Я пытаюсь получить дамп объекта для печати в порядке, в котором создаются статические объекты 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 ++ в скомпилированной программе?
От Как проверить init_priorty для C ++ статического порядка инициализации объекта? Я знаю, что могу получить некоторую информацию об этом, используя 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
и выкладывание объектных файлов в точном порядке их инициализации (см. Как заставить компоновщик соблюдать порядок объектных файлов?).
Теперь в списке рассылки Binutils есть открытый вопрос Отображать порядок инициализации статических объектов C ++ в библиотеке или программе?
POD
уже инициализирован в исполняемом образе.
Видеть, что .init
условное обозначение()? не-POD
экземпляры статического класса инициализируются сгенерированной компилятором функцией инициализации, которая просто вызывает конструктор каждого статического объекта. .init()
Функция вызывается, когда исполняемый файл (или общий объект) загружается. Его сгенерированный компилятором код продолжает вызывать конструктор каждого статического объекта.
Чтобы выяснить порядок инициализации, вам придется разобрать .init
(), и выяснить это на основе этого.
Других решений пока нет …