2015-09-23 147 views
0

我的目的是使用我自己的鏈接器腳本鏈接兩個代碼,爲此,我創建了一個簡單的鏈接器腳本(所有來自互聯網的幫助) 這是我的鏈接器腳本, link.lds「ld:找不到lc -ERROR

SECTIONS 
{ 
    . = 0x10000; 
    .text : { *(.text) } 
    . = 0x8000000; 
    .data : { *(.data) } 
    .bss : { *(.bss) } 
} 

和我的兩個簡單的C代碼如下。 1)l1.c

#include<stdio.h> 
extern int a; 
int main() 
{ 
printf("%d",a); 
return 0; 
} 

AND 2)l2.c

int a=111; 

,我使用的命令有:

gcc -c l1.c l2.c 
ld -o output -T link.lds l1.o l2.o -lc 

執行上述步驟之後,我會遇到以下錯誤:

ld:cannot find lc 

上刪除LC,

undefined reference to printf(). 

我也使用-L /目錄名稱這把我帶回到民主基金參考printf的錯誤嘗試。

我可以得到一些幫助和指導... PS-我意識到我可能已經在概念上錯誤和/或可能不知道正確的鏈接器執行順序/工作。 同樣的任何幫助將不勝感激。 非常感謝!

+2

這是一些學習GNU ld的練習嗎?如果沒有,只需使用'gcc'進行鏈接,它會爲你做所有的「髒活」。 –

+0

你爲什麼需要自定義腳本?如果目標是簡單地將兩個對象鏈接到可執行文件中,則不需要鏈接器腳本。 -lc錯誤意味着您的libc.a無法在鏈接器搜索路徑中找到。你知道你的系統在哪裏嗎? – SergeyA

+0

我編輯了這個問題。我故意要爲更大的問題語句使用自定義鏈接器腳本。另外,我找到libc.a的路徑,嘗試使用-L/-l添加它,但徒勞無功,它仍會提示「對printf()的未定義引用」錯誤。 –

回答

1

既然你是直接調用ld,沒有默認庫或默認的庫搜索路徑 提供的,因爲他們是,如果ld是間接由gcc工具驅動 以通常的方式調用。

所以還有告訴ld明確鏈接libc-lc),你必須明確 告訴它在哪裏可以找到libc,使用-L選項。 (看來你 認爲L<path>替代-l<libname>,它不是。)

因此找出libc.so位於您的系統上。你可以這樣做:(注意,不是--print-file-name-libc.so有一個在@牛米的評論錯字)

realpath $(gcc --print-file-name libc.so) 

假設它是/usr/lib/x86_64-linux-gnu/libc.so,因爲我的系統上。然後運行:

ld -o output -T link.lds l1.o l2.o -L/usr/lib/x86_64-linux-gnu -lc 

這將解決您的問題(但不一定是其他任何人)的問題。

+0

你好邁克,忙於其他模塊,現在回到這個模塊。它仍然會提示相同的錯誤。任何解決方案相同?我完全按照你的建議做了。 –

+0

@ArjunJain你的失敗命令是什麼? –

+0

它是一樣的。 ld:找不到lc –