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:
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
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)
readelf -a -W /path/To/SoFile
In an ELF file:
Example: libtest.so
To get the soname:
readelf -d /path/to/library.so | grep SONAME
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
dltest /path/to/driverFile.so
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)
With the lsof
lsof -p $(pgrep nqsserver) | awk '{print $9}' | grep .so$
lsof /path/to*
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
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