社区
Linux/Unix社区
帖子详情
动态库中的变量(全局和自动变量)在什么地方存储,内存在什么位置分配?
lysliberty
2004-10-15 08:48:48
一般来说,动态库是从0x40000000位置开始加载,动态库也有自己的text, data 和bss段, 我的问题就是
(1)动态库中的全局变量的存储位置是在进程的data段还是动态库自己的data段? 自动变量的情况又如何?
(2)如果在动态库中分配内存,那应该在什么位置分配?
...全文
490
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段里。分配的内存是在统一的堆里的。
C语言
中
全局
变量
存放在哪个
位置
?
全局
变量
存放在静态
存储
区,
位置
是固定的。 局部
变量
在栈空间,栈地址是不固定的。 栈:就是那些由编译器在需要的时候
分配
,在不需要的时候
自动
清楚的
变量
的
存储
区。里面的
变量
通常是局部
变量
、函数参数等。 堆:就是那些由new
分配
的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会
自动
回收。 自由
存储
区:就是那些由malloc等
分配
的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
全局
存储
区(静态
存储
区
论
动态库
中
的
全局
变量
和各种锁以及信号量是否是进程独立或者共享
动态库
中
的
全局
变量
测试 新建一个
动态库
,代码如下 #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("==
动态库
中
的
全局
变量
和各种锁以及信号量是否是进程独立或者共享
也就是说,想要在so内实现一个不可重入的函数还是比较困难的,因为所有
变量
都是独立的,但是考虑如下场景:驱动层给了一个视频码流录制的接口,并且没有在驱动层做互斥,但实际上这个接口同一时间只可能被一个进程调用,那么很明显,串接到so
中
的接口必须实现该接口的原子调用。在应用程序编译的时候,不同的应用程序引用同一个库,那么
动态库
的代码是共享的。因为数据是独立的,代码是共享的。有了以上两个函数,其实就可以写一个so被加载时
自动
执行的初始化函数,这样可以保证so的使用者不必关心内存、锁的创建、销毁和使用。
静态库和
动态库
里的
全局
变量
(或类的静态成员
变量
)共享和独立的问题
本文将要讨论的内容实际上包含2个问题: 1. 工程
中
包含静态库A,
动态库
B,可执行程序C。C依赖于A和B,而B依赖于A。在A
中
定义有
全局
变量
X(或类的静态成员
变量
),则在
动态库
B
中
访问的X,与可执行程序C
中
访问的X是同一个
变量
还是两个不同的
变量
? 答案:是两个不同的
变量
。 测试代码如下: //A
中
定义
变量
g_nValue(A.cpp): int g_nValue = 0;
静or
动态库
中
的
全局
变量
被不同的dll调用修改,其值是否独立
今天做了一个C++程序实验,以确认一下静态库和
动态库
中
的
全局
变量
被不同的dll调用时,其值是各自独立的还是共享的? 结果显示: 一个静态库
中
的
全局
变量
被同一个进程的不同的dll调用时,每一个dll对这些
全局
变量
都各自有一份独立的
存储
空间,即使这些dll处于同一个线程。因为是静态库,在编译每一个独立的dll时,就已经为每个dll
分配
了静态库
中
全局
变量
的
存储
空间,所以在一个dll
中
Linux/Unix社区
23,124
社区成员
74,508
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章