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

私の次のステップは と を検査することだと確信して.init.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またはを使用して、それに関する情報を取得できることを知っています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オブジェクト ファイルを初期化する必要がある正確な順序で配置しても、オブジェクト ファイルの順序を尊重するようにリンカーに強制する方法を参照してください。 )。

ライブラリまたはプログラム内の静的 C++ オブジェクトの初期化順序を表示しますか?で、Binutils メーリング リストに未解決の質問があります。

4

1 に答える 1

2

APODは、実行可能イメージで既に初期化されています。

その.initシンボル()を参照してください?非POD静的クラス インスタンスは、コンパイラによって生成された初期化関数によって初期化されます。これは、すべての静的オブジェクトのコンストラクターを呼び出すだけです。実行可能ファイル (または共有オブジェクト) がロードされると、.init()関数が呼び出されます。コンパイラによって生成されたコードは、すべての静的オブジェクトのコンストラクターを呼び出します。

初期化の順序を把握するには、() 関数を逆アセンブルし、.initそれに基づいて把握する必要があります。

于 2015-12-07T22:15:28.190 に答える