Trong LINUX, xác định xem thư viện .a / kho lưu trữ 32-bit hay 64-bit?


87

Chúng tôi phân phối trong Linux một lib tĩnh ở cả hai phiên bản 64-bit và 32-bit. Khi khắc phục sự cố cho khách hàng, tôi muốn tập lệnh shell chẩn đoán của mình nhanh chóng loại bỏ sự cố bằng cách kiểm tra tệp lưu trữ .a để xác định xem nó là 32 hay 64 bit. Các phương pháp xảy ra với tôi kém thanh lịch hơn:

  1. trích xuất một thành viên .o và hỏi lệnh "tệp" (ví dụ: ELF 32-bit, v.v.)

  2. bắt đầu bao gồm một thành viên giả được mã hóa để chỉ ra, ví dụ: 32bit.o / 64bit.o và sử dụng "ar -t" để kiểm tra

Tôi đã thử "string xyz.a | grep 32" nhưng điều này không hoạt động tốt trên các phiên bản. Không phải là một vấn đề đau lòng, nhưng nếu bạn biết về một giải pháp thanh lịch, tôi muốn biết.


Tôi biết về stackoverflow.com/questions/184502/… , đang tìm kiếm một giải pháp tốt hơn.
cvsdave

2
Giải pháp trong câu hỏi khác dường như giải quyết vấn đề khá gọn gàng, nhưng một cách nhanh chóng là nm foo.a | grep '^ 0' | đầu -1 | wc -c - nếu kết quả là 17 (16 + 1 == 8byte + 1 ký tự cho trả về dòng), thì đó là 64 bit, nếu là 9 thì là 32 bit (8 + 1 == 4byte + 1 ký tự cho trả về dòng)
Petesh

Nếu tôi được 14 tuổi thì sao? o_0
Almo

Câu trả lời:


123

objdump có vẻ như là cách tốt nhất:

objdump -f libfoo.a | grep ^architecture

1
filedễ đọc hơn như đã nêu bên dưới stackoverflow.com/a/8909086/233906
Cerber

1
Tôi hiểu architecture: i386:x86-64, flags 0x00000039:.. có nghĩa là cả hai ..? điều đó không chắc. vui lòng giúp đỡ: D
greywolf

10
@Paladin: Đó là 64 bit - kiến ​​trúc x86 được objdump mô tả là i386(IA32 cũ thuần túy), i386:x86-64(AMD64) và i386:x64-32(kiến trúc X32 32-bit-địa chỉ-không gian-trong-chế độ dài).
caf

1
Cờ '-f' trong 'objdump' chỉ định hiển thị nội dung của tiêu đề tệp tổng thể của thư viện 'libfoo.a'. Đầu ra này từ 'objdump' sau đó được đưa vào lệnh grep để tìm kiếm từ 'architecture'. Ký tự '^' biểu thị rằng 'kiến trúc' sẽ bắt đầu dòng.
Luke Purnell

3
Dọn dẹp nó và loại bỏ lừa đảo: objdump -f lib.a | grep ^architecture | cut -d' ' -f-2 | sort -u:)
Legends2k

33

Cách đơn giản nhất là sử dụng lệnh tệp.

$file <.so file or .a file>

31
trong môi trường msys, điều này chỉ phản hồi <file>: kho lưu trữ ar hiện tại , không phải kiến ​​trúc đích.
bánh nướng

11
Tương tự như vậy trong môi trường Linux (Ubuntu) hiện tại của tôi.
Asherah

4
tương tự như vậy trong centos7
Chaim Geretz

Nó hoạt động tốt trên Ubuntu 16.04. (1) file armeabi/libpique.so-> libpique.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /system/bin/linker, stripped. (2) file x86/libpique.so->libpique.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped
rpattabi

5
Tệp .so và tệp .a không giống nhau. Hiển thị rằng điều này hoạt động đối với thư viện được chia sẻ không giống như thể hiện rằng nó hoạt động với thư viện tĩnh. Câu hỏi ban đầu là về một thư viện tĩnh (tệp .a). Trong trường hợp của tôi (sử dụng MSYS), giải pháp objdump được đăng bởi caf hoạt động trong đó việc sử dụng tệp chỉ in 'kho lưu trữ ar' giống như bánh nướng.
Sean Burton

17

Chỉ cần sử dụng lệnh tệp; I Efile library.so


Câu hỏi dành riêng cho các thư viện tĩnh.
pooya13

3

rất tiếc, số sed bị thiếu có nghĩa là nó đang hiển thị cho nhiều mục.

Chỉ trong một câu trả lời:

count=$(nm foo.a | grep '^0' | head -1 | sed 's/ .*//' | wc -c)
((count == 17)) && echo 64bit
((count == 9)) && echo 32bit
((count == 0)) && echo '??bit'

Cách nó hoạt động:

  • nm - lấy các ký hiệu từ thư viện
  • grep - lấy các dòng bắt đầu bằng một chuỗi hex (địa chỉ của ký hiệu trong tệp)
  • đầu - lấy dòng đầu tiên
  • sed - xóa mọi thứ vượt qua khoảng trắng, bao gồm cả khoảng trắng
  • wc - đếm số ký tự.

Trong môi trường 32 bit, bạn nhận được các địa chỉ được tạo thành từ 8 chữ số hex, thêm dòng mới sẽ mang lại cho bạn 9. Trong môi trường 64bit, bạn nhận được các địa chỉ được tạo thành từ 16 chữ số hex, thêm dòng mới sẽ cho bạn 17.


1
Có thể muốn ném một chiếc sed -e 's /. * //' vào đó
kowey

Nhân tiện, tôi nhận được 73. Chăm sóc để giải thích tại sao nó phải hoạt động?
Francesco Dondi

Rất tiếc, số sed bị thiếu đó rất quan trọng. Câu trả lời được cập nhật, với một lời giải thích của nó như thế nào là nghĩa vụ phải làm việc
Petesh

1

Nếu có các hàm dành riêng cho một phiên bản cụ thể, bạn có thể thử nm sau đó grep cho hàm.


Bạn có thể viết một số mã tìm kiếm các byte cụ thể trong thư viện. Bạn có thể thử sử dụng od trên cả hai tệp và tìm sự khác biệt giữa hai tệp.
ColWhi

1
Một giải pháp khác là đổi tên các thư viện.
ColWhi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.