2016-03-11 8 views
2

Как можно убедиться, что исходный код некоторой библиотеки c (.a) использует глобальные переменные или нет? Есть ли какой-нибудь инструмент, который может разбирать такие детали?Глобальные переменные в библиотеке c

+4

Вы можете использовать 'nm' команду, в которой перечислены все символы и говорит, если они являются локальными или глобальными, код или данные. –

+0

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

ответ

0

Библиотека состоит из модулей (скомпилированных файлов C). Модуль может объявлять глобальную переменную. Любой модуль (внутри или вне библиотеки), ссылающийся на глобальную переменную, заставит модуль, объявляющий глобальную переменную, быть включенным в вашу сборку.

Глобальной переменной может быть static. Затем он отображается только в этом модуле.

Глобальная переменная может быть extern. Это означает, что он не существует в текущем модуле и вообще не может существовать в библиотеке, и в этом случае пользователь должен предоставить переменную.

В первом и третьем случаях переменная будет указана в таблице символов библиотеки или в таблице исправлений библиотеки. Первый - список символов, доступных для вызываемого абонента; второй - список переменных, чей точный адрес должен быть зафиксирован во время загрузки. Могут быть переменные, которые должны быть скопированы, которые не экспортируются. Символы всегда включают имя, исправления не нужно указывать с их именем.

Таким образом, инструмент для просмотра таблицы символов библиотеки, вероятно, может ответить на ваш вопрос.

Примечание: факт, что глобальная переменная указана в таблице символов библиотеки, не означает, что переменная используется любой функцией в библиотеке.

0

Рукой:

В случае, если вы уже знали, как открыть файл .a, посмотрите на него.

Если в файле есть:

  • переменная используется без объявления (так он определен в другом файле)

  • переменная объявлена ​​вне всякой функции

Таким образом, этот файл содержит глобальную переменную.

По инструменту:

Каждый компилятор имеет этот вариант для вас (я считаю)

Например:

С GCC, с помощью GDB, тип info variables перечислить все глобальные переменные.

С VS, откройте класса View, найти глобальных функций и переменных

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