Manage shared libraries (weight: 1)

Candidates should be able to determine the shared libraries that executable programs depend on
and install them when necessary. Identify shared libraries. Identify the typical locations of
system libraries. Load shared libraries.

The following is a partial list of the used files, terms and utilities:

ldd
ldconfig
/etc/ld.so.conf
LD_LIBRARY_PATH

Динамические библиотеки – Часть основной программы, которая загружается в ОС по запросу работающей программы в ходе её выполнения (Run-time), т.е. динамически (Dynamic Link Library, DLL в Windows). Один и тот же набор функций может быть использован сразу в нескольких работающих программах, из-за чего они имеют ещё одно название — библиотеки общего пользования (Shared Library). Если динамическая библиотека загружена в адресное пространство самой ОС (System Library), то единственная копия может быть использована множеством работающих с нею программ, что положительно сказывается на степени использовании ресурса ОЗУ.

Статические библиотеки – Могут быть в виде исходного текста, подключаемого программистом к своей программе на этапе написания (например, для языка Fortran существует огромное количество библиотек для решения разных задач именно в исходных текстах), либо в виде объектных файлов, присоединяемых (линкуемых) к исполняемой программе на этапе компиляции.

Если необходимо посмотреть какие библиотеки использует программа

# ldd /usr/bin/mc
        linux-gate.so.1 =>  (0xb76f3000)
        libgpm.so.2 => /usr/lib/libgpm.so.2 (0xb76db000)
        libslang.so.2 => /lib/libslang.so.2 (0xb75e2000)
        libgmodule-2.0.so.0 => /usr/lib/libgmodule-2.0.so.0 (0xb75dd000)
        librt.so.1 => /lib/librt.so.1 (0xb75d4000)
        libglib-2.0.so.0 => /lib/libglib-2.0.so.0 (0xb7505000)
        libpthread.so.0 => /lib/libpthread.so.0 (0xb74eb000)
        libc.so.6 => /lib/libc.so.6 (0xb738e000)
        libdl.so.2 => /lib/libdl.so.2 (0xb738a000)
        libm.so.6 => /lib/libm.so.6 (0xb7363000)
        libpcre.so.3 => /lib/libpcre.so.3 (0xb732e000)
        /lib/ld-linux.so.2 (0xb76f4000)

ldconfig – создает необходимые связки и формирует кэш динамических библиотек
Если shared library устанавливаются вручную, без использования менеджеров пакетов, таких как rpm или dpkg,
вы должны в ручном режиме указать системе о расположении библиотек. Необходимо добавить новые пути в файле /etc/ld.so.conf и запустить программу ldconfig – данная программа просмотрит пути и добавит их в кэш

# cat /etc/ld.so.conf
include /etc/ld.so.conf.d/*.conf
# cat /etc/ld.so.conf.d/*.conf
/usr/lib/mesa
# Multiarch support
/lib/i686-linux-gnu
/usr/lib/i686-linux-gnu
/usr/lib/alsa-lib
# libc default configuration
/usr/local/lib

Какие библиотеки сейчас находятся в кэше

# ldconfig -p | less
738 libs found in cache `/etc/ld.so.cache'
        libzephyr.so.4 (libc6) => /usr/lib/libzephyr.so.4
        libzbar.so.0 (libc6) => /usr/lib/libzbar.so.0
...

Чтобы установить LD_LIBRARY_PATH с консоли

# export LD_LIBRARY_PATH=/usr/local/newpath:/opt/newpath

Вопросы LPI-I ( приблизительные )

1) Which program is used to determine which shared libraries are used by a particular
other program?
A.ld.so
B.ldcache
C.ldd
D.ldconfig
E.libconf
2) Which programm is used to maintain the file /etc/ld.so.cache?
A.ld.so
B.ldcache
C.ldd
D.ldconfig
E.libconf
3) What is the preferred method of adding a directory to the library path for all users?
A. Modify the LD_LIBRARY_PATH environment variable in a global shell script.
B. Add the directory to the /etc/ld.so.conf file, and then type ldconfig.
C. Type ldconfig /new/dir, where /new/dir is the directory you want to add.
D. Create a symbolic link from that directory to one that’s already on the library path.
4) You prefer the look of GTK+ widgets to Qt widgets, so you want to substitute the GTK+
libraries for the Qt libraries on your system. How would you do this?
A. You must type ldconfig --makesubs=qt,gtk. This command substitutes the GTK+
libraries for the Qt libraries at load time.
B. You must uninstall the Qt library packages and re-install the GTK+ packages with the
--substitute=qt option to rpm or the --replace=qt option to dpkg.
C. You must note the filenames of the Qt libraries, uninstall the packages, and create
symbolic links from the Qt libraries to the GTK+ libraries.
D. You can’t easily do this; libraries can’t be arbitrarily exchanged for one another. You
would need to rewrite all the Qt-using programs to use GTK+

Ответы

1) The correct answer is C ldd
2) The correct answer is D ldconfig
3) The correct answer is B Add the directory to the /etc/ld.so.conf file, and type ldconfig
You must then type ldconfig to have the system update its library path cache
Although you can add a directory to the library path by altering the LD_LIBRARY_PATH
environment variable globally, this approach isn’t the preferred one
Option C simply won’t work
Option D also won’t work, although linking individual library files would work.
This method isn’t the preferred one for adding a whole directory
4) The correct answer is D. Libraries are selected by programmers, not by users or admin
Options A and B describe fictitious options to ldconfig, rpm, and dpkg
Option C wouldn’t work; Qt-using programs would crash when they found GTK+
libraries in place of the Qt libraries they were expecting

Читать: Learn Linux, 101: Manage shared libraries