我试图让对象转储打印静态 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
and .init_array
,但我似乎无法让对象转储来做到这一点:
$ objdump -d .init cryptest.exe
objdump: '.init': No such file
cryptest.exe: file format elf64-x86-64
...
如何在编译的程序中显示静态 C++ 对象的初始化顺序?
从如何验证 C++ 静态对象初始化顺序的 init_priorty?我知道我可以使用objdump -h
or获取有关它的一些信息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's init_priority
,所以我尝试添加一个 QA 步骤以确保对象的顺序在它生效时是指定的。我还想查看对象在init_priority
不生效时的顺序。
这对我们来说仍然是一个问题;由于添加了新的自测试,我们无法在正确的时间初始化特定的字符串,即使init_priority
目标文件按照它们应该被初始化的确切顺序进行布局(请参阅如何强制链接器遵守目标文件顺序?)。
现在在 Binutils 邮件列表中显示库或程序中静态 C++ 对象的初始化顺序有一个悬而未决的问题?