【发布时间】:2009-04-26 20:31:54
【问题描述】:
我注意到(至少在 Win32 上)在可执行文件中,代码段 (.text) 设置了“读取”访问位以及“执行”访问位。代码本身阅读而不是执行本身是否有任何真正的正当理由?我认为这是其他部分的用途(例如 .rdata)。
(具体来说,我说的是IMAGE_SCN_MEM_READ。)
【问题讨论】:
标签: winapi memory executable portable-executable
我注意到(至少在 Win32 上)在可执行文件中,代码段 (.text) 设置了“读取”访问位以及“执行”访问位。代码本身阅读而不是执行本身是否有任何真正的正当理由?我认为这是其他部分的用途(例如 .rdata)。
(具体来说,我说的是IMAGE_SCN_MEM_READ。)
【问题讨论】:
标签: winapi memory executable portable-executable
IMAGE_SCN_MEM_EXECUTE |IMAGE_SCN_MEM_READ 映射到内存为PAGE_EXECUTE_READ,相当于 PAGE_EXECUTE_WRITECOPY。这是启用写时复制访问所必需的。写时复制意味着任何修改页面的尝试都会导致创建新的、进程私有的页面副本。
需要写拷贝有几个不同的原因:
【讨论】:
编译时常量,特别是对于 long long 或 double 值,通常使用 mov 寄存器,address 语句从代码段加载。
【讨论】:
我能想到的一个阅读代码的例子是允许自我修改代码。代码必须能够自我阅读才能进行自我修改。
还要考虑相反的一面。禁止代码读取自身有什么好处?我在这一点上挣扎了一会儿,但我看不出这样做有什么好处。
【讨论】: