Здесь есть два общих и связанных значения таблиц символов.
Во-первых, в ваших объектных файлах есть таблица символов. Обычно компилятор C или C ++ компилирует один исходный файл в объектный файл с расширением .obj или .o. Он содержит коллекцию исполняемого кода и данных, которые компоновщик может обработать в работающее приложение или общую библиотеку. В объектном файле есть структура данных, называемая таблицей символов, которая отображает различные элементы в объектном файле на имена, понятные компоновщику. Если вы вызываете функцию из своего кода, компилятор не помещает окончательный адрес подпрограммы в объектный файл. Вместо этого он помещает в код значение заполнителя и добавляет примечание, в котором указывается, что компоновщик должен искать ссылку в различных таблицах символов во всех объектных файлах, которые он обрабатывает, и указывать там окончательное местоположение.
Во-вторых, есть также таблица символов в общей библиотеке или DLL. Он создается компоновщиком и служит для именования всех функций и элементов данных, которые видны пользователям библиотеки. Это позволяет системе выполнять связывание во время выполнения, разрешая открытые ссылки на эти имена в место, где библиотека загружена в память.
Если вы хотите узнать больше, я предлагаю прекрасную книгу Джона Левина «Линкеры и загрузчики». текст ссылки