我想得到一个进程的基址,我用execl调用这个进程,如下面的代码所示。
这种方法有意义吗?
# include <stdio.h>
# define __USE_GNU
# include <link.h>
int callback(struct dl_phdr_info *info, size_t size, void *data)
{
printf("name: '%s' base:'%lu'\n", info->dlpi_name, info->dlpi_addr);
return 0;
}
int main()
{
dl_iterate_phdr(callback, NULL);
execl("/usr/bin/ls", "ls", NULL);
}
我担心的是,由于它是回调函数,当调用execl时,它会被擦除。因此,会有一个关于调用多少回调函数的竞争条件。
1条答案
按热度按时间epggiuax1#
我想得到一个进程的基址,我用excel调用,如下面的代码。
下面的代码将不起作用--
dl_iterate_phdr()
只能检查它在其中运行的进程。当execl()
开始运行新的二进制文件时,* 当前进程的所有痕迹 * 都消失了,并被新的二进制文件替换。我担心的是,由于它是回调函数,当调用execl时,它会被擦除。因此,会有一个关于调用多少回调函数的竞争条件。
你的担心是多余的:
dl_iterate_ohdr()
是一个 * 同步 * 函数。它 * 在 * 到达execl
之前 * 完成 *(并执行对callback
的所有调用)。监控
execl
d进程的唯一方法是在它上面使用ptrace
(就像调试器和strace
一样)。