(この答えはLINUX/GLIBC固有のものです)
http://s.eresi-project.org/inc/articles/elf-rtld.txt
によるとlink_map *マップがあります。 MAP-> l_map_start & MAP-> l_map_end http://www.cygwin.com/ml/libc-hacker/2007-06/msg00014.html は=いくつかのライブラリは、メモリ内の連続ではありません、ここで言ったようにそれは、ない正確なビットである
/*
** Start and finish of memory map for this object.
** l_map_start need not be the same as l_addr.
*/
ElfW(Addr) l_map_start, l_map_end;
。リンクされた手紙にはいくつかの例があります。この検出する(にrtldする)非常に内部関数であることはELFセグメントとlink_mapと直接作業に基づいて、指定されたアドレスのlibのアドレス空間内のかどうか、次のとおりです。
/* Return non-zero if ADDR lies within one of L's segments. */
int
internal_function
_dl_addr_inside_object (struct link_map *l, const ElfW(Addr) addr)
{
int n = l->l_phnum;
const ElfW(Addr) reladdr = addr - l->l_addr;
while (--n >= 0)
if (l->l_phdr[n].p_type == PT_LOAD
&& reladdr - l->l_phdr[n].p_vaddr >= 0
&& reladdr - l->l_phdr[n].p_vaddr < l->l_phdr[n].p_memsz)
return 1;
return 0;
}
、この機能は他の代替であり、プログラムヘッダ/またはELFのセクションヘッダがロードされて見つけること
(そこlink_mapでそのような情報へのリンクです)そして、最も簡単にはmap->l_name
でいくつかstat
システムコールを使用することです - ディスクからのファイルのサイズを読み取るための巨大な検出で(不正確bssセクション)。
私が知っているように、 'maps'を解析するのが最も簡単な方法です。なぜあなたの意見ではエレガントではないのですか? – osgx
単純に以下を実行するのと比べて、文字列の解析を混乱させるのはあまり意味がありません。 'struct link_map * map; dlinfo(hLibrary、RTLD_DI_LINKMAP、&map); void * base = map-> l_addr; ' – user1036752
'map-> l_name'があり、ライブラリへのパスに基づいて' stat'を実行できます。 link_mapはELFファイルのセグメント/セクションをより深く見つけ出します。 – osgx