如何确定的静态库(.a)中的Mac OS X上的目标架构?(How do I determine t

2019-06-25 02:27发布

我感兴趣的是验证如果给定的iPhone静态库已建成ARM还是英特尔。

这是比什么都好奇。 是否有某种Mac OS X或BSD做这个特定的工具? 这后给出Linux的一个例子。

Answer 1:

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


Answer 2:

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


Answer 3:

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


Answer 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。 我很抱歉。



Answer 5:

这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


文章来源: How do I determine the target architecture of static library (.a) on Mac OS X?