我正在尝试手动将使用g ++编译的elf文件的hexdump加载到我设计的处理器模拟中。标准elf文件有30个部分,我正在加载所有30个段,并考虑到它们正确的内存位置偏移。然后我在.text
部分(00400130)的开头启动我的程序计数器,但似乎程序运行不正常。我使用SPIM作为黄金标准,相对彻底地验证了我的处理器设计。奇怪的是,如果我将一个汇编文件加载到SPIM中,然后使用由软件生成的反汇编的.text
和.data
部分,将它们加载到我的处理器内存中,程序就可以运行。这与我想做的不同,因为我想:
我应该在ELF文件中最初放置程序计数器的位置?我现在在.text
的开头有它。另外,我是否只需要包含.text
和.data
以使我的程序正常运行?我在这里做错了什么?
答案 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
字节在记忆中。