Home > Enterprise >  How to link mach-o format object files on linux?
How to link mach-o format object files on linux?

Time:10-15

I have been attempting to link a MACHO formatted object file on Linux, but I have failed miserably. So far, I have created the object file by running:

nasm -fmacho -o machoh.o hello.o

I have tried linking using:

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

but that failed. I have attempted using GCC, LD, and other linkers but I have still failed miserably. Are there any ideas on how I could solve my problem?

Thank you very much.

CodePudding user response:

I have tried linking using: clang --target=x86_64-apple-darwin machoh.o but that failed.

Failed how? Details matter.

Anyway, there are 3 commonly used linkers on Linux: BFD-ld, Gold, and (newest) LLD.

Of these, Gold is an ELF-only linker, and will not work for Mach-O.

BFD-ld is only configured to support a few emulations (use ld --help to see which ones) in my distribution. BFD does appear to support Mach-O, so it's probably possible to build a Linux BFD-ld cross-linker with such support.

LLD should support Mach-O out of the box, but you are probably not using LLD.

So your first step should be to figure out which linker clang --target=x86_64-apple-darwin ... uses, and then make it use the one which does support Mach-O.

CodePudding user response:

The most accessible solution would be lld, the LLVM linker.

  1. lld does not ship with clang, but is a separate package.

    sudo apt install lld
    

    If you installed a version of clang that isn't the default (e.g. clang-12 explicitly), then you should use the same version for lld (i.e. lld-12).

  2. Get a MacOS SDK from somewhere. This GitHub repo archives them.

    If you're uncomfortable using the above, the "legitimate" way of obtaining it without a Mac would be:

    1. Create an Apple ID
    2. Go to https://developer.apple.com/download/all/
    3. Download the "Command Line Tools for Xcode <version>"
    4. Mount or extract the dmg
    5. Extract the XAR package
    6. For each ".pkg" folder inside, run pbzx <Payload | cpio -i
    7. Find the Library/Developer/CommandLineTools/SDKs/MacOSX.sdk inside.
  3. Feed both of the above to clang:

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