我正在使用以下命令组装我的hello世界:
nasm -f elf64 test.asm
然后我链接到这个:
ld -s test.o -lc
我知道这有效,因为file a.out
告诉我
a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), stripped
但是当我使用./a.out
运行时,我会bash: ./a.out: No such file or directory
当没有libc的链接运行正常!如何让我的libc链接exe运行?
答案 0 :(得分:12)
当前问题是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
系统调用(如果你真的需要,你可以使用libc的exit
函数)。通常,不建议使用系统调用。