LINUX.ORG.RU

как слинковаться с библиотекой не добавляя её в зависимости?

 ,


0

1

Есть приложение App, и библиотеки libUtils, libFoo, и libBar.

libFoo и libBar используют функционал из libUtils: т.е. ряд классов например.

Приложение App на старте грузит libUtils вручную, а затем подбирает libFoo и libBar. хотелось бы сделать так, чтоб libFoo при загрузке через динамический линкер не тащило за собой libUtils а воспользовалось тем, что загружено.

т.е. я хочу чтоб libFoo и libBar использовали код, классы и т.д. из libUtils, но в выхлопе ldd libUtils у них не было. Теоретически такая возможность есть - все символы из libUtils в зависящих от неё библиотеках могут быть в ELF-файле UNDEFINED и ресолвиться по факту обращения.

А есть ли такая возможность на практике?

А разве это не так работает по умлочанию? ЕМНИП, Линукс как раз определяет загржена ли библиотека, и, если да, переиспользует ее. В связи с этим и возникает неоднозначность в трактовании понятия «сколько памяти занимает программа»: учитывать ли библиотеки, которые шарятся с другими программами, или нет?

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 1)

dlopen в libFoo и libBar это не то, чего ты хочешь? Ты же говоришь, что уже сделал так для App, так в чём проблема переписать либы? А уже слинкованные либы можно исправить в любом hex-редакторе.

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

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

i36_zubov
() автор топика
Ответ на: комментарий от Kroz

если я добавлю -lUtils в команду линковки, эта либа явно появится в зависимостях. а вот этого я не хочу.я хочу подавить именно автоматическую загрузку некоторых зависимостей.

i36_zubov
() автор топика
Ответ на: комментарий от anonymous

А уже слинкованные либы можно исправить в любом hex-редакторе.

Можно ключевые слова для гугления сего метода?

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

man dlopen

он немного другую задачу решает. мне нужно подавить автозагрузку одной конкретной библиотеки потому что я уже её нашел и загрузил. я не хочу чтоб параллельно еще одна загрузилась и начала гадить.

тут скорее к линкеру вопросы, как его проинструктировать.

i36_zubov
() автор топика

Не линкуй libFoo с libBar, если линкер ругается дай ему опцию чтобы разрешил unresolved символы

annulen ★★★★★
()

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

На самом деле с ELF все будет как ты хочешь, если оставить все как есть, но для успокоения можно убрать NEEDED libUtils.so из libFoo.so

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

А по-моему это никаких проблем не вызывает. Видел такое и нормально работало. Вполне возможно, что даже повторной загрузки не будет.

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

у нас С++ к сожалению, dlsym тут не поможет.

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

самое гнусное, что эту программу надо и под окошки собирать

i36_zubov
() автор топика

всем спасибо.

решил использовать patchelf для linux, для винды пока «будем посмотреть» как быть дальше.

i36_zubov
() автор топика

Твои действия не имеют смысла, потому что поведение по умолчанию и так является таким. В память будет загружена ровно одна копия каждой используемой библиотеки, если не предпринять каких-нибудь специальных мер. Более того, read-only секции будут загружены в память единожды не просто для всей программы, а для всех процессов в системе, использующих данную библиотеку. И, кстати, под офтопиком поведение такое же.

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

эта либа явно появится в зависимостях.

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

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

у нас С++ к сожалению,

Ваще монопенисуально.

dlsym тут не поможет.

Еще как поможет.

slackwarrior ★★★★★
()

Как ты думаешь, для чего вообще придумали эти библиотеки?

anonymous
()

ТС, возьми книжку что-ли почитай, ты какой-то бред делаешь от непонимания похоже.

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