如何重新定位stm32的固件?

时间:2018-04-04 09:32:29

标签: linker arm stm32 elf relocation

我已经为stm32f4构建了固件,所以我有* .elf一个* .bin文件。如果我将* .bin文件加载到内部闪存中,它会正确运行。但是,如果我想将此固件加载到与默认值(0x08000000)不同的另一个地址并从我的引导程序运行它,当然它不起作用。我在项目设置中修复了内存区域地址(如果有问题,我使用CooCox 1.7.6),它开始从引导加载程序运行。

每次在独立模式下加载固件或使用bootloader时,我都不希望重建项目。所以我正在寻找允许我从* .elf生成* .bin文件的方法,它可以从不同的地址加载。

我尝试了manualy interupt矢量表修复。它允许我运行小的闪光灯项目,但它不适用于更复杂的项目。我一定错过了什么。

然后我尝试使用objcopy --change-addresses,但遗憾的是它不起作用。我得到的文件没有任何区别。

我认为,这是一个普遍的问题,并且有解决方案,但我必须遗漏一些重要的事情。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

您必须将代码编译为与位置无关的代码。请参阅gcc的-fpic和-fPIC选项。或者您需要一个能够理解ELF图像重定位表的加载器。

答案 1 :(得分:-1)

我认为这不会对你的情况有效,因为当你编译文件以使用启动加载程序运行时,你还需要确保中断向量也已经移动到新位置,否则会有一个执行某些功能时出现问题。

相关问题