社区
Linux/Unix社区
帖子详情
动态库中的变量(全局和自动变量)在什么地方存储,内存在什么位置分配?
lysliberty
2004-10-15 08:48:48
一般来说,动态库是从0x40000000位置开始加载,动态库也有自己的text, data 和bss段, 我的问题就是
(1)动态库中的全局变量的存储位置是在进程的data段还是动态库自己的data段? 自动变量的情况又如何?
(2)如果在动态库中分配内存,那应该在什么位置分配?
...全文
626
4
打赏
收藏
动态库中的变量(全局和自动变量)在什么地方存储,内存在什么位置分配?
一般来说,动态库是从0x40000000位置开始加载,动态库也有自己的text, data 和bss段, 我的问题就是 (1)动态库中的全局变量的存储位置是在进程的data段还是动态库自己的data段? 自动变量的情况又如何? (2)如果在动态库中分配内存,那应该在什么位置分配?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
lysliberty
2004-10-17
打赏
举报
回复
up
lysliberty
2004-10-15
打赏
举报
回复
up
lysliberty
2004-10-15
打赏
举报
回复
第一点可以验证,理解.
关于第二点还有些问题:
下面是我的maps文件:
08048000-08049000 r-xp 00000000 03:07 336149 /home/test
08049000-0804a000 rw-p 00000000 03:07 336149 /home/test
0804a000-0804b000 rwxp 00000000 00:00 0
40000000-40015000 r-xp 00000000 03:05 600290 /lib/ld-2.3.2.so
40015000-40016000 rw-p 00014000 03:05 600290 /lib/ld-2.3.2.so
40016000-40017000 rw-p 00000000 00:00 0
40017000-40024000 r-xp 00000000 03:07 512362 /home/libts.so.1.0.0
40024000-40026000 rw-p 0000d000 03:07 512362 /home/libts.so.1.0.0
40026000-40040000 rw-p 00000000 00:00 0
我在动态库libts.so.1.0.0中用malloc分配的内存的返回的地址却是0x8049898
也就是说是在data段里分配, 这是为什么?
pacman2000
2004-10-15
打赏
举报
回复
动态库的全局变量在自己的data段里。分配的内存是在统一的堆里的。
动态库
中
的
全局
变量
和各种锁以及信号量是否是进程独立或者共享
也就是说,想要在so内实现一个不可重入的函数还是比较困难的,因为所有
变量
都是独立的,但是考虑如下场景:驱动层给了一个视频码流录制的接口,并且没有在驱动层做互斥,但实际上这个接口同一时间只可能被一个进程调用,那么很明显,串接到so
中
的接口必须实现该接口的原子调用。在应用程序编译的时候,不同的应用程序引用同一个库,那么
动态库
的代码是共享的。因为数据是独立的,代码是共享的。有了以上两个函数,其实就可以写一个so被加载时
自动
执行的初始化函数,这样可以保证so的使用者不必关心内存、锁的创建、销毁和使用。
论
动态库
中
的
全局
变量
和各种锁以及信号量是否是进程独立或者共享
动态库
中
的
全局
变量
测试 新建一个
动态库
,代码如下 #include <stdio.h> #include "my_lib.h" int g_val = 200; //测试库
中
的
全局
变量
是否独立或共享 static void func_1(); void func(int i) { func_1(); g_val = i; printf("===== g_val= %d\n", g_val); } static void func_1() { printf("==
动态库
中
全局
变量
问题
所以,当任何一个线程尝试修改这些page
中
的内容时,windows负责
分配
一个新的page出来,然后修改该线程的地址空间,将 这个新
分配
的page的地址设置上去,从此以后,该线程修改这个
全局
变量
或是静态
变量
,操作的就是这个新
分配
的page了。此时,很显然so只被加载了一份,那么,当这么多程序在运行调用该so时,该so
中
的
全局
变量
的值会被覆盖来覆盖去么?在所有的UNIX平台上这是默认的行为(注意:实际定义i的 模块的点o文件,必须同时链接到
动态库
和主程序上,否则链接报错)。主程序存取动态链接库里的
全局
变量
。
动态库
中
的
全局
变量
与静态
变量
之前在linux下做过一个测试: 写一个so,该so
中
有一个
全局
变量
。so
中
的代码在运行时会修改该
全局
变量
的值。然后,有多个程序都需要该so,而且这些应用程序都启动了。此时,很显然so只被加载了一份,那么,当这么多程序在运行调用该so时,该so
中
的
全局
变量
的值会被覆盖来覆盖去么? 答案是不会。这是测试的答案。 现在知道原理了,尽管这是windows via C/C++
中
解释的windows的做法,...
malloc 内存
分配
位置
及进程内存布局
进程内存分布 典型的 Linux 进程内存分布图,图片来自这里: 这张图
中
有映射段的
位置
,但是还有一个重要的部分的缺失,就是运行时的参数和环境
变量
,在 Linux/Unix 系统编程手册这本书第 6 章讲进程的内存
分配
里有给: malloc 内存
分配
在映射段 当 malloc 申请
分配
的内存过大(128K以上),内部将使用 mmap 而不是 brk 来
分配
内存。 测试代码: printf("program break:%p\n", sbrk(0)); char* ptr[10];
Linux/Unix社区
23,223
社区成员
74,536
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章