直接的问题是默认情况下ld
用作/lib/ld64.so.1
解释器,您可能会错过它(它可以是符号链接/lib64/ld-linux-x86-64.so.2
或任何适当的):
$ readelf -l a.out | grep interpreter
[Requesting program interpreter: /lib/ld64.so.1]
$ ls -l /lib/ld64.so.1
ls: cannot access /lib/ld64.so.1: No such file or directory
-dynamic-linker /lib64/ld-linux-x86-64.so.2
您可以通过将选项传递给您的ld
调用来显式设置解释器来解决此问题:
$ ld -s -dynamic-linker /lib64/ld-linux-x86-64.so.2 test.o -lc
$ readelf -l a.out | grep interpreter
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
$ ./a.out
$
然而,简单的经验法则是,gcc
如果您需要 libc,则用于链接,它会为您做所有正确的事情。还要确保将main
其用作入口点,以便正常的 libc 启动代码有机会初始化。同样,main
最后只从你的返回,不要exit
直接使用系统调用(exit
如果你真的需要,你可以使用 libc 中的函数)。一般来说,不推荐使用系统调用。