【问题标题】:How can I find the mapped file when it's not shown in proc maps?当 proc 映射中未显示映射文件时,如何找到它?
【发布时间】:2015-10-09 08:26:38
【问题描述】:

我试图gdb一个函数,它是callstack,调用的函数落入地址a4734000-a4e93000,所以我检查了/proc//maps文件,发现有:

a4734000-a4e93000 r-xp 00000000 00:00 0 
a4ee0000-a527c000 r-xp 00000000 00:00 0

这对我来说没有意义,因为通常它会显示为可执行地址映射的目标二进制文件。有谁知道这是某种技巧吗?非常感谢。

【问题讨论】:

    标签: linux memory-management process executable


    【解决方案1】:

    权限字段r-xp 包含p,因此这些映射是私有的。路径字段为空,因此这些映射是匿名的。

    因此,这些是私有匿名映射,使用 MAP_ANONMAP_PRIVATE 标志创建。它们可能是由malloc(3)创建的:

    当分配大于 MMAP_THRESHOLD 字节的内存块时,glibc malloc() 实现使用 mmap(2) 将内存分配为私有匿名映射。

    另见this问题和documentation

    【讨论】:

    • 感谢@g-v,很好的回答。但是我还是不明白为什么malloc创建的内存会有“x”权限??
    • 参见pubs.opengroup.org/onlinepubs/009695399/functions/mmap.html 和例如man7.org/linux/man-pages/man2/mprotect.2.html。 POSIX:“实现可能允许除 prot 指定的访问之外的访问”。 Linux:“PROT_EXEC 是否有任何不同于 PROT_READ 的效果取决于处理器架构、内核版本和进程状态”。换句话说,这是您的硬件(它可能不支持页面的单独 PROT_EXEC 标志)或软件的限制。
    猜你喜欢
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 2016-10-02
    相关资源
    最近更新 更多