Fundamentals 11 min read

Mastering Linux Library Linking: From Static Archives to Dynamic Loading

This tutorial walks through Linux library management, demonstrating how to build and inspect static (.a) and shared (.so) libraries, configure runtime search paths with LD_LIBRARY_PATH, customize linker behavior, and handle multi‑architecture library locations using practical command‑line examples.

Liangxu Linux
Liangxu Linux
Liangxu Linux
Mastering Linux Library Linking: From Static Archives to Dynamic Loading

Overview

Linux consists of many inter‑dependent static and dynamic libraries. For newcomers the handling of these libraries can be confusing, while experienced developers benefit from the shared code bundled with the OS when building new applications.

Example Project Setup

Clone the sample repository, enter the directory, and build the project:

$ git clone https://github.com/hANSIc99/library_sample
$ cd library_sample/
$ make

After the build the directory contains:

my_app
libmy_static.a
libmy_shared.so

Static Linking

Static libraries are archives (created with ar) that end with .a. Their object files are typically ELF format. You can verify the archive type with:

$ file libmy_static.a
libmy_static.a: current ar archive

List the contents:

$ ar -t libmy_static.a
libmy_static_a.o
libmy_static_b.o

Extract the objects:

$ ar -x libmy_static.a
$ file libmy_static_a.o
libmy_static_a.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped

Dynamic Linking

Shared libraries end with .so. They are the primary mechanism for dependency management on Linux. At program start the dynamic loader loads them into memory, allowing multiple programs to share a single copy, reducing memory usage.

If a shared library is missing, the loader cannot find it in its standard search paths. You can set LD_LIBRARY_PATH to point to the directory containing the library:

$ LD_LIBRARY_PATH=$(pwd):$LD_LIBRARY_PATH
$ export LD_LIBRARY_PATH

Now the loader can locate libmy_shared.so and the program runs. Verify dependencies with ldd:

$ ldd my_app
linux-vdso.so.1 (0x00007ffd1299c000)
libmy_shared.so => /home/stephan/library_sample/libmy_shared.so (0x00007f3fad401000)
libc.so.6 => /lib64/libc.so.6 (0x00007f3fad21d000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3fad408000)

Inspect the executable itself:

$ file my_app
my_app: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=26c677b771122b4c99f0fd9ee001e6c743550fa6, for GNU/Linux 3.2.0, not stripped

Dynamic Loader Search Order

Absolute or relative path encoded with the -rpath option during compilation.

Environment variable LD_LIBRARY_PATH.

The cache file /etc/ld.so.cache.

Adding a library to the system library directory ( /usr/lib64) requires root privileges; alternatively you can copy the shared object there or adjust LD_LIBRARY_PATH.

Customizing Shared Library Paths at Build Time

Modify the Makefile to embed an absolute rpath: CFLAGS = -Wall -Werror -Wl,-rpath,$(shell pwd) After recompiling with make, ldd shows the library path embedded in the binary.

System‑wide Library Registration

For libraries intended for all users, add their directory to /etc/ld.so.conf or create a file under /etc/ld.so.conf.d/, then run ldconfig to update the cache.

Handling Multiple Architectures

Typical library directories differ by distribution and architecture:

Red Hat family : 32‑bit /usr/lib, 64‑bit /usr/lib64 Debian family : 32‑bit /usr/lib/i386-linux-gnu, 64‑bit /usr/lib/x86_64-linux-gnu Arch Linux family : 32‑bit /usr/lib32, 64‑bit /usr/lib64 FreeBSD : 32‑bit /usr/lib32, 64‑bit /usr/lib Knowing these locations helps resolve library‑not‑found errors.

Understanding Linux library dependency management gives you greater control over the operating system and prepares you to troubleshoot common linking problems.

Original Source

Signed-in readers can open the original source through BestHub's protected redirect.

Sign in to view source
Republication Notice

This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactadmin@besthub.devand we will review it promptly.

Linuxdynamic linkingStatic Linkingshared librarieslddLD_LIBRARY_PATH
Liangxu Linux
Written by

Liangxu Linux

Liangxu, a self‑taught IT professional now working as a Linux development engineer at a Fortune 500 multinational, shares extensive Linux knowledge—fundamentals, applications, tools, plus Git, databases, Raspberry Pi, etc. (Reply “Linux” to receive essential resources.)

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.