Статическая связь с динамической библиотекой. glibc

Так. У меня возникла проблема: на машине установлены две версии GCC.
3.4.6 и 4.1.

Это связано с некоторыми проблемами зависимости с новым программным обеспечением. (требуется glibc 4.1)

Когда я собираюсь связать это новое программное обеспечение с библиотеками 4.1, оно прекрасно связывается. Однако когда дело доходит до запуска программного обеспечения, оно не может найти библиотеку, потому что ищет 3.4.6 в моем LD_LIBRARY_PATH. Если я установлю LD_LIBRARY_PATH на библиотеку 4.1, это взорвет оболочку, помимо прочего, потому что для этого используются библиотеки 3.4.6.

Это что-то вроде уловки 22.

Есть ли способ, которым во время компоновки я могу указать абсолютный путь к этой общей библиотеке без использования LD_LIBRARY_PATH?

Таким образом, я надеюсь иметь обе версии, но использовать только 4.1 для этого конкретного приложения?


person Alex    schedule 15.01.2009    source источник
comment
На самом деле такой вещи нет, но программы, требующие glibc в более старой версии, также должны принимать версию never, поскольку она обратно совместима.   -  person Ronny Brendel    schedule 15.01.2009
comment
Верю, что версия 4.0 нарушает обратную совместимость.   -  person Alex    schedule 15.01.2009


Ответы (3)


Вы имеете в виду абсолютный путь, который используется при запуске программы и является предпочтительным при поиске библиотек? rpath именно так. Он перезапишет путь поиска по умолчанию и данные, установленные в LD_LIBRARY_PATH. Просто скажите gcc передать его компоновщику:

g++ -Wl,-rpath,/usr/lib/my_4.1 -omy_binary *.cpp

Вы можете заставить его показывать вам обработку поиска (используйте help, чтобы предоставить вам больше возможностей):

[js@HOST2 cpp]$ LD_DEBUG=libs ./a.out
  5859:     find library=libc.so.6 [0]; searching
  5859:      search path=/usr/lib/my_4.1/tls/i686/sse2:/usr/lib/my_4.1/tls/i686:
               /usr/lib/my_4.1/tls/sse2:/usr/lib/my_4.1/tls:
               /usr/lib/my_4.1/i686/sse2:/usr/lib/my_4.1/i686:
               /usr/lib/my_4.1/sse2:/usr/lib/my_4.1  (RPATH from file ./a.out)
  5859:       trying file=/usr/lib/my_4.1/tls/i686/sse2/libc.so.6
  5859:       ....
  5859:      search cache=/etc/ld.so.cache
  5859:       trying file=/lib/libc.so.6  (note: found here!)
  5859:
person Johannes Schaub - litb    schedule 15.01.2009

на самом деле не ответ на ваш вопрос, а альтернативное решение:

вы сможете решить свои проблемы, добавив новый путь к библиотеке в /etc/ld.so.conf и запустив ldconfig от имени пользователя root.

person Hasturkun    schedule 15.01.2009

Разве вы не можете установить LD_LIBRARY_PATH только для приложения, которому это нужно? т.е. вместо того, чтобы устанавливать его глобально как экспортируемую переменную, запустите свою программу как

LD_LIBRARY_PATH=/path/to/4.1/libs my_executabel

?

-k

person Ketil    schedule 16.10.2010