7

私の 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 は実際のライブラリ ベース アドレスではなく、実行可能ヘッダーからのオフセットであることが示唆されていますが、そのヘッダー アドレスを見つける方法がわかりません。

4

1 に答える 1