nasm-在macOS Mojave上无法将目标文件与ld链接

时间:2018-10-16 07:52:37

标签: macos assembly nasm ld

我正在尝试组装一个简单的Hello World,它在以前的macOS版本中可以正常工作:

        global   start
        section  .text
start:  mov      rax, 0x02000004
        mov      rdi, 1
        mov      rsi, msg
        mov      rdx, 13
        syscall
        mov      rax, 0x02000001
        xor      rdi, rdi
        syscall

        section  .data
msg:    db       "Hello world!", 10

然后我像以前一样使用nasmld

$ nasm -f macho64 hello.asm
$ ld hello.o -o hello

但是ld给我以下错误:

ld: warning: No version-min specified on command line
Undefined symbols for architecture x86_64:
  "_main", referenced from:
     implicit entry/start for main executable
ld: symbol(s) not found for inferred architecture x86_64

我尝试将start切换为_main,但是得到了以下信息:

ld: warning: No version-min specified on command line
ld: dynamic main executables must link with libSystem.dylib for inferred architecture x86_64

什至不知道那意味着什么。

3 个答案:

答案 0 :(得分:3)

除了上面的@Verloren 答案 (https://stackoverflow.com/a/52830915/1189569)

我在使用 macOS Big Sur (macOS 11.1) 时遇到问题,其中标志 -lSystem 无法定位 libSystem.dylib,出现错误

ld: library not found for -lSystem

我发现了 macOS Big Sur,引用自链接: https://developer.apple.com/documentation/macos-release-notes/macos-big-sur-11_0_1-release-notes

<块引用>

macOS Big Sur 11.0.1 中的新功能,系统附带内置动态 所有系统提供的库的链接器缓存。作为这一变化的一部分, 文件系统上不再存在动态库的副本。 尝试通过查看来检查动态库是否存在的代码 对于路径中的文件或枚举目录将失败...

并非所有动态库副本都位于 usr/lib/ 和类似位置,因此默认情况下无法找到标志 -lSystem libSystem.dylib

对此的解决方案是更新/安装最新版本的命令行工具(如果尚未安装),并将 -L 命令的标志 ld 设置为 /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib

所以完整的命令看起来像这样:

ld hello.o -o hello -macosx_version_min 11.0 -L /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib -lSystem

答案 1 :(得分:2)

ld需要-lSystem标志以防止其引发此错误。此外,还需要-macosx_version_min才能删除警告。使用ld的正确方法是:ld hello.o -o hello -macosx_version_min 10.13 -lSystem

答案 2 :(得分:2)

更简单的答案。 ld 默认为动态链接并尝试加载正在寻找 maincrt1。所以指定静态链接。

% ld -e start -static hello.o -o hello
% ./hello
Hello world!