Shared Libraries enthalten ein Objekt (also einen Modul, der vom Lader des Systems geladen und ausgeführt werden kann) mit einer besonderen Struktur (ein sogenanntes „Shared Object“). Shared Objects können (unter anderem) während des Programmlaufs dynamisch nachgeladen werden.
Liste notwendiger Objekte
Ein Shared Object kann weitere Objekte angeben, die für seine Ausführung notwendig sind. Diese Objekte werden beim Laden eines Shared Objects mit geladen und bei der Auflösung unbefriedigter Externverweise mit berücksichtigt. Dabei kann jedes dieser Objekte wieder weitere notwendige Objekte angeben, so dass Ketten entstehen können.
Namensräume
Beim Laden eines Shared Objects wird nicht auf andere dynamisch nachgeladene Shared Objects zugegegriffen, es sei denn, sie befinden sich in der Liste der notwendigen Objekte.
Ausnahme ist der Kontext, in den das Programm beim Start geladen wurde (und alle dabei dynamisch geladenen Objekte).
Dadurch entsteht eine Abschottung der Namensräume.
Suchreihenfolge
Die Suche nach Shared Objects zum Ablaufzeitpunkt wird durch die Umgebungsvariable LD_LIBRARY_PATH gesteuert, in der verschiedene Verzeichnisse angegeben sein können, die in der angegebenen Reihenfolge nach zu ladenden Shared Objects durchsucht werden.
Auflösung von Extern-Verweisen
Beim Laden eines Shared Objects werden unbefriedigte Externverweise zunächst aus dem primären Lade-Kontext aufgelöst. Anschließend wird das aktuelle Shared Object herangezogen und schließlich die Objekte, die als notwendige Objekte geladen wurden. (Dies ist eine verkürzte Darstellung, Details finden Sie in den Schnittstellenbeschreibungen von dlopen() und dlsym() der jeweiligen Unix-Handbücher.)
Da die Externverweise innerhalb eines Shared Objects nicht aufgelöst sind, kann eine Funktion, die im Shared Object existiert, durch eine Funktion des primären Lade-Kontexts überladen werden (das ist in LLMs nicht möglich!).
Namenskonvention
Shared Libraries beginnen immer mit dem Präfix lib und enden mit dem Suffix .so, also z.B. libhello.so. Häufig findet man auch einen Versionssuffix am Namen für die Koexistenz und eindeutige Zuordnung verschiedener Schnittstellen-Versionen, etwa z.B. libXm.so.1.2.