如何确定Mac OS X上静态库(.a)的目标体系结构?


128

我有兴趣验证是否已为ARM或Intel构建了给定的iPhone静态库。

好奇心比什么都重要。有某种Mac OS X或BSD专用工具可以做到这一点吗?这篇文章给出了Linux中的示例。

Answers:


241

另一个选择是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
%

刚刚使用旧的PJSIP .a文件验证了这一点。armv7。谢谢。
Alex Zavatone 2015年

69

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

34
以我的经验file经常失败。
Stefan Schmidt

4
进一步查看有关lipo的答案,始终有效。
Maciej Swic

我注意到,如果不对.a进行运行,文件有时会报告较少的信息。
Paul Du Bois 2014年

4
现在在2015年,您应该使用lipo。请参阅下面的答案。
derFunk 2015年

1
不幸的是,这不适用于多个操作系统版本。
rmcclellan

53

如前所述,file并非总是有效。otool -hv -arch all可能是保证可以工作的最接近的东西-它提供了库中每个目标文件的体系结构信息。

例:

%otool -hv /sw/lib/libfftw3.a
存档:/sw/lib/libfftw3.a
/sw/lib/libfftw3.a(align.o):
马赫头
      魔术cputype cpusubtype caps filetype ncmds sizeofcmds标志
MH_MAGIC_64 X86_64 ALL 0x00对象3336 SUBSECTIONS_VIA_SYMBOLS
/sw/lib/libfftw3.a(alloc.o):
马赫头
      魔术cputype cpusubtype caps filetype ncmds sizeofcmds标志
MH_MAGIC_64 X86_64 ALL 0x00对象3416 SUBSECTIONS_VIA_SYMBOLS
...

只是为了增加这个答案,我更喜欢otool而不是file或lipo。我尝试使用iOS脂肪库尝试文件,脂质和otool,而otool是唯一向我展示它包含i386(iPhone模拟器)以及armv6,armv7和armv7s(iPhone OS)文件的工具。
罗伯托

1
注意:如果要检查您的库是否胖,则要使用“ otool -arch all”;否则,每个.o文件仅报告一种体系结构。要快速了解.a中的架构,请使用“ otool -f”
Paul Du Bois

4

作为替代,我发现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的行,但是很容易进行调整。

这样做的一个好处是,objdump大多数* nix操作系统上都安装了或类似命名的变体,而其他响应中建议的工具则没有。

编辑它只是发生在我的任择议定书是问在OSX。我很抱歉。


要使用它,objdump您可以通过MacPorts安装GNU Binutils。要查看所有可用的体系结构,只需执行port search binutils。为本机开发提供的工具带有前缀以避免冲突(例如gobjdump代替objdump)。为了方便起见,您可能需要创建一个别名。
Stefan Schmidt'2

3

该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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.