LINUX.ORG.RU

Динамическая линковка и конфликт символов


0

1

проблема: в двух библиотеках есть одинаковые символы. при линковке с обоими одного бинарника он использует символы только из одной из них. вот демонстрационный пример, если не понятно...

проблему можно решить загружая всё вручную через dlopen/dlsyn: https://gist.github.com/4067451 но тут две проблемы: 1. всё это очень тяжело, если символов туева хуча. 2. в плюсах символы сильно исковерканы.

собственно вопрос нумер раз: как это ещё можно сделать?

есть такая идея: перекинуть lib2_doer в отдельную либу и при её загрузке как-то указать, с какой библиотекой линковать именно её. но не знаю, возможно ли это в принципе...

отсюда вопрос нумер два: что почитать о том, как ld делает своё грязное дело? хотелось бы что-нить полегче исходников glibc...

Ответ на: комментарий от geekless

библиотеки чужие... задача заставить работать их вместе с применением костылей в разумных рамках.

Fat-Zer
() автор топика
Ответ на: комментарий от Fat-Zer

«Вмешательство в апстрим» - вещь совершенно обычная. Если уж так не хочешь «вмешиваться» - сделай (сгенерируй) библиотеки-обертки, которые сделаны из статических апстримных библиотек и экcпортируют ровно те символы, которые тебе нужны.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от Fat-Zer

собственно альтернатива менять API, этого и стараюсь избежать...

То есть ты реально хочешь линковать к одному бинарю библиотеки с пересекающимися символами?

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

«Вмешательство в апстрим» - вещь совершенно обычная. Если уж так не хочешь «вмешиваться» - сделай (сгенерируй) библиотеки-обертки, которые сделаны из статических апстримных библиотек и экcпортируют ровно те символы, которые тебе нужны.

можно малость поподробней...

То есть ты реально хочешь линковать к одному бинарю библиотеки с пересекающимися символами?

ну... да... в этом вся соль.

Fat-Zer
() автор топика

Proxy-либы, которые линкуются каждая со своей либой. Экспортируют все те же фунции, что и оригинальные либы, но с префиксами.
По факту, вызывают оригинальные функциию.

Так можно накостылять.

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

нельзя так накостылить, линкер всё равно будет обходить бибилиотеки в неопределённом порядке.

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

Proxy-либы, которые линкуются каждая со своей либой. Экспортируют все те же фунции, что и оригинальные либы, но с префиксами.
По факту, вызывают оригинальные функциию.

https://gist.github.com/4067827 вот так? не работает...

Fat-Zer
() автор топика
Ответ на: комментарий от nanoolinux

этот анонимус торт.

на удивление...

нашёл ещё кое-что: inline namespace из с++11. можно легко прикрутить... конечно ABI это полностьбю рушит, зато API не трогает... ИМХО торт

Fat-Zer
() автор топика
Ответ на: комментарий от Fat-Zer

http://www.akkadia.org/drepper/symbol-versioning

а вот это уже идея... если сработает, то будет очень даже Ъ.

Интересно, как ты это сделаешь без «вмешательства в апстрим».

нашёл ещё кое-что: inline namespace из с++11. можно легко прикрутить...

И это тоже.

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

в первом по идее достаточно только правильно слинковать...

а второе со вмешательством конечно... не совсем точно выразился: вмешиваться можно, но задача стояла не поломать АПИ...

Fat-Zer
() автор топика
Ответ на: комментарий от Fat-Zer

в первом по идее достаточно только правильно слинковать...

Нет.

не совсем точно выразился: вмешиваться можно, но задача стояла не поломать АПИ...

Ты просто... не знаешь... чего хочешь... тебе невозможно... помочь...

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