我正在尝试生成可执行代码,其位于默认地址0x8000000之外,以用于引导目的。使用最新的STM32CubeIDE 1.11.2,但我猜这是一个工具链问题。
从链接脚本中,我只需将我的新起点放置在0x8003800处。
/* Memories definition */
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 144K
FLASH (rx) : ORIGIN = 0x8003800, LENGTH = 512K
}
编译完全正常,这是GCC版本
.\arm-none-eabi-gcc.exe -v
Using built-in specs.
COLLECT_GCC=W:\kit\prog\ST\toolchain\1.11.2\gcc\bin\arm-none-eabi-gcc.exe
COLLECT_LTO_WRAPPER=w:/kit/prog/st/toolchain/1.11.2/gcc/bin/../lib/gcc/arm-none-eabi/10.3.1/lto-wrapper.exe
Target: arm-none-eabi
Configured with: /build/gnu-tools-for-stm32_10.3-2021.10.20211105-1100/src/gcc/configure --build=x86_64-linux-gnu --host=x86_64-w64-mingw32 --target=arm-none-eabi --prefix=/build/gnu-tools-for-stm32_10.3-2021.10.20211105-1100/install-mingw --libexecdir=/build/gnu-tools-for-stm32_10.3-2021.10.20211105-1100/install-mingw/lib --infodir=/build/gnu-tools-for-stm32_10.3-2021.10.20211105-1100/install-mingw/share/doc/gcc-arm-none-eabi/info --mandir=/build/gnu-tools-for-stm32_10.3-2021.10.20211105-1100/install-mingw/share/doc/gcc-arm-none-eabi/man --htmldir=/build/gnu-tools-for-stm32_10.3-2021.10.20211105-1100/install-mingw/share/doc/gcc-arm-none-eabi/html --pdfdir=/build/gnu-tools-for-stm32_10.3-2021.10.20211105-1100/install-mingw/share/doc/gcc-arm-none-eabi/pdf --enable-languages=c,c++ --enable-mingw-wildcard --disable-decimal-float --disable-libffi --disable-libgomp --disable-libmudflap --disable-libquadmath --disable-libssp --disable-libstdcxx-pch --disable-nls --disable-shared --disable-threads --disable-tls --with-gnu-as --with-gnu-ld --with-headers=yes --with-newlib --with-python-dir=share/gcc-arm-none-eabi --with-sysroot=/build/gnu-tools-for-stm32_10.3-2021.10.20211105-1100/install-mingw/arm-none-eabi --with-libiconv-prefix=/build/gnu-tools-for-stm32_10.3-2021.10.20211105-1100/build-mingw/host-libs/usr --with-gmp=/build/gnu-tools-for-stm32_10.3-2021.10.20211105-1100/build-mingw/host-libs/usr --with-mpfr=/build/gnu-tools-for-stm32_10.3-2021.10.20211105-1100/build-mingw/host-libs/usr --with-mpc=/build/gnu-tools-for-stm32_10.3-2021.10.20211105-1100/build-mingw/host-libs/usr --with-isl=/build/gnu-tools-for-stm32_10.3-2021.10.20211105-1100/build-mingw/host-libs/usr --with-libelf=/build/gnu-tools-for-stm32_10.3-2021.10.20211105-1100/build-mingw/host-libs/usr --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-pkgversion='GNU Tools for STM32 10.3-2021.10.20211105-1100' --with-multilib-list=rmprofile,aprofile
Thread model: single
Supported LTO compression algorithms: zlib
gcc version 10.3.1 20210824 (release) (GNU Tools for STM32 10.3-2021.10.20211105-1100)
生成完整列表。
arm-none-eabi-objdump.exe -DCgxwtz myprog.elf > myprog.elf.asm
现在一切都很好,除了段(程序头)位于0x8000000而不是0x8003800。所有符号的地址都正确,可执行代码也正确,只有程序头是错误的(不是吗?)
为什么我怀疑是错的呢?
因为P_OFFSET = 0(ELF文件中的偏移量),P_ADDR = 0x8000000,P_FILESZ = 0x000039c4(ELF中的大小)。这意味着任何程序员都会尝试将其闪存到STM32微控制器的地址0x8000000,从ELF文件偏移量0加载,这是完全错误的(因为有ELF头)。
实际预期的程序将从0x8003800开始闪存,但在此地址之前,将从ELF文件中闪存垃圾。
现在我的问题是
我上面做错了什么吗?
如何生成一个位于其他地址的图像,可以在不覆盖现有其他图像(如引导加载程序)的情况下刷写。使用纯二进制内容?
感谢您的帮助/澄清。