Làm cách nào để xác định kiến ​​trúc đích của thư viện tĩnh (.a) trên Mac OS X?


128

Tôi quan tâm đến việc xác minh xem một thư viện tĩnh cho iPhone đã được xây dựng cho ARM hay Intel chưa.

Đó là sự tò mò hơn bất cứ điều gì. Có một số loại công cụ cụ thể của Mac OS X hoặc BSD để làm việc này không? Bài đăng này đưa ra một ví dụ trong Linux.

Câu trả lời:


241

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
%

Chỉ cần xác minh điều này với một tệp .S cũ. armv7. Cảm ơn.
Alex Zavatone

69

filecó lẽ sẽ nói với bạn otoolchắc chắn sẽ có thể. Nhưng tôi sẽ thử filetrướ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

34
Theo kinh nghiệm của tôi filethường thất bại.
Stefan Schmidt

4
Xem câu trả lời về lipo hơn nữa, luôn luôn hoạt động.
Maciej Swic

Tôi đã nhận thấy rằng nếu .a không phải là ranlib'd, tệp đôi khi báo cáo ít thông tin hơn.
Paul Du Bois

4
Bây giờ trong năm 2015 bạn nên sử dụng lipo. Xem câu trả lời dưới đây.
derFunk

1
Thật không may, điều này đã không làm việc cho một số phiên bản hệ điều hành.
rmcclellan

53

Như đã đề cập trước đó, filekhông phải lúc nào cũng hoạt động. otool -hv -arch allcó 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
...

Chỉ cần thêm vào câu trả lời này, tôi thích otool hơn tập tin hoặc lipo. Tôi đã thử tập tin, lipo và otool với thư viện chất béo iOS và otool là người duy nhất cho tôi thấy rằng nó chứa các tệp cho i386 (iPhone Simulator) và cho armv6, armv7 và armv7s (HĐH iPhone).
Roberto

1
LƯU Ý: nếu bạn muốn kiểm tra xem thư viện của mình có béo hay không, bạn muốn sử dụng "otool -arch all"; nếu không, nó sẽ chỉ báo cáo một kiến ​​trúc trên mỗi tệp .o. Để biết tổng quan nhanh về các kiến ​​trúc trong .a của bạn, "otool -f"
Paul Du Bois

4

Thay thế, tôi đã tìm thấy objdumpcó 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.


Để sử dụng, objdumpbạ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ụ gobjdumpthay vì objdump). Bạn có thể muốn tạo một bí danh cho thuận tiện.
Stefan Schmidt

3

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
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.