2009-07-06 33 views

Trả lời

200

lựa chọn khác là lipo; đầu ra của nó ngắn gọn và dễ đọc hơn số của 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 
% 
+0

Chỉ cần xác minh điều này bằng một tệp PJSIP .a cũ. armv7. Cảm ơn. –

66

file có thể sẽ cho bạn biết. otool chắc chắn sẽ có thể. Nhưng tôi sẽ thử file trước tiên, ví dụ:

logan:/Users/logan% file d2 
d2: Mach-O executable ppc 

Ví dụ với lưu trữ:

+28

Theo kinh nghiệm của tôi 'file' thường thất bại. –

+4

Xem câu trả lời về lipo tiếp tục xuống, luôn hoạt động. –

+0

tác phẩm ảnh, công việc lipo, tệp không hoạt động với tôi –

49

Như đã đề cập trước đó, file không phải lúc nào việc. otool -hv -arch all có lẽ là điều 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 duy nhất trong thư viện.

Ví dụ:

% otool -hv /sw/lib/libfftw3.a 
Archive : /sw/lib/libfftw3.a 
/sw/lib/libfftw3.a(align.o): 
Mach header 
     magic cputype cpusubtype caps filetype ncmds sizeofcmds  flags 
MH_MAGIC_64 X86_64  ALL 0x00  OBJECT  3  336 SUBSECTIONS_VIA_SYMBOLS 
/sw/lib/libfftw3.a(alloc.o): 
Mach header 
     magic cputype cpusubtype caps filetype ncmds sizeofcmds  flags 
MH_MAGIC_64 X86_64  ALL 0x00  OBJECT  3  416 SUBSECTIONS_VIA_SYMBOLS 
... 
+0

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 một 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 (iPhone OS). – Roberto

+1

LƯU Ý: nếu bạn muốn kiểm tra xem thư viện của bạn 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 cho mỗi tệp .o. Để có tổng quan nhanh về các kiến ​​trúc trong .a của bạn, "otool -f" –

3

Là một thay thế, tôi đã tìm thấy objdump thể làm việc 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 lưu trữ có phải là kiến ​​trúc chính xác hay không, tôi có thể thực hiện một số việc 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, vì một số dòng DO hiển thị không nói elf32- sparc-vxworks, nhưng thật dễ dàng để thích ứng với điều này.

Một lợi ích tốt đẹp của việc này là objdump hoặc một biến thể được đặt 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ó xảy ra với tôi OP đã yêu cầu trên OSX. Lời xin lỗi của tôi.

+0

Để sử dụng 'objdump' bạn có thể cài đặt GNU Binutils qua MacPorts. Để xem tất cả các kiến ​​trúc có sẵn, chỉ cần thực hiện 'binutils tìm kiếm cổng'. Các công cụ để phát triển bản địa được đặt trước để tránh xung đột (ví dụ: 'gobjdump' thay vì' objdump'). Bạn có thể muốn tạo một bí danh để thuận tiện. –

+0

downvoter: bạn có phiền toái với một nhận xét mang tính xây dựng không? –

1

Tập lệnh bash này sẽ giúp bạn lập trình danh sách 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' 

Cách sử dụng Ví dụ:

./list_archs.sh /usr/lib/libc.dylib 
x86_64 i386 
Các vấn đề liên quan