显示程序中静态C++对象的初始化顺序
Display initialization order of static C++ objects in a program?
我正在尝试获取对象转储,以打印静态C++对象的构造顺序。我为标头找到了-h
,但似乎无法获得objdump。
在没有init_priority
的情况下编译的程序
$ objdump -h cryptest.exe
cryptest.exe: file format elf64-x86-64
Sections:
Idx Name Size VMA LMA File off Algn
0 .interp 0000001c 0000000000400238 0000000000400238 00000238 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
1 .note.ABI-tag 00000020 0000000000400254 0000000000400254 00000254 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
...
10 .init 0000001a 000000000040efd8 000000000040efd8 0000efd8 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
...
用init_priority
编译的程序
$ objdump -h cryptest.exe
cryptest.exe: file format elf64-x86-64
Sections:
Idx Name Size VMA LMA File off Algn
0 .interp 0000001c 0000000000400238 0000000000400238 00000238 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
1 .note.ABI-tag 00000020 0000000000400254 0000000000400254 00000254 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
...
10 .init 0000001a 000000000040efd8 000000000040efd8 0000efd8 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
...
19 .init_array 000000a8 00000000008e4008 00000000008e4008 002e4008 2**3
CONTENTS, ALLOC, LOAD, DATA
我很确定我的下一步是检查.init
和.init_array
,但我似乎无法获得对象转储:
$ objdump -d .init cryptest.exe
objdump: '.init': No such file
cryptest.exe: file format elf64-x86-64
...
如何在编译的程序中显示静态C++对象的初始化顺序?
从如何验证C++静态对象初始化顺序的init_priority?我知道我可以使用objdump -h
或readelf -S
获得一些关于它的信息。
例如,我可以看到与对象文件相关联的init_priority
值:
$ objdump -h cryptlib.o
509 .init_array.00275 00000008 0000000000000000 0000000000000000 00007da8 2**3
CONTENTS, ALLOC, LOAD, RELOC, DATA
510 .init_array.00276 00000008 0000000000000000 0000000000000000 00007db0 2**3
CONTENTS, ALLOC, LOAD, RELOC, DATA
511 .init_array.00280 00000008 0000000000000000 0000000000000000 00007db8 2**3
上面,我看到init_priority
及其值存在于对象文件(.init_array.00275
)中,但一旦链接到程序中,它就不会告诉我任何关于变量或最终顺序的信息。
我们最近切换到GCC的init_priority
,所以我试图添加一个QA步骤,以确保对象的顺序在它生效时是指定的。我还想看看init_priority
无效时对象的顺序。
这对我们来说仍然是一个问题;由于添加了新的自检,我们无法在正确的时间初始化特定的字符串,即使使用init_priority
并按照应该初始化的确切顺序排列对象文件(请参阅如何强制链接器遵守对象文件顺序?)。
Binutils邮件列表上现在有一个悬而未决的问题,显示库或程序中静态C++对象的初始化顺序?
POD
已在可执行映像中初始化。
看到.init
符号了吗?非POD
静态类实例由编译器生成的初始化函数初始化,该函数只调用每个静态对象的构造函数。.init()
函数在加载可执行文件(或共享对象)时被调用。它的编译器生成的代码继续调用每个静态对象的构造函数。
要确定初始化顺序,您必须分解.init
()函数,并在此基础上进行计算。
- lambda 作为接受其他参数的参数的初始化顺序
- 大括号或等于初始值设定项初始化顺序
- C++ 模板中的静态常量初始化顺序
- 视觉C++:在 DLL 加载期间,全局变量初始化顺序是否具有确定性?
- 销毁 pthread 互斥体和 C++ 中的取消初始化顺序
- 线程局部变量的初始化顺序
- 类静态变量初始化顺序
- 具有静态存储持续时间的常量初始化变量的初始化顺序
- 解析 CRTP 初始化顺序
- 内联初始化的静态 const 类成员的初始化顺序保证
- 使用constexpr的全局初始化顺序
- 初始化与类类型相同的静态成员(静态初始化顺序问题)
- 为什么结构属性声明和初始化顺序的行为是这样的?
- 影响初始化顺序(以C++为单位)
- MSVC 2017 在单个翻译单元中违反静态初始化顺序
- C++11 成员类初始化顺序
- 同一函数中的静态函数变量初始化顺序
- 静态内联成员初始化顺序
- C++静态初始化顺序:添加到映射中
- 静态成员的静态阵列:初始化顺序惨败的可能性