我正在尝试将使用g ++编译的elf文件的十六进制转储手动加载到我设计的处理器模拟器中。标准elf文件有30个部分,我正在加载所有30个段,并考虑它们的正确内存位置偏移量。然后,我将程序计数器启动在
.text
部分的开头(00400130),但似乎程序并没有正确运行。我已经相对彻底地使用SPIM作为黄金标准验证了我的处理器设计。奇怪的是,如果我将一个汇编文件加载到SPIM中,然后将软件生成的反汇编的 .text
和 .data
部分提取出来,将它们加载到我的处理器内存中,程序就可以正常运行。这与我的想法不同,因为我想要:
- 编写c ++程序
- 使用mipseb-linux-g ++(交叉编译器)进行编译
- 将所有部分的十六进制转储到各自的文件中
- 读取文件并将内容加载到处理器的“内存”中
- 运行程序
.text
的开头。此外,我只需要包含 .text
和 .data
,我的程序才能正常工作吗?我在这里做错了什么?
objcopy -S input output
可以去掉您不需要的所有链接器/调试信息,并生成一个与其输入参数 (input
) 格式相同的文件 (output
)。 - Aidan Cullyobjcopy -O binary -j .text input output.bin
),并将内存内容与(在这个例子中)output.bin
中的数据进行比较。 - Aidan Cully