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

Can thumb interwork be deactivated on CW 10.6 with ARM toolchain?

我正在使用 CodeWarrior 为 MCU v10.6 IDE 开发一个项目。它是 NXP 的基于 IDE 的 Eclipse。该项目针对 NXP 的 K21 SoC(准确地说是 MK21FN1M0M12,其中嵌入了 cortex-m4armv7-m)。 CodeWarrior 配置为使用 ARM 工具链。

我 运行 陷入了与拇指交互相关的崩溃。此功能由 IDE 启用且无法停用。

由于armv7-m只支持thumb2,使用thumb-interwork一开始似乎没有意义。但我可能在这里遗漏了一些东西。 所有代码都在拇指指令中正确生成。

我在通过指针进行间接函数调用时遇到了麻烦。函数代码在link阶段得到一个奇数地址,这没问题(这表明它是拇指代码)。但是,当通过指针调用它时,会生成一条 BLX 指令(我想 linker 在这里将原始 BL 更新为 BLX)并且函数指针的值保持不变!由于指针的值为偶数,跳转指示内核切换到 ARM 模式。因此崩溃。

我认为 linker 将 BL 升级为 BLX 是因为激活了拇指交互功能。在 MCU v10.6 的 CodeWarrior 上,这是强制的,我无法禁用它。工具告诉我这是"required for processor",无法点击相关复选框(Properties->C/C++ Build->Settings,ARM CPU。处理器设置为"cortex-m4")。

我不明白为什么,因为这是 armv7-m。而且它似乎让我陷入麻烦。我想我在这里遗漏了一些东西。

你能帮我理解这是怎么回事吗and/or告诉我是否有办法在 CodeWarrior 上禁用拇指交互?

谢谢并致以最诚挚的问候,

皮埃尔

@Notlikethat 说的对,我的问题有点 XY 问题。

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

设置了 LSB not 的函数指针来自其中一个库,在 link 阶段由 CodeWarrior 赋值。 由于 linker 正确地将这些库中的每个函数都放在奇数地址,我猜它应该会遗漏一些信息来检测错误的指针实际上是一个函数指针。

长话短说,原来是库被剥离了,尤其是带有 --strip-unneeded 标志的库。我删除了那个标志,linker 做得很完美!