老男人在这里说
-n --nmagic 关闭节的页面对齐,并将输出标记为“NMAGIC”(如果可能)。-N --omagic 将文本和数据部分设置为可读可写。另外,不要对数据段进行页面对齐,并禁用对共享库的链接。如果输出格式支持 Unix 风格幻数,请将输出标记为“OMAGIC”。注意:虽然 PE-COFF 目标允许有可写文本部分,但它不符合 Microsoft 发布的格式规范。--no-omagic 该选项取消了 -N 选项的大部分效果。它将文本段设置为只读,并强制数据段页对齐。注意 - 此选项不启用对共享库的链接。为此,请使用 -Bdynamic。
我确实明白这些选项用于使代码(.text)部分可写或不可写,但我不明白对齐或不对齐这些部分的意义,以及什么是“NMAGIC”部分
小智 7
在历史上的 (PDP-11) Unix 上,可执行文件的标头以分支指令开始,该指令将跳过标头,到达代码的实际开头。当 Unix 被移植到其他处理器时,最初的 PDP-11 分支指令变成了 a.out(5) 文件格式的“魔数”。当“纯文本”被引入时,最初是为了允许进程共享它们的代码段,引入了一个新的幻数,以便内核能够区分差异(有一些重要的 Unix 程序依赖于自我修改代码,因此需要加载可写代码段)。旧的魔法数字(0407)被命名为“OMAGIC”——“旧魔法”——而新的魔法数字(0410)被命名为“NMAGIC”,“新魔法”。数据段紧跟在内存中的代码段之后,因此当代码段设为只读时,必须将其填充到页边界。
此后各种操作系统和文件格式引入了其他幻数;在最后一个使用 a.out 格式的 FreeBSD 版本中,普通格式是 ZMAGIC 和 QMAGIC,引入这些格式是为了安全起见,允许取消映射地址空间中的第 0 页(这样空指针取消引用就会出错),同时仍然允许可执行文件进行按需分页(即 mmap() 到进程的地址空间中)。
因此,更直接地回答您的问题:NMAGIC 和 OMAGIC 是可执行文件的不同格式,而不是各个部分的格式。它们指示可执行文件的内存中布局和磁盘布局之间所需的对应关系。(这些数字传统上以八进制而不是十六进制或十进制书写的原因是八进制是 PDP-11 上指令格式的自然表示形式。)GNU ld 使用这些名称(仅)作为对具有类似功能的可执行格式的引用,即使您没有生成传统的 a.out 格式——这当然在今天相当罕见。使用 OMAGIC 格式的一个特别好处是它比任何其他格式都更紧凑,这在空间有限、没有需求分页且没有任何填充空间的引导加载程序等情况下可能很重要。
| 归档时间: |
|
| 查看次数: |
1722 次 |
| 最近记录: |