3

我正在尝试将我使用 g++ 编译的 elf 文件的 hexdump 手动加载到我设计的处理器模拟中。一个标准的 elf 文件有 30 个部分,我正在加载所有 30 个段,并考虑到它们的正确内存位置偏移量。然后我在部分 (00400130) 的开头启动我的程序计数器,.text但似乎程序运行不正确。我已经使用 SPIM 作为黄金标准,相对彻底地验证了我的处理器设计。奇怪的是,如果我将一个程序集文件加载到 SPIM 中,然后将软件生成的反汇编文件.text.data部分加载到我的处理器内存中,程序就可以工作。这与我想做的不同,因为我想:

  • 编写一个c++程序
  • 使用 mipseb-linux-g++ 编译它(交叉编译器)
  • 十六进制将所有部分转储到自己的文件中
  • 读取文件并将内容加载到处理器“内存”中
  • 运行程序

我最初应该在 ELF 文件中的哪个位置放置程序计数器?我现在一开始就有.text。另外,我是否只需要包含.text.data让我的程序正常工作?我在这里做错了什么?

4

3 回答 3

5

ELF 标头应包含入口地址,该入口地址不一定与.text区域中的第一个地址相同。用于objdump -f查看文件的入口点是什么——它将被称为“起始地址”。

此处描述了格式- 您应该使用program headers而不是section headers用于将 ELF 图像加载到内存中(我怀疑有 30 个程序头),并且入口点将由e_entryELF 头中的字段描述。

于 2010-06-23T13:59:35.120 回答
1

使用 ELF 头的 e_entry 字段来确定在哪里设置程序计数器。

于 2010-06-23T14:01:29.677 回答
1

查看Elf32_Ehdr.e_entry(或者Elf64_Ehdr.e_entry如果您在 64 位平台上)。您至少还应该包括该.bss部分,该部分是空的,但在磁盘 ELF 映像中具有“内存中”大小。

维基百科将引导您找到所有必要的文档

编辑:

这是objdump -h /usr/bin/vim我目前的盒子:

Sections:
Idx Name         Size      VMA               LMA               File off  Algn
...
22 .bss          00009628  00000000006df760  00000000006df760  001df760  2**5
                 ALLOC
23 .comment      00000bc8  0000000000000000  0000000000000000  001df760  2**0
                 CONTENTS, READONLY

注意 和File off是相同的.bss.comment这意味着.bss在磁盘文件中是空的,但在内存中应该是0x9628字节。

于 2010-06-23T14:02:29.537 回答