Показать порядок инициализации статических объектов C ++ в программе?

Я пытаюсь получить дамп объекта для печати в порядке, в котором создаются статические объекты 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 ++ в библиотеке или программе?

2

Решение

POD уже инициализирован в исполняемом образе.

Видеть, что .init условное обозначение()? не-POD экземпляры статического класса инициализируются сгенерированной компилятором функцией инициализации, которая просто вызывает конструктор каждого статического объекта. .init() Функция вызывается, когда исполняемый файл (или общий объект) загружается. Его сгенерированный компилятором код продолжает вызывать конструктор каждого статического объекта.

Чтобы выяснить порядок инициализации, вам придется разобрать .init(), и выяснить это на основе этого.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]