Overview of the Linux Library System

D

DevynCJohnson

Guest
Linux has a variety of library files in many locations. Learning the names, locations, and purposes of some of these libraries may help users and admins better understand their Linux system.

Library File Extensions
*.a - These are statically linked libraries. Static libraries are linked into programs.
*.bin - These libraries are binary files.
*.fw - Firmware files are special libraries/drivers for hardware.
*.o - Many loadable kernel modules/objects are object files.
*.so - These files are dynamically-linked shared libraries that are not linked put into programs. Rather, programs reference this library and obtain functions/code from it.

Libraries
ld-linux.so, ld-linux.so*, ld.so, ld*.so - These libraries find and load shared libraries needed by software. Next, they execute the software that requested the shared libraries. Most Linux applications that are compiled use dynamically linked libraries. "ld.so" and its related files manage a.out binaries while "ld-linux.so" (and others) is used by ELF binaries. These libraries are typically found in /lib/.

libc - This is the Standard C Library (http://man7.org/linux/man-pages/man7/libc.7.html).

libcurses - This library provides the codes needed for the Ncurses interface.

libntfs - Access and manage NTFS filesystems.

libxaw7 - This library provides the X Athena Widget Set.

Library Paths
/lib/ - The important shared library files are kept in here. Mainly these are system libraries or low-level libraries. The Linux kernel modules are kept under /lib/modules/ and firmware drivers are under /lib/firmware/.

/lib*/ - Other library directories may exist under root. For instance, /lib64/ contains 64-bit specific libraries and /lib32/ contains 32-bit libraries.

/lib/firmware - Various low-level drivers and modules for hardware are stored in this folder.

/lib/firmware/*-generic - This directory is named after the version of the available Linux kernels. Contained in this directory are firmware libraries that are specific to the specified kernel version.

/lib/modules/ - The drivers/modules that are stored under here are the loadable kernel modules. When modprobe inserts a module into the running kernel, modprobe is inserting modules that are under this directory. The filesystem drivers are also under this directory. For instance, the FAT filesystem driver is /lib/modules/3.16.0-36-generic/kernel/fs/fat/msdos.o.

Linux-FS-Modules.png


/libexec/ - These are shared executable libraries.

/usr/lib/ - Program libraries are stored here. These libraries are either multiarch or specific to the current system.

/usr/libexec/ - These are application-specific executable libraries.

/usr/lib32/ - 32-bit specific application libraries are found here.

/usr/libx32/ - 32-bit specific application libraries are found here.

/usr/lib64/ - 64-bit specific application libraries are found here.

Library Path
Just as the list of paths containing executables are listed in the $PATH variable, the libraries are also listed in a special variable. This variable is $LD_LIBRARY_PATH. If users wanted to add /opt/lib/ to the library path variable, then the user would execute "export LD_LIBRARY_PATH=/opt/lib:$LD_LIBRARY_PATH".

/etc/ld.so.conf.d/ is a directory that contains a list of configuration files that list the library paths for each architecture type.
Code:
collier@Nacho-Linux:/etc/ld.so.conf.d$ ls
fakechroot-x86_64-linux-gnu.conf
fakeroot-x86_64-linux-gnu.conf
i386-linux-gnu.conf
i386-linux-gnu_GL.conf
i686-linux-gnu.conf
libc.conf
x86_64-linux-gnu.conf
x86_64-linux-gnu_EGL.conf
x86_64-linux-gnu_GL.conf
x86_64-linux-gnu_mirclient8driver.conf
zz_i386-biarch-compat.conf
zz_x32-biarch-compat.conf
collier@Nacho-Linux:/etc/ld.so.conf.d$ cat ./x86_64-linux-gnu.conf
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu

Special Commands
Users can see a list of libraries needed by an executable by running the "ldd" command. In a terminal/command-line, run "ldd EXECUTABLE_PATH" to see the libraries needed by the executable. For example, to list the libraries needed by Firefox, the below code would be seen.
Code:
collier@Nacho-Linux:~$ ldd `which firefox`
not a dynamic executable
This indicates that Firefox uses static libraries that are built into the executable. However, the "cp" command uses dynamic libraries.
Code:
collier@Nacho-Linux:~$ ldd `which cp`
linux-vdso.so.1 =>  (0x00007fff6d9e5000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f90de140000)
libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007f90ddf37000)
libattr.so.1 => /lib/x86_64-linux-gnu/libattr.so.1 (0x00007f90ddd31000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f90dd96d000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f90dd700000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f90dd4fb000)
/lib64/ld-linux-x86-64.so.2 (0x00007f90de3b5000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f90dd2dd000)

Users can find the location of a library file by using the "whereis" command. For instance, users can type "whereis libpng" to find the PNG library.
Code:
collier@Nacho-Linux:~$ whereis libpng
libpng: /usr/include/libpng /usr/share/man/man3/libpng.3.gz
Alternately, users can use the below command.
Code:
collier@Nacho-Linux:~$ ldconfig -p | grep libpng
libpng12.so.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libpng12.so.0
libpng12.so.0 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libpng12.so.0
libpng12.so.0 (libc6) => /lib/i386-linux-gnu/libpng12.so.0
libpng12.so.0 (libc6) => /usr/lib/i386-linux-gnu/libpng12.so.0
libpng12.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libpng12.so

Further Reading
 

Attachments

  • slide.jpg
    slide.jpg
    29 KB · Views: 10,834

Staff online


Latest posts

Top