LINUX.ORG.RU

«Слабая» линковка: как?

 ,


1

1

Хочу вызвать функцию pthread_setname_np, но знаю что на древнем дебиане её нет.

Можно ли как-то объявить эту функцию так, что бы при запуске программы динамический линковщик попробовал подобрать эту функцию, но если нет, то всё равно запустился бы, что бы я мог проверить:

if(pthread_setname_np) pthread_setname_np(...);

Или я перемудриваю и надо сделать dlsym() с каким-то правильным аргументом?

Лучше вообще так не делать. Сделай код-заглушку, вынеси его в отдельный файл, и при сборке проверяй наличие нужной функции. Если её не будет, собирай свой вариант.

hateyoufeel ★★★★★
()
Ответ на: комментарий от hateyoufeel

Мне не годится вариант «при сборке». Я собираю один пакет и хочу, что бы он работал в описанных условиях.

max_lapshin ★★★★★
() автор топика
Ответ на: комментарий от xaizek

Почитал, интересно.

Только теперь перестал понимать, как работает LTO для c++, когда в разных исходных файлах генерируются одинаковые экземпляры для шаблона, а затем во время линковки остается только одна версия из одного объектного файла (другие одинаковые выкидываются). По сути при инстанциировании шаблона с одинаковыми типами в разных исходниках создаются одинаковые функции с одинаковыми именами, а при линковке остается только одна... Что-то я тут не понимаю.

x_hash
()
Ответ на: комментарий от x_hash

Только теперь перестал понимать, как работает LTO

Это не LTO, а One Definition Rule. Линкер просто сравнивает реализации и оставляет только одну. С weak символами не так, их значения пустуют до запуска и заполняются динамическим линкером.

Или речь о том, что будет если к программе с шаблоном подгрузить библиотеку с реализацией того же шаблона? В таком случае будут две (возможно, одинаковые) реализации, соответственно, с разными адресами. Тут как бы поздно уже что-то делать. Не уверен покрывает ли стандарт как-то подгружаемые модули, в лучшем случае это может быть unspecified behaviour. Ни к чему плохому это в принципе не должно привести (может, но это надо постараться).

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

С шаблонами прикол в том, то они определяются в заголовочных файлах и инстанциируются в .cpp файлах. Таким образом из каждого .cpp файла при компиляции создается объектный, в котором будет инстанциирована шаблонная функция. Если типы шаблона одинаковые, то функции одинаковые, но при линковке этих объектников остается только одна и никаких ошибок линковки не будет. Если же в двух файлах определить обычную функцию (с одинаковыми сигнатурами), то такие объектники не линкуются (я ходил по ссылке и проверял последний пример).

Сейчас проверю, что происходит с инстанциированием шаблонов. Хочу понять, где я ошибаюсь.

x_hash
()
Ответ на: комментарий от x_hash

Ок. Я разобрался. Шаблоны инстанциируются weak функциями (если в двух исходниках сделать #include <vector> и вызвать vector<int>.push_back(), то в обоих объектниках инстанциируется «W _ZNSt6vectorIiSaIiEE9push_backERKi»). Ну, а при линковке остается только одна из одного объектника.

Я и раньше знал, что остается только одна, но не знал что символы бывают weak и strong и думал, что линковщик в любом случае оставляет только один экземпляр. Но в последнем примере по ссылке написано про конфликты...

x_hash
()
Последнее исправление: x_hash (всего исправлений: 1)
Ответ на: комментарий от x_hash

Я тоже не знал, что шаблонные функции как weak символы определяются.

Но в последнем примере по ссылке написано про конфликты...

Ага и в комментариях, берётся первый найденый символ, т.е. линкер не выполняет работу по проверке того, что функции одинаковые. В зависимости от порядка объектных файлов я получаю разные результаты внутри шаблона, который использует макрос. В идеале, линкер должен выдать ошибку, что функции с одинаковым именем имеют разные тела.

xaizek ★★★★★
()
Ответ на: комментарий от max_lapshin

Ну, это не прямо таки проблемы, а скорее следствия фич. Просто их реализация местами не идеальная. На практике, с последствиями таких вещей не так уж часто сталкиваются. Если те же макросы в шаблонах использовать и определять их в разных местах по разному, то разработчик сам же себя и наказывает.

xaizek ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.