Что такое таблица символов?

87

Может ли кто-нибудь описать, что такое таблица символов в контексте C и C ++?

jdt141
источник

Ответы:

81

Здесь есть два общих и связанных значения таблиц символов.

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

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

Если вы хотите узнать больше, я предлагаю отличную книгу Джона Левина «Линкеры и загрузчики». текст ссылки

Бен Комби
источник
Привет, Бен, во втором случае вы имеете в виду таблицу экспорта? То есть, является ли таблица экспорта частным случаем таблицы символов? Или это не связанные между собой понятия?
Pooven
Здравствуй. Я считаю, что его нет ни в одном объектном файле, а в нем. Во-вторых, не могли бы вы подробнее объяснить, что вы имели в виду под «конечным местоположением»? Физический адрес или окончательный относительный адрес в исходном коде.
stdout
26

Вкратце, это сопоставление имени, которое вы назначаете переменной ее адресу в памяти, включая метаданные, такие как тип, область действия и размер. Он используется компилятором.

В общем, не только C [++] *. Технически он не всегда включает прямой адрес памяти. Это зависит от того, на какой язык, платформу и т. Д. Нацелен компилятор.

Стив Лэнди
источник
Я думаю, было очень важно упомянуть содержание адреса, сказав, что «он не всегда включает прямой адрес памяти».
stdout
13

В Linux вы можете использовать команду:

nm [объектный файл]

для вывода таблицы символов этого объектного файла. Из этой распечатки вы сможете затем расшифровать используемые символы компоновщика по их искаженным именам .

ZeHolyQofPower
источник
8

Таблица символов - это список «символов» в программе / модуле. Символы - это чаще всего имена переменных или функций. Таблица символов может использоваться для определения того, где в памяти будут находиться переменные или функции.

Джо Шнайдер
источник
0

Таблица символов - это важная структура данных, созданная и поддерживаемая компиляторами для хранения информации о возникновении различных сущностей, таких как имена переменных, имена функций, объекты, классы, интерфейсы и т. Д.

rashedcs
источник
Компоновщики и ассемблеры также имеют дело с таблицами символов (часто более простыми, чем таблицы компилятора).
Старынкевич