我在 ARM 的汇编器中创建了一个小模块,以与我的裸机嵌入式应用程序链接在一起。有时,当我重建应用程序时,我会收到“错误 [Lp002]:重定位失败:值超出范围或非法”。更令人费解的是,我在注释掉 C 模块中的一些代码后出现了错误。
IAR 手册对“重新排序部分或代码”含糊不清。但是查看编译器从我的 .c 文件生成的汇编器文件,我发现它们的部分声明与我的没有区别。实际上,我通过在 C 中将代码存根然后接管组装文件来开始我的代码。
每当我遇到一些神秘的链接器/编译器错误时,我都会执行 Rebuild All。大约有一半的时间可以修复它。我的猜测是某些模块应该已经重新编译,但没有。
祝你好运。
我找到了导致问题的原因,以及如何实施可接受的解决方法。在我的汇编源代码中,我有一个数据部分和一个代码部分,而链接器将它们放置得太远了。我现在已经将我的变量移动到代码部分(无论如何都放置在 RAM 中,因为它需要在我写入内部闪存时在中断上下文中运行),现在我让它正确链接。
这是剩下的问题:如何告诉链接器将某个部分彼此靠近?
查看编译器的文档。通常,有一个关于链接器命令文件的部分,它完全符合您的要求。