我有一个 cat++程序,我正在运行以下命令来检查在加载实现转换的任何一个库时向进程添加了多少内存段。
(echo "hello world"; sleep 100) | ./cat++ -l ./librot13.so -l ./libupper.so -l ./librot13.so & pmap $!
我得到以下输出,但我无法解释它。 正在加载多少内存段?当同一个库在我的命令中被调用两次时会发生什么?是否有我应该运行的替代 pmap 命令?
3847: ./cat++ -l ./librot13.so -l ./libupper.so -l ./librot13.so
000055ec84326000 8K r-x-- cat++
000055ec84527000 4K r---- cat++
000055ec84528000 4K rw--- cat++
000055ec84ef3000 132K rw--- [ anon ]
00007f07540d6000 4K r-x-- libupper.so
00007f07540d7000 2044K ----- libupper.so
00007f07542d6000 4K r---- libupper.so
00007f07542d7000 4K rw--- libupper.so
00007f07542d8000 4K r-x-- librot13.so
继续...
最佳答案
当创建内存段时,它们会被赋予权限 - 读、写和执行 - 或 rwx
简写。在您看到的输出中,给出了一个段的虚拟内存地址,以及该段的大小、该段的权限以及用于填充该段的文件的名称(如果可用)。这些是类似 mmap
命令的非常标准的结果,加载程序通常在幕后使用它来帮助加载库。这就是解释输出格式的方法。
正在加载多少内存段?
您包含的每个文件似乎都有一个 read
/execute
部分(对于 .text
等代码部分很常见),一个readonly
部分(常见于只读部分,例如 .rodata
),以及一个 read
/write
部分(常见于全局数据部分,如 .data
。出于通常与安全性和标准化相关的原因,文件的这些部分被加载到具有不同权限的段中。例如,您通常不希望您的指令程序是可写的(否则任意内存写入漏洞将允许攻击者在您的地址空间中编写他们自己的指令)。
当同一个库在我的命令中被调用两次时会发生什么? 长话短说,不必担心为单个文件创建多个段。该文件未被加载多次。相反,文件的某些部分是根据其权限加载的。这是因为我上面提到的所有功能。
如果您想更多地了解 ELF 文件格式并了解加载器如何知道如何创建内存段,请尝试在您的 cat++
程序中使用 readelf
实用程序.程序标题将向您显示段数、每个段中的部分以及每个段的权限(以及更多)。尝试 readelf -l cat++
并亲眼看看。
关于c - 如何解释此 PMAP 输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58670654/