36

libtest.so という名前の共有ライブラリがあり、その中に「foo」という関数が 1 つあるとします。

ストリップを使用して libtest.so からすべてのシンボルを破棄します

$strip libtest.so

だから、今私たちが使用する場合:

$nm libtest.so

印刷されます:

nm: libtest.so: シンボルなし

しかし、使用する場合:

$readelf -s libtest.so 

foo 関数は、その結果からまだ見ることができます:

...

10: 000005dc 5 FUNC グローバルデフォルト 12 _Z3foov

...

コマンド文字列を使用して確認することもできます。

$strings libtest.so

...

_Z3foov

...

ここに私の質問があります.なぜ nm は縞模様の libtest.so に対して結果を出さないのですか?

ありがとう

4

1 に答える 1

64

nm がストライプ化された libtest.so に対して結果を返さない理由

元のには2 つのシンボル テーブルがありますlibtest.so。「通常の」テーブル (.symtabおよび.strtabセクション内) と動的テーブル (.dynsymおよび.dynstrセクション内) です。

両方のシンボル テーブルを削除するとstrip、ライブラリは完全に役に立たなくなります。ダイナミック ローダーはライブラリ内のシンボルを解決できません。strip意味のある唯一のこともそうです: 「通常の」シンボルテーブルを削除し、動的なものをそのまま残します。

nm -Dまたはを使用して、ダイナミック シンボル テーブルにシンボルを表示できますreadelf -s

「通常の」シンボル テーブルは、デバッグにのみ役立ちます (たとえば、ライブラリによってエクスポートされず、動的シンボル テーブルに表示されない静的関数のエントリが含まれます)。

ただし、動的ローダーは「通常の」シンボル テーブル (高速なシンボル検索に適した形式ではない) を参照することはありません。動的なもののみ。したがって、正しいプログラム操作には「通常の」シンボルテーブルは必要ありませんが、動的シンボルテーブルは必要です。

于 2012-04-01T02:55:37.657 に答える