无法运行与libc链接的可执行文件

时间:2012-12-21 11:34:04

标签: linux assembly x86-64 nasm ld

我正在使用以下命令组装我的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运行?

1 个答案:

答案 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函数)。通常,不建议使用系统调用。