使用ARM工具链在CW 10.6上是否可以禁用拇指交互?

时间:2016-12-08 13:42:25

标签: assembly crash cortex-m thumb codewarrior

我正在为MCU v10.6 IDE开发一个CodeWarrior项目。它是恩智浦基于Eclipse的IDE。该项目针对恩智浦的K21 SoC(恰好是MK21FN1M0M12,其中嵌入了cortex-m4armv7-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上的拇指互通?

谢谢和最诚挚的问候,

皮尔

1 个答案:

答案 0 :(得分:1)

@Notliket这是对的,我的问题有点像XY问题。

我的问题源于使用GCC构建的库,CodeWarrior配置为使用飞思卡尔的工具链(ARM工具)。

LSB 设置的函数指针来自其中一个库,并由CodeWarrior在链接阶段进行了评估。 由于链接器正确地将这些库中的每个函数放在奇数地址,我猜测它应该错过一些信息来检测错误指针实际上是一个函数指针。

长话短说,事实证明图书​​馆被剥离了,尤其是--strip-unneeded标志。我删除了那个标志,链接器做得很好!