[APUE] 使用dlopen进行动态链接时动态库会被加载到heap内存段

查看进程内存分布情况的方法: 

https://stackoverflow.com/questions/36523584/how-to-see-memory-layout-of-my-program-in-c-during-run-time

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 里。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值