【问题标题】:How to know the size of the memory allocation of a shared object linked at runtime?如何知道运行时链接的共享对象的内存分配大小?
【发布时间】:2017-05-31 17:45:44
【问题描述】:

使用 dlopen 链接共享库 (.so) 后,我们如何知道链接的共享对象的大小,即直到 dlopen 返回的句柄的偏移量是分配的共享库。

【问题讨论】:

  • 你为什么需要知道这个?
  • 共享对象不必是单个内存块。它可以有不同的文本段、数据段、BSS 段,就像可执行的目标文件一样。
  • 我们能知道数据的偏移量吗?我想为共享库的功能和数据做一个偏移量表。
  • 从什么偏移? dlopen返回的指针是不透明的数据,可能与共享对象在内存中的位置无关。

标签: c memory shared-libraries dlopen


【解决方案1】:

共享库的动态链接是一个完整的用户空间过程。您可以自己完成:解析文件的 ELF 标头,将文件映射到内存中,使用共享库的未定义符号进行动态链接等 pp。然后您就知道库部分的确切位置。但是 GNU libdl 没有提供任何相关信息。

另一个选项是 dlopen() 库并为它解析 /proc/self/maps。它通常有几个具有不同访问权限(代码、rodata、rwdata 等)的映射,具体取决于这样的 elf 标头:

7fd6298f0000-7fd6298f5000 r-xp 00000000 fd:00 393441 /lib/x86_64-linux-gnu/libnss_dns-2.19.so
7fd6298f5000-7fd629af4000 ---p 00005000 fd:00 393441 /lib/x86_64-linux-gnu/libnss_dns-2.19.so
7fd629af4000-7fd629af5000 r--p 00004000 fd:00 393441 /lib/x86_64-linux-gnu/libnss_dns-2.19.so
7fd629af5000-7fd629af6000 rw-p 00005000 fd:00 393441 /lib/x86_64-linux-gnu/libnss_dns-2.19.so

这应该提供您需要的所有信息。

【讨论】:

    猜你喜欢
    • 2012-04-13
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    相关资源
    最近更新 更多