Таблица символов

Октябрь 1, 2021 / Комментарии 0

В информатике таблица символов (от англ. symbol table «таблица идентификаторов») — это структура данных, используемая транслятором (компилятором или интерпретатором), в которой каждый идентификатор переменной или функции из исходного кода ассоциируется с информацией, связанной с его объявлением или появлением в коде: типом данных, областью видимости и в некоторых случаях местом в памяти (смещением).

Реализация

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

Применение

Объектный модуль (англ. object file) содержит таблицу символов для внешне видимых (публичных) идентификаторов. При связывании (линковке) разных объектных модулей компоновщик использует таблицы символов для разрешения межмодульных упоминаний.

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

Во время реверс-инжиниринга многие утилиты с помощью таблицы проверяют, каким адресам принадлежат глобальные переменные и известные функции. Если таблица символов была убрана из объектных модулей до линковки (например, с помощью strip из GNU binutils), утилитам будет сложнее определить адреса важных мест программы и проанализировать её.

При доступе к переменным и динамическом распределении памяти компилятор должен осуществить множество работ, отсюда — расширенной модели стека при динамическом распределении необходима таблица символов.[прояснить]

Хорошим примером использования таблицы символов могут послужить модульные ядра ОС семейства Unix: таблица символов может использоваться подгружаемыми модулями ядра (например, драйверами) для доступа к неким символам. Однако это не является обязательным, если модуль не обращается к ядру, не использует внутренние функции, переменные, и т. д. Возможно обойтись без таблицы символов и обращаться к памяти внутри ядра напрямую, но в этом случае будет потеряна переносимость модулей, так как при разных конфигурациях ядра одинаковый код будет размещён в разных местах.

Пример

Снизу приведена таблица символов небольшой программы. Для её создания использовалась утилита nm из комплекта GNU binutils. В таблице размечен один символ данных (отмечен как тип «D») и множество функций (как из стандартной библиотеки, так и принадлежащие самой программе). Первая колонка содержит адрес смещения в памяти, вторая — тип символа, третья — его название.

Подпишитесь на свежую email рассылку сайта!

Читайте также

  • Окт 26

    Головко, Елена Анатольевна

    Елена Анатольевна Головко (укр. Олена Анатоліївна Головко, 4 июня 1975,

  • Окт 26

    Сокирки полевые

    Сокирки полевые, или живокость полевая, или консолида полевая (лат. Consólida

  • Окт 26

    Муминов, Усман

    Усман Муминов — советский хозяйственный, государственный и политический деятель, Герой

  • Окт 26

    Волков, Александр Никитович

    Александр Никитович Волков (25 марта 1929, Валуйки, Центрально-Чернозёмная область, ныне

  • Окт 26

    Томас, Йен

    Йен Томас (англ. Ian Thomas) (род. 30 апреля 1997 года)

  • Окт 26

    Герасимов, Михаил Степанович

    Михаил Степанович Герасимов (Микай Г., 7 октября 1885, д. Ильнеть,

  • Окт 26

    Таможня даёт добро

    «Таможня даёт добро» (фр. Rien à déclarer; дословно «Нечего декларировать»)

  • Окт 26

    Acleris

    Acleris (лат.) — род бабочек-листовёрток из подсемейства Tortricinae. Около 200

  • Окт 26

    Рехневская, Витольда

    Витольда Рехневская (урожденная Карпович) (польск. Witolda Rechniewska; 1862, на Кавказе,

  • Окт 26

    Эдвардс, Леон

    Леон Эдвардс (англ. Leon Edwards; род. 25 августа 1991, Кингстон)

  • Окт 25

    Ээнпалу, Каарел

    Каарел Ээнпалу (эст. Kaarel Eenpalu; до 1935 — Карл Эйнбунд

  • Окт 25

    Шелковый, Сергей Епифанович

    Сергей Епифанович Шелковый (21 октября 1912 — 25 декабря 1997)

  • Окт 25

    Вейтцейл, Эбби

    Эбби Вейтцейл (англ. Abbey Weitzeil; род. 3 декабря 1996, Валенсия,

  • Окт 25

    Се Хэ

    Се Хэ (кит. трад. 謝赫, упр. 谢赫, пиньинь Xiè Hè; V

  • Окт 25

    Малокатериновка

    Малокатериновка (укр. Малокатеринівка) — посёлок городского типа, Малокатериновский поселковый совет,