Что происходит в __libc_start_main? - программирование
Подтвердить что ты не робот

Что происходит в __libc_start_main?

Я действительно пытаюсь понять шаги из кода высокого уровня → исполняемый файл.. но у меня есть некоторые трудности.

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

  • в _start, настройте выравнивание, нажмите аргументы на стек, вызовите __libc_start_main
  • в __libc_start_main, первая строка для выполнения - jmp *0x8049658

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

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

edit: здесь часть источника;

 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
4b9b3361

Ответ 1

Первый блок, заканчивающийся на "@plt", является таблицей связей процедуры (fooobar.com/info/111764/...). jmp *0x8049658 является инструкцией о непрямой ветки, поэтому она фактически перескакивает на __libc_start_main везде, где она фактически заканчивается загрузкой в ​​ОЗУ во время выполнения.

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