2009-02-05 37 views
3

鏈接時出現這些錯誤,這兩個消息都與相同的目標文件有關。C/C++鏈接器在xxxxx處的CALL16 reloc不符合全局符號

CALL16 reloc at 0x5f8 not against global symbol 

could not read symbols: Bad value 

第二屆信息似乎是,我發現了CALL16錯誤的原因,但該文件編譯就好了。

修復此問題的任何提示?

僅供參考,我的目標MIPS交叉編譯和使用gcc 4.1.2

編輯:至今沒有運氣:
這裏使用我的標誌: -fPIC,輪候冊, - rpath的,輪候冊,-O1

我也嘗試沒有成功如下:
-mno-顯式relocs
-mexplicit-relocs
-mlong通話
-mno-長呼籲
-mxgot
-mno-xgot


同時,我會在這一點回到源和調查等等。

+0

添加一些您使用的編譯器標誌。看起來你鏈接錯誤的文件或生成的對象有一些不同的標誌。 – INS 2009-02-05 20:14:44

回答

2

啊哈! 感謝我的一位同事,我們發現了這個問題。

這是問題:

有一個函數的前置聲明/原型。

void FooBarIsBest(void); 

後來在文件中定義了函數。

static void FooBarIsBest(void) 
{ 
    // do the best 
} 

這裏的問題是,在原型中關鍵字static被省略了。所以它就像是一個全新的功能正在被定義。

gcc使用CALL16引用來重定位代碼。該文件的彙編代碼顯示CALL16正在使用該函數......這是錯誤的,因爲這個函數是本地的。

有趣的是,這段代碼用於編譯&鏈接,只適用於舊版本的gcc(3.2.2)。 另一個灰燼記者瞭解到。 :)

+0

好'趕上'同事' – 2009-02-07 16:40:31

1

Try -mlong-calls標誌給編譯器。

另請參閱manual瞭解更多具體MIPS選項。