2011-08-23 96 views
2

我试图在x86_64平台上用“gcc -S” - >“as” - >“ld”编译一个简化的C源文件。x86_64“gcc -S” - > as - > ld - >执行失败

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

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 

但是错误依然存在。

意见和建议表示赞赏。

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

回答

1

-dynamic-linker适合我,但我有一个32位系统。

运行gcc -v -o ctest ctest.o并查看输出的最后一行。尝试将它作为命令运行。如果可行的话,开始简化它,扔掉零件直到它不再起作用。然后扔掉一些零件等。这就是我到达一个有效的命令的方式。

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

+0

感谢您的回复,-dynamic-linker现在适合我。请参阅我的问题中的编辑。 – ning

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 

如果仍然无法正常工作并关注@牛米的建议。并检查gcc -v -o ctest ctest.c的输出。

相关问题