链接时出现这些错误,两条消息都与同一个目标文件有关。
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
-长通话
-mno长通话
-mxgot
-mno-xgot
同时,我现在将回到源头并进行更多调查。
最佳答案
啊哈!
感谢我的一位同事,我们找到了问题所在。
这是问题所在:
有一个函数的前向声明/原型(prototype)。
void FooBarIsBest(void);
稍后在文件中定义函数。
static void FooBarIsBest(void)
{
// do the best
}
这里的问题是在原型(prototype)中关键字static被忽略了。因此,这就像正在定义一个全新的功能。
gcc将CALL16引用用于可重定位的代码。该文件的汇编代码表明该函数正在使用CALL16 ...这是错误的,因为此函数是本地函数。
有趣的是,此代码用于编译和链接时可以与旧版本的gcc(3.2.2)很好地兼容。
另一个教训。 :)
关于c++ - C/C++链接程序CALL16重定位在xxxxx处,不针对全局符号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/517563/