我正在尝试通过“gcc -S”编译简化的C源文件 - > “as” - > x86_64平台上的“ld”。
该过程完成且没有错误,但在执行时,会显示“No such file or direcotry”错误消息。
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不报告指定的不存在的库文件的错误。
答案 0 :(得分:1)
-dynamic-linker
对我有用,但我有一个32位系统。
运行gcc -v -o ctest ctest.o
并查看输出的最后一行。尝试将其作为命令运行。如果可行的话,开始简化它,抛弃零件,直到它不再有效。然后扔出更多的零件,等等。这就是我到达一个有效的命令的方式。
您也可以使用gcc -o ctest ctest.o
代替。
答案 1 :(得分:1)
您应该使用-dynamic-linker /lib/ld-linux-x86-64.so.2
而不是/lib64/ld-linux.so.2
进行链接,这是针对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
如果仍然无效,请遵循@n.m的建议。并检查gcc -v -o ctest ctest.c
的输出。