社区
Linux/Unix社区
帖子详情
关于动态库的问题
lysliberty
2004-10-12 04:26:36
有哪位大侠知道如何获得动态库载入内存时的起始地址及大小??
动态库是保存在堆?栈?or 堆栈之间?
...全文
287
17
打赏
收藏
关于动态库的问题
有哪位大侠知道如何获得动态库载入内存时的起始地址及大小?? 动态库是保存在堆?栈?or 堆栈之间?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
17 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
CoolQ
2004-10-14
打赏
举报
回复
上边的maps包含的内容很多,不是几句话就能讲明白的。
CoolQ
2004-10-14
打赏
举报
回复
#cat /proc/1755/exec
lrwxrwxrwx 1 root root 0 Oct 13 22:52 exe -> /bin/bas
#cat /proc/1755/maps
00111000-0011b000 r-xp 00000000 08:02 79616 /lib/libnss_files-2.3.3.so
0011b000-0011c000 r--p 00009000 08:02 79616 /lib/libnss_files-2.3.3.so
0011c000-0011d000 rw-p 0000a000 08:02 79616 /lib/libnss_files-2.3.3.so
00908000-0091d000 r-xp 00000000 08:02 83601 /lib/ld-2.3.3.so
0091d000-0091e000 r--p 00014000 08:02 83601 /lib/ld-2.3.3.so
0091e000-0091f000 rw-p 00015000 08:02 83601 /lib/ld-2.3.3.so
00921000-00a36000 r-xp 00000000 08:02 83602 /lib/tls/libc-2.3.3.so
00a36000-00a38000 r--p 00115000 08:02 83602 /lib/tls/libc-2.3.3.so
00a38000-00a3a000 rw-p 00117000 08:02 83602 /lib/tls/libc-2.3.3.so
00a3a000-00a3c000 rw-p 00000000 00:00 0
00a3e000-00a40000 r-xp 00000000 08:02 83607 /lib/libdl-2.3.3.so
00a40000-00a41000 r--p 00001000 08:02 83607 /lib/libdl-2.3.3.so
00a41000-00a42000 rw-p 00002000 08:02 83607 /lib/libdl-2.3.3.so
00ac7000-00aca000 r-xp 00000000 08:02 83609 /lib/libtermcap.so.2.0.8
00aca000-00acb000 rw-p 00002000 08:02 83609 /lib/libtermcap.so.2.0.8
00d37000-00d38000 r-xp 00000000 00:00 0
08047000-080d2000 r-xp 00000000 08:02 284585 /bin/bash
080d2000-080d8000 rw-p 0008b000 08:02 284585 /bin/bash
080d8000-080dc000 rw-p 00000000 00:00 0
09eff000-09f20000 rw-p 00000000 00:00 0
f6e31000-f6e32000 rw-p 00000000 00:00 0
f6e33000-f6e34000 rw-p 00000000 00:00 0
f6e34000-f6e3a000 r--s 00000000 08:02 79853 /usr/lib/gconv/gconv-modules.cache
f6e3a000-f703a000 r--p 00000000 08:02 67181 /usr/lib/locale/locale-archive
f7044000-f7046000 rw-p fffff000 00:00 0
fee75000-ff000000 rw-p fff6f000 00:00 0
ffffd000-ffffe000 ---p 00000000 00:00 0
以上是Redhat FC2的结果,内核是2.6.5,Redhat自己打了4G/4G的内核补丁,还有为了防止ret-libc攻击打了动态链接的补丁。你要是真想深入研究,不该在这里问。有条件还是自己看源代码吧
lysliberty
2004-10-14
打赏
举报
回复
ok! 顶再!
lysliberty
2004-10-14
打赏
举报
回复
还有,如果在动态库分配内存,那这块内存应该在哪里分配?
lysliberty
2004-10-14
打赏
举报
回复
ding!
winux0
2004-10-13
打赏
举报
回复
用ldd可以看到动态连接库的加载情况
tkit
2004-10-13
打赏
举报
回复
动态库并不是在分配在堆上,只不过位置在堆的后面:
|用户程序|堆|动态库loader|动态库|栈
通常用户程序和动态库的起始地址是固定的,但是特定于实现,所以不用拘泥于具体的数值。
在linux中,一个进程的堆被定义为程序数据段开始data_start到data_start+limitation. 这个limitation可以通过“ulimit -d"来设置。当用户通过brk来扩大当前堆的时候,内核会检查这次扩大是否会破坏已经存在的vma,如果是,则会放弃这次操作。这个特性决定了堆最大就是动态库ld的起始-程序数据段的起始。看官不用担心,并不是说动态库以后的大片区域就不能被使用,通常程序会通过malloc来实现内存分配,glibc的malloc实现了几种策略,既可以从堆中获取,也可以通过mmap来映射进程地址空间任何一块区域(当然是栈顶以下,3G以内哈)。LD_PRELOAD不过是允许用户自己实现的库来替代标准的glibc的动态库,有种说法是叫interpolater。至于加载位置由库的加载顺序和loader来决定,随机的
lysliberty
2004-10-13
打赏
举报
回复
自己顶
lysliberty
2004-10-13
打赏
举报
回复
我的进程的maps如下:
08048000-0804b000 r-xp 00000000 03:07 528452 /home/myckpt/client
0804b000-0804c000 rw-p 00003000 03:07 528452 /home/myckpt/client
0804c000-0804d000 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 512361 /home/librocks.so.1.0.0
40024000-40026000 rw-p 0000d000 03:07 512361 /home/librocks.so.1.0.0
40026000-40040000 rw-p 00000000 00:00 0
从上面的maps来看,我同意tkit(熊熊520)的观点.
也就是说 程序内存的分布是|用户程序|堆|动态库loader|动态库|栈.
请问CoolQ()兄,你觉得问题在哪里?
CoolQ
2004-10-13
打赏
举报
回复
|用户程序|堆|动态库loader|动态库|栈?
这个有问题吧。
lysliberty
2004-10-12
打赏
举报
回复
to winux0(阿鱼木木): 这就是说动态库不是加载到代码段,而是在堆的上面, 对吧?
to CoolQ(): 老兄, 有什么函数可以直接得到某个动态库在内存中的起始地址?
难道只能通过读maps这个笨办法吗?
还有,LD_PRELOAD 对动态库的加载位置有什么影响?
呵呵,问题比较多,谢拉!
winux0
2004-10-12
打赏
举报
回复
写错了,程序都是从0x08048000开始运行
winux0
2004-10-12
打赏
举报
回复
所有的程序都是从0x0848000开始运行,而所用到的动态连接库都是从0x040000000开始加载
CoolQ
2004-10-12
打赏
举报
回复
cat /proc/$pid/maps
or refer to ld source code
lysliberty
2004-10-12
打赏
举报
回复
to pacman2000(pacman)(影子传说) :
这个我倒是知道,但是我用sbrk(0)看了一下我堆顶的地址,结果是0x804d000.
而在/proc/本进程id/maps中却发现动态库的加载起始地址是:0x40017000
这说明动态库是加载到堆的上面,也就是说动态库没有加载到text段中.
这是为什么?
pacman2000
2004-10-12
打赏
举报
回复
动态库是代码段。。。而且代码是多个程序公用的。
装载进去的起始地址不固定,因此编译动态库的时候要用-fPIC编译成位置无关的代码。
gordenfl
2004-10-12
打赏
举报
回复
动态链接库保存代码段里面的,当然是在栈里面的!
cygwin中
动态库
链接的
问题
在Cygwin环境下,遇到
动态库
libcommon.so链接
问题
。解决方案包括:1) 使用静态库libcommon.a;2) 将.so更改为.dll并确保$PATH包含
动态库
目录;3) 使用
动态库
全名,并同样调整$PATH。
动态库
连接依赖
问题
本文介绍了在编译过程中遇到的
动态库
依赖
问题
及其解决方案,包括调整编译命令顺序以正确包含系统库,以及使用-Wl,rpath参数确保可执行文件能找到所需的
动态库
。
Linux
动态库
依赖其它
动态库
的
问题
探讨了在使用GCC编译器时遇到的一个
问题
:即使插件加载器已链接ld库,但在链接应用程序时仍需显式链接同一库。文章深入解析了binutils 2.22版本之后的行为变化,解释了为何在某些情况下需要显式指定
动态库
依赖,并提供了解决方案。
linux
动态库
路径生效,Linux下如何解决
动态库
的链接
问题
本文探讨了在Linux环境下遇到的
动态库
链接
问题
,并提出了几种解决方案。包括通过环境变量LD_LIBRARY_PATH临时设置库路径,修改ld.so.conf文件永久添加路径,以及避免将
动态库
置于系统默认路径等做法。
linux 依赖
动态库
问题
本文介绍了一个在将Windows代码移植到Linux环境时遇到的
问题
:
动态库
加载失败及依赖库函数未定义。文章详细记录了创建、编译和链接
动态库
的过程,并提供了如何正确设置
动态库
路径的方法。
Linux/Unix社区
23,223
社区成员
74,536
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章