2011-08-23 45 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的輸出。

相關問題