Zel*_*luX 5 c memory linker kernel dynamic-linking
要查看正在运行的程序包含哪些内存映射区域,我编写了一个简单的C程序来从/ proc/self/maps读取数据:
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
int main() {
char buf[1024];
int fd;
ssize_t n;
fd = open("/proc/self/maps", O_RDONLY);
if (fd < 0) {
perror("");
}
while ((n = read(fd, buf, 1000)) > 0) {
buf[n] = 0;
printf("%s", buf);
}
close(fd);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
程序的输出看起来像这样(标记):
1. 08048000-08049000 r-xp 00000000 08:01 2323014 /tmp/a.out
2. 08049000-0804a000 rw-p 00000000 08:01 2323014 /tmp/a.out
3. b7f69000-b7f6a000 rw-p b7f69000 00:00 0
4. b7f6a000-b80c6000 r-xp 00000000 08:01 1826975 /lib/tls/i686/cmov/libc-2.9.so
5. b80c6000-b80c7000 ---p 0015c000 08:01 1826975 /lib/tls/i686/cmov/libc-2.9.so
6. b80c7000-b80c9000 r--p 0015c000 08:01 1826975 /lib/tls/i686/cmov/libc-2.9.so
7. b80c9000-b80ca000 rw-p 0015e000 08:01 1826975 /lib/tls/i686/cmov/libc-2.9.so
8. b80ca000-b80cd000 rw-p b80ca000 00:00 0
9. b80dd000-b80df000 rw-p b80dd000 00:00 0
10.b80df000-b80e0000 r-xp b80df000 00:00 0 [vdso]
11.b80e0000-b80fc000 r-xp 00000000 08:01 1826830 /lib/ld-2.9.so
12.b80fc000-b80fd000 r--p 0001b000 08:01 1826830 /lib/ld-2.9.so
13.b80fd000-b80fe000 rw-p 0001c000 08:01 1826830 /lib/ld-2.9.so
14.bfee9000-bfefe000 rw-p bffeb000 00:00 0 [stack]
Run Code Online (Sandbox Code Playgroud)
正如我们可以从执行位和可写位推断的那样,前两行分别与程序的代码和数据段相关联.
但令我困惑的是libc.so,有从libc.so映射的区域.其中一个甚至只有私有位,它不能被写入,读取或执行.另一个有趣的事情是ld.so只有三个部分.与libc.so的段相比,缺少只有私有位的段.
所以我想知道这四个细分实际上是什么?我正在使用内核2.6.28,gcc 3.4.6和binutils 2.19的Ubuntu SMP.
的r-xp
,r--p
并且rw-p
映射只是需要不同的权限的区域.
神秘---p
映射是由ELF文件描述的部分的虚拟存储器偏移的结果,不一定匹配文件内的物理偏移(出于对齐原因可能存在填充).
即ELF文件本身可能如下所示:
| .... sections .... | .... more sections .... |
Run Code Online (Sandbox Code Playgroud)
...但是描述一个如下所示的内存布局:
| .... sections .... | gap | .... more sections .... |
Run Code Online (Sandbox Code Playgroud)
(你可以使用objdump -h
或看到这个readelf -e
.)
所以,一般原则是ld.so
需要为所有东西分配足够的内存:
| |
Run Code Online (Sandbox Code Playgroud)
...然后为第一部分制作一个映射:
| .... sections .... | |
Run Code Online (Sandbox Code Playgroud)
...然后进行第二次映射以将第二部分放在正确的位置:
| .... sections .... | | .... more sections .... |
Run Code Online (Sandbox Code Playgroud)
然后它保护虚拟地址空间中留下的"洞".这是你看到的神秘映射:
| .... sections .... |XXXXXXXXXXXXX| .... more sections .... |
Run Code Online (Sandbox Code Playgroud)
我相信这个洞是受保护的 - 而不是为了重复使用而被释放 - 以保持简单:它确保每个库只有一个虚拟地址范围,属于它而不属于其他人.
归档时间: |
|
查看次数: |
525 次 |
最近记录: |