
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コマンドを使用する方法