Формат файла ELF - PullRequest
       15

Формат файла ELF

3 голосов
/ 23 июня 2010

Я пытаюсь вручную загрузить hexdump файла эльфа, который я скомпилировал с помощью g ++, в разработанную мной имитацию процессора.В стандартном эльфийском файле 30 разделов, и я загружаю все 30 сегментов с учетом их правильного смещения в памяти.Затем я запускаю счетчик программ в начале раздела .text (00400130), но кажется, что программа работает неправильно.Я довольно тщательно проверил дизайн своего процессора, используя SPIM в качестве золотого стандарта.Странно то, что, если я загружаю файл сборки в SPIM, а затем беру разобранные секции .text и .data, сгенерированные программным обеспечением, загружаю их в память моего процессора, программы работают.Это отличается от того, что я хочу сделать, потому что я хочу:

  • написать программу на c ++
  • скомпилировать ее, используя mipseb-linux-g ++ (кросс-компилятор)
  • шестнадцатеричный дамп всех разделов в их собственный файл
  • чтение файлов и загрузка содержимого в «память» процессора
  • запуск программы

Где в файле ELF я должен разместитьмой счетчик программ изначально?У меня есть это в начале .text прямо сейчас.Кроме того, мне нужно только включить .text и .data, чтобы моя программа работала правильно?Что я тут не так делаю?

Ответы [ 3 ]

5 голосов
/ 23 июня 2010

Заголовок ELF должен включать в себя адрес входа, который не обязательно совпадает с первым адресом в области .text. Используйте objdump -f, чтобы увидеть, какова точка входа в файл - он будет называться «начальный адрес».

Формат описан здесь - вы должны использовать program headers вместо section headers для загрузки изображения ELF в память (я сомневаюсь, что имеется 30 заголовков программы) и запись точка будет описана полем e_entry в заголовке ELF.

1 голос
/ 23 июня 2010

Посмотрите на Elf32_Ehdr.e_entry (или Elf64_Ehdr.e_entry, если вы на 64-битной платформе). Вы должны также хотя бы включить раздел .bss, который является пустым, но имеет размер «в памяти» в образе ELF диска.

Википедия приведет вас ко всей необходимой документации .

Edit:

Вот с 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 байт в памяти.

1 голос
/ 23 июня 2010

Используйте поле e_entry заголовка ELF, чтобы определить, где установить счетчик программ.

...