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

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

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

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

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

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

共有ライブラリ

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

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

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

ldd [OPTION]... FILE...

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

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