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