GNU/Linux >> Linux の 問題 >  >> Linux

Linuxでの8つのLDDコマンドの例

Lddは、実行可能ファイルまたは共有ライブラリの共有ライブラリの依存関係をユーザーが知りたい場合に使用されるLinuxコマンドラインユーティリティです。 Linuxマシンの/libおよび/usr/libディレクトリにあるlib*で始まる多くのファイルに気付いたかもしれません。これらのファイルはライブラリと呼ばれます。ライブラリは、サブルーチン/関数、クラス、値、型指定などのリソースのコレクションです。

ライブラリを使用すると、プログラムは、ソースコードを維持するための管理オーバーヘッドや、プログラムをコンパイルするたびにコンパイルするための処理オーバーヘッドなしで、共通のルーチンを使用できます。

ライブラリには2つのタイプがあります:

静的ライブラリ: 実行する外部ライブラリに依存しない完全なプログラム用の静的ライブラリ。静的にリンクされたプログラムの機能は、前提条件をインストールしなくても機能することです。静的ライブラリは*.aで終わります 拡張機能とこれらのライブラリは、その機能を必要とするプログラムに含まれています(別のコピー)。

ダイナミックライブラリ: サイズの小さいプログラム用のダイナミックライブラリ。これらのライブラリは.soで終わります。 拡張機能、多数のプログラムが実行されているときにダイナミックリンクを使用するもう1つの機能。同じコードの多数のコピーでメモリを占有するのではなく、ライブラリの1つのコピーを共有できます。そのため、最近のプログラムはダイナミックリンクを使用しています。この記事では、コマンドlddについて説明します。 共有ライブラリの管理に使用されます。

共有ライブラリ

私たちがプログラムを作るとき、私たちのためにルーチンまたは特殊な機能を実行するために、他の誰かがすでに書いた多くのコードが必要です。これらのコードは共有ライブラリに保存されます。それらを使用するには、プログラムをビルドするとき、またはプログラムを実行するときに、コードとリンクします。

LDDコマンドの構文とオプション

lddコマンドは、共有オブジェクトの依存関係を出力します。コマンドの構文は次のとおりです。

ldd [OPTION]... FILE...

に挿入できるlddコマンドスイッチを使用できます
[オプション]上記のコマンドのスポット:

  • -v:すべての情報を印刷します。
  • -d:プロセスデータの再配置。
  • -r:プロセスデータと関数の再配置。
  • -u:未使用の直接依存関係を出力します。

コマンドを実行する前に、次の点に注意してください。

-ファイルld-linux.soは、要求されたプログラムの目的のリンクまたはライブラリキャッシュをチェックし、それをロードするダイナミックリンカーまたはローダーです。

-キャッシュファイル/etc/ld.so.cacheには、/ etc/ld.so.confで指定されたディレクトリにあるライブラリのリストが含まれています。これは、より高速なダイナミックリンクを提供するのに役立ちます。

-ファイル/etc/ld.so.confは、ライブラリを検索するディレクトリを指定します

1)コマンドの依存関係を表示する

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)コマンドの依存関係を詳細とともに表示します

cpの依存関係を表示します -vを使用して詳細を指定するコマンド オプション。

$ 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)コマンドの未使用の直接依存関係を表示します

cpの未使用の直接依存関係を表示できます -uを使用したコマンド オプション。

$ 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)ディスプレイlddは動的実行可能ファイルでのみ機能します

lddを表示します -rを使用する動的実行可能ファイルでのみ機能します オプション。

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

出力には、提供されたファイルが動的実行可能ファイルではないという明確なメッセージ状態が表示されました。

5)標準のコマンドライン実行可能ファイルを含むldd

lddを試してみると lsのような標準のコマンドライン実行可能ファイル 、動的実行可能ファイルへのフルパスが必要です。

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

ldd 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)

ただし、絶対パスでは、ldd うまくいきました。

6)特定の実行可能デーモンがTCPWrapperをサポートしていることを知っている

特定の実行可能デーモンがTCPWrapperをサポートしているかどうかを判断するには、次のコマンドを実行します。

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

出力は、OpenSSH(sshd)デーモンがTCPWrapperをサポートしていることを示しています。

7)依存関係が欠落しているldd

lddを使用できます 依存関係がないために実行可能ファイルが失敗した場合のコマンド。不足している依存関係が見つかったら、それをインストールするか、ldconfigを使用してキャッシュを更新できます。 コマンド。

$ 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)

以下のコマンドを入力して、再配置を実行し、欠落しているオブジェクト(ELFのみ)を報告します。

$ sudo ldd -d path/to/executable_file

データオブジェクトと関数の両方の再配置を実行し、以下のコマンドを入力して、欠落しているオブジェクトまたは関数(ELFのみ)を報告します。

$ sudo ldd -r path/to/executable_file

一般的な共有ライブラリ関連のエラー

1)ライブラリエラーがありません

上記のライブラリが新しいインストールパス「/opt/ newinstall / lib」で使用可能であっても、ライブラリの欠落エラーが発生する場合があります。これは、システムがライブラリをチェックするためにこのディレクトリを認識していないためです。これは、2つの方法のいずれかで修正できます。

a。次のコマンドを実行します

$ ldconfig -n /opt/newinstall/lib

b。 /etc/ld.so.confファイルに次のインクルード行が表示されます。

ld.so.conf.d/*。conf

を含める

したがって、/ etc / ld.so.sonf.dフォルダーに、次の内容のnewinstall.confなどのファイルを作成します。

/opt/newinstall/lib

次に、次を実行します:

$ ldconfig

2)ダイナミックリンカーエラー、キャッシュファイルをマップできません

これは、キャッシュファイルが破損していることが原因である可能性があります。これは、ldconfigを使用してキャッシュファイルを再構築することで解決できます。

$ ldconfig

ldconfigコマンド

ldconfigは、コマンドラインで指定されたディレクトリ、file / etc / ld.so.conf、およびにある最新の共有ライブラリへの必要なリンクとキャッシュ(ランタイムリンカーld.soで使用するため)を作成します。信頼できるディレクトリ(/ usr /libおよび/lib)にあります。

例:

次のコマンドを実行して、共有バイナリの正しいリンクを設定し、キャッシュを再構築します。

$ ldconfig –v

新しい共有ライブラリをインストールすると、/lib内の共有ライブラリのシンボリックリンクが適切に更新された後、次のコマンドを実行します。

$ ldconfig -n /lib

次のコマンドは、現在のキャッシュを出力します。

$ ldconfig -p

結論

このチュートリアルでは、lddコマンドの使用方法とLinuxコマンドラインでの使用方法を学びました。このチュートリアルを楽しんで読んだことを願っています。何か提案があればアドバイスしてください。

関連項目:

  • 8つのLinuxTeeコマンドと例
  • 例でLinuxTrコマンドを使用する方法

Linux
  1. LinuxでのJQコマンドと例

  2. 8 Linux TR コマンドの例

  3. Linux での rm コマンドの例

  1. 7 Linux df コマンドの例

  2. Linux での ps コマンドの例

  3. w Linux でのコマンド例

  1. Linux での sa コマンドの例

  2. Linux での ac コマンドの例

  3. Linux での df コマンドの例