(此答案是LINUX/GLIBC特异性)
有link_map *图; MAP-> l_map_start & MAP-> l_map_end
/*
** 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;
这是有点不完全一样,如这里所述http://www.cygwin.com/ml/libc-hacker/2007-06/msg00014.html =一些库不在存储器连续;这封信有一些例子...例如这是非常的内部(至rtld)函数来检测里面的lib的地址空间与否,基于link_map和直接的工作与ELF段定地址:
/* 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这样的信息)
而且最简单的就是使用一些stat系统调用与map->l_name - 到从磁盘读取文件大小在检测巨大(不精确bss部分)。