2013-06-06 5 views
14

Я действительно пытаюсь понять шаги из кода высокого уровня -> исполняемый файл .. но у меня есть некоторые трудности.Что происходит в __libc_start_main?

Я написал пустой файл int main() {} и пытаюсь расшифровать разборку с помощью objdump -d. Вот что происходит:

  • в _start, настроить выравнивание, поместить аргументы в стек, вызовите __libc_start_main
  • в __libc_start_main, первая линия, чтобы выполнить это jmp *0x8049658

Однако при использовании objdump -R в проверьте записи переезда, значение в 0x8049658 равно __libc_start_main!

я что-то здесь не хватает ..

редактировать: вот некоторые из источника;

080482c0 <[email protected]>: 
80482c0:  ff 25 58 96 04 08  jmp *0x8049658 
80482c6:  68 08 00 00 00   push $0x8 
80482cb:  e9 d0 ff ff ff   jmp 80482a0 <_init+0x2c> 

Disassembly of section .text: 

080482d0 <_start>: 
80482d0:  31 ed     xor %ebp,%ebp 
80482d2:  5e      pop %esi 
80482d3:  89 e1     mov %esp,%ecx 
80482d5:  83 e4 f0    and $0xfffffff0,%esp 
80482d8:  50      push %eax 
80482d9:  54      push %esp 
80482da:  52      push %edx 
80482db:  68 50 84 04 08   push $0x8048450 
80482e0:  68 e0 83 04 08   push $0x80483e0 
80482e5:  51      push %ecx 
80482e6:  56      push %esi 
80482e7:  68 d0 83 04 08   push $0x80483d0 
80482ec:  e8 cf ff ff ff   call 80482c0 <[email protected]> 
80482f1:  f4      hlt 
80482f2:  66 90     xchg %ax,%ax 



DYNAMIC RELOCATION RECORDS 
OFFSET TYPE    VALUE 
08049644 R_386_GLOB_DAT __gmon_start__ 
08049654 R_386_JUMP_SLOT __gmon_start__ 
08049658 R_386_JUMP_SLOT __libc_start_main 
+0

Также вы можете опубликовать полный код сборки, на который вы ссылаетесь? Это облегчит нашу жизнь. –

+1

Что произойдет, если вы пройдете сборку с помощью отладчика? Возможно, динамический компоновщик перезаписывает значение в ячейке памяти 0x8049658, поэтому к моменту, когда программа попадает в инструкцию 'jmp * 0x8049658', она переходит к любому значению, полученному там во время выполнения. –

+0

@AdamRosenfield Я не на 100%, как это сделать. Я знаю, как настроить gdb для выполнения моего кода на C, но не знаю, как это сделать для сборки: S – gone

ответ

8

Первый блок, который заканчивается в "@plt", это таблица связи процедура (https://stackoverflow.com/a/5469334/994153). jmp *0x8049658 является инструкцией о непрямой ветви, поэтому на самом деле она прыгает на __libc_start_main, где бы она ни была Фактически заканчивается загрузкой в ​​ОЗУ во время выполнения.

Реальный адрес RAM __libc_start_main находится в таблице DYNAMIC RELOCATION RECORDS, которая создается в ОЗУ динамическим загрузчиком при загрузке программы.

+0

Это на самом деле разрешается при первом вызове в эти дни, это сообщение в блоге показывает, как можно наблюдать динамический компоновщик, работающий во время выполнения http: //dustin.schultz. io/how-is-glibc -load-at-runtime.html – falstaff

+0

^Это называется «ленивая загрузка» для тех, кто ищет по ключевому слову. – sherrellbc

Смежные вопросы