В основном я использовал objdump -D
для разборки объектного файла и файла ELF. Основное различие, которое я вижу между ними, заключается в следующем.
Я вижу, что инструкции в объектном файле (отдельных сегментов) имеют адрес, начинающийся с 0. Следовательно, последовательные адреса смещены на определенное значение, вероятно, в зависимости от длины кода операции, соответствующего этой конкретной инструкции.
Disassembly of section .text:
00000000 <main>:
0: 8d 4c 24 04 lea 0x4(%esp),%ecx
4: 83 e4 f0 and $0xfffffff0,%esp
7: ff 71 fc pushl -0x4(%ecx)
a: 55 push %ebp
С другой стороны, для штрафа ELF я вижу 32-битное адресное пространство для инструкций. Также, если я печатаю адрес main
в своей программе. Он эквивалентен адресу в моем разобранном ELF.
08048394 <main>:
8048394: 8d 4c 24 04 lea 0x4(%esp),%ecx
8048398: 83 e4 f0 and $0xfffffff0,%esp
804839b: ff 71 fc pushl -0x4(%ecx)
804839e: 55 push %ebp
Вот вопросы.
- К чему на самом деле относятся адреса в файле ELF?
- Как компоновщик их вычисляет?