2016-03-16 6 views
0

У меня есть простая программа hello_world.cpp. Я скомпилировал его с помощью g ++ 4.4.7 в системе CentOS 6.6. Когда я смотрю на ldd a.out:Почему настройка LD_LIBRARY_PATH изменяет зависимости разделяемой библиотеки?

linux-vdso.so.1 => (0x00007fffbd79e000) 
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00002ab6f6819000) 
libm.so.6 => /lib64/libm.so.6 (0x00002ab6f6b1f000) 
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00002ab6f6da4000) 
libc.so.6 => /lib64/libc.so.6 (0x00002ab6f6fba000) 
/lib64/ld-linux-x86-64.so.2 (0x00002ab6f65f7000) 

Когда я загружаю модуль для GCC-4.9.2, LD_LIBRARY_PATH установлен в /path/to/gcc-4.9.2/lib64 и работает ldd a.out выходы:

linux-vdso.so.1 => (0x00007ffff9393000) 
libstdc++.so.6 => /path/to/gcc-4.9.2/lib64/libstdc++.so.6 (0x00002b2b7c104000) 
libm.so.6 => /lib64/libm.so.6 (0x00002b2b7c435000) 
libgcc_s.so.1 => /path/to/gcc-4.9.2/lib64/libgcc_s.so.1 (0x00002b2b7c6b9000) 
libc.so.6 => /lib64/libc.so.6 (0x00002b2b7c8cf000) 
/lib64/ld-linux-x86-64.so.2 (0x00002b2b7bee2000) 

ВОПРОС: Почему 4.9.2 версия gcc-библиотек, используемых при установке LD_LIBRARY_PATH, хотя я скомпилирован с 4.4.7?

Это, похоже, создает проблему с пониманием того, какая версия библиотеки используется. Пользователь может скомпилировать программу с одной версией компилятора, загрузить разные версии компилятора (через модуль), а затем запустить исполняемый файл, который использует другую версию библиотеки, чем ожидалось.

+0

«Когда я загружаю модуль для gcc-4.9.2, LD_LIBRARY_PATH установлен в ...« Что вы имеете в виду? Кто это устанавливает? –

+0

он установлен в файле модуля, то есть: preend-path LD_LIBRARY_PATH /path/to/gcc-4.9.2/lib64 –

ответ

0

Я не знаю, знаете ли вы, что использование Environment Modules не является необходимой или нормальной частью использования GCC или даже с использованием нескольких версий GCC.

Настройка LD_LIBRARY_PATH для переопределения каталогов по умолчанию порядок поиска системного динамического компоновщика это практика, которая уже давно и громко порицал, по причинам, которые включают один экспрессируется в последнем абзаце Вашего поста. См. Gurus say that LD_LIBRARY_PATH is bad

Выполнение этого в рамках модулей среды в системе, специально разработанной для использования нескольких версий инструментов или инструментальных цепей , может рассматриваться как регулируемое применение опасной практики. В этом контексте, однако, настройка LD_LIBRARY_PATH в вашем окружном модуле gcc-4.9.2 делает именно то, что должно делать такое : переопределение порядка поиска каталогов по умолчанию для динамического компоновщика . См. the documentation: 3.3.1.

В принципе возможно, что программа компилируется и связана с более старой или поздней версией GCC будет вести себя неожиданно, если вы решили запустить его в среды модуля GCC-4.9.2. Модули окружающей среды - это нишевое удобство, , и они приходят с этим риском. Хотя, если вы построили программу в среде native или, в частности, в среде с поддержкой модуля для gcc 4.4.7, то риск-менеджер при запуске в вашей среде gcc-4.9.2 предположительно один , нужно взять.