0

据我了解,ELF 标头用于程序执行视图。部分用于链接器的视图。

但是linux命令'readelf'显示每个部分(AWX)和每个标题(RWE)都有内存访问权限标志。

这本书说的不止一个部分被合并到一个标题中。如果链接器将多个部分合并到单个标题中并且每个部分具有不同的访问权限标志会发生什么?

以及 /proc/[pid]/maps 中的访问权限之间的关系是什么,例如

root@declspec-desktop:/tmp# cat /proc/1951/maps
004a5000-005f8000 r-xp 00000000 08:01 511     /lib/tls/i686/cmov/libc-2.11.1.so
005f8000-005fa000 r--p 00153000 08:01 511     /lib/tls/i686/cmov/libc-2.11.1.so
005fa000-005fb000 rw-p 00155000 08:01 511     /lib/tls/i686/cmov/libc-2.11.1.so

和部分和标题中的访问权限?

这些权限(in /proc/[pid]/maps)是如何确定的?

4

2 回答 2

0

根据我对上面示例的理解,/proc//maps 中的权限是与不同部分关联的权限。例如,在上面的代码片段中,具有权限的条目 - 'r-xp' 给出了 .text 段的地址(代码所在的位置)。因此,如果您检查,它不包含 'w' 权限,因为我们不应该在正在执行的二进制文件中编写新代码。所以,在你上面的例子中 -

004a5000-005f8000 r-xp 00000000 08:01 511     /lib/tls/i686/cmov/libc-2.11.1.so - TEXT AREA which contains executable code

005f8000-005fa000 r--p 00153000 08:01 511     /lib/tls/i686/cmov/libc-2.11.1.so - Area that contains read only variables or constants (.rodata data)

005fa000-005fb000 rw-p 00155000 08:01 511     /lib/tls/i686/cmov/libc-2.11.1.so - Area where we have variables used by program i.e. (.data)

抱歉,我无法关注您的其他问题。你能详细说明一下吗?另外,你说的是哪本书?

于 2012-08-17T01:25:39.597 回答
0

我的理解是程序头(或段)包含按位或合并到其中的部分的权限。因此,在您的示例中,如果 RW- 部分与 R- 部分合并为一个部分,则最终将成为 RW-。为避免这种情况,您将安排将它们放在独特的部分中。

如果你有一个“.hello”部分(这确实是可能的!)那么它在内存映射中的条目取决于哪个段包含它。权限至少与部分一样严格,但如果在同一段中还有其他部分具有额外权限,则可能会更宽松。

但对我来说 - 不清楚为什么有人在谈论“部分”如何以“可执行文件”结尾。正如 OP 所提到的,部分用于链接,段用于加载。有一个没有部分的 ELF 并且仍然可以正常加载和运行是很好的。/proc/map 行对应段表

于 2012-11-21T17:27:04.180 回答