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

时间:2009-07-06 02:12:54

标签: iphone macos linker bsd

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

这比任何事情都更好奇。是否有某种Mac OS X或BSD特定工具来执行此操作?这个post在Linux中给出了一个例子。

6 个答案:

答案 0 :(得分:220)

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

答案 1 :(得分:64)

file可能会告诉你。 otool当然应该能够。但我先试试file, e.g。

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

答案 2 :(得分:52)

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

示例:

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

答案 3 :(得分: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,但是很容易适应这一点。

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

编辑我刚刚想到OP正在询问OSX。道歉。

答案 4 :(得分:2)

此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

答案 5 :(得分:1)

如果有人来这里寻找有关如何判断库(或其中的目标文件)是否适用于 Mac Catalyst 的答案,请使用 otool -l 转储加载命令。找到任何对象的 LC_BUILD_VERSION 部分。 Mac Catalyst 由 platform 6 而不是 platform 1 标识。