我正在尝试将使用 g++ 编译的 elf 文件的 hexdump 手动加载到我设计的处理器模拟中。一个标准的 elf 文件有 30 个部分,我正在加载所有 30 个部分,并考虑到它们的正确内存位置偏移。然后,我在 .text
部分 (00400130) 的开头启动我的程序计数器,但程序似乎没有正确运行。我已经使用 SPIM 作为黄金标准相对彻底地验证了我的处理器设计。奇怪的是,如果我将汇编文件加载到 SPIM 中,然后将软件生成的反汇编的 .text
和 .data
部分加载到我处理器的内存,程序运行。这与我想做的不同,因为我想:
- 写一个c++程序
- 使用mipseb-linux-g++(交叉编译器)编译
- hex 将所有部分转储到它们自己的文件中
- 读取文件并将内容加载到处理器“内存”
- 运行程序
我应该在 ELF 文件的什么地方放置我的程序计数器?我现在把它放在 .text
的开头。另外,我是否只需要包含 .text
和 .data
就可以让我的程序正常工作?我在这里做错了什么?
最佳答案
ELF 头应该包含入口地址,该地址不一定与.text
区域中的首地址相同。使用 objdump -f
查看文件的入口点是什么 -- 它将被称为“起始地址”。
格式描述here - 你应该使用 program headers
而不是 section headers
将 ELF 图像加载到内存中(我怀疑有 30 个程序头),入口点将由 ELF header 中的 e_entry
字段描述。
关于c++ - Sprite 文件格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3102232/