【问题标题】:What is the easiest way to add a field to a structure in a shared library?将字段添加到共享库中的结构的最简单方法是什么?
【发布时间】:2012-06-03 18:14:43
【问题描述】:

我想在pthread_mutex_t 结构中添加一个新字段。为此目的更改pthread.h 头文件是否足够?但我想这不是一个好主意,因为那样我会篡改编译器附带的头文件。

还有哪些其他方法可以做到这一点?

我这样做是因为我正在 LD_PRELOADing pthread_mutex_lock 并且我的自定义 pthread_mutex_lock 需要在 pthread_mutex_t 中添加一个额外的字段。当然我可以编写代码以便使用pthread_mutex_t 以外的结构,但我不希望用户修改其程序。

【问题讨论】:

标签: c linux gcc


【解决方案1】:

如果不重新编译可能依赖它的所有内容,就无法扩展pthread_mutex_t 结构。这意味着您的所有系统库、第三方库和您的应用程序。根本没有办法解决这个问题。

您能解释一下您这样做是为了解决什么实际问题吗?这可能会让某人给你一个可以接受的答案。

【讨论】:

    【解决方案2】:

    这是一个长镜头。但是您可以执行以下操作:

    struct my_pthread_mutex_t {
       pthread_mutex_t mutex;
       ...
       /* insert fields here */
       ...
    };
    

    这应该允许您为pthread_mutex_tmy_pthread_mutex_t 使用相同的地址。因此,如果一个函数知道这个hack(也就是说,如果结构声明在范围内),您可以强制转换为 my_pthread_mutex_t,否则您可以使用与简单 pthread_mutex_t 相同的东西。

    这样扩展结构的好处是,您不必重新编译任何代码,也不会冒着为合法使用pthread_mutex_t的其他程序搞砸事情的风险

    【讨论】:

    • 问题是 OP 想要 replace 使用 LD_PRELOAD 的标准函数,然后 OP 的替换函数将使用指向(标准大小)pthread_mutex_t 对象的指针调用没有足够的空间容纳额外的字段,替换代码将破坏相邻的内存。
    猜你喜欢
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 2019-10-09
    • 2017-09-03
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多