Câu trả lời:
Một lựa chọn khác là lipo
; đầu ra của nó ngắn gọn và dễ đọc hơn so với otool
.
Một ví dụ:
% lipo -info /usr/lib/libiodbc.a
Architectures in the fat file: /usr/lib/libiodbc.a are: x86_64 i386 ppc
% lipo -info libnonfatarchive.a
input file libnonfatarchive.a is not a fat file
Non-fat file: libnonfatarchive.a is architecture: i386
%
file
có lẽ sẽ nói với bạn otool
chắc chắn sẽ có thể. Nhưng tôi sẽ thử file
trước, vd
logan:/Users/logan% file d2
d2: Mach-O executable ppc
Ví dụ với kho lưu trữ:
logan:/Users/logan% file /usr/lib/libMallocDebug.a
/usr/lib/libMallocDebug.a: Mach-O universal binary with 2 architectures
/usr/lib/libMallocDebug.a (for architecture i386): current ar archive random library
/usr/lib/libMallocDebug.a (for architecture ppc): current ar archive
file
thường thất bại.
Như đã đề cập trước đó, file
không phải lúc nào cũng hoạt động. otool -hv -arch all
có lẽ là thứ gần nhất được đảm bảo để hoạt động - nó cung cấp thông tin kiến trúc cho mọi tệp đối tượng trong thư viện.
Thí dụ:
% otool -hv /sw/lib/libfftw3.a Lưu trữ: /sw/lib/libfftw3.a /sw/lib/libfftw3.a(align.o): Tiêu đề Mach ma thuật cputype cpusubtype mũ filetype ncmds sizeofcmds cờ MH_MAGIC_64 X86_64 TẤT CẢ 0x00 ĐỐI TƯỢNG 3 336 ĐỐI TƯỢNG_VIA_SYMBOLS /sw/lib/libfftw3.a(alloc.o): Tiêu đề Mach ma thuật cputype cpusubtype mũ filetype ncmds sizeofcmds cờ MH_MAGIC_64 X86_64 TẤT CẢ 0x00 ĐỐI TƯỢNG 3 416 ĐỐI TƯỢNG_VIA_SYMBOLS ...
Thay thế, tôi đã tìm thấy objdump
có thể hoạt động tốt. Ví dụ, trong môi trường của tôi, tôi xây dựng kho lưu trữ thư viện với vxWorks và cần liên kết chúng với các dự án khác. Để kiểm tra xem kho lưu trữ có đúng kiến trúc hay không, tôi có thể làm một cái gì đó như sau (cú pháp bash):
if [ "$(objdumpsparc -a ${ARCHIVE_FILE} 2>&1 | ggrep -cvP 'elf32-sparc-vxworks')" -ne "0" ]; then
echo "Cannot build with ${ARCHIVE_FILE}, it contains one or more non-sparc components"
fi;
Ví dụ này không chính xác, bởi vì một số dòng DO hiển thị không nói elf32-sparc-vxworks, nhưng nó đủ dễ để điều chỉnh điều này.
Một lợi ích tuyệt vời của điều này là objdump
, hoặc một biến thể có tên tương tự, được cài đặt trên hầu hết các hệ điều hành * nix, trong khi các công cụ được đề xuất trong các phản hồi khác thì không.
chỉnh sửa Nó chỉ xảy ra với tôi OP đã hỏi trên OSX. Lời xin lỗi của tôi.
objdump
bạn có thể cài đặt GNU Binutils thông qua MacPorts. Để xem tất cả các kiến trúc có sẵn chỉ cần thực hiện port search binutils
. Các công cụ để phát triển bản địa được tiền tố để tránh xung đột (ví dụ gobjdump
thay vì objdump
). Bạn có thể muốn tạo một bí danh cho thuận tiện.
Kịch bản bash này sẽ giúp bạn lập trình một danh sách các kiến trúc thành một biến.
list_archs.sh:
#! /bin/bash
lipo -info $1 | sed -En -e 's/^(Non-|Architectures in the )fat file: .+( is architecture| are): (.*)$/\3/p'
Ví dụ sử dụng:
./list_archs.sh /usr/lib/libc.dylib
x86_64 i386