как подменить библиотеку?

можно ли и как подменить библиотеку для отдельно взятой софтины?
grayich
подменить библиотеку
LD_LIBRARY_PATH="/путь до библиотеки" программа
vs220, это я так понимаю укажет путь где искать ВСЕ библиотеки, а мне нужно одну только
grayich
мне нужно одну только
Положите в каталог одну, остальные будут искаться по стандартным путям
Список динамических библиотек приведен в исполняемом файле, например, возьмем firefox
$ readelf -d /usr/bin/firefox | grep NEEDED
0x00000001 (NEEDED)                     Совм. исп. библиотека: [libpthread.so.0]
 0x00000001 (NEEDED)                     Совм. исп. библиотека: [libdl.so.2]
 0x00000001 (NEEDED)                     Совм. исп. библиотека: [libstdc++.so.6]
 0x00000001 (NEEDED)                     Совм. исп. библиотека: [libm.so.6]
 0x00000001 (NEEDED)                     Совм. исп. библиотека: [libgcc_s.so.1]
 0x00000001 (NEEDED)                     Совм. исп. библиотека: [libc.so.6]
 0x00000001 (NEEDED)                     Совм. исп. библиотека: [ld-linux.so.2]
При запуске проги приведенные библиотеки считываются, загружаются и попадают в память, откуда они и считываются при запросе ......... в принципе их можно посмотреть и через ldd (хотя это делать не рекомендуют, если есть сомнения в чистоте кода) … проверяем … и убеждаемся. что получаем все те же библиотеки
$ ldd /usr/bin/firefox
linux-gate.so.1 (0xb772e000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0xb76e5000)
libdl.so.2 => /usr/lib/libdl.so.2 (0xb76e0000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7560000)
libm.so.6 => /usr/lib/libm.so.6 (0xb750a000)
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0xb74ec000)
libc.so.6 => /usr/lib/libc.so.6 (0xb7333000)
/lib/ld-linux.so.2 (0xb7730000)
Насчет подмены библиотеки, …. как можно судить, возможны следующие варианты
1. Пересобрать прогу ….. это, конечно, не выход … и самый крайний вариант … а, главное, нужны все исходники
2. Править код …. не выход … нужно знать, что править и возможно ли это в данном конкретном случае.
3. Самое простое — сделать симлинк на нужную библиотеку … если, конечно, такая имеется и является полным аналогом заменяемой библиотеки … PS .... но это, конечно, дело вкуса ... можно и как написал vs220
Например, недавно возился с прогой sb_pilot - прога не запускалась ввиду отсутствия библиотеки libncurses.so.5, которая была прописана в бинарнике
readelf -d ~/..../sb_pilot | grep NEEDED
0x00000001 (NEEDED)                     Совм. исп. библиотека: [libncurses.so.5]
Эта библиотека из пакета ncurses 5, а у нас стоит ncurses 6 …. но, главное, что в нашем пакете эта билиотека даже и называется немного по другому - libncursesw.so.6.0
Я решил попробовать сделать симлинк на libncursesw.so.6.0 …. по идее должно пройти, но полной уверенности не было ….. прошло, прога запустилась
$ ls -l /usr/lib/libncurses.so.5
lrwxrwxrwx 1 root root 27 янв 27 19:09 /usr/lib/libncurses.so.5 -> /usr/lib/libncursesw.so.6.0
Ошибки не исчезают с опытом - они просто умнеют
Можно еще
LD_PRELOAD="/путь до библиотеки" программа
Путь до библиотеки и название
например
LD_PRELOAD=/usr/lib/libv4l/v4l1compat.so программа
vs220, сработало, благодарю)
Если на постоянку, то проще симлинк
Ошибки не исчезают с опытом - они просто умнеют
vasek, это как?
vasek
то проще симлинк
Это не подойдет если используются две версии одной и той же библиотеки. В системе используется новая версия а программе нужна старая. Сделав симлинк вы заставите все программы использовать старую версию, что может привести к неработоспособности
 
Зарегистрироваться или войдите чтобы оставить сообщение.