WikiSort.ru - Программирование

ПОИСК ПО САЙТУ | о проекте

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

Реализация

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

Применение

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

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

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

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

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

Пример

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

Пример таблицы
АдресТипИмя
00000020aT_BIT
00000040aF_BIT
00000080aI_BIT
20000004tirqvec
20000008tfiqvec
2000000ctInitReset
20000018T_main
20000024tEnd
20000030TAT91F_US3_CfgPIO_useB
2000005ctAT91F_PIO_CfgPeriph
200000b0Tmain
20000120TAT91F_DBGU_Printk
20000190tAT91F_US_TxReady
200001c0tAT91F_US_PutChar
200001f8TAT91F_SpuriousHandler
20000214TAT91F_DataAbort
20000230TAT91F_FetchAbort
2000024cTAT91F_Undef
20000268TAT91F_UndefHandler
20000284TAT91F_LowLevelInit
200002e0tAT91F_DBGU_CfgPIO
2000030ctAT91F_PIO_CfgPeriph
20000360tAT91F_US_Configure
200003dctAT91F_US_SetBaudrate
2000041ctAT91F_US_Baudrate
200004ectAT91F_US_SetTimeguard
2000051ctAT91F_PDC_Open
2000059ctAT91F_PDC_DisableRx
200005c8tAT91F_PDC_DisableTx
200005f4tAT91F_PDC_SetNextTx
20000638tAT91F_PDC_SetNextRx
2000067ctAT91F_PDC_SetTx
200006c0tAT91F_PDC_SetRx
20000704tAT91F_PDC_EnableRx
20000730tAT91F_PDC_EnableTx
2000075ctAT91F_US_EnableTx
20000788T__aeabi_uidiv
20000788T__udivsi3
20000884T__aeabi_uidivmod
2000089cT__aeabi_idiv0
2000089cT__aeabi_ldiv0
2000089cT__div0
200009a0D_data
200009a0A_etext
200009a0Dholaamigosh
200009a4A__bss_end__
200009a4A__bss_start
200009a4A__bss_start__
200009a4A_edata
200009a4A_end

См. также

Примечания

  1. Jonathan Corbet, Alessandro Rubini, Greg Kroah-Hartman. Гл. 2: Сборка и запуск модулей; Символьная таблица ядра // Linux Device Drivers, Third Edition. — O'Reilly Media, 2005. ISBN 0-596-00590-3.

Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".

Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.

Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .




Текст в блоке "Читать" взят с сайта "Википедия" и доступен по лицензии Creative Commons Attribution-ShareAlike; в отдельных случаях могут действовать дополнительные условия.

Другой контент может иметь иную лицензию. Перед использованием материалов сайта WikiSort.ru внимательно изучите правила лицензирования конкретных элементов наполнения сайта.

2019-2024
WikiSort.ru - проект по пересортировке и дополнению контента Википедии