【问题标题】:"otool" and "file" can't show architecture of the ".a" file“otool”和“file”不能显示“.a”文件的架构
【发布时间】:2013-07-04 10:55:19
【问题描述】:

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

f.e.

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

或者 f.e.

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 提取具体的二进制文件

【问题讨论】:

    标签: file build cmake arm otool


    【解决方案1】:

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

    "<!arch>\n"
    
    header 0
    SYMDEF entry
    
    header 1
    object 1
    
    header 2
    object 2
    
    ...
    

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      另一种方法是使用 GNU binutils 软件包中的objdump(例如通过自制软件提供)。在 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
      ...
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-27
        • 2011-05-21
        • 2013-09-22
        • 2011-04-14
        • 1970-01-01
        • 2011-12-20
        • 1970-01-01
        • 2015-06-28
        相关资源
        最近更新 更多