"otool"和"file"无法显示".a"文件的体系结构

Ber*_*rgP 6 arm file build cmake otool

我用cMake为ARM7构建了一些静态库.通常,当您对.a文件使用next命令时,它会显示以下体系结构:

FE

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
Run Code Online (Sandbox Code Playgroud)

或者fe

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)
Run Code Online (Sandbox Code Playgroud)

但现在,当我构建我的图书馆时,"otool"和"file"无法显示它的架构.

mac:libs User$ otool -vf ./mylib_meta.a 
Archive : ./mylib_meta.a
Run Code Online (Sandbox Code Playgroud)

这是什么意思?建立我的图书馆可以犯哪些错误?

更新: 伊戈尔,谢谢!

我用命令解压缩了目标文件:

ar -t mylib.a

ar -xv mylib.a myobj.o

-t显示二进制文件列表

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

Igo*_*sky 5

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

"<!arch>\n"

header 0
SYMDEF entry

header 1
object 1

header 2
object 2

...
Run Code Online (Sandbox Code Playgroud)

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

另一种是Apple自己的发明.他们采用了用于多拱Mach-O可执行文件的"Fat二进制/通用二进制"概念,并将其用于存档.所以,"胖"档案看起来像这样:

  Fat Mach-O header
  Architecture 1 header --+
  Architecture 2 header --|--+
  Architecture 3 header --|--|--+
  [padding]               |  |  |
  Archive 1 <-------------+  |  |
  Archive 2 <----------------+  |
  Archive 3 <-------------------+
Run Code Online (Sandbox Code Playgroud)

在这种情况下file,otool可以查看fat标头并列出支持哪些体系结构.

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