Интересуют платформы: 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? Ладно, погуглю... )