Я пишу инструмент анализа размера кода для моей программы на C, используя выходной ELF
файл.
Я использую readelf -debug-dump=info
для создания Dwarf format file
.
Я заметил, что Мой компилятор добавляет как часть оптимизации новые константы, которых нет в файле Dwarf, в раздел .rodata
.
Итак, .rodata
размер раздела включает их размеры, но у меня нет их размеров в Dwarf
.
Вот пример файла карты:
*(.rodata)
.rodata 0x10010000 0xc0 /<.o file0 path>
0x10010000 const1
0x10010040 const2
.rodata 0x100100c0 0xa /<.o file1 path>
fill 0x100100ca 0x6
.rodata 0x100100d0 0x6c /<.o file2 path>
0x100100d0 const3
0x100100e0 const4
0x10010100 const5
0x10010120 const6
fill 0x1001013c 0x4
В файле file1 выше, хотя я не объявлял переменную const - это делает компилятор, эта константа занимает место в .rodata, но для нее нет символа / имени.
Вот код внутри некоторой функции, которая его генерирует:
uint8 arr[3][2] = {{146,179},
{133, 166},
{108, 141}} ;
Таким образом, компилятор добавляет некоторые значения const, чтобы оптимизировать загрузку массива.
Как я могу извлечь эти скрытые дополнения из разделов данных?
Я хочу иметь возможность полностью охарактеризовать свой код - сколько места используется в каждом файле и т. Д.
;
, это был даже недопустимый код, поэтому я не уверен, что этот код имеет какое-либо отношение к файлу карты, поскольку он не будет компилироваться. - person Clifford   schedule 24.03.2018arr
- это повлияет на то, как и когда происходит инициализация и как ведут себя компилятор и компоновщик - контекст - это все - вы предоставили небольшой контекст. Также избегайте публикации кода и текста с посторонним пустым пространством и жесткими вкладками - он плохо отображается на SO, и действительно использует разметку кода. Я исправил для вас _все_ ошибки разметки. - person Clifford   schedule 24.03.2018