重定位值不适合24位

时间:2011-09-11 13:07:52

标签: c++ gnu vxworks

我尝试使用vxWorks函数loadModule将代码文件加载到内存中,它给了我错误:

Relocation value does not fit in 24 bits

我尝试在编译器中添加-mlongcall标志,但它不起作用。

3 个答案:

答案 0 :(得分:3)

在使用PowerPC架构之前,我已经看到了这个错误。假设您在类似的环境中工作,问题必须特别针对系统中的内存量和相对分支指令的范围。

阿贡国家实验室有一个webpage detailing their experiences with the same issue。以下摘录解释了相对分支寻址的问题:

  

PowerPC相对分支指令仅限于跳转   当前指令的+/- 32MB(24位= +/- 4M指令,每指令4个字节= +/- 32MB)。不幸的是vxWorks内核   被放入RAM的底端,但它加载所有应用程序代码   在最高端。如果两者相隔超过32MB(你应该   当它尝试加载应用程序时,在板上有64MB或更多)   编码那些使用这些相对分支指令的调用   vxWorks例程无法在24位和解析器中解析   打印您正在看到的消息。

在Argonne国家实验室,针对此问题的建议修复方法是重新编译已加载的模块并启用-mlongcall标记。

您的初始问题表明此标志不是您问题的解决方法。已设置gnu标志,但未列出编译器的更多信息。鉴于我只能建议您检查编译器文档并验证-mlongcall标志是否有效。

假设支持该标志,这可能是由链接库引起的,该链本身本身并未使用-mlongcall标志进行编译。 ComplexIT上的一篇文章详细介绍了使用QT的PowerPC架构中的类似问题。为了解决该问题,需要重建所有库,包括QT。

答案 1 :(得分:3)

如果要使用 -mlongcall ,请确保将 Active Build Spec 的编译器设置为GNU。请记住,WindRiver还提供了Diab编译器,它恰好是他们的专有编译器。如果要使用Diab编译器,则该编译器的等效标志为:

<强> -xcode-绝对远

如果您正在使用Workbench,您可以通过在Project Explorer子窗口中右键单击项目然后选择

来查看您正在使用的编译器(如果您愿意,可以更改它)。

属性 - &gt; 构建属性 - &gt; 构建支持和规范

在该对话框中,您将看到(通常在底部)一个名为 Active Build Spec 的下拉菜单按钮。选择所需的体系结构 - 编译器组合。

如果找不到所需的体系结构 - 编译器组合,则很可能在创建项目时没有选择它,或者它没有随您购买的pkg VxWorks一起提供。

答案 2 :(得分:0)

-mlongcall标志用于GNU C编译器。 Windriver Diab不支持此功能,启用_Xcode-absolute-far不能解决我的问题,而是将库链接到VxWorks映像似乎可以解决问题。