2

可能重复:
是否可以 LD_PRELOAD 使用不同参数的函数?

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

struct my_struct
{
 int a;
 int b;
}

出于某种原因,我想为其添加一个新字段,因此我想对其进行如下更改。

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

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

4

1 回答 1

10

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

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

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

于 2012-06-03T17:32:22.073 回答