Я создаю c программу, что я намереваюсь работать на процессоре ARM в близкий период времени. Я хочу измерить объем памяти, который я использую со своими глобальными переменными при игнорировании размера стека/"кучи". Существует ли способ или заставить gcc разгрузить это во время компиляции или получить эту информацию от скомпилированного двоичного файла?
Отличный способ узнать, куда уходит ваша память, - посмотреть на карту компоновщика. Карта компоновщика - это файл, который генерируется компоновщиком и содержит подробное описание всех мест памяти программы. Вы можете увидеть распределение памяти по символам как для глобальных переменных, так и для кода. В прошлом я использовал карты компоновщика для проектов с жесткими требованиями к памяти. С их помощью легко определить проблемные области, такие как буферы глобальной памяти, которые занимают много места.
Добавьте эту опцию в командную строку gcc для создания карты компоновщика:
-Wl,-Map=output.map
Пакет GNU binutils содержит программу под названием «size», которая является самым простым способом получить нужные вам данные - или, по крайней мере, их разумное приближение. Для типичной программы (в данном случае не маленькой встроенной) результат может выглядеть следующим образом:
text data bss dec hex filename
332268 2200 19376 353844 56634 test-directory/add
Первые три столбца - это размеры разделов в двоичном файле: «текст» - это исполняемый код, «данные» - это константы и так далее, в том числе те, которые представляют начальные переменные с явными инициализаторами, а «bss» - это инициализаторы для всего, что неявно статически инициализируется. В типичной встроенной программе эти статические инициализаторы в значительной степени предназначены исключительно для глобальных переменных (и для ваших целей вы можете в любом случае включить другие статические переменные в свои измерения, поскольку они также не находятся в стеке или куче).
Таким образом, я думаю, что в итоге вы получите сумму «data» и «bss», которая будет, по сути, тем, что вы хотите. (После прочтения статьи, на которую ссылается hlovdal, я менее уверен в этом, чем был; возможно, комментаторы могут добавить подтверждение?)
(После этого «dec» и «hex» - это общий размер всего в десятичном и шестнадцатеричный, и "имя файла", конечно, очевидно.)
Вам необходимо проанализировать различные сегменты памяти с помощью objdump
. См. Статью здесь и здесь для другого ответа, который дает некоторые подробности по этому поводу.