在使用dlopen链接共享库(.so)之后,我们怎么知道链接共享对象的大小,直到dlopen返回的句柄的偏移量是分配的共享库。
答案 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
这应提供您需要的所有信息。