nm
gdb
プロセスを実行するたびに変更される実際の仮想プロセスのメモリアドレスを提供しながら、マングルされた名前シンボルテーブルのアドレスオフセットを提供します。
nm
は、コード セグメントの先頭からのオフセットを示す単なるツールです。あなたの場合:
00021af0 T Rect_IsEmpty
単に、コード セグメント全体で、他のすべての関数の中で、コード セグメントからのRect_IsEmpty
オフセット00021af0
があるため、コード セグメントのベースが に再配置された00000000
場合、オフセットはアドレスと同じになることを意味します00021af0
。
Linux で実行可能ファイルを実行する前に、アドレスのランダム化に ASLR メカニズムが使用されますが、すべてのアドレスではなく、セグメントの先頭のみが使用されます。したがって、実行可能ファイルを実行する前に動的シンボルが持つアドレスを常に知ったり依存したりできるとは限りません。セグメントの開始アドレスからのオフセットしか持つことができません。
デバッガーを使用して関数のアドレスを検索すると、ASLR が既にジョブを実行した後で、プロセスのコード セグメント内にシンボルのアドレスが表示されます。
これは、共有ライブラリに関する IBM の優れた記事と、Procedure Linkage Table および Global Offset Table に関する別の記事です。