我在链接时得到了这些错误,这两条消息都与同一个对象文件有关。
CALL16 reloc at 0x5f8 not against global symbol
和
could not read symbols: Bad value
第二条消息似乎是我获得CALL16错误的原因,但是文件编译得很好。
有什么解决办法吗?
FYI,我正在交叉编译一个MIPS目标,并使用gcc 4.1.2
编辑:到目前为止没有运气:
这里是我使用的旗帜:-fPIC,-Wl,-rpath,-Wl,-O1
我也尝试过以下几点,但都没有成功:
-mno-明确-重新定位
-明示-重新定位
-mlong-电话
-巫统-长途电话
-mxgot
-mno-xgot
同时,我将回到来源在这一点,并调查更多。
发布于 2009-02-07 15:47:14
啊哈!多亏了我的一位同事,我们发现了这个问题。
以下是问题所在:
有一个函数的前向声明/原型。
void FooBarIsBest(void);
稍后在文件中定义了函数。
static void FooBarIsBest(void)
{
// do the best
}
这里的问题是,在原型中,关键字静态被忽略了。这就像一个全新的函数正在被定义。
gcc使用CALL16引用作为可重定位代码。该文件的汇编代码显示,在此函数上使用了CALL16 .这是错误的,因为这个函数是本地的。
有趣的是,这段代码用于编译和链接gcc的旧版本(3.2.2)。另一个经验教训。:)
发布于 2009-02-05 20:29:58
尝试-mlong-调用标志到编译器。
更具体的MIPS选项,请参见手册。
https://stackoverflow.com/questions/517563
复制相似问题