代码之家  ›  专栏  ›  技术社区  ›  zildjohn01

标记为“执行”和“读取”的可执行节?

  •  2
  • zildjohn01  · 技术社区  · 17 年前

    我注意到(至少在win32上)在可执行文件中,代码节(.text)设置了“读取”访问位,以及“执行”访问位。有没有什么正当的理由 阅读 而不是 执行 本身?我以为这就是其他部分的目的(如.rdata)。

    (具体来说,我指的是 IMAGE_SCN_MEM_READ )

    3 回复  |  直到 12 年前
        1
  •  5
  •   Michael    17 年前

    IMAGE_SCN_MEM_EXECUTE |IMAGE_SCN_MEM_READ 作为映射到内存中 PAGE_EXECUTE_READ ,相当于页面“执行”或“写入副本”。这是启用写时复制访问所必需的。copy-on-write意味着任何修改页面的尝试都会导致创建新的、处理私有的页面副本。

    有几个不同的原因需要写副本:

    • 需要由加载程序重新定位的代码必须具有此设置,以便加载程序可以进行修复。这很常见。
    • 在单个部分中包含代码和数据的部分也需要这样做,以便能够修改流程全局参数。单个部分中的代码和数据可以节省空间,并可能通过将代码和代码使用的全局数据放在同一页上来改进位置。
    • 试图修改自身的代码。我相信这是相当罕见的。
        2
  •  1
  •   Joshua    17 年前

    编译时常量,特别是对于长的、长的或双的值,通常使用MOV寄存器加载, 地址 来自代码段的语句。

        3
  •  0
  •   JaredPar    17 年前

    我能想到的一个阅读代码的原因是允许自我修改代码。代码必须能够读取自己才能进行自我修改。

    还要考虑另一面。不允许代码从读取本身中得到什么好处?我在这个问题上挣扎了一会儿,但我看不出这样做有什么好处。