Отправная точка исполняемого файла 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, потому что исполняемый код отсутствует.
У меня есть вопросы здесь.
- как узнать адрес начального адреса?
- какой код можно игнорировать?(может быть, многие 0x0000 можно игнорировать, но что еще?)
1 ответ
Даже для самой простой программы, как ваша, gcc
связывает некоторые библиотеки и некоторые объектные файлы (особенно crt0.o
который называет ваш main
и содержит _start
, отправная точка ELF). И ваш двоичный файл, вероятно, динамически связан с некоторыми libc.so.6
так нужен динамический компоновщик (используйте ldd foobar
выяснить). использование gcc -v
чтобы понять, что gcc
делается. И у objdump есть много интересных флагов или опций.
Вы также можете прочитать руководство по сборке, соглашения о вызовах X86, этот вопрос, ABI X86-64, эти заметки по программированию X86-64 и т. Д.