Я действительно пытаюсь понять шаги из кода высокого уровня -> исполняемый файл .. но у меня есть некоторые трудности.Что происходит в __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
Также вы можете опубликовать полный код сборки, на который вы ссылаетесь? Это облегчит нашу жизнь. –
Что произойдет, если вы пройдете сборку с помощью отладчика? Возможно, динамический компоновщик перезаписывает значение в ячейке памяти 0x8049658, поэтому к моменту, когда программа попадает в инструкцию 'jmp * 0x8049658', она переходит к любому значению, полученному там во время выполнения. –
@AdamRosenfield Я не на 100%, как это сделать. Я знаю, как настроить gdb для выполнения моего кода на C, но не знаю, как это сделать для сборки: S – gone