Що таке таблиця символів?


87

Хтось може описати, що таке таблиця символів у контексті C та C ++?

Відповіді:


81

Тут є два загальні та пов’язані між собою значення таблиць символів.

По-перше, у ваших об’єктних файлах є таблиця символів. Зазвичай компілятор C або C ++ компілює один вихідний файл в об'єктний файл із розширенням .obj або .o. Він містить колекцію виконуваного коду та даних, які компонувальник може обробити в робочий додаток або спільну бібліотеку. Об’єктний файл має структуру даних, яка називається таблицею символів, яка відображає різні елементи у об’єктному файлі до імен, які компонент зв’язку може зрозуміти. Якщо ви викликаєте функцію з вашого коду, компілятор не вводить остаточну адресу підпрограми у файл об'єкта. Натомість він додає у код значення заповнювача та додає примітку, яка вказує лінкеру шукати посилання в різних таблицях символів з усіх оброблюваних файлів, які він обробляє, і фіксувати там кінцеве розташування.

По-друге, є також таблиця символів у спільній бібліотеці або DLL. Це створюється лінкером і служить для імені всіх функцій та елементів даних, які бачать користувачі бібліотеки. Це дозволяє системі виконувати підключення під час виконання, вирішуючи відкриті посилання на ці імена до місця, де бібліотека завантажується в пам'ять.

Якщо ви хочете дізнатись більше, я пропоную чудову книгу Джона Левіна "Посилання та навантажувачі". текст посилання


Привіт, Бен, у другому випадку ти маєш на увазі таблицю експорту? Тобто, чи є таблиця експорту особливим випадком таблиці символів? Або це не пов’язані між собою поняття?
Pooven

Привіт. Я вважаю, що його немає в жодному об'єктному файлі, а посилається на них. По-друге, не могли б ви пояснити трохи більше, що ви мали на увазі під "кінцевим місцем розташування"? Фізична адреса або остаточна відносна адреса у вихідному коді.
stdout

26

Коротко кажучи, це відображення імені, яке ви присвоюєте змінній її адресі в пам’яті, включаючи такі метадані, як тип, область застосування та розмір. Він використовується компілятором.

Це загалом, а не тільки C [++] *. Технічно це не завжди включає пряму адресу пам'яті. Це залежить від того, на яку мову, платформу тощо націлений компілятор.


Думаю, вам було дуже важливо згадати зміст адреси, сказавши, що "вона не завжди включає пряму адресу пам'яті".
stdout

13

У Linux ви можете використовувати команду:

nm [файл об'єкта]

для переліку таблиці символів цього об’єктного файлу. З цього роздруківки ви зможете потім розшифрувати використовувані символи лінкера з їхніх імен .


8

Таблиця символів - це список "символів" у програмі / блоці. Символи - це найчастіше імена змінних чи функцій. За допомогою таблиці символів можна визначити, де в пам'яті будуть розташовані змінні або функції.



0

Таблиця символів - це важлива структура даних, створена та підтримувана компіляторами для зберігання інформації про появу різних сутностей, таких як імена змінних, імена функцій, об'єкти, класи, інтерфейси тощо.


Лінкери та асемблери також мають справу з таблицями символів (часто простішими, ніж компіляторні).
Василь Старинкевич
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.