我们有一个用嵌入式powerpc上运行的g ++编译的多线程c ++应用程序。对于内存泄漏测试,我们在持续集成测试中创建了一个加载ld_preload
的堆分析器。
我们希望保证ld_preloaded
模块中的函数在发生任何其他事件之前被调用(包括创建静态对象等...)。更重要的是,我们希望在进程退出之前调用另一个函数,以便堆分析器可以输出其结果。我们看到的问题是,在我们的ld_preloaded
模块中发生任何事情之前,我们的应用程序中的向量是在全局文件范围内创建的。向量在main中增长。在关闭时,在向量被销毁之前调用预加载模块中的destructor
函数。
有没有什么方法可以编写预加载的模块来在其他任何事情之前运行一个函数?我们已尝试使用__attribute__((constructor))
和destructor
但未成功。
回到问题标题,我开始怀疑ld
只在解析后续模块加载的符号时才会查看预加载的模块。它实际上并不首先加载预加载的模块。任何人都可以为我们阐明这一点吗?
答案 0 :(得分: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
是最高的。首先执行较低的数字。