链接期间如何替换pthread_create

eup*_*upp 5 c linux multithreading posix

我想维护所有正在运行的线程的列表,以及有关每个线程的一些其他信息。在此答案中提到可以提供我自己的pthread_create版本并与其链接程序。我想在其覆盖版本的末尾调用原始pthread_create也很重要。

有人可以详细解释如何完成和/或提供一些代码示例吗?

Ctx*_*Ctx 5

您可以通过调用以下命令查找原始pthread_create-function的符号:

pthread_create_orig = dlsym(RTLD_NEXT, "pthread_create");
Run Code Online (Sandbox Code Playgroud)

包装器将如下所示:

#include <dlfcn.h>

int (*pthread_create_orig)(pthread_t *, const pthread_attr_t *, void *(*) (void *), void *);

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start) (void *), void *arg) {
       if (!pthread_create_orig)
           pthread_create_orig = dlsym(RTLD_NEXT, "pthread_create");
       return pthread_create_orig(thread, attr, start, arg);
}
Run Code Online (Sandbox Code Playgroud)

将其编译为共享库,并在启动可执行文件时将其预加载。

说明:通常,的第一个参数dlsym()是使用打开的库的句柄dlopen()。特殊句柄RTLD_NEXT用于搜索该符号的下一个出现,即默认情况下不会链接的那个。那么,这就是libpthread中的符号,而不是预加载库中的符号。