7

我正在使用以下命令组装我的 hello world:

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 运行?

4

1 回答 1

14

直接的问题是默认情况下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 中的函数)。一般来说,不推荐使用系统调用。

于 2012-12-21T12:51:32.373 回答