2009-01-12 2 views
3

У меня есть база кода C и необходимо программно идентифицировать все используемые глобальные переменные. Я думаю, что gcc можно сделать для создания файла карты памяти, но не знаю, как и это может позволить мне увидеть, какие переменные являются глобальными? Любая помощь будет оценена по достоинству.Глобальная идентификация переменной в базе кода C

Cheers

ответ

6

Вы можете извлечь такую ​​информацию из ваших объектных файлов с помощью nm.

nm *.o | grep OBJT | grep GLOB 

РЕДАКТИРОВАТЬ Команда выше для нм (пакет SUNWbtool) Solaris'. Для переносимости, nm имеет параметр, чтобы выбрать формат вывода:

nm -f [posix|bsd|sysv] *.o 
+0

Значение OBJT и GLOB не был получен на выходе «нм», когда я побежал, но различные Алфавитные идентификаторы были использованы на месте. «nm» - это инструмент разработки GNU, если вам интересно. Попробуйте man nm на вашем блоке linux dev. –

0

Зачем вам это нужно? Для многих целей статические данные (будь то в области файлов или функций) должны быть сгруппированы с глобальными.

В общем, глобальные значения отображаются в виде данных, а не кода на карте компоновщика. Переменные стека и переменные, выделенные кучей, этого не делают. (Конечно, указатель на в куче данных может быть глобальным, то просто регулярное различие в C между указателем и что она указывает.)

1

Возможность выходной карты памяти является -М с линкера , поэтому, чтобы получить его от gcc, вы должны использовать gcc .... -Xlinker -M.

Другой способ получить это - использовать программу ctags. Он может не только отмечать доступные функции, но также и доступные глобальные переменные (и не собирает статику, это отличается от карты памяти). Поскольку он не компилирует все, это также должно быть быстрее, чем gcc-подход (если вам нужно скомпилировать, вы получите это, конечно, бесплатно).

0

Если у вас есть dwarfdump и бинарный файл содержит DWARF отладочную информацию (не удалялись), вы можете проверить содержание .debug_pubnames DWARF секции, запустив

dwarfdump -p mybinary | awk '{print $2}'

Он будет производить набор строк с именами глобальных символов, по одному на каждую строку.

Смежные вопросы