C / C ++链接器CALL16在xxxxx处重定位而不是全局符号

我在链接时遇到这些错误,这两个消息都与同一个目标文件有关。

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-显式relocs
-mexplicit-relocs
-mlong通话
-mno长通话
-mxgot
-mno-xgot

与此同时,我将在此时回到源头并进行更多调查。

啊哈! 感谢我的同事,我们发现了这个问题。

这是问题所在:

有一个函数的前向声明/原型。

 void FooBarIsBest(void); 

稍后在文件中定义了该函数。

 static void FooBarIsBest(void) { // do the best } 

这里的问题是在原型中关键字static被遗漏了。 所以它就像定义了一个全新的function。

gcc使用CALL16引用来获取可重定位代码。 该文件的汇编代码显示该函数正在使用CALL16 …这是错误的,因为这个函数是本地的。

有趣的是,这段代码用于编译和链接与旧版本的gcc(3.2.2)。 另一个淡化了。 🙂

尝试-mlong-calls标志到编译器。

另请参阅手册以获取更具体的MIPS选项。