I'm attempting to manually load the hexdump of an elf file that I compiled using g++ into a processor simulation I designed. There are 30 sections to a standard elf file and I am loading all 3开发者_高级运维0 segments with their proper memory location offset taken into account. I then start my program counter at the beginning of the .text
section (00400130) but it seems that the program isn't running correctly. I have verified my processor design relatively thoroughly using SPIM as a gold standard. The strange thing is that, if I load an assembly file into SPIM, and then take the disassembled .text
and .data
sections that are generated by the software, load them into my processor's memory, the programs work. This is different from what I want to do because I want to:
- write a c++ program
- compile it using mipseb-linux-g++ (cross compiler)
- hex dump all sections into their own file
- read files and load contents into processor "memory"
- run program
Where in the ELF file should I place my program counter initially? I have it at the beginning of .text
right now. Also, do I only need to include .text
and .data
for my program to work correctly? What am I doing wrong here?
The ELF header should include the entry address, which is not necessarily the same as the first address in the .text
region. Use objdump -f
to see what the entry point of the file is -- it'll be called the "start address".
The format is described here - you should be using the program headers
rather than the section headers
for loading the ELF image into memory (I doubt that there are 30 program headers), and the entry point will be described by the e_entry
field in the ELF header.
Use the e_entry field of the ELF header to determine where to set the Program Counter.
Look into Elf32_Ehdr.e_entry
(or Elf64_Ehdr.e_entry
if you are on 64-bit platform). You should at least also include the .bss
section, which is empty, but has "in-memory" size in the disk ELF image.
Wikipedia will lead you to all necessary documentation.
Edit:
Here's from objdump -h /usr/bin/vim
on my current box:
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
Note the File off
is the same for both .bss
and .comment
, which means .bss
is empty in the disk file, but should be 0x9628
bytes in memory.
精彩评论