2017-05-08 78 views
0

我知道這是一個非常基本的問題,但同時,我發現類似的問題,我沒有找到一個解決辦法...GCC -c和ld:EXEC沒有這樣的文件或目錄

我有這個同樣的問題簡單的程序:

#include <stdio.h> 

void main() 
{ 
    printf("Hi\n"); 
    fflush(stdout); 
} 

如果我用gcc main.c編譯,我沒有問題。

如果我編譯用gcc -c main.c中,然後用LD -o主main.o鏈接,我獲得錯誤未定義參考提出標準輸出fflush 。我在末尾添加了-lc,二進制文件僅在_start處創建了warnig,但是當我執行該程序時,它返回一個通用的「文件未找到」錯誤。 如果我沒看錯的問題是,連接器使用的libc.so.1不存在的相反,我認爲,libc.so.6的:與readelf -a主

[Requesting program interpreter: /usr/lib/libc.so.1] 

有誰知道什麼是錯的?這是一些環境/系統問題,或者我必須更改ld選項?怎麼樣?

謝謝你,對不起,「愚蠢」的問題......(和我可憐的「英語」)

編輯:「解決」(見下文),我想補充的形式獲得的新的ld選項GCC -v main.c中 [COLLECT_GCC_OPTIONS]我試圖在最小,以減少:

ld -o main main.o --hash-style=gnu --as-needed -dynamic-linker /lib/ld-linux.so.2 -z relro /usr/lib/gcc/i686-linux-gnu/5/../../../i386-linux-gnu/crt1.o /usr/lib/gcc/i686-linux-gnu/5/../../../i386-linux-gnu/crti.o /usr/lib/gcc/i686-linux-gnu/5/crtbegin.o -L/usr/lib/gcc/i686-linux-gnu/5 -L/usr/lib/gcc/i686-linux-gnu/5/../../../i386-linux-gnu -L/usr/lib/gcc/i686-linux-gnu/5/../../../../lib -L/lib/i386-linux-gnu -L/lib/../lib -L/usr/lib/i386-linux-gnu -L/usr/lib/../lib -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/i686-linux-gnu/5/crtend.o /usr/lib/gcc/i686-linux-gnu/5/../../../i386-linux-gnu/crtn.o 

EDIT2:啓動程序,我認爲分鐘是

ld -o main main.o --as-needed -dynamic-linker /lib/ld-linux.so.2 -lc 

它返回一個分段錯誤(我認爲錯過了鏈接到crt *)

+1

如果你讓'gcc'調用'ld',你會得到同樣的錯誤,也就是說,如果你用'gcc -o main main.o'鏈接會發生什麼? –

+0

不,如說我讓海灣合作委員會呼籲ld我沒有問題,對不起,我不得不更好地突出它 – user7707645

+0

這個答案幫助:http://stackoverflow.com/a/14418246/646887? –

回答

2

你不能只是鏈接一個目標文件並注意獲取一個可執行文件。您需要鏈接到定義目標文件所需符號的庫。由於任何C程序都需要一些啓動代碼來初始化main的argc和argv,因此您可能至少需要鏈接一個通常稱爲crt0.o的文件,可能還需要使用C標準庫。

這是相當重要的。如果使用gcc -v運行詳細編譯,則可以看到實際的鏈接命令。

+0

是的,謝謝你,我按照上面的建議,在查看gcc -v後解決了 – user7707645

相關問題