linux pmap was java,linux – pmap输出的含义

我在Linux中编写了main.c:

int main()

{

while (1){}

}

当我编译并启动它时,我可以对它进行pmap:

# pmap 28578

28578: ./a.out

0000000000400000 4K r-x-- /root/a.out

000000000int main()

{

while (1){}

}

00 4K r---- /root/a.out

0000000000601000 4K rw--- /root/a.out

00007f87c16c2000 1524K r-x-- /lib/libc-2.11.1.so

00007f87c183f000 2044K ----- /lib/libc-2.11.1.so

00007f87c1a3e000 16K r---- /lib/libc-2.11.1.so

00007f87c1a42000 4K rw--- /lib/libc-2.11.1.so

00007f87c1a43000 20K rw--- [ anon ]

00007f87c1a48000 128K r-x-- /lib/ld-2.11.1.so

00007f87c1c55000 12K rw--- [ anon ]

00007f87c1c65000 8K rw--- [ anon ]

00007f87c1c67000 4K r---- /lib/ld-2.11.1.so

00007f87c1c68000 4K rw--- /lib/ld-2.11.1.so

00007f87c1c69000 4K rw--- [ anon ]

00007fff19b82000 84K rw--- [ stack ]

00007fff19bfe000 8K r-x-- [ anon ]

ffffffffff600000 4K r-x-- [ anon ]

total 3876K

解决方法:

文本段是0x400000处的映射 – 它标记为’r-x’表示可读和可执行. 0x600000处的映射是只读的,因此几乎可以肯定是可执行文件的“.rodata”部分. GCC将C字符串文字放入只读部分. 0x601000处的映射是’rw-‘,因此可能是着名的堆.你可以让你的可执行文件malloc()1024字节并打印出地址,以确定.

您可以通过查找进程的PID并执行以下操作获得更多信息:cat / proc / $PID / maps – 在我的Arch笔记本电脑上,它提供了一些额外的信息.它正在运行一个3.12内核,所以它也有/ proc / $PID / numa_maps,并且捕获它也可能提供一个小的洞察力.

在可执行文件上运行的其他内容:nm和objdump -x.前者可以让您了解内存映射中的各种内容,因此您可以看到0x4000000部分与其他部分的内容. objdump -x在很多其他事情中显示ELF文件头,因此您可以看到所有部分,包括部分名称以及它们是否在运行时映射.

至于找到“什么在哪里”的书面解释,你将不得不做像谷歌这样的“ELF FILE内存布局”.请注意,ELF文件格式可以支持比常用内存布局更多的内存布局. GCC和Gnu ld和glibc都做了关于如何布局可执行文件然后在运行时映射到内存的简化假设.存在许多旨在记录此内容的网页,但仅适用于旧版本的Linux,旧版本的GCC或glibc,或仅适用于x86可执行文件.如果没有,请获取readelf命令.如果您可以编写C程序,请创建自己的objdump -x或readelf版本,以熟悉可执行文件的工作方式以及它们中的内容.

标签:linux,memory,process,virtual-memory

来源: https://codeday.me/bug/20190809/1628118.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值