私の C 共有ライブラリで、別の共有ライブラリを dlopen() し、このライブラリが持っているエクスポートされたシンボルのリストを取得したいと考えています。
nm/objdump を実行せずにプログラムでそれを行う方法はありますか?
二次的な質問として: dlopen() の後にこの 2 番目のライブラリがロードされたベース アドレスを取得するにはどうすればよいですか?
私は次のことを試しました:
struct link_map *imagehandle = (struct link_map*)dlopen(libraryname, RTLD_LOCAL | RTLD_LAZY);
void * fbase = (void*) imagehandle->l_addr;
printf("base addr is %p",fbase)
これは印刷します
「ベース アドレスは 0x6862696c です」
ただし、ライブラリはそこにはありません。
[ /proc/pid/maps 出力: ]
b6d27000-b6d28000 r-xp 00000000 1f:01 1581 mysecondlib.so
b6d28000-b6d29000 r--p 00000000 1f:01 1581 mysecondlib.so
b6d29000-b6d2a000 rw-p 00001000 1f:01 1581 mysecondlib.so
l_addr は実際のライブラリ ベース アドレスではなく、実行可能ヘッダーからのオフセットであることが示唆されていますが、そのヘッダー アドレスを見つける方法がわかりません。