如何确定 MacOSX 上静态库(. a)的目标架构?

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

比什么都好奇。是否有某种 MacOSX 或 BSD 特定的工具可以做到这一点?这个 邮寄给出了 Linux 中的一个例子。

112386 次浏览

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

正如前面提到的,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
...

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

作为替代方案,我发现 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 上问的问题。我很抱歉。

这个 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

如果有人来这里寻找如何判断一个库(或其中的目标文件)是否用于 Mac Catalyst 的答案,请使用 otool -l转储 load 命令。查找任何对象的 LC _ BUILD _ VERION 部分。Mac Catalyst 由 platform 6而不是 platform 1识别。