転送:ITスーパーマン
GDBは、動的ライブラリ場合、または情報は、ライブラリの検索パスを指定するためのライブラリ検索パスの誤り、使用セットSYSROOT、セットsolib絶対プリフィックス、セットsolib-検索パスに起因する通常間違って表示、であるので、情報を表示することができないとき。
1セットSYSROOTとセットsolib絶対プレフィックスは同じコマンドである、実際には、セットSYSROOTセットsolib絶対プレフィックス別名です。
(で分離:「」2セットsolib探索経路セット動的ライブラリ検索パスは、検索コマンドは、間のパスを使用して、複数のパスを提供することができるLinuxの Win32では結腸、DOS、及びセミコロンとして)。
3.セットsolib絶対プレフィックスとセットsolib-検索パスの違い:
全体的に、唯一の絶対パスの有効な絶対パス接頭辞solib絶対プレフィックス設定ライブラリ、;およびサーチパスsolib-検索パスの設定ライブラリ、絶対パスと相対パスが働いています。(コンパイラが自動的クドロー絶対パスに連結します)。
詳細なルールは以下のとおりです。
セットsolib-サーチパスは、唯一のパスが提供され、そしてsolib-探索経路が探索経路を複数設けてもよいように、接頭辞以降のパスです。
絶対および相対パス:動的ライブラリ情報コアダンプ出会いを2つのルートをロードするとき。手順;コンパイル時ライブラリのリンクは、このような「/lib/libc.so.6","/lib/libdl.so.2」というように、コアダンプファイルのこの時間も、絶対パスとして保存されるように、多くの場合、絶対パスですdlopenの関数ライブラリはので、この時点でのファイルの完全なパスと同じコアダンプの保存、は、例えば、「./libddd.so」相対パスを使用してロードされました。
Bnがセットsolib検索パスの設定を表すとプレゼンテーションを容易にするために、パス設定solib絶対プレフィックスAによって提供さで表される、R&LT(A)は、ルート接頭語(すなわち、マイナス接頭辞「/」記号)の後にパスを除去Aで表されます各パスは、すなわちパスのライブラリファイルを検索するライブラリのパスに格納されているXコアダンプ、で表される、F.は、(X)Xのディレクトリ内のファイル名を表す(文字列の後に最後のパス「/」記号)を除去します。
絶対パス、検索順序は次のとおりです。
1) A/X // 先添加solib-absolute-prefix前缀进行搜索,成功则不再继续,否则继续2)
2) R(A)/X // 再把1)的根前缀去掉后进行搜索,成功则不再继续,否则继续3)
3) Bn/R(A)/X // 再在2)的基础上逐一添加solib-search-path中的每条路径进行搜索,成功则不再继续,否则继续4)
4) Bn/F(X) // 再只使用2)中的文件名(去掉目录段),并逐一添加solib-search-path中的每条路径进行搜索,成功则不再继续,否则继续5)
5) $PATH/R(A)/X // 在2)的基础上使用环境变量$PATH中的每条路径进行搜索,成功则不再继续,否则继续6)
6) $LD_LIBRARY_PATH/R(A)/X // 在2)的基础上使用环境变量$LD_LIBRARY_PATH中的每条路径进行搜索,成功则不再继续,否则继续7)
7) 返回失败
ブロガーは注意:GDBをすることによって達成することができるようにLD_LIBRARY_PATHのGDBコマンドなどの環境変数を設定します。
(gdb) set env LD_LIBRARY_PATH /tmp
相対パスの場合、検索順序は次のとおりです。
1) X // 直接使用原始路径进行搜索,成功则不再继续,否则继续2)
2) Bn/X // 再逐一添加solib-search-path中的每条路径进行搜索,成功则不再继续,否则继续3)
3) Bn/F(X) // 再只使用文件名(去掉目录段),并逐一添加solib-search-path中的每条路径进行搜索,成功则不再继续,否则继续4)
4) $PATH/X // 再使用环境变量$PATH中的每条路径进行搜索,成功则不再继续,否则继续5)
5) $LD_LIBRARY_PATH/X // 再使用环境变量$LD_LIBRARY_PATH中的每条路径进行搜索,成功则不再继续,否则继续6)
6) 返回失败
================================================== ====================
例えば:
set solib-absolute-prefix /root/temp
set solib-search-path /home/evan:/home/peter
$PATH is /usr/sbin:/usr/bin
$LD_LIBRARY_PATH is /opt:/usr/games
そして、絶対パス「/lib/libc.so.6」の検索順は以下のとおりです。
1) A/X
/root/temp/lib/libc.so.6
2) R(A)/X
root/temp/lib/libc.so.6
3) Bn/R(A)/X
/home/evan/root/temp/lib/libc.so.6
/home/peter/root/temp/lib/lic.so.6
4) Bn/F(X)
/home/evan/libc.so.6
/home/peter/libc.so.6
5) $PATH/R(A)/X
/usr/sbin/root/temp/lib/libc.so.6
/usr/bin/roo/temp/lib/lic.so.6
6) $LD_LIBRARY_PATH/R(A)/X
/opt/root/temp/lib/libc.so.6
/usr/games/root/temp/lib/libc.so.6
検索順序が「./libddd.so」相対パス
1) X
./libddd.so
2) Bn/X
/home/evan/./libddd.so
/home/peter/./libddd.so
3) Bn/F(X)
/home/evan/libddd.so
/home/peter/libddd.so
4) $PATH/X
/usr/sbin/./libddd.so
/usr/bin/./libddd.so
5) $LD_LIBRARY_PATH/X
/opt/./libddd.so
/usr/games/./libddd.so
上記の絶対的および相対パスから1つのステップは、(ステップ3ステップ4の絶対パスと相対パス)を見つけるために、ステッチファイル名とsolib-サーチパスを使用する限りセットとしてsolib-検索 - であり見各ライブラリカタログファイルが配置されているため、我々はすべてのライブラリを見つけることができるようにすることができ、ダイレクトパスを設定します。
ロードパスかどうか4.チェックし、対応するファイルからそれを発見されたとToのロードアドレスが値を持つことになり、このとき、ファイルは正しい道ディスプレイに搭載されたアドレスで、場合場合、ライブラリは、情報sharedlibrary正しいコマンドを使用することができますので、値シムズ読むはい、シンボリック情報が含まれているライブラリファイルには、そう、そうでない場合はありませんが、Fromアドレスとに空である場合、対応するファイルが見つからない、シムズ読むませ値は、右の番組にファイルコアダンプのパスを表示されますライブラリファイルパスインチ
5.コアダンプファイルがロードされている場合、またはときsharedlibrary infoコマンドは、そのようなAミス「アドレス0x87000069にすることはできませんアクセスメモリ」と表示され、メインの実行可能ファイル(「ファイル」コマンドを使用するか、または「実行ファイルされているので、それは通常、 「コマンド)とコアダンプファイル(」コア「コマンドまたは」コア・ファイル「コマンド)彼らがリードを一致していません。メインの実行ファイルは、コアダンプを生成するために使用されるメインの実行ファイルがあるかどうか、それは、動的ライブラリ情報の読み取りエラーにつながる可能性があるとして、この時間は、ほぼ限り、チェックする必要があります。
6.ロードプロセスは、「警告:のための.dynamicセクション」持っている場合/lib/librt.so.1は通常、ライブラリ検索パスであるこのようなヒント、「期待されるアドレス(?間違ったライブラリまたはバージョン不一致)ではありません」 GDBは、原因と間違ったライブラリファイルをロードし、正しく設定。この場合、ライブラリのロードパスを表示し、設定SYSROOTまたはセットsolib-検索パスを使用して正しいパス上のエラーを修正するライブラリへの検索パスを変更するには、info sharedlibraryコマンドを使用します。
7.検索パスパスを設定した後、それが適切な負荷のシンボル・テーブル・ライブラリーを確保するように、メインの実行可能ファイルをロードして、コアダンプコア・コマンド・ファイルをロードするために、ファイルコマンドを使用するのが最適です。それ以外の場合は、ファイルを最初にメインの実行ファイルをロードするためにコアダンプコア命令し、ファイルコマンドにロードされている場合、それはライブラリを検索するだろう唯一の原因ではなく、ロードされたシンボル(参照するには、info sharedlibraryコマンドを使用して)、その後、再実行しますその上にコアコマンド。
8.検索の具体例:
カレントディレクトリは/ホーム
中/ホーム/エヴァン/ gdbso / MIPS / gdbsoメインの実行ファイル
中/ホームコアファイル/エヴァン/ gdbso / MIPS /コアダンプ
動的ライブラリとメインの実行ファイルと同じディレクトリにコピーします
マスターが使用する標準ライブラリのコンパイルされた実行可能ファイルは、メインの実行ファイルディレクトリのlibの/home/evan/gdbso/mips/lib/libxxx.soにコピーされます
GDBを入力し、コマンドでメインの実行可能ファイルをロードします。
evan@ubunu:/home$ mips-linux-gnu-gdb
...
(gdb) file evan/gdbso/mips/gdbso
Reading symbols from /home/evan/gdbso/mips/gdbso...done.
(gdb) info sharedlibrary
No shared libraries loaded at this time.
あなただけのメインの実行可能ファイルがロードされて見ることができる場合は、動的ライブラリの情報を取得することができませんでした。そして、コアコマンドは、コアダンプファイルをロードします。
(gdb) core evan/gdbso/mips/Coredump
...
warning: .dynamic section for "/lib/libc.so.6" is not at the expected address (wrong library or version mismatch?)
...
(gdb) info sharedlibrary
From To Syms Read Shared Object Library
0x2aad98c0 0x2aadd6d8 Yes /lib/librt.so.1
0x2aaf3460 0x2ab0db98 Yes /lib/libm.so.6
0x2ab7e2e0 0x2ab89b28 Yes /lib/libpthread.so.0
0x2abba9a0 0x2acb2bd8 Yes /lib/libc.so.6
0x2ad06a40 0x2ad07988 Yes /lib/libdl.so.2
No /lib/ld.so.1
No ./libddd.so
(gdb)
同時に情報sharedlibraryとメインの実行ファイルとコアダンプとした後、あなたは、動的ライブラリの情報を見ることができます。しかし、ライブラリーのバージョンがロードプロセスの間に一致していないヒントがあります。情報sharedlibraryによっても、GDBが誤ってシステムにロード標準ライブラリが付属してご覧ください。我々は間違いなく、元のパス名がでコアダンプを保存したを見て、存在しないディレクトリへのパスを設定します:
(gdb) set sysroot /noexist
...
(gdb) info sharedlibrary
From To Syms Read Shared Object Library
No /lib/librt.so.1
No /lib/libm.so.6
No /lib/libpthread.so.0
No /lib/libc.so.6
No /lib/libdl.so.2
No /lib/ld.so.1
No ./libddd.so
(gdb)
コアダンプはただ絶対パス接頭辞を設定するには、GDBは、正しいライブラリ/home/evan/gdbso/mips/lib/librt.so.1を使用することを可能にするために、/lib/librt.so.1と呼ばれる元のパスに保存されています/ホーム/エヴァン/ gdbso / MIPSは、ここでの効果を実証するためにエヴァン/ gdbso / MIPSに設定することができます。
(gdb) set sysroot evan/gdbso/mips
...
(gdb) info sharedlibrary
From To Syms Read Shared Object Library
0x2aad98c0 0x2aade270 Yes evan/gdbso/mips/lib/librt.so.1
0x2aaf3110 0x2ab31b70 Yes evan/gdbso/mips/lib/libm.so.6
0x2ab7e320 0x2ab8e620 Yes evan/gdbso/mips/lib/libpthread.so.0
0x2abba6a0 0x2accc3f0 Yes evan/gdbso/mips/lib/libc.so.6
0x2ad06b50 0x2ad07c70 Yes evan/gdbso/mips/lib/libdl.so.2
0x2aaa8810 0x2aac2e40 Yes evan/gdbso/mips/lib/ld.so.1
No ./libddd.so
(gdb)
あなたが見ることができる、GDBは正常に絶対パスをロードされています。しかし、「./libddd.so」相対パスは、ホーム/エヴァン/ gdbso / MIPSが可能/ライブラリ検索パスが含まれている設定、/home/evan/gdbso/mips/libddd.so使用するためには、発見されていません。効果を確認するために、また、存在しない検索パスが追加されます。
(gdb) set solib-search-path /noexist:/home/evan/gdbso/mips
...
(gdb) info sharedlibrary
From To Syms Read Shared Object Library
0x2aad98c0 0x2aade270 Yes evan/gdbso/mips/lib/librt.so.1
0x2aaf3110 0x2ab31b70 Yes evan/gdbso/mips/lib/libm.so.6
0x2ab7e320 0x2ab8e620 Yes evan/gdbso/mips/lib/libpthread.so.0
0x2abba6a0 0x2accc3f0 Yes evan/gdbso/mips/lib/libc.so.6
0x2ad06b50 0x2ad07c70 Yes evan/gdbso/mips/lib/libdl.so.2
0x2aaa8810 0x2aac2e40 Yes evan/gdbso/mips/lib/ld.so.1
0x2ad1a590 0x2ad1a770 Yes /home/evan/gdbso/mips/libddd.so
(gdb)
あなたはすべてのライブラリは、正しいパスを見つけることがことがわかります、シムズも正しくロードされています。