0

Linuxでは、/ proc / $ PID / pmapsを調べて特定のプログラムによってロードされたライブラリを確認でき、プログラムは/ proc / self/pmapsを開いて自分自身がロードしたライブラリを確認できます。

pmapにはダイナミックライブラリのみが含まれることはわかっています。カーネルは、後でdlopenする可能性のあるライブラリを予測できないため、それらは/ proc / self/mapsに含まれないと思います。しかし、他のいくつかのシナリオがわかりません。

  1. ビルド時にリンクされているが、まだ関数を呼び出していないライブラリは含まれていますか?私の理解では、Linuxはシンボルのリンクを最初に使用するまで遅らせるので、シンボルが表示されるかどうかはわかりません。

  2. pmapには、再帰的に使用されるすべてのライブラリが含まれていますか?たとえば、pmapで各ライブラリを確認し、その上でlddを実行してから、それらに対してlddを実行すると、元のpmapになかった新しいライブラリが見つからないはずです。私はこれをいくつかのバイナリで試しましたが、そうであるように見えますが、運が良かったのかもしれません。

4

2 に答える 2

2

/ proc / $ pid / mapsは、ロードされたライブラリだけでなく、他のすべてのマップされたメモリセグメントも一覧表示します。

このスレッドとそこにある記事を読んでください:

Linux / proc / id/mapsを理解する

于 2013-02-08T22:23:37.413 に答える
2

ビルド時にリンクされているが、まだ関数を呼び出していないライブラリは含まれていますか?

はい: ランタイム ローダーはmmap、プログラムの実行が開始される前に、実行可能ファイルが直接依存するすべてのライブラリを削除します。

実行すると、そのようなライブラリのリストを見つけることができます

readelf -d a.out | grep NEEDED

pmaps には、再帰的に使用されるすべてのライブラリが含まれていますか?

はい: それ自体に直接依存しているライブラリが他のライブラリに依存している場合、ランタイム ローダーはmmap再帰的な依存関係も同様に扱います。

私の理解では、Linux はシンボルのリンクを最初に使用するまで遅らせます。

これは、関数シンボルではほとんど正しいですが、遅延解決できないデータ シンボルでは正しくありません。

また、シンボルが遅延解決されるかどうかは、LD_BIND_NOW環境変数と、-znowリンカー フラグによって制御される実行可能な動的セクションの同等の設定に依存します。

ただし、そのどれもが絵を変えるものではありmmapません。動的セクションにのDT_NEEDEDエントリがある場合は、遅延解決または非遅延解決に関係なく ed (および に表示)されます。foo.sofoo.so mmap/proc/self/*map*

于 2013-02-10T03:02:26.760 に答える