Jak określić docelową architekturę biblioteki statycznej (.a) na Mac OS X?

Interesuje mnie sprawdzenie, czy dana biblioteka statyczna iPhone ' a została zbudowana dla ARM lub Intela.

To bardziej ciekawość niż cokolwiek innego. Czy istnieje jakieś specyficzne narzędzie Mac OS X lub BSD, aby to zrobić? This post daje przykład w Linuksie.

Author: Community, 2009-07-06

5 answers

Inną opcją jest lipo; jej wyjście jest krótkie i bardziej czytelne niż otool's.

Przykład:

% 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
%
 206
Author: Václav Slavík,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-02 02:20:30

file pewnie ci powie. otool z pewnością powinien być w stanie. Ale najpierw spróbowałbym file, np.

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

Przykład z archiwum:

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
 66
Author: Logan Capaldo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-06 02:23:44

Jak wspomniano wcześniej, file nie zawsze działa. otool -hv -arch all jest prawdopodobnie najbliższą rzeczą, która jest gwarantowana - dostarcza informacji o architekturze dla każdego pojedynczego pliku Obiektowego w bibliotece.

Przykład:

% 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
...
 50
Author: Jiahao Chen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-02 02:23:55

Jako alternatywę, znalazłem objdump może działać dobrze. Jako przykład, w moim środowisku buduję archiwa biblioteczne za pomocą vxWorks i muszę je połączyć z innymi projektami. Aby sprawdzić, czy archiwum jest poprawną architekturą, mogę zrobić coś takiego (składnia 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;

Ten przykład nie jest dokładnie poprawny, ponieważ pojawiają się niektóre linie, które nie mówią elf32-sparc-vxworks, ale łatwo jest to dostosować.

Jedną z miłych korzyści jest to, że objdump, lub podobnie nazwany wariant, jest instalowany na większości systemów operacyjnych * nix, podczas gdy narzędzia sugerowane w innych odpowiedziach nie są.

edit przyszło mi do głowy, że OP pyta na OSX. Przepraszam.

 4
Author: Brian Vandenberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-18 17:09:09

Ten skrypt bash pomoże Ci programowo uzyskać listę architektur do zmiennej.

List_archs.sh:

#! /bin/bash
lipo -info $1 | sed -En -e 's/^(Non-|Architectures in the )fat file: .+( is architecture| are): (.*)$/\3/p'

Przykład użycia:

./list_archs.sh /usr/lib/libc.dylib
x86_64 i386
 1
Author: bleater,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-07 22:04:20