我想要获取对象转储以打印静态C++对象构建的顺序。我发现
程序编译时没有使用
程序使用
如何在编译程序中显示静态C ++对象的初始化顺序?
在上面,我看到
我们最近转换到了GCC的
这仍然是我们的一个问题;自从添加了新的自测,即使使用
现在,在 Binutils 邮件列表上有一个开放性问题,即 在库或程序中显示静态 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 ++对象的初始化顺序?
我知道可以使用objdump -h
或readelf-S
来获取有关C ++静态对象初始化顺序的<验证方法>。例如,我可以看到与对象文件相关联的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++ 对象的初始化顺序?。