Отправная точка исполняемого файла ELF?

Я собираю следующую программу на C на Lubuntu 12.10 с Anjuta

int main()
{
return 0;
}

имя файла foobar

тогда я открываю терминал и пишу команду

ndisasm foobar -b 32 1>asm.txt

(дизассемблируйте foobar с 32-битной командой и сохраните дизассемблированный результат в asm.txt)

Я открываю asm.txt, там много 0x0000 и непонятного кода.

Инструкция jg 0x47(0x7F45) on 0x00000000 and dec esp(0x4C) on 0x00000002 Кажется, ELF формат файла подпись. (потому что шестнадцатеричный код 0x454c46 это "ELF" в ascii)

Linux может загрузить этот код в память и не переходить к 0x00000000, потому что исполняемый код отсутствует.

У меня есть вопросы здесь.

  1. как узнать адрес начального адреса?
  2. какой код можно игнорировать?(может быть, многие 0x0000 можно игнорировать, но что еще?)

1 ответ

Решение

Даже для самой простой программы, как ваша, gcc связывает некоторые библиотеки и некоторые объектные файлы (особенно crt0.o который называет ваш main и содержит _start, отправная точка ELF). И ваш двоичный файл, вероятно, динамически связан с некоторыми libc.so.6 так нужен динамический компоновщик (используйте ldd foobar выяснить). использование gcc -v чтобы понять, что gcc делается. И у objdump есть много интересных флагов или опций.

Вы также можете прочитать руководство по сборке, соглашения о вызовах X86, этот вопрос, ABI X86-64, эти заметки по программированию X86-64 и т. Д.

Другие вопросы по тегам