【问题标题】:How do I determine the target architecture of static library (.a) on Mac OS X?如何确定 Mac OS X 上静态库 (.a) 的目标架构?
【发布时间】:2010-11-08 06:43:27
【问题描述】:

我有兴趣验证是否为 ARM 或 Intel 构建了给定的 iPhone 静态库。

好奇心胜过一切。是否有某种 Mac OS X 或 BSD 特定工具来执行此操作?这个post 给出了一个Linux 中的例子。

【问题讨论】:

    标签: iphone macos linker bsd universal-binary


    【解决方案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
    %
    

    【讨论】:

    • 刚刚用旧的 PJSIP .a 文件验证了这一点。 armv7.谢谢。
    【解决方案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
    

    【讨论】:

    • 根据我的经验,file 经常失败。
    • 进一步查看有关 lipo 的答案,始终有效。
    • 我注意到如果 .a 不是 ranlib'd,文件有时会报告较少的信息。
    • 现在在 2015 年你应该使用 lipo。请参阅下面的答案。
    • 不幸的是,这不适用于多个操作系统版本。
    【解决方案3】:

    如前所述,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
    ...
    

    【讨论】:

    • 只是为了补充这个答案,我更喜欢 otool 而不是文件或 lipo。我尝试了使用 iOS 胖库的 file、lipo 和 otool,而 otool 是唯一一个向我展示它包含 i386(iPhone 模拟器)和 armv6、armv7 和 armv7s(iPhone OS)的文件。
    • 注意:如果你想检查你的库是否胖,你想使用“otool -arch all”;否则,每个 .o 文件只会报告一个架构。要快速了解 .a 中的架构,请使用“otool -f”
    【解决方案4】:

    此 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
    

    【讨论】:

      【解决方案5】:

      作为替代方案,我发现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)。为方便起见,您可能想创建一个别名。
      【解决方案6】:

      如果有人来这里寻找有关如何判断库(或其中的目标文件)是否适用于 Mac Catalyst 的答案,请使用 otool -l 转储加载命令。查找任何对象的 LC_BUILD_VERSION 部分。 Mac Catalyst 由platform 6 而不是platform 1 标识。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-12
        • 1970-01-01
        • 2011-06-17
        • 1970-01-01
        • 2016-05-11
        相关资源
        最近更新 更多