Table of Contents

Linux - Shared Library (so, sl)

About

so means shared object file and are shared library in Linux

There format is the Executable and Linkable Format.

As Shared Library, so files are open file opened by a process.

The shared library extension is operating system dependent:

Management

Search Path

When an executable is looking for a dynamic library (.so file), the linker searches in order:

/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

PATH

Dynamically linked libraries are typically placed in directories.

The usual directories include:

Path Description
/lib
/usr/lib Standard system libraries
/gnu/lib Gnu libraries
/lib/security PAM modules
/usr/X11R6/lib or /usr/openwin/lib X-windows
/usr/local/lib 3rd party libraries

On GNU glibc-based systems, including all Linux systems, the list of directories automatically searched during program start-up is stored in the file /etc/ld.so.conf.

cat /etc/ld.so.conf
include ld.so.conf.d/*.conf

To control this process, you can use the LD_PATH environment variable (for instance: LD_LIBRARY_PATH for Linux/Solaris)

Content (Unpack)

readelf -a -W /path/To/SoFile

Version

Soname

In an ELF file:

Example: libtest.so

To get the soname:

readelf -d  /path/to/library.so | grep SONAME

File

The version is just to be found in the symbolic link.

libc below is the version 2.5

file /lib64/libc.so.6
/lib64/libc.so.6: symbolic link to `libc-2.5.so'

File System - ( Symbolic | ln | Soft) link - File Alias - Symlink - Junction - Reparse Points

file libodbc.so
# if it's a symlink
libodbc.so: symbolic link to `libodbc.so.2.0.0'
# if it's file
libodbc.so: ELF 64-bit LSB shared object, AMD x86-64, version 1 (SYSV), not stripped

Load Test

dltest /path/to/driverFile.so

Dependency

ldd ../product/fmw/Oracle_BI1/bifoundation/odbc/lib/libodbc.so
ldd: warning: you do not have execution permission for `../product/fmw/Oracle_BI1/bifoundation/odbc/lib/libodbc.so'
        linux-vdso.so.1 =>  (0x00007fff375c4000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f7bc07ba000)
        librt.so.1 => /lib64/librt.so.1 (0x00007f7bc05b0000)
        libodbcinst.so => /u01/app/oracle/product/fmw/Oracle_BI1/bifoundation/odbc/lib/libodbcinst.so (0x00007f7bc03ca000)
        libSEicu23.so => /u01/app/oracle/product/fmw/Oracle_BI1/bifoundation/odbc/lib/libSEicu23.so (0x00007f7bbf7b9000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f7bbf5b4000)
        libstdc++.so.5 => /usr/lib64/libstdc++.so.5 (0x00007f7bbf2d9000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f7bbf056000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f7bbecfd000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f7bbeaef000)
        /lib64/ld-linux-x86-64.so.2 (0x00000035bb600000)

List Shared Library used by processes

With the lsof

lsof -p $(pgrep nqsserver) | awk '{print $9}' | grep .so$
lsof /path/to*

Find a shared library

sudo find / | grep whatever.so
sudo find / | grep libodbc.so
/tmp/infa_rpm/Domain/ce908432ad08b4beffd072ef5344365b/infa_rpm.tar/ODBC7.1/lib/libodbc.so
/tmp/unixODBC-2.3.6/DriverManager/.libs/libodbc.so.2.0.0
/tmp/unixODBC-2.3.6/DriverManager/.libs/libodbc.so.2
/tmp/unixODBC-2.3.6/DriverManager/.libs/libodbc.so
/usr/local/lib/libodbc.so.2.0.0
/usr/local/lib/libodbc.so.2
/usr/local/lib/libodbc.so

Creation

Example with Sqlite and an amalgam adapted from the Ref documentation

gcc \
-Wl,-soname,libsqlite3.so.0 \
-DDISABLE_DIRSYNC \
-DENABLE_COLUMN_METADATA \
-DENABLE_FTS3 \
-DENABLE_RTREE \
-DENABLE_JSON1 \
-DENABLE_UNLOCK_NOTIFY \
-DSECURE_DELETE \
-DTEMP_STORE=1 \
-DTHREADSAFE=1 \
-shared \
-o libsqlite3.so \
-fPIC \
sqlite3.c

Documentation / Reference