我正在使用Codesourcerys GCC arm EABI编译器编译Beagleboard(ARM Cortex A8)的baremetal软件(无OS)。现在编译成一个二进制文件或图像文件,我可以使用U-Boot引导程序加载。将HEX数据加载到内存中
问题是,我可以在运行时动态加载hexdata到内存(这样我可以加载其他图像文件到内存中)?我可以使用gcc objcopy来生成一个hexdump的软件。我可以使用这些信息并将其加载到适当的地址吗?请按照链接器脚本中的说明正确加载.text .data .bss段的所有地址?通过
$(OBJCOPY) build/$(EXE).elf -O binary build/$(EXE).bin
od -t x4 build/$(EXE).bin > build/$(EXE).bin.hex
外观产生
的hexdata输出是这样的:
0000000 e321f0d3 e3a00000 e59f1078 e59f2078
0000020 e4810004 e1510002 3afffffc e59f006c
0000040 e3c0001f e321f0d2 e1a0d000 e2400a01
0000060 e321f0d1 e1a0d000 e2400a01 e321f0d7
...等等。
是否只需将每行20个字节加载到所需的内存地址,并且只需将PC分支到正确的地址即可工作?我忘了什么吗?
我有点期待的是,随着连接器脚本我有过所有的部分应设完全控制。 Uboot使用loady命令为我加载这个文件。然而,我不知道如何加载我的软件后,在运行时加载另一个二进制文件的内容。只是阅读二进制文件的所有内容并将其加载到特定地址将不会工作,因为我从您的答案中了解到。猜猜我必须阅读一些精灵文件才能知道如何解析它! THx – MrGigu 2012-03-18 22:05:16
如果你想让你的程序加载其他程序,是的,你需要制作一个加载程序。我建议intel hex格式首先或motorola srec,与objcopy -O ihex或-O srec,ascii格式,易于解析,并没有-O二元问题。 http://github.com/dwelch67我可能在模拟器中有多个intel十六进制解析器(再次超级简单)。请注意,对于每个目标类型的长度和地址定义以及ihex的末端更改,我不知道我为amber_samples做了什么,这基本上是arm,可能是ihex。 – 2012-03-18 22:36:14
Thx,intel hex格式解决了问题!只需要转换数据的末端并将其解析为内存! – MrGigu 2012-03-20 19:53:13