2

我正在尝试在 x86_64 平台上通过“gcc -S”->“as”->“ld”编译一个简化的 C 源文件。

该过程没有错误完成,但在执行时,显示“没有这样的文件或目录”错误消息。

ctest.c
int main()
{
    return 0;
}

> gcc -S ctest.c
> as -o ctest.o ctest.s
> ld -o ctest  /usr/lib64/crt1.o /usr/lib64/crti.o ctest.o -lc /usr/lib64/crtn.o
> ./ctest 
bash: ./ctest: No such file or directory

> uname -a
Linux mkb3 2.6.27.48-0.3-default #1 SMP 2010-09-20 11:03:26 -0400 x86_64 x86_64 x86_64 GNU/Linux

我还尝试添加一些谷歌结果中所述的动态链接。

> ld -o ctest -dynamic-linker /lib64/ld-linux.so.2 /usr/lib64/crt1.o /usr/lib64/crti.o ctest.o -lc /usr/lib64/crtn.o

但错误仍然存​​在。

意见和建议表示赞赏。

编辑:我犯了一个错误,我的 linux 机器中不存在 /lib64/ld-linux.so.2。我应该使用 /lib64/ld-2.9.so。不知道 ld 不报告指定不存在的库文件的错误。

4

2 回答 2

2

您应该链接 using-dynamic-linker /lib/ld-linux-x86-64.so.2而不是/lib64/ld-linux.so.2which 用于 32 位。

/lib64 $ file -L ld*
ld-linux.so.2:        ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped
ld-linux-x86-64.so.2: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, stripped

总而言之,这对我有用:

$ gcc -S ctest.c
$ as -o ctest.o ctest.s
$ ld -o ctest -dynamic-linker /lib/ld-linux-x86-64.so.2 /usr/lib64/crt1.o /usr/lib64/crti.o ctest.o -lc /usr/lib64/crtn.o

如果这仍然不起作用,请遵循@nm 的建议并检查gcc -v -o ctest ctest.c.

于 2011-08-23T08:32:41.637 回答
1

-dynamic-linker对我有用,但我有一个 32 位系统。

运行gcc -v -o ctest ctest.o并查看输出的最后一行。尝试将其作为命令运行。如果可行,请开始简化它,丢弃部分直到它不再起作用。然后扔掉更多的部分,等等。这就是我如何得出一个有效的命令。

您也可以直接使用gcc -o ctest ctest.o

于 2011-08-23T08:00:19.127 回答