我在链接时遇到这些错误,这两个消息都与同一个目标文件有关。
CALL16 reloc at 0x5f8 not against global symbol
和
could not read symbols: Bad value
第二条消息似乎是我收到CALL16错误的原因,但文件编译得很好。
有关修复此问题的任何提示吗?
仅供参考,我正在为MIPS目标进行交叉编译并使用gcc 4.1.2
编辑:到目前为止没有运气:
这是我使用的标志:
-fPIC,-Wl,-rpath,-Wl,-O1
我也试过以下但没有成功:
-mno-explicit-relocs
-mexplicit-relocs
-mlong-calls
-mno-long-calls
-mxgot
-mno-xgot
与此同时,我将在此时回到源头并进行更多调查。
答案 0 :(得分:3)
啊哈! 感谢我的同事,我们发现了这个问题。
问题在于:
有一个函数的前向声明/原型。
void FooBarIsBest(void);
稍后在文件中定义了该函数。
static void FooBarIsBest(void)
{
// do the best
}
这里的问题是,在原型中,关键字static被遗漏了。所以就像定义了一个全新的功能一样。
gcc使用CALL16引用来获取可重定位代码。该文件的汇编代码显示该函数正在使用CALL16 ...这是错误的,因为这个函数是本地的。
有趣的是,这段代码用于编译&与旧版本的gcc(3.2.2)链接得很好。 另一个淡化了。 :)
答案 1 :(得分:1)
尝试-mlong-calls标志到编译器。
另请参阅manual了解更具体的MIPS选项。