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

时间:2017-05-31 17:45:45

标签: c memory shared-libraries dlopen

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

1 个答案:

答案 0 :(得分:0)

共享库的动态链接是一个完整的用户空间进程。您可以自己完成:解析文件的ELF头,将文件映射到内存中,使用共享库的未定义符号进行动态链接等。然后您就可以确切地知道库部件的位置。但是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

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