如何在Mac OS X上确定静态库(.a)的目标体系结构?
我有兴趣validation一个给定的iPhone静态库是为ARM还是Intel构build的。
这比任何事情都更好奇。 是否有某种Mac OS X或BSD特定的工具来做到这一点? 这篇文章在Linux中给出了一个例子。
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
另一种select是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 %
如前所述, 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 capstype ncmds sizeofcmds flags MH_MAGIC_64 X86_64全部0x00对象3 336 SUBSECTIONS_VIA_SYMBOLS /sw/lib/libfftw3.a(alloc.o): Mach头 magic cputype cpusubtype caps capstype ncmds sizeofcmds flags MH_MAGIC_64 X86_64全部0x00对象3 416 SUBSECTIONS_VIA_SYMBOLS ...
作为替代,我发现objdump
可以很好地工作。 例如,在我的环境中,我使用vxWorks构build库存档,并需要将这些存档链接到其他项目中。 为了testing档案是否是正确的架构,我可以做如下的事情(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,但是很容易适应这个。
这样做的一个好处就是在大多数* nix操作系统上安装了objdump
或类似命名的变体,而在其他响应中build议的工具则不是。
编辑它刚刚发生在我的操作系统问在OSX上。 我很抱歉。
这个bash脚本将帮助你以编程方式将一个体系结构列表变成一个variables。
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
- 在Perl中,如何将整个文件读入string?
- Android Studio Gradle:错误:任务“:app:processDebugGoogleServices”的执行失败。 >找不到匹配的客户端软件包