таблица визуальных символов, созданная компилятором C ++

я читал Эффективный C ++, 3-е издание и в п.2 (предпочитайте const, enums и inlines вместо #definesСкотт Мейерс упоминает таблица символов: он объясняет это #defines может не появиться в таблица символов.

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

Вот что я хотел бы знать:

  • Верна ли моя интерпретация выше?
  • После связывания, после того как адреса памяти были разрешены, я не думаю, что таблицы символов необходимы? То есть я думаю, что таблица символов не будет доступна в исполняемом файле / библиотеке; это верно?
  • Я подозреваю, что таблица символов также полезна для других задач компилятора? Возможно, что-то вроде выявления конфликтов имен?
  • Таблица символов, описанная выше, не совпадает с таблица экспорта. По крайней мере, в контексте Visual C ++ таблица экспорта определяет символы, которые явно объявлены как видимые вне библиотеки. Я полагаю, что в некотором смысле это таблица символов, но не связанная с таблицей символов, на которую ссылается Скотт.
  • Есть ли что-нибудь еще интересное в таблице символов? То есть, есть ли у меня какие-то дополнительные сведения о таблицах символов?

Спасибо за ваше время и вклад.

5

Решение

Таблицы символов существуют как для компилятора (и тогда компилятор помещает в них даже символы локальной переменной; даже препроцессор имеет какие-то таблицы символов для #define-d имена, но препроцессор может быть внутри компилятора сегодня) и для компоновщика. Но это разные таблицы, организованные по-разному.

Таблица символов компоновщика в основном предназначена для экспортируемых или импортируемых глобальных символов. Помните, что линкер выполняет некоторые перемещение. Имейте в виду, что компоновщик ведет себя совершенно по-разному в Windows и в Linux (dllimport в Windows, __attribute__(visibility...) в Linux). Обратите внимание, что для динамических библиотек некоторые связи происходят во время выполнения (динамическая загрузка). Для C ++ название искажения может случиться. Читайте также о смутная связь & создание шаблона & оптимизация времени соединения в НКУ

Читайте также Книга Левина: Линкеры и загрузчики и, например, википейдж на ELF формат (используется для объектных файлов, общих библиотек и исполняемых файлов в Linux и многих системах Unix).

Если у вас есть доступ к какой-либо системе Linux, используйте readelf (1), нм (1) а также objdump (1) коммунальные услуги. Читайте также Бумага Дреппера: Как писать общие библиотеки (в Linux)

5

Другие решения


По вопросам рекламы [email protected]