如何知道运行时链接的共享对象的内存分配大小?

How to know the size of the memory allocation of a shared object linked at runtime?

将共享库 (.so) 与 dlopen 链接后,我们如何知道链接的共享对象的大小,即分配的共享库距离 dlopen 返回的句柄的偏移量是多少。

共享库的动态链接是一个完整的用户空间进程。你可以自己做:解析文件的ELF headers,将文件mmap到内存中,使用共享库的未定义符号进行动态链接等pp。然后你就知道库部分在哪里位于。但是 GNU libdl 没有提供任何相关信息。

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

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

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