ELF文件格式

时间:2010-06-23 13:53:52

标签: c++ compiler-construction simulation elf spim

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

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

我应该在ELF文件中最初放置程序计数器的位置?我现在在.text的开头有它。另外,我是否只需要包含.text.data以使我的程序正常运行?我在这里做错了什么?

3 个答案:

答案 0 :(得分:5)

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

格式描述为here - 你应该使用program headers而不是section headers将ELF图像加载到内存中(我怀疑有30个程序头),并且入口点将由ELF标题中的e_entry字段描述。

答案 1 :(得分:1)

使用ELF标头的e_entry字段确定程序计数器的设置位置。

答案 2 :(得分:1)

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

维基百科将带您到所有necessary documentation

编辑:

这是我当前方框中的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的{​​{1}}相同,这意味着.comment在磁盘文件中为空,但应为.bss字节在记忆中。