可以使用LD_PRELOAD更改结构吗?

时间:2012-06-03 17:31:23

标签: c linux gcc

  

可能重复:
  Is it possible to LD_PRELOAD a function with different parameters?

我有一个结构,我们称之为 my_struct ,声明如下。

struct my_struct
{
 int a;
 int b;
}

出于某种原因,我想为它添加一个新字段,所以我想按如下方式更改它。

struct my_struct
{
 int a;
 int b;
 int c;
}

假设我在我的共享对象库中执行此操作,然后我将LD_PRELOAD运行该程序。我的程序会使用第二个定义还是原始定义。

1 个答案:

答案 0 :(得分:10)

不,原始代码不会使用新定义。想象一下如果它做了什么以及必须改变什么。首先,堆上的每个my_struct都必须扩展为包含新字段。这可能意味着必须调整数据部分的大小,并且所有向前移动的数据都需要重新定位其引用。在编译时评估的sizeof struct my_struct将与新定义不一致。这些只是使你想做的事情变得不可能的几个原因(至少在你尝试的方式)。

根据旧定义编译和链接的原始代码将继续使用旧的my_struct。您的共享对象中的任何新代码都将被编译并使用新定义,因此将具有c字段。

编译完原始程序后,它对my_struct一无所知。该信息仅供编译器用于生成访问结构成员的偏移量,并允许它知道如何将其放置在内存中。信息仍然可以以符号的形式提供,但这不会影响定义的获取方式。与功能解析不同,结构的代码/数据生成和解析严格来说是编译时操作。