Chinaunix

标题: libc的加载地址随机的问题 [打印本页]

作者: wojiaohesen    时间: 2009-07-11 16:01
标题: libc的加载地址随机的问题
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
作者: snail_314    时间: 2009-07-13 10:32
应该不光libc,所有动态链接库在进程地址空间中加载的地址都是“随机”的。或者说是编译期无法知道的(编译链接完后无法把确切地址写在elf文件里,最多写个hint),只有运行期(加载时)才知道。动态链接库的relocation机制就是专门解决这个问题的,你可以看相光理论知识,比如《linkers and loaders》,这个和具体平台无关,只是具体实现方式可能和平台有关
作者: accessory    时间: 2009-07-13 12:24
和平台还是有点关系的. 在WINDOWS上面的话,每个DLL都有个默认的加载地址,如果这段地址没没人占用的话,那么DLL会优先加载到这个默认地址. 比如在我的XP机器上, MSVCRT.DLL 这个DLL在很多进程下面(如果不是所有的话)的加载地址都是0X77C3000.
当然,如果这个默认地址没其他DLL占用的话,那么就会发生RELOCATION了.
我觉得LZ的结果是比较奇怪. 如果有些LIB的加载地址一样,有些不一样,那么似乎比较正常. 但是如果 每个都不一样,就有点奇怪了.

PS: 现在正在看LINKERS AND LOADERS这本书,目前还没找到合理的解释.




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2