我在Linux上写了main.c :
int main () )
{
while(1) }
() ) ) ) )。
编译并启动后,可以进行pmap。
# pmap 28578
28578:/a.out
0000000000400004 kr-x---/root/a.out
000000000int main ()
{
while(1) }
() ) ) ) )。
00 4K r---- /root/a.out
00000000006010004 krw---/root/a.out
00007 f87c 16 c 20001524 kr-x---/lib/libc-2.11.1.so
00007 f87c 183 f 0002044 k--/lib/libc-2.11.1.so
00007 f 87 C1 a3e 00016 kr--/lib/libc-2.11.1.so
00007 f 87 C1 a 420004 krw--/lib/libc-2.11.1.so
00007 f 87 c1a 4300020 krw---- [ anon ]
00007 f 87 C1 a 48000128 kr-x---/lib/LD-2.11.1.so
00007 f 87 c1c 5500012 krw---- [ anon ]
00007f87c1c65000 8K rw--- [ anon ]
00007 f 87 C1 c 670004 kr--/lib/LD-2.11.1.so
00007 f 87 C1 c 680004 krw--/lib/LD-2.11.1.so
00007f87c1c69000 4K rw--- [ anon ]
00007 fff 19b 8200084 krw---- [ stack ]
00007 fff 19b Fe 0008 kr-x---- [ anon ]
fffffffff 60000004 kr-x---- [ anon ]
总计3876 k
解决方法:
文本段是0x400000的映射。 标记为“r-x”表示它是只读的且可运行。0x600000的映射是只读的,因此几乎可以确定它是可执行文件的".rodata "部分。 GCC可能很有名,因为将c字符串文本放在只读部分.0x601000中的映射是“rw-”
您可以通过查找进程的PID并执行以下操作来获取更多信息: cat/proc/$ PID/maps我的Arch笔记本电脑提供了一些附加信息。 3.12因为核心正在运行,所以还有/proc/$PID/numa_maps,可以对其进行捕获
在可执行文件中执行的其他内容: nm和objdump -x。 前者可以了解内存映射的各种内容,因此可以看到0x4000000的部分和其他部分的内容。 在objdump -x中,ELF文件的标头在许多其他方面都是可见的,包括名称的一部分和是否在运行时映射。
要找到“什么在哪里”的书面说明,就必须进行类似谷歌的“elf文件内存布局”。 请注意,ELF文件格式可以支持比典型的内存布局更多的内存布局。 GCC、Gnu ld和glibc对如何布局可执行文件并在运行时将其映射到内存做了简单的假设。 有很多用于记录这个内容的网页。 但是,它仅适用于旧版本的Linux、旧版本的GCC或glibc或x86可执行文件。 否则,请获取readelf命令。 如果可以编写C程序,请创建自己的objdump -x或readelf版本,以了解可执行文件的工作方式及其内容。
标签: linux、memory、process、virtual-memory
资料来源: https://codeday.me/bug/2019 08 09/1628118.html