【问题标题】:C/C++ linker CALL16 reloc at xxxxx not against global symbolC/C++ 链接器 CALL16 在 xxxxx 重定位不针对全局符号
【发布时间】:2009-02-05 19:37:04
【问题描述】:

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

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


同时,我将在这一点上回到源头并进行更多调查。

【问题讨论】:

  • 添加更多您使用的编译器标志。您似乎链接到错误的文件或生成的对象有一些不同的标志。

标签: c++ c embedded linker mips


【解决方案1】:

啊哈! 感谢我的一位同事,我们找到了问题所在。

这就是问题所在:

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

void FooBarIsBest(void);

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

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

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

gcc 将 CALL16 引用用于可重定位代码。该文件的汇编代码显示此函数正在使用 CALL16...这是错误的,因为此函数是本地函数。

有趣的是,这段代码用于编译和链接旧版本的 gcc (3.2.2)。 又一个教训了。 :)

【讨论】:

    【解决方案2】:

    尝试向编译器添加 -mlong-calls 标志。

    另请参阅manual 了解更具体的 MIPS 选项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      • 2015-09-19
      • 1970-01-01
      • 2013-04-15
      相关资源
      最近更新 更多