c - 如何在 C 中查看 Linux 内存映射信息?

标签 c linux memory ld dlopen

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

获取库的起始地址

dlinfo

(参见 1)。

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

我唯一发现的是必须阅读

/proc/[pid]/maps

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

最佳答案

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

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

有link_map *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;
}

而这个功能是Other alternative,就是查找加载的ELF的program headers/或section headers(link_map中有一些指向此类信息的链接)

最简单的方法是使用一些带有 map->l_namestat 系统调用 - 从磁盘读取文件大小(在检测巨大的 bss 部分时不准确)。

关于c - 如何在 C 中查看 Linux 内存映射信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8059435/

相关文章:

c - Typedef 结构指针正确指向 typedef 结构 (C)

c - 嵌套赋值语句和副作用

在 C 中的字符串 vector 之间复制字符串

linux - mkdir : missing operand - ssh -tt ${REMOTE_SERVER} sudo sh -c "mkdir -p/opt/migration"

memory - 克隆语句是否被优化过?

c - 指向结构函数指针的函数指针

ruby-on-rails - 开发 Rails 应用程序

linux - OpenGL 全屏纹理使帧率降至 12fps

c++ - 连续调用 mmap,有缓存吗?

c - struct 字段声明顺序在 Rust 中重要吗?