可能重复:
LD_PRELOAD是否可以使用不同参数的函数?
我有一个结构,我们称之为my_struct,声明如下.
struct my_struct
{
int a;
int b;
}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,我想为它添加一个新字段,所以我想按如下方式更改它.
struct my_struct
{
int a;
int b;
int c;
}
Run Code Online (Sandbox Code Playgroud)
假设我在我的共享对象库中执行此操作,然后我将LD_PRELOAD运行该程序.我的程序会使用第二个定义还是原始定义.
Mik*_*wan 10
不,原始代码不会使用新定义.想象一下如果它做了什么以及必须改变什么.首先,my_struct
堆上的每个都必须扩展为包含新字段.这可能意味着必须调整数据部分的大小,并且所有向前移动的数据都需要重新定位其引用.sizeof struct my_struct
,在编译时进行评估,然后与新定义不一致.这些只是使你想做的事情变得不可能的几个原因(至少在你尝试的方式).
根据旧定义编译和链接的原始代码将继续使用旧代码my_struct
.您的共享对象中的任何新代码都将被编译并使用新定义,因此将具有一个c
字段.
一旦编译了原始程序,它就不知道任何事情my_struct
.该信息仅供编译器用于生成访问结构成员的偏移量,并允许它知道如何将其放置在内存中.信息仍然可以以符号的形式提供,但这不会影响定义的获取方式.与功能解析不同,结构的代码/数据生成和解析严格地是编译时操作.
归档时间: |
|
查看次数: |
166 次 |
最近记录: |