Linux 内核 6.1 上的pthread_create拦截

pthread_create interception on Linux Kernel 6.1

提问人:Victor 提问时间:6/26/2023 最后编辑:Victor 更新时间:6/27/2023 访问量:88

问:

我正在尝试使用 LD_PRELOAD 拦截对 pthread 库的调用。

我成功拦截了除 .我没有收到任何错误,拦截根本不会发生。pthread_mutex_initpthread_mutex_lockpthread_create

我的代码在内核 5.10 (glibc 2.31) 上运行,但一旦在内核 6.1 (glibc 2.36) 上运行,它就不再工作了。但是,我需要内核 6.1 来处理代码中的其他内容,因此降级不是一种选择。

内核 5.10 和 6.1(或 glibc 2.31 和 2.36)之间的pthread_create函数有什么变化吗?

我的代码:编译为共享库,然后使用 LD_PRELOAD 加载。

#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <pthread.h>
#include <stdio.h>

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                   void *(*start_routine)(void *), void *arg) {

    printf("[p] pthread_create\n");
    return 0
}

int pthread_mutex_init(pthread_mutex_t *mutex,
                       const pthread_mutexattr_t *attr) {
                        
    printf("[p] pthread_mutex_init\n");
    return 0
}

[p] pthread_mutex_init显示但未显示。[p] pthread_create

注意:我知道截获的二进制文件使用的事实。在内核 5.10 中使用相同的代码和相同的二进制文件被打印出来。pthread_create[p] pthread_create

c linux-kernel pthreads 拦截器 ld-preload

评论

4赞 user253751 6/26/2023
内核无关紧要,因为这将是一个轻浮的事情
0赞 Ted Lyngmo 6/26/2023
也许你可以编译(链接)然后实现?-Wl,--wrap=pthread_create__wrap_pthread_create
0赞 Andrew Henle 6/26/2023
什么?此外,您发布的实现很容易产生问题 - 它返回 ,表示成功,但不执行任何操作。它不会启动线程,也不会将从调用方传递的线程 ID 设置为任何值 - 这意味着如果调用线程尝试使用可能是未初始化的值,它可能会调用 UB。DEBUG_PTHREADpthread_create()0pthread_t
0赞 Victor 6/27/2023
@user253751 是的,可能我只是在描述我发现的东西。我在 6.1 上使用 glibc 2.36,在 5.10 上使用 glibc 2.31。
0赞 Victor 6/27/2023
@TedLyngmo 但pthread_create不是一个未定义的参考。如果我没记错的话,--wrap 想要一个未定义的符号,该符号将被解析为包装某些东西

答: 暂无答案