gpt4 book ai didi

linux - 在调用/lib/ld-linux.so.2 中的 _start 函数之前发生了什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:46:27 28 4
gpt4 key购买 nike

我发现程序的入口点是我机器上的动态链接器/lib/ld-linux-so.2。

enter image description here

readelf -h /lib/ld-linux.so.2 |grep Entry 
Entry point address: 0x11d0

实际上入口点是0xb7fdf1d0。部分上下文信息如下。

gdb-peda$ context_code
[-------------------------------------code-------------------------------------]
0xb7fdf1c3: ret
0xb7fdf1c4: lea esi,[esi+0x0]
0xb7fdf1ca: lea edi,[edi+0x0]
=> 0xb7fdf1d0 <_start>: mov eax,esp
0xb7fdf1d2 <_start+2>: call 0xb7fe2c80 <_dl_start>
0xb7fdf1d7 <_dl_start_user>: mov edi,eax
0xb7fdf1d9 <_dl_start_user+2>: call 0xb7fdf1c0
0xb7fdf1de <_dl_start_user+7>: add ebx,0x1fe16
gdb-peda$ bt
#0 0xb7fdf1d0 in _start () from /lib/ld-linux.so.2
gdb-peda$ i r esp
esp 0xbffff3e0 0xbffff3e0

enter image description here

但是此时栈已经初始化了,保存了程序的环境变量和args。那么谁在_start函数之前初始化了栈呢?

最佳答案

内核设置堆栈。

当内核处理动态加载程序的 exec 时,它会初始化一些跟踪虚拟内存映射和堆栈位置的数据结构。在 fs/exec.c堆栈位置已设置。

当调度程序将控制权交给这个新进程时,它会将堆栈指针的值设置为相应的值。

关于linux - 在调用/lib/ld-linux.so.2 中的 _start 函数之前发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36637209/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com