я читал Эффективный C ++, 3-е издание и в п.2 (предпочитайте const, enums и inlines вместо #definesСкотт Мейерс упоминает таблица символов: он объясняет это #defines
может не появиться в таблица символов.
На основании ответа Вот, немного из предложенного чтение из них, и Википедия В статье я бы определил таблицу символов следующим образом: поскольку компилятор создает объектные файлы только для каждой единицы перевода, нам все еще нужен способ ссылки на символы между единицами перевода. Это делается с помощью таблицы, которая создается для каждого объектного файла, чтобы символы могли быть определены на более позднем этапе — компоновщиком, когда исполняемый файл / библиотека создается из объектных файлов. Во время компоновки компоновщик заменяет символы соответствующими адресами в памяти.
Вот что я хотел бы знать:
Спасибо за ваше время и вклад.
Таблицы символов существуют как для компилятора (и тогда компилятор помещает в них даже символы локальной переменной; даже препроцессор имеет какие-то таблицы символов для #define
-d имена, но препроцессор может быть внутри компилятора сегодня) и для компоновщика. Но это разные таблицы, организованные по-разному.
Таблица символов компоновщика в основном предназначена для экспортируемых или импортируемых глобальных символов. Помните, что линкер выполняет некоторые перемещение. Имейте в виду, что компоновщик ведет себя совершенно по-разному в Windows и в Linux (dllimport
в Windows, __attribute__(visibility...)
в Linux). Обратите внимание, что для динамических библиотек некоторые связи происходят во время выполнения (динамическая загрузка). Для C ++ название искажения может случиться. Читайте также о смутная связь & создание шаблона & оптимизация времени соединения в НКУ…
Читайте также Книга Левина: Линкеры и загрузчики и, например, википейдж на ELF формат (используется для объектных файлов, общих библиотек и исполняемых файлов в Linux и многих системах Unix).
Если у вас есть доступ к какой-либо системе Linux, используйте readelf (1), нм (1) а также objdump (1) коммунальные услуги. Читайте также Бумага Дреппера: Как писать общие библиотеки (в Linux)