0

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

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

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

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

4

1 回答 1

1

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

但是,较新版本的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是最高的。较低的数字首先执行。

于 2012-08-04T00:08:14.873 回答