Linuxでのlddコマンドの概要



Introduction Ldd Command Linux



Linuxでは、ls、rm、mv、cpなど、すべての人に共通のコマンドがいくつかあります。詳しく説明する必要はないと思います。一部のコマンドは、開発者のみが使用します。プログラマーとしてのそのようなコマンドは理解するために必要であり、いくつかは熟練している必要さえあります。

これらの順序は重要ではないと常に言う人もいます。使用する際に確認できます。どうしてそんなナンセンスを言うことができますか?特定の使用法の詳細は問題ありませんが、少なくともlddについて知っておく必要があります。 lddでさえ知らない、どうやってlddが乾いていることを知っているのか?



この記事では、非常に単純ですが、lddコマンドを紹介します。ああ、突然思い出しました。友達がいます。彼女の名前は3語で、最初の文字はl、d、d、ちょっとした意味です。 Linuxでは、lddはlist、dynamic、dependenciesの略語です。これは、動的ライブラリの依存関係がリストされることを意味します。もちろん、ldd--helpまたはmanlddを使用してその使用法を確認することもできます。以下で、見てみましょう:

test.hの内容は次のとおりです。



void print()

test.cの内容は次のとおりです。

#include #include 'test.h' void print() { printf('rainy days ') }

main.cの内容は次のとおりです。

#include 'test.h' int main() { print() return 0 }

一連のコンパイルを実行し、lddコマンドを使用して以下を取得します。



[root @ xxxxx learn_ldd] $ ls
main.c test.c test.h
[root @ xxxxx learn_ldd] $ gcc -c main.c test.c
[root @ xxxxx learn_ldd] $ gcc main.o test.o
[root @ xxxxx learn_ldd] $ ls
a.out main.c main.o test.c test.h test.o
[root @ xxxxx learn_ldd] $ ./a.out
雨の日
[root @ xxxxx learn_ldd] $
[root @ xxxxx learn_ldd] $
[root @ xxxxx learn_ldd] $
[root @ xxxxx learn_ldd] $ ldd *
a.out:
linux-gate.so.1 =>(0x00ba1000)
libc.so.6 => /lib/libc.so.6(0x0087e000)
/lib/ld-linux.so.2(0x00858000)
main.c:
ldd:警告: `./main.c 'の実行権限がありません
動的実行可能ファイルではありません
main.o:
ldd:警告: `./main.o 'の実行権限がありません
動的実行可能ファイルではありません
test.c:
ldd:警告: `./test.c 'の実行権限がありません
動的実行可能ファイルではありません
test.h:
ldd:警告: `./test.h 'の実行権限がありません
lddlibc4: `./test.h 'からヘッダーを読み取れません
test.o:
ldd:警告: `./test.o 'の実行権限がありません
動的実行可能ファイルではありません
[root @ xxxxx learn_ldd] $
a.outはライブラリlibc.so.6に依存しており、このライブラリへのパスは/lib/libc.so.6であることがわかります。


静的リンクライブラリの使用については引き続き検討します。

[root @ xxxxx learn_ldd] $ ls
main.c test.c test.h
[root @ xxxxx learn_ldd] $ gcc -c test.c
[root @ xxxxx learn_ldd] $ ar rcs libtest.a test.o
[root @ xxxxx learn_ldd] $ gcc main.c-L。 -ltest
[root @ xxxxx learn_ldd] $ ls
a.out libtest.a main.c test.c test.h test.o
[root @ xxxxx learn_ldd] $ ./a.out
雨の日
[root @ xxxxx learn_ldd] $
[root @ xxxxx learn_ldd] $
[root @ xxxxx learn_ldd] $
[root @ xxxxx learn_ldd] $ ldd *
a.out:
linux-gate.so.1 =>(0x00e7c000)
libc.so.6 => /lib/libc.so.6(0x0087e000)
/lib/ld-linux.so.2(0x00858000)
libtest.a:
ldd:警告: `./libtest.a 'の実行権限がありません
動的実行可能ファイルではありません
main.c:
ldd:警告: `./main.c 'の実行権限がありません
動的実行可能ファイルではありません
test.c:
ldd:警告: `./test.c 'の実行権限がありません
動的実行可能ファイルではありません
test.h:
ldd:警告: `./test.h 'の実行権限がありません
lddlibc4: `./test.h 'からヘッダーを読み取れません
test.o:
ldd:警告: `./test.o 'の実行権限がありません
動的実行可能ファイルではありません
[root @ xxxxx learn_ldd] $
今回は静的ライブラリを使用しても、結果は同じです。言うことは何もありません。


ダイナミックリンクライブラリを使用する場合の状況を引き続き確認します。

[root @ xxxxx learn_ldd] $ ls
main.c test.c test.h
[root @ xxxxx learn_ldd] $ gcc -c test.c
[root @ xxxxx learn_ldd] $ gcc -shared -fPIC -o libtest.so test.o
[root @ xxxxx learn_ldd] $ gcc main.c-L。 -ltest
[root @ xxxxx learn_ldd] $ ls
a.out libtest.so main.c test.c test.h test.o
[root @ xxxxx learn_ldd] $ ./a.out
./a.out:共有ライブラリのロード中にエラーが発生しました:libtest.so:共有オブジェクトファイルを開くことができません:そのようなファイルまたはディレクトリはありません
[root @ xxxxx learn_ldd] $
[root @ xxxxx learn_ldd] $
[root @ xxxxx learn_ldd] $
[root @ xxxxx learn_ldd] $ ldd *
a.out:
linux-gate.so.1 =>(0x00f3d000)
libtest.so =>見つかりません
libc.so.6 => /lib/libc.so.6(0x0087e000)
/lib/ld-linux.so.2(0x00858000)
libtest.so:
linux-gate.so.1 =>(0x0031d000)
libc.so.6 => /lib/libc.so.6(0x00110000)
/lib/ld-linux.so.2(0x00858000)
main.c:
ldd:警告: `./main.c 'の実行権限がありません
動的実行可能ファイルではありません
test.c:
ldd:警告: `./test.c 'の実行権限がありません
動的実行可能ファイルではありません
test.h:
ldd:警告: `./test.h 'の実行権限がありません
lddlibc4: `./test.h 'からヘッダーを読み取れません
test.o:
ldd:警告: `./test.o 'の実行権限がありません
動的実行可能ファイルではありません
[root @ xxxxx learn_ldd] $
[root @ xxxxx learn_ldd] $ su root
パスワード:
[root @ xxxxx learn_ldd] #cp libtest.so / usr / lib /
[root @ xxxxx learn_ldd]#。/ a.out
雨の日
[root @ xxxxx learn_ldd] #exit
出口
[root @ xxxxx learn_ldd] $ ./a.out
雨の日
[root @ xxxxx learn_ldd] $
[root @ xxxxx learn_ldd] $
[root @ xxxxx learn_ldd] $
[root @ xxxxx learn_ldd] $ ldd a.out
linux-gate.so.1 =>(0x00510000)
libtest.so => /usr/libtest.so(0x00fe3000)
libc.so.6 => /lib/libc.so.6(0x0087e000)
/lib/ld-linux.so.2(0x00858000)

まず、a.outがlibtest.soライブラリに依存していることがわかりますが、結果は見つかりませんでした。どうして? / usr / libの下にlibtest.soがないため、後でlibtest.so(root権限が必要)をコピーしましたが、問題ありません。さらに、libtest.soの依存関係ライブラリもlddコマンドで見つけることができることも確認する必要があります。

もちろん、独自のプログラムを作成したくないが、lddコマンドを試したい場合は、次のように実行できます。

[root @ xxxxx learn_ldd] $ ldd / bin / ls
linux-gate.so.1 =>(0x0052b000)
libselinux.so.1 => /lib/libselinux.so.1(0x00b52000)
librt.so.1 => /lib/librt.so.1(0x00a5c000)
libcap.so.2 => /lib/libcap.so.2(0x0489c000)
libacl.so.1 => /lib/libacl.so.1(0x048c9000)
libc.so.6 => /lib/libc.so.6(0x0087e000)
libdl.so.2 => /lib/libdl.so.2(0x00a0c000)
/lib/ld-linux.so.2(0x00858000)
libpthread.so.0 => /lib/libpthread.so.0(0x00a13000)
libattr.so.1 => /lib/libattr.so.1(0x04d99000)
[root @ xxxxx learn_ldd] $ ldd / bin / mv
linux-gate.so.1 =>(0x00944000)
libselinux.so.1 => /lib/libselinux.so.1(0x00b52000)
librt.so.1 => /lib/librt.so.1(0x00a5c000)
libacl.so.1 => /lib/libacl.so.1(0x048c9000)
libattr.so.1 => /lib/libattr.so.1(0x04d99000)
libc.so.6 => /lib/libc.so.6(0x00110000)
libdl.so.2 => /lib/libdl.so.2(0x00a0c000)
/lib/ld-linux.so.2(0x00858000)
libpthread.so.0 => /lib/libpthread.so.0(0x00a13000)
[root @ xxxxx learn_ldd] $

実際のLinuxの開発とデバッグでは、ダイナミックライブラリの依存関係を常に確認する必要があります。特に障害が発生した場合は、lddがさらに使用されます。 OK、lddコマンドをここで簡単に紹介します。シンプルですが、とても実用的ですので、知っておくことが重要です。

元の住所: https://blog.csdn.net/stpeace/article/details/47069215