【发布时间】:2010-11-08 06:43:27
【问题描述】:
我有兴趣验证是否为 ARM 或 Intel 构建了给定的 iPhone 静态库。
好奇心胜过一切。是否有某种 Mac OS X 或 BSD 特定工具来执行此操作?这个post 给出了一个Linux 中的例子。
【问题讨论】:
标签: iphone macos linker bsd universal-binary
我有兴趣验证是否为 ARM 或 Intel 构建了给定的 iPhone 静态库。
好奇心胜过一切。是否有某种 Mac OS X 或 BSD 特定工具来执行此操作?这个post 给出了一个Linux 中的例子。
【问题讨论】:
标签: iphone macos linker bsd universal-binary
另一个选项是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 当然应该可以。但我会先尝试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 经常失败。
如前所述,file 并不总是有效。 otool -hv -arch all 可能是最接近可以保证工作的东西 - 它为库中的每个目标文件提供架构信息。
例子:
% otool -hv /sw/lib/libfftw3.a
存档:/sw/lib/libfftw3.a
/sw/lib/libfftw3.a(align.o):
马赫头
魔术 cputype cpusubtype caps 文件类型 ncmds sizeofcmds 标志
MH_MAGIC_64 X86_64 ALL 0x00 对象 3 336 SUBSECTIONS_VIA_SYMBOLS
/sw/lib/libfftw3.a(alloc.o):
马赫头
魔术 cputype cpusubtype caps 文件类型 ncmds sizeofcmds 标志
MH_MAGIC_64 X86_64 ALL 0x00 对象 3 416 SUBSECTIONS_VIA_SYMBOLS
...
【讨论】:
此 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
【讨论】:
作为替代方案,我发现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 操作系统上,而其他响应中建议的工具则没有。
edit 我突然想到 OP 在 OSX 上询问。我很抱歉。
【讨论】:
objdump,您可以通过 MacPorts 安装 GNU Binutils。要查看所有可用架构,只需执行port search binutils。原生开发工具的前缀是为了避免冲突(例如 gobjdump 而不是 objdump)。为方便起见,您可能想创建一个别名。
如果有人来这里寻找有关如何判断库(或其中的目标文件)是否适用于 Mac Catalyst 的答案,请使用 otool -l 转储加载命令。查找任何对象的 LC_BUILD_VERSION 部分。 Mac Catalyst 由platform 6 而不是platform 1 标识。
【讨论】: