web-dev-qa-db-ja.com

Mac OS Xの静的ライブラリ(.a)のターゲットアーキテクチャを確認するにはどうすればよいですか?

特定のiPhone静的ライブラリがARMまたはIntel用にビルドされているかどうかを確認することに興味があります。

それは何よりも好奇心です。これを行うための何らかの種類のMac OS XまたはBSD固有のツールはありますか?この post は、Linuxでの例を示しています。

118
Justicle

別のオプションはlipoです。その出力は簡潔で、otoolのものより読みやすくなっています。

例:

% 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
%
230
Václav Slavík

fileはおそらくあなたに教えてくれるでしょう。 otoolは確かにできるはずです。しかし、最初にfileを試してみてください。

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

アーカイブの例:

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
Logan Capaldo

前述したように、fileは常に機能するとは限りません。 otool -hv -Arch allはおそらく動作が保証されている最も近いものです。ライブラリ内のすべてのオブジェクトファイルのアーキテクチャ情報を提供します。

例:

%otool -hv /sw/lib/libfftw3.a
アーカイブ:/sw/lib/libfftw3.a
/sw/lib/libfftw3.a(align.o):
 Machヘッダー
 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ヘッダー
 magic cputype cpusubtype caps filetype ncmds sizeofcmds flags 
 MH_MAGIC_64 X86_64 ALL 0x00 OBJECT 3 416 SUBSECTIONS_VIA_SYMBOLS 
 ... 
53
Jiahao Chen

別の方法として、objdumpがうまく機能することがわかりました。例として、私の環境では、vxWorksでライブラリアーカイブを構築し、それらを他のプロジェクトにリンクする必要があります。アーカイブが正しいアーキテクチャであるかどうかをテストするには、次のようなことを行うことができます(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;

Elf32-sparc-vxworksと言わない行が表示されるため、この例は正確ではありませんが、これを適用するのは簡単です。

この利点の1つは、ほとんどの* nixオペレーティングシステムにobjdumpまたは同様の名前のバリアントがインストールされているのに対し、他の応答で提案されているツールはインストールされていないことです。

編集それは、OPがOSXで要求していることを私に思い起こさせました。謝罪いたします。

4

このbashスクリプトは、プログラムでアーキテクチャのリストを変数に取得するのに役立ちます。

list_archs.sh:

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

使用例:

./list_archs.sh /usr/lib/libc.dylib
x86_64 i386
3
bleater