LINUX.ORG.RU

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


0

2

Допустим, на компьютере стоят программы Вася и Валера.

Васе нужна библиотека Маша версии 1, а Валере - библиотека Маша версии 2. Допустим, в системе есть обе Маши, и они лежат по разным путям.

Можно ли стандартными для линуксов способами сделать так, чтобы Вася и Валера получили нужные им версии Маши, ничего не зная о деталях?

(статическая линковка и особые параметры запуска Васи и Валеры не должны иметь место)

★★★★☆

/etc/ld.so.conf
/etc/ld.so.conf.d/
Стандартнее некуда

imul ★★★★★
()

Можно ли стандартными для линуксов способами сделать так, чтобы Вася и Валера получили нужные им версии Маши, ничего не зная о деталях?

А ты думал цифирки в именах библиотек просто так?

$ ls -lh /usr/lib64/libavcodec.so*
lrwxrwxrwx. 1 root root   20 марта 19 09:42 /usr/lib64/libavcodec.so -> libavcodec.so.53.8.0
lrwxrwxrwx. 1 root root   20 марта 19 09:42 /usr/lib64/libavcodec.so.53 -> libavcodec.so.53.8.0
-rwxr-xr-x. 1 root root 6,1M февр. 29 21:30 /usr/lib64/libavcodec.so.53.8.0

Deleted
()
$ ldd /usr/lib/ruby/1.8/i386-linux/readline.so | grep readline
        libreadline.so.5 => /lib/libreadline.so.5 (0x00110000)
$ ldd /usr/bin/ftp | grep readline
        libreadline.so.6 => /lib/libreadline.so.6 (0x00954000)
anonymous
()
Ответ на: комментарий от Deleted

мне нужно, чтобы при загрузке библиотеки по имени «libavcodec.so» разные программы получали разные версии .so.

void* handle = dlopen("myclass.so", RTLD_LAZY);

У тебя есть либа «по умолчанию» (/usr/lib64/libavcodec.so -> libavcodec.so.53.8.0).

Задача такая: чтобы версии по умолчанию не было вообще, а грузилось только то, что запрогано в белом списке в виде соответствия: (программа, название_либы_для_dlopen, путь_до_либы).

Например:

/usr/bin/mplayer ; libavcodec.so ; /usr/lib/libavcodec.so.53.8.0
/usr/bin/xine-gui ; libavcodec.so ; /usr/lib/libavcodec.so.860.15.3

Можно так сделать?

У меня сейчас под рукой линукса нет, пишу с микроволновки, так что возможно жутко туплю и всё именно так и есть :(

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

мне нужно, чтобы при загрузке библиотеки по имени «libavcodec.so» разные программы получали разные версии .so.

Не нужно грузить библиотеки по имени *.so. Более того, нормальные программы так и не делают без очень веской необходимости. dlopen() вообще лучше не использовать для внешних библиотек.

У тебя есть либа «по умолчанию» (/usr/lib64/libavcodec.so -> libavcodec.so.53.8.0).

Она скорее не для загрузки, а для сборки. У собранных программ прописаны библиотеки с одной цифрой версии, что гарантирует (при наличии головы у разработчиков библиотеки) совместимость по ABI.

Задача такая: чтобы версии по умолчанию не было вообще, а грузилось только то, что запрогано в белом списке в виде соответствия: (программа, название_либы_для_dlopen, путь_до_либы).

Это не задача, а выдуманное тобой решение =). Опиши задачу.

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

LD_LIBRARY_PATH в .profile юзерхоума не?

зачем так радикально ;)

LD_LIBRARY_PATH=/path/to/my/library ./my_app

и засунуть это в скрипт my_app.sh

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

а то б я так и предложил.

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

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

Юзеру осталось бы только запустить эту обертку.

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

Именно для этого и надо. Точнее, для того, чтобы к программе, которая НЕ тянет за собой либы, эти либы присобачить.

stevejobs ★★★★☆
() автор топика
Ответ на: комментарий от Deleted

Задача - подменять для программ зависимости от версий библиотек. Универсальным способом, т.е. так, чтобы программа ничего не знала о текущей версии библиотеки, вне зависимости от используемого метода подключения либы. Учитывая также, что в системе может стоять несколько версий одной и той же программы, и все они могут использовать разные версии либы.

stevejobs ★★★★☆
() автор топика
Ответ на: комментарий от Deleted

И да, для этого можно было бы сделать новый дистрибутив, но я не хочу новый дистрибутив. Хочу чтобы это работало на арче с минимальными изменениями.

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

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

Ну вот, ты опять всё перепутал... Впрочем ладно. Тебе уже выше сказали про LD_LIBRARY_PATH. Делаешь для каждой программы директорию, в которую скидываешь все нужные либы (можно этот процесс почти полностью автоматизировать при помощи скрипта и ldd) и пишешь скрипт запуска для программы, который сначала устанавливает переменную окружения LD_LIBRARY_PATH, а потом запускает приложение.

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

ты предлагаешь написать обертки для Всего Дистрибутива? А не может с этой штукой возникнуть каких-нибудь проблем? Особенно со всякой системной и ядерной штукой, например если нужно будет перефигачить так SELinux?

поэтому и спрашиваю _стандартный_ способ, который действовал бы на уровне путей до библиотек :((

может тогда попробовать разобраться в ведре и написать патч, который бы в рантайме перехватывал переписывал пути к загружаемым либам?
Если ты когда-нибудь такое делал, можешь посоветова куда копать?

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

ты предлагаешь написать обертки для Всего Дистрибутива? А не может с этой штукой возникнуть каких-нибудь проблем? Особенно со всякой системной и ядерной штукой, например если нужно будет перефигачить так SELinux?

Да, проблемы возникнут.

поэтому и спрашиваю _стандартный_ способ, который действовал бы на уровне путей до библиотек :((

Стандартный способ я тебе уже сказал. И кстати при сборке можно в ELF'ы прописать не только имена библиотек, но и даже полные пути.

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

А разве этим ядро занимается? Тут я, к сожалению, не в курсе.

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

при сборке можно в ELF'ы прописать не только имена библиотек, но и даже полные пути

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

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