gpt4 book ai didi

c++ - LD_PRELOAD 应该加载模块还是只使用模块来替换符号

转载 作者:太空宇宙 更新时间:2023-11-04 11:30:11 24 4
gpt4 key购买 nike

我们有一个在嵌入式 powerpc 上运行的用 g++ 编译的多线程 c++ 应用程序。为了在持续集成测试中对此进行内存泄漏测试,我们创建了一个使用 ld_preload 加载的堆分析器。

我们想保证 ld_preloaded 模块中的函数在任何其他事情发生之前被调用(包括创建静态对象等)。更重要的是,我们希望在进程退出之前调用另一个函数,以便堆分析器可以输出结果。我们看到的问题是,在我们的 ld_preloaded 模块中发生任何事情之前,我们的应用程序中的一个 vector 是在全局文件范围内创建的。 vector 在 main 中增长。在关闭时,我们的预加载模块中的 destructor 函数在 vector 被销毁之前被调用。

有什么方法可以让我们编写一个预加载模块来在其他任何事情之前和之后运行一个函数?我们尝试使用 __attribute__((constructor))destructor 但没有成功。

回到问题标题,我开始怀疑 ld 在为后续模块加载解析符号时只查看预加载模块。它实际上并不首先加载预加载模块。任何人都可以为我们阐明这一点吗?

最佳答案

最初,您无法控制来自不同翻译单元的构造函数的顺序。因此,这也扩展到共享库。

但是,较新版本的 GCC 支持将优先级参数应用于 constructor 属性,这应该允许您控制指定的函数何时相对于其他全局函数运行构造函数。未指定时的默认优先级是最大优先级值。因此,您设置的任何低于该优先级的优先级都应该使您的构造函数在它们之前运行,而您的析构函数在它们之后运行。

static int initialize () __attribute__((constructor(101)));
static int deinitialize () __attribute__((destructor(101)));

static int initialize () {
puts("initialized");
}

static int deinitialize () {
puts("deinitialized");
}

101 似乎是允许指定的最低优先级。 65535 是最高的。较小的数字首先执行。

关于c++ - LD_PRELOAD 应该加载模块还是只使用模块来替换符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11803439/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com