我正在尝试组装一个简单的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
然后我像以前一样使用nasm
和ld
:
$ 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
什至不知道那意味着什么。
答案 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 默认为动态链接并尝试加载正在寻找 main 的 crt1。所以指定静态链接。
% ld -e start -static hello.o -o hello
% ./hello
Hello world!