免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1564 | 回复: 2
打印 上一主题 下一主题

libc的加载地址随机的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-11 16:01 |只看该作者 |倒序浏览
question:
          被加载的libc的可执行段的地址为什么是随机的?
          这种随机是何时以及如何产生的??
thanks

$ cat address_random.sh
#! /usr/bin/env bash

while [ 1 ]
do
    sleep 3 &
    #print address of libc text segment.
    pmap $(pidof sleep | awk '{print $1}') | \
    awk '($3 == "r-x--") && ($4 ~ /\/libc-.*\.so$/) {print $1; exit}'
    wait %1

$ uname -a
Linux hesen 2.6.28-11-generic #42-Ubuntu SMP Fri Apr 17 01:58:03 UTC
2009 x86_64 GNU/Linux

$ ./address_random.sh  #random address
00007f10843ae000
00007f16dd467000
00007f056d011000

论坛徽章:
0
2 [报告]
发表于 2009-07-13 10:32 |只看该作者
应该不光libc,所有动态链接库在进程地址空间中加载的地址都是“随机”的。或者说是编译期无法知道的(编译链接完后无法把确切地址写在elf文件里,最多写个hint),只有运行期(加载时)才知道。动态链接库的relocation机制就是专门解决这个问题的,你可以看相光理论知识,比如《linkers and loaders》,这个和具体平台无关,只是具体实现方式可能和平台有关

论坛徽章:
0
3 [报告]
发表于 2009-07-13 12:24 |只看该作者
和平台还是有点关系的. 在WINDOWS上面的话,每个DLL都有个默认的加载地址,如果这段地址没没人占用的话,那么DLL会优先加载到这个默认地址. 比如在我的XP机器上, MSVCRT.DLL 这个DLL在很多进程下面(如果不是所有的话)的加载地址都是0X77C3000.
当然,如果这个默认地址没其他DLL占用的话,那么就会发生RELOCATION了.
我觉得LZ的结果是比较奇怪. 如果有些LIB的加载地址一样,有些不一样,那么似乎比较正常. 但是如果 每个都不一样,就有点奇怪了.

PS: 现在正在看LINKERS AND LOADERS这本书,目前还没找到合理的解释.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP