测试是在32位Linux上进行的
代码如下:
int foo(int a, int b)
{
int c = a + b;
return c;
}
int main()
{
int e = 0;
int d = foo(1, 2);
printf("%d\n", d);
scanf("%d", &e);
return 0;
}
当我使用cat / proc / pid / maps查看内存布局时,似乎我可以看到三个 我的代码和库的文字段。
ubuntu% cat /proc/2191/maps
08048000-08049000 r-xp 00000000 08:01 1467306 /home/shuai/work/asm/test1
08049000-0804a000 r--p 00000000 08:01 1467306 /home/shuai/work/asm/test1
0804a000-0804b000 rw-p 00001000 08:01 1467306 /home/shuai/work/asm/test1
09137000-09158000 rw-p 00000000 00:00 0 [heap]
b75c6000-b75c7000 rw-p 00000000 00:00 0
b75c7000-b776b000 r-xp 00000000 08:01 3149924 /lib/i386-linux-gnu/libc-2.15.so
b776b000-b776d000 r--p 001a4000 08:01 3149924 /lib/i386-linux-gnu/libc-2.15.so
b776d000-b776e000 rw-p 001a6000 08:01 3149924 /lib/i386-linux-gnu/libc-2.15.so
b776e000-b7771000 rw-p 00000000 00:00 0
b7780000-b7784000 rw-p 00000000 00:00 0
b7784000-b7785000 r-xp 00000000 00:00 0 [vdso]
b7785000-b77a5000 r-xp 00000000 08:01 3149914 /lib/i386-linux-gnu/ld-2.15.so
b77a5000-b77a6000 r--p 0001f000 08:01 3149914 /lib/i386-linux-gnu/ld-2.15.so
b77a6000-b77a7000 rw-p 00020000 08:01 3149914 /lib/i386-linux-gnu/ld-2.15.so
bfd47000-bfd68000 rw-p 00000000 00:00 0 [stack]
有人可以给我一些关于这个问题的指导吗?非常感谢你!
答案 0 :(得分:2)
请注意,每个文件的三个部分具有不同的权限:只读,读写和读执行。这是为了安全:代码部分(读 - 执行)无法通过漏洞利用写入,并且可以执行的部分无法执行。
答案 1 :(得分:2)
请注意第3列(起始偏移)和第2列(权限)中的值。实际上,您在二进制文件的第1行和第2行中映射了两次相同的部分,但是,在第3行中,它是不同的。允许多次分别映射同一个文件;不同的系统可以跳过将其合并到一个VM映射条目中,因此它可以反映映射历史,但不能反映当前的状态jist。
如果您在库映射中看到,您可以轻松找到任何库分别映射的规律:
具有相同的起始4K二进制文件区域映射两次可以用RTLD逻辑来解释,该逻辑由于引导需要而不同于任意库逻辑。我并不认为它如此重要,因此它可能很容易在平台细节上有所不同。