链接时出现这些错误,两条消息都与同一个目标文件有关。

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/

10-11 05:31