que*_*en3 9 c++ linux gcc shared-libraries static-initialization
这里的答案表明,静态初始化后不调用__attribute __((构造函数)),它在声明顺序中调用.
那么,如果在初始化所有数据时不能保证调用它的目的是什么呢?我们也可以在Foo构造函数中使用我们的((构造函数)代码.
我正在寻找的是一种在共享库中拥有一个代码的方法,该代码将在初始化所有静态数据并调用静态构造函数之后执行.我看到人们推荐__attribute __((构造函数))作为DllMain的替代品; 我们可以看到这是错误的,因为某些静态数据可能仍未初始化.
当然在单个文件(编译单元)中我们可以安排静态.但在典型的程序中有很多文件.在初始化共享库中的所有其他静态之后,有没有办法保证一个文件中的((构造函数))肯定会被调用?
如果我将一个带有静态初始化(构造函数,对象等)的文件放到gcc命令行的末尾:
g++ -shared -fPIC source1.o source2.o MyLastInitChance.o
Run Code Online (Sandbox Code Playgroud)
这个文件的静态构造函数是否保证最后被调用?我试验过,当我改变源文件的顺序时,printfs的顺序改变了; 但它是否在某处指定并保证在编译系统/计算机上相同?
例如,引用:
在链接时,gcc驱动程序在所有可重定位文件之前立即放置crtbegin.o,在所有可重定位文件之后立即放置crtend.o.©
根据我的理解,上面的引用暗示传递给链接器的.o文件的顺序定义了静态初始化的顺序.我对么?
另一个有趣的解决方案可能是编写一个GCC插件来调整静态初始化(例如将代码添加到.ctors部分等).但这只是一个可能有人可以扩展的想法.
这里介绍了另一种可能的解决方案.简而言之,可以使用外部构建后工具来重新排序可执行文件(库)中的.ctors条目.但我不是ELF格式的专家; 我想知道这是否可行且容易以这种方式调整.so文件.
我感兴趣的是解决一个特定的问题,或证明它是不可能解决的(至少为什么上面的解决方案不起作用).
j_k*_*bik 13
您可以尝试使用链接描述文件ld.你可以在这里阅读更多相关内容,但我猜你正在寻找的是
.ctors : { *(SORT(.ctors)) MyLastInitChance.o(SORT(.ctors)) }
.dtors : { *(SORT(.dtors)) MyLastInitChance.o(SORT(.dtors)) }
Run Code Online (Sandbox Code Playgroud)
在SECTIONS{...}街区.这应该重新排列.ctors部分,因此提供的文件将把它的构造函数称为最后一个.显然,如果你发现自己需要一个更先进的解决方案;)
提示:编写自己的链接脚本很繁琐.使用打印出已用链接脚本并修改它ld的--verbose选项.然后使用-T开关添加链接脚本.
| 归档时间: |
|
| 查看次数: |
5309 次 |
| 最近记录: |