2

我正在用 C 动态加载一些 Linux 库。我可以使用

信息

(见1)。

但是,我找不到任何信息来获取库的大小。

我发现的唯一一件事是必须阅读

/proc/[pid]/maps

文件并解析它以获取相关信息(参见2)。有没有更优雅的方法?

4

2 回答 2

0

(这个答案是 LINUX/GLIBC 特定的)

根据http://s.eresi-project.org/inc/articles/elf-rtld.txt

有link_map *map;地图->l_map_start & 地图->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 部分时不准确)。

于 2011-11-09T01:54:52.917 回答
0

解析/proc/self/maps(或者可能popenpmap命令)对我来说似乎仍然是最简单的事情。还有这个dladdr功能(前提是你有一些地址开始)。

于 2011-11-09T18:43:12.173 回答