Как измерить общий размер моих глобальных переменных?

Я создаю программу c, которую я намерен запускать на ARM-процессоре в ближайшем таймфрейме. Я хочу измерить объем памяти, который я использую, с моими глобальными переменными, игнорируя размер стека/кучи. Есть ли способ получить gcc, чтобы выгрузить это во время компиляции или получить эту информацию из скомпилированного двоичного файла?

Ответ 1

Отличный способ увидеть, куда идет ваша память, - это посмотреть на карту компоновщика. Карта компоновщика - это файл, который создается компоновщиком и детализирует все ячейки памяти для программы. Вы можете видеть распределение памяти на основе символа по символам для глобальных переменных, а также кода. Я использовал компоновщики в прошлом для проектов, которые требуют жестких требований к памяти. Они позволяют легко идентифицировать проблемы, такие как глобальные буферы памяти, которые занимают много места.

Добавьте этот параметр в командную строку gcc для создания карты компоновщика:

-Wl, -Map = output.map

Ответ 2

В комплект GNU binutils входит программа под названием "размер", которая является самым простым способом получения необходимых данных - или, по крайней мере, разумной аппроксимации. Для типичной программы (в данном случае не маленькой встроенной) выход может выглядеть так:

   text    data     bss     dec     hex filename
 332268    2200   19376  353844   56634 test-directory/add

Первые три столбца представляют собой размеры разделов в двоичном формате: "текст" - это исполняемый код, "данные" - это константы и т.д., в том числе те, которые представляют начальные переменные с явными инициализаторами - и "bss" - инициализаторы для всего, что неявно статически инициализируется. В типичной встроенной программе эти статические инициализаторы в значительной степени предназначены исключительно для глобальных переменных (и для ваших целей вам может потребоваться включить другие статические переменные в измерение, так как они также не находятся в стеке или куче).

Таким образом, я думаю, что вы в конечном итоге получаете сумму "данных" и "bss", которые, по сути, вы хотите. (После прочтения статьи, связанной с hłddal, я менее уверен в этом, чем я, возможно, комментаторы могут добавить подтверждение?)

(После этого "dec" и "hex" - это общий размер всего в десятичном и шестнадцатеричном, а "filename", конечно, очевидно.)

Ответ 3

Вам нужно проанализировать различные сегменты памяти с помощью objdump. См. здесь для статьи и here для получения другого ответа, который дает некоторые подробности на этом.