GNU/Linux >> Znalost Linux >  >> Linux

Úvod do sdílených knihoven Linuxu (Jak vytvořit sdílené knihovny)

Knihovna je soubor obsahující zkompilovaný kód z různých objektových souborů nacpaných do jednoho souboru. Může obsahovat skupinu funkcí, které se používají v určitém kontextu. Například knihovna „pthread“ se používá, když mají být v programu použity funkce související s vlákny.

Obecně může být knihovna (nebo programová knihovna) dvou typů:

  1. Sdílená knihovna
  2. Statická knihovna

V tomto článku budeme diskutovat konkrétně o sdílených knihovnách.

Sdílené knihovny

Sdílené knihovny jsou knihovny, které lze za běhu propojit s jakýmkoli programem. Poskytují prostředky k použití kódu, který lze načíst kdekoli v paměti. Po načtení může kód sdílené knihovny používat libovolný počet programů. Tímto způsobem lze velikost programů (pomocí sdílené knihovny) a paměťovou stopu udržet na nízké úrovni, protože mnoho kódu je udržováno jako společné ve formě sdílené knihovny.

Sdílené knihovny poskytují modularitu vývojovému prostředí, protože kód knihovny lze měnit, upravovat a znovu kompilovat, aniž by bylo nutné znovu kompilovat aplikace, které tuto knihovnu používají. Například pro jakoukoli změnu v kódu knihovny pthread není vyžadována žádná změna v programech používajících sdílenou knihovnu pthread. Ke sdílené knihovně lze přistupovat pod různými názvy:

  • Název používaný linkerem („lib“ následovaný názvem knihovny a následným „.so“ . Například libpthread.so)
  • Plně kvalifikované jméno nebo soname („lib“ následované názvem knihovny, následovaným „.so“, následovaným „.“ a číslem verze. Například:libpthread.so.1)
  • Skutečný název ('lib' následovaný názvem knihovny, následovaným '.so', následovaným '.' a číslem verze, následovaným '.' a vedlejším číslem následovaným '.' a číslo vydání. Číslo vydání je volitelné. Například libpthread.so.1.1)

Číslo verze sdílené knihovny se změní, když změny provedené v kódu učiní sdílenou knihovnu nekompatibilní s předchozí verzí. Pokud je například funkce zcela odstraněna, je vyžadována nová verze knihovny.

Menší číslo se změní v případě, že dojde k úpravě v kódu, která nezpůsobí, že sdílená knihovna nebude kompatibilní s předchozí používanou verzí. Například malá oprava chyby nenaruší kompatibilitu stávající sdílené knihovny, takže se změní pouze malé číslo, zatímco verze zůstane stejná.

Nyní se může někdo divit, proč tolik názvů pro sdílenou knihovnu?

No, tyto konvence pojmenování pomáhají více verzím stejné sdílené knihovny koexistovat v systému. Programy propojené se sdílenou knihovnou se nemusí starat o nejnovější verzi sdílené knihovny nainstalované v systému. Po úspěšné instalaci nejnovější verze sdílené knihovny se všechny programy automaticky začnou propojovat s nejnovější verzí.

Jméno používané linkerem je obvykle symbolickým odkazem na plně kvalifikované soname, které je zase symbolickým odkazem na skutečné jméno.

Umístění v systému souborů

V souborovém systému jsou hlavně tři standardní umístění, kam lze knihovnu umístit.

  • /lib
  • /usr/lib
  • /usr/local/lib

Zde budeme postupovat podle standardů Filesystem Hierarchy (FHS). Podle standardů FHS jsou všechny knihovny, které se načítají při spuštění a běží v kořenovém souborovém systému, uloženy v /lib. Zatímco knihovny, které systém používá interně, jsou uloženy v /usr/lib. Tyto knihovny nejsou určeny k přímému použití uživateli nebo skripty shellu. Existuje třetí umístění /usr/local/lib (i když není definováno v nejnovější verzi FHS). Pokud existuje, obsahuje všechny knihovny, které nejsou součástí standardní distribuce. Tyto nestandardní knihovny jsou ty, které si stáhnete a mohou být chybné.

Pomocí ldconfig

Jakmile je sdílená knihovna vytvořena, zkopírujte sdílenou knihovnu do adresáře, ve kterém chcete, aby knihovna sídlila (například /usr/local/lib nebo /usr/lib). Nyní spusťte příkaz ldconfig v tomto adresáři.

Co dělá ldconfig?

Pamatujete si, že jsme dříve diskutovali o tom, že název linkeru pro sdílenou knihovnu je symbolický odkaz na plně kvalifikované soname, což je zase symbolický odkaz na skutečné jméno. No, tento příkaz dělá přesně to samé.

Když spustíte spustitelný soubor ELF, ve výchozím nastavení se nejprve spustí zavaděč. Samotný zavaděč je soubor sdíleného objektu /lib/ld-linux.so.X, kde „X“ je číslo verze. Tento zavaděč zase najde a načte všechny sdílené knihovny, na kterých je náš program závislý.

Všechny adresáře, které zavaděč prohledává za účelem nalezení knihoven, jsou uloženy v /etc/ld.so.conf. Hledání všech adresářů uvedených v souboru /etc/ld.so.conf může být časově náročné, takže pokaždé, když je příkaz ldconfig spuštěn, nastaví požadované symbolické odkazy a poté vytvoří mezipaměť v souboru /etc/ld.so.cache, kde jsou zapsány všechny informace požadované pro spustitelný soubor. Čtení informací z mezipaměti je časově velmi méně náročné. Háček je v tom, že příkaz ldconfig musí být spuštěn pokaždé, když je přidána nebo odebrána sdílená knihovna. Takže při spuštění program používá /etc/ld.so.cache k načtení knihoven, které vyžaduje.

Používání nestandardních umístění knihovny

Při použití nestandardních umístění knihoven. Lze provést jeden z následujících tří kroků:

Přidejte cestu k souboru /etc/ld.so.conf. Tento soubor obsahuje cesty ke všem adresářům, ve kterých je knihovna prohledávána zavaděčem. Tento soubor může někdy obsahovat jeden řádek jako :

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

V takovém případě stačí vytvořit soubor conf ve stejném adresáři. Adresář můžete přímo přidat do mezipaměti pomocí následujícího příkazu:

ldconfig -n [non standard directory path containing shared library]

Upozorňujeme, že se jedná o dočasnou změnu a po restartu systému bude ztracena. Aktualizujte proměnnou prostředí LD_LIBRARY_PATH tak, aby ukazovala na váš adresář obsahující sdílenou knihovnu. Loader použije cesty uvedené v této proměnné prostředí k vyřešení závislostí.

Všimněte si, že na některých unixových systémech se název proměnné prostředí může lišit.

Poznámka:U souvisejícího tématu, jak jsme vysvětlili dříve, existují čtyři hlavní fáze, kterými prochází zdrojový kód, aby se nakonec stal spustitelným souborem.

Příklad (Jak vytvořit sdílenou knihovnu)

Vezměme si jednoduchý praktický příklad, abychom viděli, jak můžeme vytvářet a používat sdílené knihovny. Následuje část kódu (shared.c), kterou chceme vložit do sdílené knihovny:

#include "shared.h"
unsigned int add(unsigned int a, unsigned int b)
{
    printf("\n Inside add()\n");
    return (a+b);
}

shared.h vypadá takto:

#include<stdio.h>
extern unsigned int add(unsigned int a, unsigned int b);

Nejprve udělejme shared.c jako sdílenou knihovnu.

1. Spuštěním následujících dvou příkazů vytvořte sdílenou knihovnu:

gcc -c -Wall -Werror -fPIC shared.c
gcc -shared -o libshared.so shared.o

První příkaz zkompiluje kód shared.c do kódu nezávislého na pozici, který je vyžadován pro sdílenou knihovnu.
Druhý příkaz ve skutečnosti vytvoří sdílenou knihovnu s názvem ‚libshared.so‘.

2. Zde je kód programu, který používá funkci sdílené knihovny ‘add()’

#include<stdio.h>
#include"shared.h"
int main(void)
{
    unsigned int a = 1;
    unsigned int b = 2;
    unsigned int result = 0;

    result = add(a,b);

    printf("\n The result is [%u]\n",result);
    return 0;
}

3. Dále spusťte následující příkaz:

gcc -L/home/himanshu/practice/ -Wall main.c -o main -lshared

Tento příkaz zkompiluje kód main.c a řekne gcc, aby propojil kód se sdílenou knihovnou libshared.so (pomocí příznaku -l) a také sdělí umístění sdíleného souboru (pomocí příznaku -L).

4. Nyní exportujte cestu, kde je uložena nově vytvořená sdílená knihovna, pomocí následujícího příkazu:

export LD_LIBRARY_PATH=/home/himanshu/practice:$LD_LIBRARY_PATH

Výše uvedený příkaz exportuje cestu k proměnné prostředí „LD_LIBRARY_PATH“.

5. Nyní spusťte spustitelný soubor ‚main‘ :

# ./main

Inside add()

The result is [3]

Vidíme tedy, že sdílená knihovna byla načtena a byla v ní provedena funkce add.


Linux
  1. Jak vytvořit skript příkazu Linux

  2. Jak nainstalovat knihovnu Ncurses v Linuxu

  3. Jak zkontrolovat, zda je nainstalována sdílená knihovna?

  1. Jak vytvořit sdílený adresář pro všechny uživatele v Linuxu

  2. Jak vytvořit swap v Linuxu

  3. Jak vytvořit službu Systemd v Linuxu

  1. Jak vytvořit odkládací soubor v Linuxu

  2. Jak zobrazit všechny sdílené knihovny používané spustitelnými soubory v Linuxu?

  3. Jak inicializovat sdílenou knihovnu v Linuxu