这个值实际上应该是 main 与 _start 的偏移量,对吧?
错误的。您不能只是从 to 跳转_start
到main
-- 后者期望argc
和argv[]
参数,但还没有人设置它们。libc
初始化代码的工作是:
- 初始化 libc 本身,创建标准
FILE
句柄(stdout
等),设置环境等,以及
- 使用正确的参数调用
main
,并且
- 如果/当
main
返回时,安排程序exit(2)
使用正确的退出代码。
您所看到的实际上是对 的PLT
调用__libc_start_main
,它将执行上述所有操作,然后调用main
。您可以使用 来查看objdump -dr a.out
,它看起来类似于:
00000000004003d0 <_start>:
4003d0: 31 ed xor %ebp,%ebp
4003d2: 49 89 d1 mov %rdx,%r9
4003d5: 5e pop %rsi
4003d6: 48 89 e2 mov %rsp,%rdx
4003d9: 48 83 e4 f0 and $0xfffffffffffffff0,%rsp
4003dd: 50 push %rax
4003de: 54 push %rsp
4003df: 49 c7 c0 50 05 40 00 mov $0x400550,%r8
4003e6: 48 c7 c1 c0 04 40 00 mov $0x4004c0,%rcx
4003ed: 48 c7 c7 b4 04 40 00 mov $0x4004b4,%rdi
4003f4: e8 c7 ff ff ff callq 4003c0 <__libc_start_main@plt>
4003f9: f4 hlt
4003fa: 90 nop
4003fb: 90 nop
st_value 字段如何初始化?
您可以在此处阅读有关动态符号解析如何工作的实际详细信息(搜索“过程链接表”;请注意:很少有人真正了解它的详细工作原理)。