c - 如何解释此 PMAP 输出?

标签 c linux unix dynamic posix

我有一个 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/

相关文章:

c - 将数据分配给二维数组并显示 C

node.js - 如何将 Node.js 作为后台进程运行并且永不死亡?

c - 使用 rmmod (del_gendisk) 卸载时 Linux block 设备模块挂起

C++ Unix 多线程 "under the hood"会发生什么?

linux - 如何在文件中查找匹配项,然后为该匹配项添加后缀

linux - 在手册页中使用 <> 来指示可选的空格

c - 下溢如何导致上溢?

c - 从哪里可以获得这些头文件?

使用标准 C 库的 C SSL 实现

java - 无法写入 pty - linux