linux – 为什么ELF部分之间没有未使用的空白空间?
您可以在https://sourceware.org/binutils/docs/ld/Builtin-Functions.html查阅GNU ld链接器脚本内置函数的文档.但要注意DATA_SEGMENT_ALIGN文档不正确,正如Stephen Kell在binutils bug #19203: “DATA_SEGMENT_ALIGN documentation is not consistent with behaviour”报道的那样,显然是因为Jakub Jelinek的[PATCH] Fix DATA_SEGMENT_ALIGN.DATA_SEGMENT_ALIGN本身是在binutils的邮件列表线程中引入的[RFC PATCH] Smarter aligning of data segment. 不知何故,以下内容: . = ALIGN (CONSTANT (MAXPAGESIZE)) - ((CONSTANT (MAXPAGESIZE) - .) & (CONSTANT (MAXPAGESIZE) - 1)); . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE),CONSTANT (COMMONPAGESIZE)); 导致1页跳转,在您的示例中将您从0x0804856c移动到0x0804956c. 当使用链接器选项-z relro时,请求在加载时修复的重定位被标记为只读,DATA_SEGMENT_RELRO_END会使先前的DATA_SEGMENT_ALIGN添加足够的填充,以使DATA_SEGMENT_RELRO_END的两个参数的总和与新页面对齐. 因此,假设.got.plt至少有三个指针,前三个指针(由加载器立即使用)将位于第二个区域,其余的.got.plt位于第三个区域. DATA_SEGMENT_ALIGN添加的填充将您从0x0804956c移动到0x08049f08.如果在发生修复后发送的所有可以被保护的内容都是只读的,那么在新页面中,您将保持在0x0804a000,这将保持读写. (编辑:PHP编程网 - 黄冈站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |