2011-07-08 15 views
7

実行時に、アドレスを出力して、そのアドレスが含まれている機能を見つける必要があります。関数は共有ライブラリにあり、固定アドレスではありません。私のマップファイルは明らかに各共有ライブラリfuncの相対オフセットを示しているだけです。実行時に、ライブラリがロードされた場所を照会することができます。その結果、正しいアドレスのファイルを取得するために、自分のアドレスからその値を減算することができますか?Linuxで共有ライブラリのロードアドレスを見つける

現在、私はライブラリー内の1つの関数のアドレスを出力し、マップファイル内のその関数を見つけて、ロードアドレスがどこにあるのかを調べます。私はむしろ参照関数に名前を付ける必要のない汎用メソッドを持っています。

(GDBは私の設定では利用できません)おかげさまで

答えて

4

最近のLinuxでは、dl_iterate_phdrを使用して共有ライブラリのアドレスを調べることができます。

1

GNU backtraceライブラリ?

私はこのようなもののためにハッキーなアプローチに頼っていません。私は、ライブラリの内容が連続したメモリにロードされるという保証はないと思います。

3

/proc/[PID]/mapsファイルを見てみてください。 これには、プロセスメモリアドレス空間にライブラリマッピングのアドレスが含まれている必要があります。

実行可能部分にアクセスするには、ライブラリでreadelfを使用し、.textセクションのオフセットを見つけます。

7

dladdrがこれを行います。 :-)

dladdrはアドレスを取って、どのライブラリとシンボルに対応しているかを調べると、ライブラリ名、シンボル名、ベース名が表示されますそれぞれのアドレス。個人的に私はそれが気の利いたと思う、それはまた、私の現在のデバッグジョブを点灯しやすくしている。

希望すると便利です。

1

System V ABI, chapter 5を確認してください。

#include <link.h> 

off_t load_offset; 
for (Elf64_Dyn *dyn = _DYNAMIC; dyn->d_tag != DT_NULL; ++dyn) { 
    if (dyn->d_tag == DT_DEBUG) { 
     struct r_debug *r_debug = (struct r_debug *) dyn->d_un.d_ptr; 
     struct link_map *link_map = r_debug->r_map; 
     while (link_map) { 
      if (strcmp(link_map->l_name, libname) == 0) { 
       load_offset = (off_t)link_map->l_addr; 
       break; 
      } 
      link_map = link_map->l_next; 
     } 
     break; 
    } 
} 

これは、任意のGNU拡張機能に依存しない:そこに怠惰なものについては、こちらをELFバイナリフォーマットをサポートするシステムのためにこれを行うための標準的な方法です。

GNUシステムでは、ElfW(Dyn)マクロは、便利なElf64_DynまたはElf32_Dynのいずれかを返します。

関連する問題