Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Таблицы экспорта. Линковка.
|
|||
|---|---|---|---|
|
#18+
Модераторы, я случайно параллельно запостил это в ПРОГРАММИРОВАНИЕ. Если будете удалять одно из двух, удалите ТАМ, оставьте ЗДЕСЬ пожалуйста. Интересуют платформы: 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? Ладно, погуглю... ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2013, 03:12 |
|
||
|
Таблицы экспорта. Линковка.
|
|||
|---|---|---|---|
|
#18+
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 добавили специальный аттрибут командующий линкеру спрятать объект (функции/классы/переменные) и не показывать его в библиотеке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2013, 09:07 |
|
||
|
Таблицы экспорта. Линковка.
|
|||
|---|---|---|---|
|
#18+
White OwlВ последних gcc добавили специальный аттрибут командующий линкеру спрятать объект (функции/классы/переменные) и не показывать его в библиотеке. Вообще-то указать линкеру --no-export-all-symbols и прочие --exclude* можно было уже давно. Как и возможность использовать .def-файл. Иначе symbol hell в линуксе был бы просто невыносим. PS: Это я так ворчу, поскольку однажды потратил полдня выясняя почему падает моя программа пока не нашёл у себя переменную с именем, совпадающим с функцией, вызываемой из so-шки. Умный линкер при загрузке заставлял библиотеку вызывать переменную из программы вместо функции той же библиотеки. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2013, 13:54 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=83&tid=2020407]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
33ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
| others: | 47ms |
| total: | 188ms |

| 0 / 0 |
