6

我已经用 cMake 为 ARM7 构建了一些静态库。通常,当您对 .a 文件使用下一个命令时,它会显示架构:

mac:libs User$ file ./libcurl.a 
./libcurl.a: Mach-O universal binary with 3 architectures
./libcurl.a (for architecture armv6):   current ar archive random library
./libcurl.a (for architecture armv7):   current ar archive random library
./libcurl.a (for architecture i386):    current ar archive random library

或铁

mac:libs User$ otool -vf ./libboost_regex.a 
Fat headers
fat_magic FAT_MAGIC
nfat_arch 3
architecture armv6
    cputype CPU_TYPE_ARM
    cpusubtype CPU_SUBTYPE_ARM_V6
    capabilities 0x0
    offset 68
    size 9550024
    align 2^2 (4)
architecture armv7
    cputype CPU_TYPE_ARM
    cpusubtype CPU_SUBTYPE_ARM_V7
    capabilities 0x0
    offset 9550092
    size 9390544
    align 2^2 (4)
architecture i386
    cputype CPU_TYPE_I386
    cpusubtype CPU_SUBTYPE_I386_ALL
    capabilities 0x0
    offset 18940636
    size 9595040
    align 2^2 (4)

但是现在,当我构建我的库时,“otool”和“file”无法显示它的架构。

mac:libs User$ otool -vf ./mylib_meta.a 
Archive : ./mylib_meta.a

这是什么意思?我在建造图书馆时会犯什么错误?

更新: 伊戈尔,谢谢!

我用命令提取了目标文件:

ar -t mylib.a

ar -xv mylib.a myobj.o

-t 显示二进制文件列表

-xv 提取具体的二进制文件

4

2 回答 2

6

Apple 使用两种形式的 AR 存档。第一个与传统的 Unix 存档(“a.out 存档”)非常相似——基本上只是一堆 .o 文件与前面的符号索引粘在一起:

"<!arch>\n"

header 0
SYMDEF entry

header 1
object 1

header 2
object 2

...

要确定此存档所针对的体系结构,您需要提取至少一个目标文件并在其上使用fileotool。存档标头本身没有此信息。(事实上​​,目标文件不一定都属于同一个架构,理论上您可能有任何类型的文件,而不仅仅是对象,但这不太可能。)您可以使用该ar实用程序从存档中提取单个文件。

另一种是苹果自己的发明。他们采用了用于多架构 Mach-O 可执行文件的“胖二进制/通用二进制”概念,并将其用于存档。所以,一个“胖”的档案看起来像这样:

  Fat Mach-O header
  Architecture 1 header --+
  Architecture 2 header --|--+
  Architecture 3 header --|--|--+
  [padding]               |  |  |
  Archive 1 <-------------+  |  |
  Archive 2 <----------------+  |
  Archive 3 <-------------------+

在这种情况下fileotool可以查看胖头并列出支持的架构。

要创建或编辑胖文件(存档和可执行文件),您可以使用lipo工具.

于 2013-07-04T11:43:33.097 回答
2

一种替代方法是使用objdumpGNU binutils 包(例如通过 homebrew 提供)。在 macOS 上,它被重命名为gobjdump. 在存档上调用它会显示存档头信息,也许可以省去提取目标文件的麻烦(就像您最初想要的那样)

> gobjdump -a ./libboost_regex.a
In archive ./libboost_regex.a:
c_regex_traits.o:     file format mach-o-x86-64
rw-r--r-- 502/20 140976 Nov  8 08:03 2018 c_regex_traits.o
cpp_regex_traits.o:     file format mach-o-x86-64
rw-r--r-- 502/20 106424 Nov  8 08:03 2018 cpp_regex_traits.o
...

迟到的答案,但在这里添加以供将来参考。

于 2019-01-13T21:53:16.237 回答