3

我试图让对象转储打印静态 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

我很确定我的下一步是检查.initand .init_array,但我似乎无法让对象转储来做到这一点:

$ objdump -d .init cryptest.exe 
objdump: '.init': No such file

cryptest.exe:     file format elf64-x86-64
...

如何在编译的程序中显示静态 C++ 对象的初始化顺序?


如何验证 C++ 静态对象初始化顺序的 init_priorty?我知道我可以使用objdump -hor获取有关它的一些信息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++ 对象的初始化顺序有一个悬而未决的问题?

4

1 回答 1

2

APOD已在可执行映像中初始化。

看到那个.init符号()了吗?非POD静态类实例由编译器生成的初始化函数初始化,该函数简单地调用每个静态对象的构造函数。该.init()函数在可执行文件(或共享对象)被加载时被调用。它的编译器生成的代码继续调用每个静态对象的构造函数。

要弄清楚初始化顺序,你必须反汇编.init() 函数,并据此计算出来。

于 2015-12-07T22:15:28.190 回答