powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Таблицы экспорта. Линковка.
3 сообщений из 3, страница 1 из 1
Таблицы экспорта. Линковка.
    #38172814
Фотография Ivan Ignatov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модераторы, я случайно параллельно запостил это в ПРОГРАММИРОВАНИЕ. Если будете удалять одно из двух, удалите ТАМ, оставьте ЗДЕСЬ пожалуйста.

Интересуют платформы: 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
Таблицы экспорта. Линковка.
    #38172886
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan IgnatovКомпилятор выдаёт один объектный файл на каждую единицу трансляции - .cpp файл с кучей включенных .h. В этот объектный файл попадает таблица экспорта - набор "символов" (строк/имён) с атрибутами и адресом для каждого символа. Имена функций, глобальных переменных и т.п.Да
Ivan IgnatovАдрес - всмысле по какому смещению от адресного пространства процесса или какой-то секции (напр. секции кода, секции данных) данный символ будет лежать в памяти. Нет. Адреса это дело линкера. В объектнике только локальные адреса: "Здесь лежит код этой функции, а здесь этой". А где они будут лежать в реальности в адресном пространстве решает линкер.

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

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

Ivan IgnatovСколько в каждом .obj / .so / .dll - файле таблиц экспорта? Одна на весь файл или у неё существуют разные разделы?эээ... ты про какой из форматов спрашиваешь? В принципе все они представляют из себя библиотеки неких объектов. Соответственно таблицу экспорта обычно многосекционные.
И не забывай что существует несколько разных форматов obj, несколько разных .so, несколько разных .dll...

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

Ivan IgnatovЧто сделать в C/C++ - программе, чтобы обеспечить символу присутствие в таблице экспорта?По разному. Зависит от языка (С или С++) и компилятора. Начни с ответа на вопрос: а где и зачем тебе это нужно?

Ivan IgnatovПравильно я понимаю, что static глобальные переменные не попадут в таблицу экспорта, обеспечивая локальность символа для данной единицы трансляции? А если надо заюзать глобальную переменную из другой единицы трансляции, то нужно объявить эту переменную со словом extern?Для глобальных переменных, на этапе компиляции - да.

Ivan IgnatovПлюс интересно почитать что-нибудь касающееся сабжа, но что у меня не упомянуто и особо интересно почитать о различиях линковальной кухни под разными платформами, о платформенно-зависимых ключевых словах языков C/C++ под разными платформами: о виндовых "__declspec(dllexport)" и прочей такой тряхомути.я не знаю где бы это описывалось в одном месте. Ну можно начать с теории компиляторов. Например вот: http://www.amazon.com/Compilers-Principles-Techniques-Edition-ebook/dp/B004P5NQYI/ref=dp_kinw_strp_1

Ivan IgnatovЧто такое hidden visibility в gcc? Ладно, погуглю... )Традиционно, на gcc/linux все объекты видимые из других единиц трансляции также становятся видимыми и когда все это собрано в разделяемую библиотеку. На винде наоборот - хочешь чтобы объект был видим из библиотеки - объяви его специально. В последних gcc добавили специальный аттрибут командующий линкеру спрятать объект (функции/классы/переменные) и не показывать его в библиотеке.
...
Рейтинг: 0 / 0
Таблицы экспорта. Линковка.
    #38173284
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlВ последних gcc добавили специальный аттрибут командующий линкеру спрятать
объект (функции/классы/переменные) и не показывать его в библиотеке.

Вообще-то указать линкеру --no-export-all-symbols и прочие --exclude* можно было уже
давно. Как и возможность использовать .def-файл. Иначе symbol hell в линуксе был бы просто
невыносим.

PS: Это я так ворчу, поскольку однажды потратил полдня выясняя почему падает моя программа
пока не нашёл у себя переменную с именем, совпадающим с функцией, вызываемой из so-шки.
Умный линкер при загрузке заставлял библиотеку вызывать переменную из программы вместо
функции той же библиотеки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Таблицы экспорта. Линковка.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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