我有一个嵌入式微控制器在FPGA中的代码,其中包含存储在堆栈中的变量,我想从这些变量中分离代码,并将其放入2个ELF文件。最终的目标是将ELF文件转换为英特尔十六进制格式,并使用它们初始化2个不同的RAM。
最终的目标是拥有一个哈佛体系结构(即一个有数据存储器和程序本身存储器的体系结构)
现在我有一个makefile,它包含以下规则:
%.hex: %.elf
$(OBJCOPY) -j .data -O ihex $^ $@.data
$(OBJCOPY) --remove-section .data $^
$(OBJCOPY) -O ihex $^ $@
这里我创建一个ELF,然后将.data部分提取到一个单独的intelhex文件中。然后我从原始ELF中删除.data部分并将其转换为intel十六进制格式。我的问题是,这似乎是不正确的,因为删除部分从原来的精灵重新定位下一节在文件中的一个新的位置,我想这是不是我想要的。
2条答案
按热度按时间qv7cva1a1#
我有一个嵌入式微控制器在FPGA中的代码,其中包含存储在堆栈中的变量,我想从这些变量中分离代码,并将其放入2个ELF文件。
放置在堆栈上的变量是在运行时分配的,你不能在elf文件中将它们分开。
此外,
.data
可能在elf文件中没有物理存在(只有关于位置和大小的信息)。如果代码从非易失性存储器(如FLASH)运行,则启动代码将数据从FLASH复制到.data
段所在的位置。这看起来像是一个X-Y问题。
kknvjkwl2#
您需要使用的是一个链接器脚本(最好修改您正在使用的脚本),它允许您在ELF二进制文件中指示不同部分的位置。不要做链接器设计要做的事情。
阅读
ld(1)
命令信息文档(如果您使用的是GNU binutils),了解如何做到这一点。