2009-02-05 9 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选项。