查看进程内存分布情况的方法:
Code:
#include <stdio.h>
#include <dlfcn.h>
#include <gnu/lib-names.h>
int main(int agrv,char** argv)
{
double (*cosine)(double);
void *handle = dlopen(LIBM_SO, RTLD_LAZY);
cosine = (double (*)(double)) dlsym(handle, "cos");
int i;
printf("handle address of so. file which dynamic linked --- %p\r\n",handle);
printf("address of function in the so. file which dynamic linked --- %p\r\n",cosine);
printf("local variable address --- %p\r\n",&i);
while(1);
}
Result:
ubuntu@ubuntu18:~/_WORKSPACE$ gcc -m64 1.cpp -ldl -o 1
ubuntu@ubuntu18:~/_WORKSPACE$ ./1 &
[2] 25716
ubuntu@ubuntu18:~/_WORKSPACE$
handle address of so. file which dynamic linked --- 0x5574600f4290
address of function in the so. file which dynamic linked --- 0x7f8e66696a60
local variable address --- 0x7fffdbf33904
ubuntu@ubuntu18:~/_WORKSPACE$ cat /proc/25716/maps
55745f4fe000-55745f4ff000 r-xp 00000000 fd:00 3023615 /home/ubuntu/_WORKSPACE/1
55745f6fe000-55745f6ff000 r--p 00000000 fd:00 3023615 /home/ubuntu/_WORKSPACE/1
55745f6ff000-55745f700000 rw-p 00001000 fd:00 3023615 /home/ubuntu/_WORKSPACE/1
5574600f4000-557460115000 rw-p 00000000 00:00 0 [heap]
7f8e66662000-7f8e667ff000 r-xp 00000000 fd:00 393469 /lib/x86_64-linux-gnu/libm-2.27.so
7f8e667ff000-7f8e669fe000 ---p 0019d000 fd:00 393469 /lib/x86_64-linux-gnu/libm-2.27.so
7f8e669fe000-7f8e669ff000 r--p 0019c000 fd:00 393469 /lib/x86_64-linux-gnu/libm-2.27.so
7f8e669ff000-7f8e66a00000 rw-p 0019d000 fd:00 393469 /lib/x86_64-linux-gnu/libm-2.27.so
7f8e66a00000-7f8e66be7000 r-xp 00000000 fd:00 393451 /lib/x86_64-linux-gnu/libc-2.27.so
7f8e66be7000-7f8e66de7000 ---p 001e7000 fd:00 393451 /lib/x86_64-linux-gnu/libc-2.27.so
7f8e66de7000-7f8e66deb000 r--p 001e7000 fd:00 393451 /lib/x86_64-linux-gnu/libc-2.27.so
7f8e66deb000-7f8e66ded000 rw-p 001eb000 fd:00 393451 /lib/x86_64-linux-gnu/libc-2.27.so
7f8e66ded000-7f8e66df1000 rw-p 00000000 00:00 0
7f8e66df1000-7f8e66df4000 r-xp 00000000 fd:00 393466 /lib/x86_64-linux-gnu/libdl-2.27.so
7f8e66df4000-7f8e66ff3000 ---p 00003000 fd:00 393466 /lib/x86_64-linux-gnu/libdl-2.27.so
7f8e66ff3000-7f8e66ff4000 r--p 00002000 fd:00 393466 /lib/x86_64-linux-gnu/libdl-2.27.so
7f8e66ff4000-7f8e66ff5000 rw-p 00003000 fd:00 393466 /lib/x86_64-linux-gnu/libdl-2.27.so
7f8e66ff5000-7f8e6701e000 r-xp 00000000 fd:00 393447 /lib/x86_64-linux-gnu/ld-2.27.so
7f8e671f0000-7f8e671f5000 rw-p 00000000 00:00 0
7f8e6721e000-7f8e6721f000 r--p 00029000 fd:00 393447 /lib/x86_64-linux-gnu/ld-2.27.so
7f8e6721f000-7f8e67220000 rw-p 0002a000 fd:00 393447 /lib/x86_64-linux-gnu/ld-2.27.so
7f8e67220000-7f8e67221000 rw-p 00000000 00:00 0
7fffdbf15000-7fffdbf36000 rw-p 00000000 00:00 0 [stack]
7fffdbfc4000-7fffdbfc7000 r--p 00000000 00:00 0 [vvar]
7fffdbfc7000-7fffdbfc9000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
ubuntu@ubuntu18:~/_WORKSPACE$
可见,通过dlopen进行动态库的动态链接时,dlopen会把动态库加载到 heap 空间,而动态库对应的 handle 也会存在 heap 里。