2

我注意到(至少在 Win32 上)在可执行文件中,代码段(.text)设置了“读取”访问位以及“执行”访问位。代码读取自身而不是执行自身是否有任何真正的正当理由?我认为这是其他部分的用途(例如 .rdata)。

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

4

3 回答 3

5

IMAGE_SCN_MEM_EXECUTE |IMAGE_SCN_MEM_READ映射到内存中PAGE_EXECUTE_READ,相当于 PAGE_EXECUTE_WRITECOPY。这是启用写时复制访问所必需的。Copy-on-write 意味着任何修改页面的尝试都会导致创建一个新的、进程私有的页面副本。

需要 write-copy 有几个不同的原因:

  • 需要由加载程序重新定位的代码必须具有此设置,以便加载程序可以进行修复。这是很常见的。
  • 在单个部分中包含代码和数据的部分也需要这样做,以启用修改进程全局变量。单个部分中的代码和数据可以节省空间,并可能通过将代码和代码使用的全局变量放在同一页面上来提高局部性。
  • 试图修改自身的代码。我相信这是相当罕见的。
于 2009-04-26T20:35:25.397 回答
1

编译时常量,特别是对于 long long 或 double 值,通常使用 mov 寄存器加载,地址语句来自代码段。

于 2009-04-26T20:53:49.813 回答
0

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

还要考虑对面。禁止代码读取自身有什么好处?我在这一点上挣扎了一会儿,但我看不出这样做有什么好处。

于 2009-04-26T20:43:08.280 回答