Идентификация глобальной переменной в базе кода C - PullRequest
3 голосов
/ 12 января 2009

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

Приветствия

Ответы [ 5 ]

6 голосов
/ 12 января 2009

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

nm *.o | grep OBJT | grep GLOB

EDIT Приведенная выше команда для Solaris 'nm (пакет SUNWbtool). Для переносимости nm имеет параметр для выбора формата вывода:

nm -f [posix|bsd|sysv] *.o
1 голос
/ 12 января 2009

Опция для вывода карты памяти - -M с компоновщиком, поэтому, чтобы получить ее из gcc, вы должны использовать gcc .... -Xlinker -M.

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

0 голосов
/ 29 июня 2012

Мне понравились "переменные информации" GDB, чтобы сделать это.

Перечислено здесь: Глобальная идентификация переменной в базе кода C

0 голосов
/ 12 января 2009

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

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

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

0 голосов
/ 12 января 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...