使用arm-none-eabi-objcopy将elf文件粘合在一起?

问题描述 投票:0回答:1

我正在开发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

数据段地址的更改是为了反映STM32F429中闪存的启动。

[当我尝试使用openocd刷新此文件时,它失败并显示:

Error: invalid ELF file, no program headers

是否有跳过.elfs-> .bin-> .elf转换并直接从.elfs-> .elf转换的方法?否则,插入程序头文件?我怀疑这些是在刷新过程中实际使用的。

我知道我可以通过指定闪存地址来告诉openocd直接使用生成的.bin文件。但是,由于我将Clion与嵌入式插件一起使用,因此在调用openocd时无法控制命令行。

编辑

:目前,我正在使用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);
}

如果这些链接器将这些符号放置在正确的位置,它们使用的符号是否还会在正确的位置结尾?必须复制固件映像以填满两个固件页面,因此应用程序使用的所有符号也必须复制。

我正在开发STM32F429,并尝试从三个.elf文件创建一个合并的.elf文件。合并的.elf文件的布局应如下所示:Bootloader.elf(最大256K,但是可以有所不同...

gcc arm clion elf openocd
1个回答
0
投票

恕我直言,您不应尝试合并.elf文件。一种实现您的目标的方法是使用一个简单的bash脚本,对此脚本进行修改:

© www.soinside.com 2019 - 2024. All rights reserved.