GNU/Linux >> Znalost Linux >  >> Linux

8 Příklady příkazů LDD v Linuxu

Ldd je nástroj příkazového řádku Linuxu, který se používá v případě, že uživatel chce znát závislosti sdílené knihovny spustitelného souboru nebo dokonce sdílené knihovny. Možná jste si všimli mnoha souborů začínajících na lib* v adresářích /lib a /usr/lib na vašem počítači se systémem Linux. Tyto soubory se nazývají knihovny. Knihovna je sbírka zdrojů, jako jsou podprogramy/funkce, třídy, hodnoty nebo specifikace typu.

Knihovna umožňuje programu používat běžné rutiny bez administrativní režie v podobě údržby jejich zdrojového kódu nebo režie zpracování při jejich kompilaci pokaždé, když je program kompilován.

Existují dva typy knihoven:

Statické knihovny: statické knihovny pro kompletní programy, jejichž spouštění nezávisí na externích knihovnách. Funkce staticky propojených programů spočívá v tom, že fungují bez instalace jakýchkoliv předpokladů. Statická knihovna končí *.a rozšíření a tyto knihovny jsou zahrnuty (samostatná kopie) do programů, které vyžadují jeho funkce.

Dynamické knihovny: dynamické knihovny pro malé programy velikosti, Tyto knihovny končí na .so rozšíření, Další funkce použití dynamického propojování, když je spuštěno mnoho programů. Může sdílet jednu kopii knihovny, místo aby zabíralo paměť mnoha kopiemi stejného kódu. Nejnovější programy tedy používají dynamické propojení. V tomto článku si projdeme příkazy ldd který se používá ke správě sdílených knihoven.

Sdílené knihovny

Když vytváříme program, potřebujeme mnoho částí kódu, které již někdo napsal, aby za nás prováděl rutinní nebo specializované funkce. Tyto části kódu jsou uloženy ve sdílených knihovnách. Abychom je mohli použít, propojíme je s naším kódem, buď když program sestavujeme, nebo když program spouštíme.

Syntaxe a možnosti příkazu LDD

Příkaz ldd vypíše závislosti sdílených objektů. Syntaxe příkazu je:

ldd [OPTION]... FILE...

Můžeme použít příkazové přepínače ldd, které lze vložit do
[OPTION] místo ve výše uvedeném příkazu:

  • -v :Vytiskne všechny informace.
  • -d :proces přemístění dat.
  • -r :přemístění dat a funkcí.
  • -u:vytiskne nepoužívané přímé závislosti.

Před provedením příkazu si poznamenejte následující body:

- Soubor ld-linux.so je dynamický linker nebo zavaděč, který zkontroluje mezipaměť požadovaného odkazu nebo knihovny pro požadovaný program a načte jej.

- Soubor mezipaměti /etc/ld.so.cache obsahuje seznam knihoven nalezených v adresářích uvedených v /etc/ld.so.conf. To pomáhá zajistit rychlejší dynamické propojení.

- Soubor /etc/ld.so.conf určuje adresáře, kde se mají hledat knihovny

1) Zobrazte závislosti příkazu

Zobrazíme závislosti příkazu cp.

$ ldd /bin/cp
    Output:
    linux-vdso.so.1 =>  (0x00007fffaf3ff000)
    libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003a06a00000)
    librt.so.1 => /lib64/librt.so.1 (0x0000003a06200000)
    libacl.so.1 => /lib64/libacl.so.1 (0x0000003a13000000)
    libattr.so.1 => /lib64/libattr.so.1 (0x0000003a0ea00000)
    libc.so.6 => /lib64/libc.so.6 (0x0000003a05200000)
    libdl.so.2 => /lib64/libdl.so.2 (0x0000003a05a00000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003a04a00000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003a05600000)

2) Zobrazit závislosti příkazu s podrobnostmi

Zobrazíme závislosti cp příkaz s více podrobnostmi pomocí -v možnost.

$ ldd -v /bin/cp
    Output:
     linux-vdso.so.1 =>  (0x00007fff473ff000)
        libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003a06a00000)
        librt.so.1 => /lib64/librt.so.1 (0x0000003a06200000)
        libacl.so.1 => /lib64/libacl.so.1 (0x0000003a13000000)
        libattr.so.1 => /lib64/libattr.so.1 (0x0000003a0ea00000)
        libc.so.6 => /lib64/libc.so.6 (0x0000003a05200000)
        libdl.so.2 => /lib64/libdl.so.2 (0x0000003a05a00000)
        /lib64/ld-linux-x86-64.so.2 (0x0000003a04a00000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003a05600000)

        Version information:
        /bin/cp:
                librt.so.1 (GLIBC_2.2.5) => /lib64/librt.so.1
                libattr.so.1 (ATTR_1.1) => /lib64/libattr.so.1
                libacl.so.1 (ACL_1.2) => /lib64/libacl.so.1
                libacl.so.1 (ACL_1.0) => /lib64/libacl.so.1
                libc.so.6 (GLIBC_2.6) => /lib64/libc.so.6
                libc.so.6 (GLIBC_2.4) => /lib64/libc.so.6
                libc.so.6 (GLIBC_2.3) => /lib64/libc.so.6
                libc.so.6 (GLIBC_2.3.4) => /lib64/libc.so.6
                libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
        /lib64/libselinux.so.1:
                libdl.so.2 (GLIBC_2.2.5) => /lib64/libdl.so.2
                ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
                libc.so.6 (GLIBC_2.4) => /lib64/libc.so.6
                libc.so.6 (GLIBC_2.8) => /lib64/libc.so.6
                libc.so.6 (GLIBC_2.3) => /lib64/libc.so.6
                libc.so.6 (GLIBC_2.3.4) => /lib64/libc.so.6
                libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
        /lib64/librt.so.1:
                libpthread.so.0 (GLIBC_2.2.5) => /lib64/libpthread.so.0
                libpthread.so.0 (GLIBC_PRIVATE) => /lib64/libpthread.so.0
                libc.so.6 (GLIBC_2.3.2) => /lib64/libc.so.6
                libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
                libc.so.6 (GLIBC_PRIVATE) => /lib64/libc.so.6
        /lib64/libacl.so.1:
                libattr.so.1 (ATTR_1.0) => /lib64/libattr.so.1
                libc.so.6 (GLIBC_2.4) => /lib64/libc.so.6
                libc.so.6 (GLIBC_2.3.4) => /lib64/libc.so.6
                libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
        /lib64/libattr.so.1:
                libc.so.6 (GLIBC_2.4) => /lib64/libc.so.6
                libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
        /lib64/libc.so.6:
                ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
                ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
        /lib64/libdl.so.2:
                ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
                libc.so.6 (GLIBC_PRIVATE) => /lib64/libc.so.6
                libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
        /lib64/libpthread.so.0:
                ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
                ld-linux-x86-64.so.2 (GLIBC_2.2.5) => /lib64/ld-linux-x86-64.so.2
                ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
                libc.so.6 (GLIBC_2.3.2) => /lib64/libc.so.6
                libc.so.6 (GLIBC_PRIVATE) => /lib64/libc.so.6
                libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6

3) Zobrazit nepoužívané přímé závislosti příkazu

Můžeme zobrazit nepoužívané přímé závislosti cp pomocí -u možnost.

$ ldd -u /bin/cp
    Output:
     Unused direct dependencies:

        /lib64/libselinux.so.1
        /lib64/librt.so.1
        /lib64/libacl.so.1
        /lib64/libattr.so.1

4) Display ldd funguje pouze u dynamických spustitelných souborů

Zobrazíme ldd funguje pouze na dynamických spustitelných souborech pomocí -r možnost.

$  ldd -r /smart/pycharm-community-2017.3.3/bin/pycharm.sh
    Output:
     not a dynamic executable

Na výstupu se zobrazila jasná zpráva, že dodaný soubor není dynamický spustitelný soubor.

5) ldd se standardním spustitelným souborem příkazového řádku

Když zkusíme ldd na standardním spustitelném příkazovém řádku jako ls , Potřebujeme úplnou cestu k dynamickému spustitelnému souboru.

$ ldd ls
    Output:
    ldd: ./ls: No such file or directory

Vidíme, že ldd uvádí, že nemůže najít ls .

$ ldd /bin/ls
    Output:
    linux-vdso.so.1 =>  (0x00007fff5cbea000)
    libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003a06a00000)
    librt.so.1 => /lib64/librt.so.1 (0x0000003a06200000)
    libcap.so.2 => /lib64/libcap.so.2 (0x0000003a07600000)
    libacl.so.1 => /lib64/libacl.so.1 (0x0000003a13000000)
    libc.so.6 => /lib64/libc.so.6 (0x0000003a05200000)
    libdl.so.2 => /lib64/libdl.so.2 (0x0000003a05a00000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003a04a00000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003a05600000)
    libattr.so.1 => /lib64/libattr.so.1 (0x0000003a0ea00000)

Ale s absolutní cestou ldd fungovalo dobře.

6) Vědět, že daný spustitelný démon podporuje TCP Wrapper

Chcete-li zjistit, zda daný spustitelný démon podporuje TCP Wrapper či nikoli, spusťte následující příkaz.

$ sudo ldd /usr/sbin/sshd | grep libwrap
    Output:
    libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f1cc2ac6000)

Výstup indikuje, že démon OpenSSH (sshd) podporuje TCP Wrapper.

7) ldd s chybějící závislostí

Můžeme použít ldd příkaz, když spustitelný soubor selže z důvodu chybějící závislosti. Jakmile najdeme chybějící závislost, můžeme ji nainstalovat nebo aktualizovat mezipaměť pomocí ldconfig příkaz.

$ sudo ldd /bin/mv
libacl.so.1 => /lib/libacl.so.1 (0×40016000)
libc.so.6 => /lib/libc.so.6 (0x4001c000)
libattr.so.1 => /lib/libattr.so.1 (0×40141000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0×40000000)

Provedeme přemístění a nahlásíme všechny chybějící objekty (pouze ELF) zadáním níže uvedeného příkazu.

$ sudo ldd -d path/to/executable_file

Provedeme přemístění datových objektů i funkcí a nahlásíme všechny chybějící objekty nebo funkce (pouze ELF) zadáním příkazu níže.

$ sudo ldd -r path/to/executable_file

Běžné chyby související se sdílenou knihovnou

1) Chybějící chyba knihovny

Můžete se setkat s chybou chybějící knihovny, i když jsou uvedené knihovny dostupné v nové instalační cestě „/opt/newinstall/lib“. Důvodem je, že systém nezná tento adresář, aby mohl zkontrolovat knihovny. To lze opravit kterýmkoli ze dvou způsobů.

A. Proveďte následující příkaz,

$ ldconfig -n /opt/newinstall/lib

b. V souboru /etc/ld.so.conf můžete vidět následující řádek pro začlenění:

zahrnout ld.so.conf.d/*.conf

Vytvořte tedy soubor ve složce /etc/ld.so.sonf.d, řekněte newinstall.conf s následujícím obsahem.

/opt/newinstall/lib

Poté proveďte:

$ ldconfig

2) Chyba dynamického linkeru, nelze namapovat soubory mezipaměti

To může být způsobeno poškozeným souborem mezipaměti. To lze vyřešit přebudováním souboru mezipaměti pomocí ldconfig.

$ ldconfig

Příkaz ldconfig

ldconfig vytvoří potřebné odkazy a mezipaměť (pro použití linkerem za běhu, ld.so) na nejnovější sdílené knihovny nalezené v adresářích zadaných na příkazovém řádku, v souboru/etc/ld.so.conf a v důvěryhodných adresářích (/usr/lib a /lib).

Příklady:

Provedením následujícího příkazu nastavte správné odkazy pro sdílené binární soubory a znovu vytvořte mezipaměť.

$ ldconfig –v

Provedením následujícího příkazu po instalaci nové sdílené knihovny správně aktualizujete symbolické odkazy sdílené knihovny v /lib.

$ ldconfig -n /lib

Následující příkaz vytiskne aktuální mezipaměť.

$ ldconfig -p

Závěr

V tomto tutoriálu jsme se naučili, jak používat příkaz ldd a jak používat příkazový řádek linuxu. Doufám, že se vám čtení tohoto návodu líbilo, a pokud máte nějaké návrhy, poraďte.

Přečtěte si také:

  • 8 Linux Tee Command s příklady
  • Jak používat Linux Tr Command s příklady

Linux
  1. 8 Příklady příkazů Linux TR

  2. Příklady příkazů rm v Linuxu

  3. Příklady příkazů ps v Linuxu

  1. JQ Command v Linuxu s příklady

  2. 7 Příklady příkazů Linux df

  3. w Příklady příkazů v Linuxu

  1. sa Příklady příkazů v Linuxu

  2. Příklady příkazů ac v Linuxu

  3. Příklady příkazů df v Linuxu