我一直試圖在 Linux 上鏈接 MACHO 格式的目標檔案,但我失敗了。到目前為止,我已經通過運行創建了目標檔案:
nasm -fmacho -o machoh.o hello.o
我嘗試使用以下鏈接進行鏈接:
clang --target=x86_64-apple-darwin machoh.o
但那失敗了。我曾嘗試使用 GCC、LD 和其他聯結器,但仍然慘遭失敗。關于如何解決我的問題有什么想法嗎?
非常感謝。
uj5u.com熱心網友回復:
我嘗試使用以下方法進行鏈接:
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 的聯結器。
uj5u.com熱心網友回復:
最容易訪問的解決方案是lldLLVM 聯結器。
lld 不附帶 clang,而是一個單獨的包。
sudo apt install lld如果您安裝了一個不是默認版本的 clang(例如
clang-12明確的),那么您應該為 lld 使用相同的版本(即lld-12)。從某個地方獲取 MacOS SDK。這個 GitHub 存盤庫將它們存檔。
如果您對使用上述內容感到不舒服,那么在沒有 Mac 的情況下獲得它的“合法”方式是:
- 創建 Apple ID
- 轉到https://developer.apple.com/download/all/
- 下載“Xcode <version> 的命令列工具”
- 掛載或提取 dmg
- 提取 XAR 包
- 對于里面的每個“.pkg”檔案夾,運行
pbzx <Payload | cpio -i - 找到
Library/Developer/CommandLineTools/SDKs/MacOSX.sdk里面。
將以上兩個都喂給 clang:
clang --target=x86_64-apple-darwin -fuse-ld=lld --sysroot=path/to/MacOSX.sdk machoh.o
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/315039.html
