Pthread库初始化

时间:2012-03-23 03:15:45

标签: linux pthreads glibc

我使用dlopen和dlsym创建了围绕pthread函数的包装器,以便调试和分析我的应用程序中发生的一些问题。分析器通过所有单元测试。不幸的是,似乎我绕过了一些库初始化,因为getenv现在为所有输入返回null。如果我删除了探查器,getenv的正确操作将返回。

我认为问题是编译器没有在Libpthread中链接,因为它在链接时没有看到从库请求的任何符号。我查看了glib源代码,但是没有找到一个明显的运行时初始化函数,我可以用dlsym加载和执行。

我已经进入getenv并发现__environ = null并且编译了覆盖。但是,environ包含正确的值。删除分析器后,__ environ具有适当的变量。

此外,getenv似乎与Ubuntu 10.04上的pthread覆盖一起使用glibc 2.11。不幸的是,由于现有的产品分发,升级不是一个吸引人的选择。

Linux 2.6.31 Glib 2.5

我的初始代码:

inline int init_pthreads_debugger(void)
{
    static int recursion=0;
    if(!real_pthread_create)
    {
        // we know that we are single threaded here, because we override pthread_create and
        // call this function. Therefore, recursion does not have to be guarded.
        if(recursion)
        {
            return 0;
        }
        recursion = 1;

        init_heap();

        void * handle = dlopen("libpthread.so.0",RTLD_NOW);

        real_pthread_cond_timedwait   =(real_pthread_cond_timedwait_t)dlsym(handle,"pthread_cond_timedwait");

            // more pthread initialization functions here.

        //do me last to make sure any recursion in dlsym/dlopen is caught
        real_pthread_create           =(real_pthread_create_t)dlsym(handle,"pthread_create");

        recursion = 0;
    }
    return 1;
}

//an example override
int   pthread_cond_timedwait(pthread_cond_t *c, pthread_mutex_t * m, const struct timespec * t)
{
    if(!init_pthreads_debugger()) return 0; //no thread, no sync needed.
    int ret;
    int condition_count;  
    ptd_note_unblock((void *)m,&condition_count);
    ret=real_pthread_cond_timedwait(c,m,t);
    ptd_note_block((void *)m,&condition_count);
    return ret;
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

  

我使用dlopen和dlsym

创建了围绕pthread函数的包装器

我怀疑您正在尝试构建一个类似于this one的库插入器。

这种方法非常一般不会对pthread函数成功,因为dlopendlsym本身都会调用pthread_mutex_lockpthread_mutex_unlock(和动态装载机本身一样。)