Таблица символов
В статье не хватает ссылок на источники (см. рекомендации по поиску). |
В информатике таблица символов (от англ. symbol table «таблица идентификаторов») — это структура данных, используемая транслятором (компилятором или интерпретатором), в которой каждый идентификатор переменной или функции из исходного кода ассоциируется с информацией, связанной с его объявлением или появлением в коде: типом данных, областью видимости и в некоторых случаях местом в памяти (смещением).
Реализация
Общеиспользуемой реализацией является хеш-таблица. Компилятор может как использовать единую таблицу для символов, так и разделять символы на несколько иерархических таблиц по разным областям видимости. Бывают также реализации в виде деревьев, линейных и самоорганизовывающихся списков.
Применение
Объектный модуль (англ. object file) содержит таблицу символов для внешне видимых (публичных) идентификаторов. При связывании (линковке) разных объектных модулей компоновщик использует таблицы символов для разрешения межмодульных упоминаний.
Таблица символов может существовать лишь на протяжении трансляции, но иногда она вкладывается в вывод этого процесса для дальнейшего использования, например, во время интерактивной отладки, или как источник для форматирования диагностического отчета во время или после исполнения программы.
Во время реверс-инжиниринга многие утилиты с помощью таблицы проверяют, каким адресам принадлежат глобальные переменные и известные функции. Если таблица символов была убрана из объектных модулей до линковки (например, с помощью strip из GNU Binutils), утилитам будет сложнее определить адреса важных мест программы и проанализировать её.
При доступе к переменным и динамическом распределении памяти компилятор должен осуществить множество работ, отсюда — расширенной модели стека при динамическом распределении необходима таблица символов.[прояснить]
Хорошим примером использования таблицы символов могут послужить модульные ядра ОС семейства Unix: таблица символов может использоваться подгружаемыми модулями ядра (например, драйверами) для доступа к неким символам. Однако это не является обязательным, если модуль не обращается к ядру, не использует внутренние функции, переменные, и т. д. Возможно обойтись без таблицы символов и обращаться к памяти внутри ядра напрямую, но в этом случае будет потеряна переносимость модулей, так как при разных конфигурациях ядра одинаковый код будет размещён в разных местах.[источник не указан 4385 дней]
Пример
Снизу приведена таблица символов небольшой программы. Для её создания использовалась утилита из комплекта GNU Binutils. В таблице размечен один символ данных (отмечен как тип «D») и множество функций (как из стандартной библиотеки, так и принадлежащие самой программе). Первая колонка содержит адрес смещения в памяти, вторая — тип символа, третья — его название.
| Адрес | Тип | Имя |
|---|---|---|
| 00000020 | a | T_BIT |
| 00000040 | a | F_BIT |
| 00000080 | a | I_BIT |
| 20000004 | t | irqvec |
| 20000008 | t | fiqvec |
| 2000000c | t | InitReset |
| 20000018 | T | _main |
| 20000024 | t | End |
| 20000030 | T | AT91F_US3_CfgPIO_useB |
| 2000005c | t | AT91F_PIO_CfgPeriph |
| 200000b0 | T | main |
| 20000120 | T | AT91F_DBGU_Printk |
| 20000190 | t | AT91F_US_TxReady |
| 200001c0 | t | AT91F_US_PutChar |
| 200001f8 | T | AT91F_SpuriousHandler |
| 20000214 | T | AT91F_DataAbort |
| 20000230 | T | AT91F_FetchAbort |
| 2000024c | T | AT91F_Undef |
| 20000268 | T | AT91F_UndefHandler |
| 20000284 | T | AT91F_LowLevelInit |
| 200002e0 | t | AT91F_DBGU_CfgPIO |
| 2000030c | t | AT91F_PIO_CfgPeriph |
| 20000360 | t | AT91F_US_Configure |
| 200003dc | t | AT91F_US_SetBaudrate |
| 2000041c | t | AT91F_US_Baudrate |
| 200004ec | t | AT91F_US_SetTimeguard |
| 2000051c | t | AT91F_PDC_Open |
| 2000059c | t | AT91F_PDC_DisableRx |
| 200005c8 | t | AT91F_PDC_DisableTx |
| 200005f4 | t | AT91F_PDC_SetNextTx |
| 20000638 | t | AT91F_PDC_SetNextRx |
| 2000067c | t | AT91F_PDC_SetTx |
| 200006c0 | t | AT91F_PDC_SetRx |
| 20000704 | t | AT91F_PDC_EnableRx |
| 20000730 | t | AT91F_PDC_EnableTx |
| 2000075c | t | AT91F_US_EnableTx |
| 20000788 | T | __aeabi_uidiv |
| 20000788 | T | __udivsi3 |
| 20000884 | T | __aeabi_uidivmod |
| 2000089c | T | __aeabi_idiv0 |
| 2000089c | T | __aeabi_ldiv0 |
| 2000089c | T | __div0 |
| 200009a0 | D | _data |
| 200009a0 | A | _etext |
| 200009a0 | D | holaamigosh |
| 200009a4 | A | __bss_end__ |
| 200009a4 | A | __bss_start |
| 200009a4 | A | __bss_start__ |
| 200009a4 | A | _edata |
| 200009a4 | A | _end |
См. также
- Отладочные символы
Примечания
- Jonathan Corbet, Alessandro Rubini, Greg Kroah-Hartman. Гл. 2: Сборка и запуск модулей; Символьная таблица ядра // Linux Device Drivers, Third Edition. — O'Reilly Media, 2005. — ISBN 0-596-00590-3. Архивировано 28 марта 2014 года.
Википедия, чтение, книга, библиотека, поиск, нажмите, истории, книги, статьи, wikipedia, учить, информация, история, скачать, скачать бесплатно, mp3, видео, mp4, 3gp, jpg, jpeg, gif, png, картинка, музыка, песня, фильм, игра, игры, мобильный, телефон, Android, iOS, apple, мобильный телефон, Samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Сеть, компьютер, Информация о Таблица символов, Что такое Таблица символов? Что означает Таблица символов?
Ne sleduet putat s naborom simvolov tablicej zadayushej kodirovku simvolov alfavita Eta statya ob informacii o funkciyah i peremennyh v obektnyh fajlah O standartnoj programme Windows sm V state ne hvataet ssylok na istochniki sm rekomendacii po poisku Informaciya dolzhna byt proveryaema inache ona mozhet byt udalena Vy mozhete otredaktirovat statyu dobaviv ssylki na avtoritetnye istochniki v vide snosok iyul 2013 V informatike tablica simvolov ot angl symbol table tablica identifikatorov eto struktura dannyh ispolzuemaya translyatorom kompilyatorom ili interpretatorom v kotoroj kazhdyj identifikator peremennoj ili funkcii iz ishodnogo koda associiruetsya s informaciej svyazannoj s ego obyavleniem ili poyavleniem v kode tipom dannyh oblastyu vidimosti i v nekotoryh sluchayah mestom v pamyati smesheniem RealizaciyaObsheispolzuemoj realizaciej yavlyaetsya hesh tablica Kompilyator mozhet kak ispolzovat edinuyu tablicu dlya simvolov tak i razdelyat simvoly na neskolko ierarhicheskih tablic po raznym oblastyam vidimosti Byvayut takzhe realizacii v vide derevev linejnyh i samoorganizovyvayushihsya spiskov PrimenenieObektnyj modul angl object file soderzhit tablicu simvolov dlya vneshne vidimyh publichnyh identifikatorov Pri svyazyvanii linkovke raznyh obektnyh modulej komponovshik ispolzuet tablicy simvolov dlya razresheniya mezhmodulnyh upominanij Tablica simvolov mozhet sushestvovat lish na protyazhenii translyacii no inogda ona vkladyvaetsya v vyvod etogo processa dlya dalnejshego ispolzovaniya naprimer vo vremya interaktivnoj otladki ili kak istochnik dlya formatirovaniya diagnosticheskogo otcheta vo vremya ili posle ispolneniya programmy Vo vremya revers inzhiniringa mnogie utility s pomoshyu tablicy proveryayut kakim adresam prinadlezhat globalnye peremennye i izvestnye funkcii Esli tablica simvolov byla ubrana iz obektnyh modulej do linkovki naprimer s pomoshyu strip iz GNU Binutils utilitam budet slozhnee opredelit adresa vazhnyh mest programmy i proanalizirovat eyo Pri dostupe k peremennym i dinamicheskom raspredelenii pamyati kompilyator dolzhen osushestvit mnozhestvo rabot otsyuda rasshirennoj modeli steka pri dinamicheskom raspredelenii neobhodima tablica simvolov proyasnit Horoshim primerom ispolzovaniya tablicy simvolov mogut posluzhit modulnye yadra OS semejstva Unix tablica simvolov mozhet ispolzovatsya podgruzhaemymi modulyami yadra naprimer drajverami dlya dostupa k nekim simvolam Odnako eto ne yavlyaetsya obyazatelnym esli modul ne obrashaetsya k yadru ne ispolzuet vnutrennie funkcii peremennye i t d Vozmozhno obojtis bez tablicy simvolov i obrashatsya k pamyati vnutri yadra napryamuyu no v etom sluchae budet poteryana perenosimost modulej tak kak pri raznyh konfiguraciyah yadra odinakovyj kod budet razmeshyon v raznyh mestah istochnik ne ukazan 4385 dnej PrimerSnizu privedena tablica simvolov nebolshoj programmy Dlya eyo sozdaniya ispolzovalas utilita iz komplekta GNU Binutils V tablice razmechen odin simvol dannyh otmechen kak tip D i mnozhestvo funkcij kak iz standartnoj biblioteki tak i prinadlezhashie samoj programme Pervaya kolonka soderzhit adres smesheniya v pamyati vtoraya tip simvola tretya ego nazvanie Primer tablicy Adres Tip Imya00000020 a T BIT00000040 a F BIT00000080 a I BIT20000004 t irqvec20000008 t fiqvec2000000c t InitReset20000018 T main20000024 t End20000030 T AT91F US3 CfgPIO useB2000005c t AT91F PIO CfgPeriph200000b0 T main20000120 T AT91F DBGU Printk20000190 t AT91F US TxReady200001c0 t AT91F US PutChar200001f8 T AT91F SpuriousHandler20000214 T AT91F DataAbort20000230 T AT91F FetchAbort2000024c T AT91F Undef20000268 T AT91F UndefHandler20000284 T AT91F LowLevelInit200002e0 t AT91F DBGU CfgPIO2000030c t AT91F PIO CfgPeriph20000360 t AT91F US Configure200003dc t AT91F US SetBaudrate2000041c t AT91F US Baudrate200004ec t AT91F US SetTimeguard2000051c t AT91F PDC Open2000059c t AT91F PDC DisableRx200005c8 t AT91F PDC DisableTx200005f4 t AT91F PDC SetNextTx20000638 t AT91F PDC SetNextRx2000067c t AT91F PDC SetTx200006c0 t AT91F PDC SetRx20000704 t AT91F PDC EnableRx20000730 t AT91F PDC EnableTx2000075c t AT91F US EnableTx20000788 T aeabi uidiv20000788 T udivsi320000884 T aeabi uidivmod2000089c T aeabi idiv02000089c T aeabi ldiv02000089c T div0200009a0 D data200009a0 A etext200009a0 D holaamigosh200009a4 A bss end 200009a4 A bss start200009a4 A bss start 200009a4 A edata200009a4 A endSm takzheOtladochnye simvolyPrimechaniyaJonathan Corbet Alessandro Rubini Greg Kroah Hartman Gl 2 Sborka i zapusk modulej Simvolnaya tablica yadra Linux Device Drivers Third Edition O Reilly Media 2005 ISBN 0 596 00590 3 Arhivirovano 28 marta 2014 goda
