我正在使用 CLion 开发 STM32F429,并尝试从三个 .elf 文件创建合并的 .elf 文件。 合并的 .elf 文件的布局应如下所示:
- Bootloader.elf(最大 256K,但大小可能有所不同)
- FirmwareImage.elf(始终为 384K,填满为第一个固件镜像分配的空间)
- FirmwareImage.elf(始终为 384K,填充为第二个固件镜像分配的空间)
这使得总共 1M。
我尝试将 .elf 文件转换为 .bin(使用 arm-none-eabi-objcopy),并使用我编写的自定义工具创建 1M .bin 文件。我可以确认创建的 .bin 的布局是正确的。 然后,我将生成的 .bin 文件转换回 .elf:
arm-none-eabi-objcopy -I binary -O elf32-little --change-section-address .data=0x08000000 in.bin out.elf
数据部分地址的变化是为了反射(reflect)STM32F429中闪存的启动。
当我尝试使用 openocd 刷新此文件时,失败并显示:
Error: invalid ELF file, no program headers
有没有办法跳过 .elfs -> .bin -> .elf 转换并直接从 .elfs -> .elf 转换?或者,插入程序头?我怀疑这些在闪烁过程中是否实际使用过。
我知道我可以通过指定闪存地址来告诉 openocd 直接使用生成的 .bin 文件。但 CLion 不会让 openocd 从其 Arm 嵌入式插件中刷新 .bin 文件,而只允许 .elf 文件。
编辑: 目前我正在使用 these链接器脚本,改编自ST官方链接器脚本。他们身上发生了很多事情。 我也许只能使用单个链接器脚本来实现此目的。我可以有以下代码:
extern "C" __attribute__((__section__(".bootloader"))) void runBootloader()
{
Platform platform;
DFUBootloader bootloader(platform);
}
extern "C" __attribute__((__section__(".image1"))) void runApplication1()
{
Platform platform;
Application application(platform);
}
extern "C" __attribute__((__section__(".image2"))) void runApplication2()
{
Platform platform;
Application application(platform);
}
如果这些链接器将这些符号放置在正确的位置,那么它们使用的符号最终也会放置在正确的位置吗?必须复制固件镜像才能填充两个固件页面,因此应用程序使用的所有符号也必须复制。
最佳答案
看起来以我描述的方式合并多个 .elf 文件是不可能的,或者至少不是很简单。
我已经找到了解决我的问题的方法。尽管 CLion 无法让 openocd 刷新 .bin 文件(其内置 openocd 启动命令使用 .elf),但可以轻松创建自定义 CMake 目标,使用以下命令刷新合并的 .bin:
openocd -f board/stm32f429discovery.cfg -c "program merged_image.bin exit 0x08000000"
关于gcc - (arm-none-eabi-gcc) 从引导加载程序 + 2 x 固件镜像创建 .elf 二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60975745/