【问题标题】:How to link mach-o format object files on linux?如何在 linux 上链接 mach-o 格式的目标文件?
【发布时间】:2021-12-02 01:04:21
【问题描述】:

我一直试图在 Linux 上链接一个 MACHO 格式的目标文件,但我失败了。到目前为止,我已经通过运行创建了目标文件:

nasm -fmacho -o machoh.o hello.o

我尝试过使用链接:

 clang --target=x86_64-apple-darwin machoh.o

但是失败了。我曾尝试使用 GCC、LD 和其他链接器,但仍然失败得很惨。有什么想法可以解决我的问题吗?

非常感谢。

【问题讨论】:

    标签: linux linker ld mach-o


    【解决方案1】:

    最容易使用的解决方案是lld,LLVM 链接器。

    1. lld 不附带 clang,而是一个单独的包。

      sudo apt install lld
      

      如果您安装的 clang 版本不是默认版本(例如 clang-12 明确),那么您应该为 lld 使用相同版本(即 lld-12)。

    2. 从某个地方获取 MacOS SDK。 This GitHub repo 存档。

      如果您对使用上述内容感到不舒服,那么在没有 Mac 的情况下获得它的“合法”方式是:

      1. 创建 Apple ID
      2. 转到https://developer.apple.com/download/all/
      3. 下载“Xcode 命令行工具”
      4. 装载或提取 dmg
      5. 解压 XAR 包
      6. 对于其中的每个“.pkg”文件夹,运行pbzx <Payload | cpio -i
      7. 在里面找到Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
    3. 将以上两个都喂给clang:

      clang --target=x86_64-apple-darwin -fuse-ld=lld --sysroot=path/to/MacOSX.sdk machoh.o
      

    【讨论】:

      【解决方案2】:

      我尝试使用以下链接进行链接:clang --target=x86_64-apple-darwin machoh.o 但是失败了。

      失败怎么办?细节很重要。

      无论如何,Linux 上有 3 种常用的链接器:BFD-ld、Gold 和(最新的)LLD。

      其中,Gold 是一个仅限 ELF 的链接器,不适用于 Mach-O。

      BFD-ld 在我的发行版中仅配置为支持少数仿真(使用ld --help 查看哪些仿真)。 BFD 似乎确实支持 Mach-O,因此有可能构建具有这种支持的 Linux BFD-ld 交联器。

      LLD 应该支持开箱即用的 Mach-O,但您可能没有使用 LLD。

      所以你的第一步应该是找出 clang --target=x86_64-apple-darwin ... 使用哪个链接器,然后让它使用支持 Mach-O 的链接器。

      【讨论】:

        猜你喜欢
        • 2014-11-07
        • 2014-03-25
        • 1970-01-01
        • 1970-01-01
        • 2013-03-27
        • 2015-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多