Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Хочу разобраться с линковкой, таблицами экспорта, ключевыми словами C/C++. / 1 сообщений из 1, страница 1 из 1
04.03.2013, 03:07
    #38172812
Ivan Ignatov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хочу разобраться с линковкой, таблицами экспорта, ключевыми словами C/C++.
Интересуют платформы: linux, windows, macOS. Последние 2 знаю хуже. Меня интересуют не спецификации или "как правильно", а как оно в реальности и какие есть побочные явления/возможности. Что я помню:

Компилятор выдаёт один объектный файл на каждую единицу трансляции - .cpp файл с кучей включенных .h. В этот объектный файл попадает таблица экспорта - набор "символов" (строк/имён) с атрибутами и адресом для каждого символа. Имена функций, глобальных переменных и т.п. Адрес - всмысле по какому смещению от адресного пространства процесса или какой-то секции (напр. секции кода, секции данных) данный символ будет лежать в памяти. Атрибуты - это код/данные/другое.

Когда из набора объектных файлов линкуется один .so/.dll/.a/.exe, наши таблицы экспорта из всех объектных файлов тупо сливаются в одну. Если какой-то символ где-то дублируется, линкер матерится (как оно под разными платформами)?

Есть ли в таблице экспорта какая-то "разная степень видимости"? Т.е. могут там лежать символы public, private или ещё что-то такое хитрое? Незнаю для чего! Есть ли там что-то такое или всё попавшее в таблицу экспорта видимо извне линкером?

Сколько в каждом .obj / .so / .dll - файле таблиц экспорта? Одна на весь файл или у неё существуют разные разделы?

C++ - классы выступают как пространства имён для "символов". Плюс сами namespace-ы. Для них есть какие-то правила формирования имён символов или каждый компилятор заворачивает двойные двоеточия ("::") как-то по-своему?

Что сделать в C/C++ - программе, чтобы обеспечить символу присутствие в таблице экспорта? Это будет любая функция или функция-член класса и любая глобальная переменная? Правильно я понимаю, что static глобальные переменные не попадут в таблицу экспорта, обеспечивая локальность символа для данной единицы трансляции? А если надо заюзать глобальную переменную из другой единицы трансляции, то нужно объявить эту переменную со словом extern?

Я гарантированно где-то неправ, т.к. давно не думал об этом, поправьте/дополните пожалуйста. Плюс интересно почитать что-нибудь касающееся сабжа, но что у меня не упомянуто и особо интересно почитать о различиях линковальной кухни под разными платформами, о платформенно-зависимых ключевых словах языков C/C++ под разными платформами: о виндовых "__declspec(dllexport)" и прочей такой тряхомути.

Что такое hidden visibility в gcc? Ладно, погуглю... )
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Хочу разобраться с линковкой, таблицами экспорта, ключевыми словами C/C++. / 1 сообщений из 1, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]