オブジェクト ダンプを取得して、静的 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 メーリング リストに未解決の質問があります。