gcc - (arm-none-eabi-gcc) 从引导加载程序 + 2 x 固件镜像创建 .elf 二进制文件

标签 gcc arm clion elf openocd

我正在使用 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/

相关文章:

c++ - GCC轮流实现

gcc - 将 RVCT 库与 GCC 链接

rep_movsl 的 Clobber 列表

c++ - 为什么警告要实现指向字符串的指针数组?

c - 裸机 ARM Raspberry Pi + qemu 具有浮点除法的奇怪行为

c - 使用 arm-none-eabi-gcc 编译 hello world 程序 C 时出错

c - 如何禁用 CLion 中代码导航的函数重载检测?

c++ - CLion (C++) - 无匹配函数

windows - Windows上CLion的Rust标准库位置的路径是什么?

c - GCC 优化掉无法优化的 if 子句