您可以使用 LD_PRELOAD 更改结构吗

标签 c linux gcc

<分区>

Possible Duplicate:
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 来运行该程序。我的程序会使用第二个定义还是原始定义。

最佳答案

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

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

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

关于您可以使用 LD_PRELOAD 更改结构吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10872449/

相关文章:

c - 列出来自 GDB 的可调用函数

linux - 在 unzip 命令中使用带有 "*"的路径

gcc - 使用 gccgo 构建 Go - fork/exec 没有这样的文件或目录

ubuntu - 在 Ubuntu 上链接 libusb 不起作用

c - 奇怪的 C fprintf 格式符号

需要最少样板的 C 跨平台 RPC?

linux - 我无法在终端上使用 sed 正确替换字符串

linux - 节头列表指向哪个字符串表?

c - 未定义对 `shm_open' 的引用,即使在使用 -pthread -lrt 进行编译时也是如此

c - 如何将程序的控制台输出存储在文本文件中?