我正在阅读http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup.html并尝试手动验证。
_start的反汇编如下:
080482e0 <_start>: 80482e0: 31 ed xor %ebp,%ebp
80482e2: 5e pop %esi
80482e3: 89 e1 mov %esp,%ecx
80482e5: 83 e4 f0 and $0xfffffff0,%esp
80482e8: 50 push %eax
80482e9: 54 push %esp
80482ea: 52 push %edx
80482eb: 68 00 84 04 08 push $0x8048400
80482f0: 68 a0 83 04 08 push $0x80483a0
80482f5: 51 push %ecx 80482f6: 56 push %esi
80482f7: 68 94 83 04 08 push $0x8048394
80482fc: e8 c3 ff ff ff call 80482c4 <__libc_start_main@plt>
8048301: f4 hlt
但是我自己的反汇编如下:
0x00000000004003c0 <+0>: xor ebp,ebp
0x00000000004003c2 <+2>: mov r9,rdx
0x00000000004003c5 <+5>: pop rsi
0x00000000004003c6 <+6>: mov rdx,rsp
0x00000000004003c9 <+9>: and rsp,0xfffffffffffffff0
0x00000000004003cd <+13>: push rax
0x00000000004003ce <+14>: push rsp
0x00000000004003cf <+15>: mov r8,0x400650
0x00000000004003d6 <+22>: mov rcx,0x4005c0
0x00000000004003dd <+29>: mov rdi,0x40051c
0x00000000004003e4 <+36>: call 0x4003b0 <__libc_start_main@plt>
0x00000000004003e9 <+41>: hlt
0x00000000004003ea <+42>: nop
0x00000000004003eb <+43>: nop
所以我的问题只是在第一次反汇编中推入堆栈的 __libc_start_main 的参数发生了什么?
我的文件是“ELF 64 位 LSB 可执行文件,x86-64,版本 1 (SYSV),动态链接(使用共享库),未剥离。” 即动态链接为http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup.html中的文件也是如此。
这是因为我的系统是 64 位的,而链接中使用的系统是 32 位的吗?__libc_start_main 的定义是否改变了?