能否用dl_iterate_phdr监控exec进程?获取execl启动进程基址可行吗?
你的方案完全不可行,原因如下:
首先得搞懂execl的本质——它是替换当前进程整个地址空间的系统调用。一旦execl调用成功,你当前程序的所有代码(包括main、callback函数)、数据段都会被新程序(这里是/usr/bin/ls)的镜像彻底覆盖,程序会直接跳转到ls的入口点执行,原来的代码再也不会跑了。
你代码里的dl_iterate_phdr(callback, NULL)是在调用execl之前执行的,它只能获取当前这个测试程序自身的加载基址,和即将启动的ls进程半毛钱关系都没有。你担心的“回调被覆盖引发竞态”其实是伪问题——根本不存在竞态,execl成功后原来的回调函数直接就没了,连执行的机会都没有。
如果要获取execl启动的新进程的基址,你得换思路:
- 用
fork+exec+ptrace组合:先fork子进程,子进程调用execl,父进程通过ptrace附加到子进程,读取它的内存映射信息(比如解析/proc/[子进程pid]/maps文件,或者用ptrace读取子进程的ELF头获取基址)。 - 如果你能修改目标程序,可以让目标程序启动时自己调用
dl_iterate_phdr输出基址,但系统自带的ls显然没法改,所以第一种方法更通用。
内容的提问来源于stack exchange,提问作者Har
相关产品推荐
相关产品推荐

