ldconfig создает неправильный симлинк

Автор hexray, 21 января 2014, 13:41:57

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

hexray

Здравствуйте. Возникла небольшая проблемка. Некоторое время использовал драйвер radeon+mesa потом поставил fglrx. Но заводиться 3D приложения под ним не захотели, причина оказалась проста - символическая ссылка libGL.so.1 указывала не на libGL fglrx а на libGL mesa. Ну поправил, все заработало, и забыл. Да не надолго. Буквально на следующий день проблема повторилась. Что-то пересоздавало эту ссылку на не ту библиотеку. Виновника искать долго не пришлось:
/usr/lib64# ll libGL.so*
lrwxrwxrwx 1 root root     10 янв 13 00:27 libGL.so -> libGL.so.1
lrwxrwxrwx 1 root root     12 янв 21 11:13 libGL.so.1 -> libGL.so.1.2
lrwxrwxrwx 1 root root     24 янв 13 00:27 libGL.so.1.2 -> fglrx/fglrx-libGL.so.1.2
-rwxr-xr-x 1 root root 511032 окт 22 05:54 libGL.so.1.2.0
/usr/lib64# ldconfig
/usr/lib64# ll libGL.so*
lrwxrwxrwx 1 root root     10 янв 13 00:27 libGL.so -> libGL.so.1
lrwxrwxrwx 1 root root     14 янв 21 11:14 libGL.so.1 -> libGL.so.1.2.0
lrwxrwxrwx 1 root root     24 янв 13 00:27 libGL.so.1.2 -> fglrx/fglrx-libGL.so.1.2
-rwxr-xr-x 1 root root 511032 окт 22 05:54 libGL.so.1.2.0

ldconfig при каждом запуске создает ссылку libGL.so.1 которая указывает не на другую ссылку (libGL.so.1.2 -> fglrx/fglrx-libGL.so.1.2), как мне бы хотелось, а прямиком на библиотеку mesa (libGL.so.1.2.0).
Вопрос не в том как это исправить вообще, а в том как это сделать правильно, чтобы обе библиотеки лежали на своих местах а ldconfig не трогал верную ссылку.
Очень похожая проблема возникала у арчеводов https://bbs.archlinux.org/viewtopic.php?pid=1363367 но они вроде как решили ее выпиливанием 'неугодной' библиотеки из зоны видимости ldconfig (т.е. /usr/lib), что не есть тру.

bormant

#1
А вот такое на ldconfig не повлияет?
# cd /usr/lib64
# ln -fs fglrx/fglrx-libGL.so.1.2 libGL.so
# ln -fs fglrx/fglrx-libGL.so.1.2 libGL.so.1


А если прописать в /etc/ld.conf последней строчкой
/usr/lib64/fglrx/
это ситуацию не изменит?

При загрузке ldconfig вызывается из /etc/rc.d/rc.M:
if [ -x /sbin/ldconfig ]; then
  echo "Updating shared library links:  /sbin/ldconfig &"
  /sbin/ldconfig &
fi
а также обычно вызывается после установки пакетов библиотек из установочных сценариев их пакетов.

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

hexray

Нет, не помогло. Он все равно пересоздает по своему. Я уже даже "/usr/lib64/fglrx" добавлял в список /etc/ld.so.conf

/usr/lib64# ln -fs fglrx/fglrx-libGL.so.1.2 libGL.so.1
/usr/lib64# ll libGL.so*
lrwxrwxrwx 1 root root     10 янв 13 00:27 libGL.so -> libGL.so.1
lrwxrwxrwx 1 root root     24 янв 21 11:58 libGL.so.1 -> fglrx/fglrx-libGL.so.1.2
lrwxrwxrwx 1 root root     24 янв 13 00:27 libGL.so.1.2 -> fglrx/fglrx-libGL.so.1.2
-rwxr-xr-x 1 root root 511032 окт 22 05:54 libGL.so.1.2.0
/usr/lib64# ldconfig
/usr/lib64# ll libGL.so*
lrwxrwxrwx 1 root root     10 янв 13 00:27 libGL.so -> libGL.so.1
lrwxrwxrwx 1 root root     14 янв 21 11:59 libGL.so.1 -> libGL.so.1.2.0
lrwxrwxrwx 1 root root     24 янв 13 00:27 libGL.so.1.2 -> fglrx/fglrx-libGL.so.1.2
-rwxr-xr-x 1 root root 511032 окт 22 05:54 libGL.so.1.2.0


Собственно по той ссылке, что я привел, юзер Gusar ответил почему это происходит:
ЦитироватьAnd the reason ldconfig creates the symlink? Simple, It's the libGL.so with the highest soname.
Но что с этим поделать не совсем ясно. Я попытался 'повысить soname' для fglrx переименовав fglrx/fglrx-libGL.so.1.2 в fglrx/fglrx-libGL.so.1.2.0 и даже fglrx/fglrx-libGL.so.1.2.1 но ldconfig на это не смотрит и упорно гнет свое  :dirol_mini:

bormant

#3
А с добавленным в каталогом /usr/lib64/fglrx/ в /etc/ld.conf что говорит
# ldconfig -v | grep -F libGL.so


Остаётся обёртка. Переименовать /sbin/ldconfig, скажем, в /sbin/ldconfig.orig, в /sbin/ldconfig положить исполняемый сценарий, вызывающий /sbin/ldconfig.orig с параметрами, а затем восстанавливающий символьные ссылки.

Или пытаться libGL.so.1.2.0 переселить, скажем, в /usr/lib64/mesa/.

Или снести пакеты mesa и, если правильно путаю, xf86-video-ati.