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