linux - `execve()` 是否设置寄存器来调用动态链接器或要执行的可执行文件?
问题描述
了解 Linux 内核说明每个对象的execve()
调用,以及load_binary()
linux_binfmt
load_binary()
调用 start_thread( ) 宏来修改保存在内核模式堆栈上的用户模式寄存器 eip 和 esp 的值,使它们分别指向动态链接器的入口点和新用户模式堆栈的顶部。
发生的情况是内核安排
execve
系统调用,在返回到用户模式时,将 IP(指令指针)寄存器设置为指向函数的开头_start
,并将 SP(堆栈指针)寄存器设置为指向函数的开头。 argv + env 字符串列表的开头,所以从用户模式的角度来看,效果就像有人调用了_start
函数一样:_start(argc, argv0, argv1, ... , NULL, env0, env1, ... NULL)
在所有参数都在堆栈上传递的调用约定中。
“函数的开头_start
”是指要 执行的可执行文件的入口点吗?
哪一个是正确的?即是否execve()
设置寄存器来调用动态链接器或要执行的可执行文件?
解决方案
_start 是可执行文件的入口点。在 C 中你可能认为 main 是入口点,但这只是程序员的观点。编译器可能会在 _start 中插入其他代码,以便在调用 main 之前运行。
我的解释是,您问题中描述的所有内容都发生在调用_start(或似乎调用_start)之前。
推荐阅读
- reactjs - 如何在 react-id-swiper 中将初始活动幻灯片设置为不同的索引?
- javascript - 跨域调用中显示了哪些 HTTP 标头?
- html - 可折叠导航问题
- sharepoint - sharepoint 占位符底部不刷新
- database - 如何为每个客户的产品创建单独的定价?
- java - 我怎样才能获得一个班级的所有班级?
- amazon-web-services - 如何从 Cloudwatch 事件规则将环境变量和值传递给代码构建?
- python - 如何使用画布显示窗口调整 Tkinter 小部件的大小?
- javascript - 线性渐变不适用于在 javascript 中调用函数的 rgb 值
- node.js - 只允许通过 nginx 和 docker 访问 express 应用