我尝试使用vxWorks函数loadModule将代码文件加载到内存中,它给了我错误:
Relocation value does not fit in 24 bits
我尝试在编译器中添加-mlongcall
标志,但它不起作用。
答案 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映像似乎可以解决问题。