我正在为MCU v10.6 IDE
开发一个CodeWarrior项目。它是恩智浦基于Eclipse的IDE。该项目针对恩智浦的K21 SoC(恰好是MK21FN1M0M12
,其中嵌入了cortex-m4
,armv7-m
)。
CodeWarrior配置为使用ARM工具链。
我遇到了与拇指交互相关的崩溃。此功能由IDE启用,无法停用。
由于armv7-m
仅支持thumb2,因此首先使用拇指互通似乎没有意义。但我可能在这里遗漏了一些东西。
所有代码都在拇指指令中正确生成。
通过指针进行间接函数调用时遇到麻烦。功能代码在链接阶段获得奇数地址,这是正常的(这表示它是拇指代码)。但是,当通过指针调用它时,会生成BLX指令(我想链接器会将原始BL更新为BLX)并且函数指针的值保持均匀!由于指针的值是偶数,因此跳转指示内核切换到ARM模式。因此崩溃。
我认为链接器将BL升级为BLX,因为激活了拇指互通功能。在MCU v10.6
的CodeWarrior上,这是强制的,我无法禁用它。我被告知这是工具“处理器所需”,无法单击相关复选框(Properties->C/C++ Build->Settings
,ARM CPU。处理器设置为"cortex-m4"
)。
我不明白为什么,因为这是armv7-m
。而且它似乎让我陷入困境。我想我在这里错过了一些东西。
你能帮我理解发生了什么和/或告诉我是否有办法禁用CodeWarrior上的拇指互通?
谢谢和最诚挚的问候,
皮尔
答案 0 :(得分:1)
@Notliket这是对的,我的问题有点像XY问题。
我的问题源于使用GCC构建的库,CodeWarrior配置为使用飞思卡尔的工具链(ARM工具)。
LSB 不设置的函数指针来自其中一个库,并由CodeWarrior在链接阶段进行了评估。 由于链接器正确地将这些库中的每个函数放在奇数地址,我猜测它应该错过一些信息来检测错误指针实际上是一个函数指针。
长话短说,事实证明图书馆被剥离了,尤其是--strip-unneeded
标志。我删除了那个标志,链接器做得很好!