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