【问题标题】:difference between .text and .data.text 和 .data 之间的区别
【发布时间】:2019-06-21 19:14:32
【问题描述】:

我想知道数据部分和文本部分在特定部分的整个代码方面有什么区别。

我试图运行我在此处添加的代码。 在数据部分中,它运行并打印“af)a” 如果我将其更改为第 2 行中的文本部分,则会出现段错误。

我无法弄清楚关键的区别是什么。 谢谢:)

global _start
section .data

_start: mov ecx, 3
    xor byte [_start + 1], 0x02
    pushad  
    mov eax, 4
    mov ebx, 1
    mov edx, ecx
    mov ecx, dword blah
    int 0x80
blah:   popad
    sub bx, ax
    loop _start
    mov eax, 1
    mov ebx, 2
    int 0x80
fin:

预期的代码会产生相同的结果,但事实证明并非如此。

【问题讨论】:

  • 文本段可执行但不可写,数据段可写但不可执行。某些操作系统无法强制执行“不执行”规则。
  • .text 通常是只读的、可执行的。 .data 是读写的,不应该是可执行的,尽管有时(如你的情况)它是可执行的。请注意,这些只是内置的默认属性。另请参阅 nasm 手册中的 7.9.2 elf Extensions to the SECTION Directive
  • 您的代码似乎过于复杂。您使用慢速 loop 指令,但在循环内将循环计数器重置为 3。并且您无缘无故地使用pushad/popad 保存/恢复所有寄存器。只需使用jmp _start 而不是loop。或者,如果您想要一个非无限循环,请为计数器使用不同的寄存器。
  • 要是我有发言权就好了..这是我教授的怪脑袋哈哈

标签: assembly x86 nasm


【解决方案1】:

.text.data 之间的区别

我不了解 MASM 汇编器,但 GNU 汇编器有两个不同之处:

  1. 名称(在一种情况下为.text,在另一种情况下为.data)。但是,此名称被操作系统忽略
  2. 可执行文件中的部分标志:
    • SHF_ALLOC | SHF_EXECINSTR 代表 .text
    • SHF_ALLOC | SHF_WRITE.data

“节标志”告诉操作系统该节中存在哪些类型的数据以及允许哪些类型的操作:

  • SHF_EXECINSTR 表示该部分包含可以执行的代码。如果此标志丢失,如果该部分包含代码,则程序将在大多数操作系统中崩溃。较旧的 32 位 CPU 不支持此标志,因此许多操作系统在运行 32 位程序时会忽略此标志。显然,您的操作系统会忽略此标志;否则你的程序的.data 变体会崩溃,因为代码位于.data 部分。

  • SHF_WRITE 表示节中的数据可以被覆盖。如果缺少此标志,并且您尝试对该节中的数据执行写操作,则程序将崩溃。

当然,可以通过.text 部分设置SHF_WRITE 标志的方式来操作可执行文件。 (并且一些汇编程序允许直接为.text 部分设置此标志。)在这种情况下,如果您写入.text 部分,您的程序不会崩溃。

【讨论】:

  • 您可以通过与gcc -zexecstack 链接获得可执行的.data(以及堆栈和BSS)。 ld 手册页文档ld -N(又名ld --omagic)赋予文本段读+写权限。 (.text 部分链接到可执行文件的文本段)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-31
  • 2016-02-13
  • 1970-01-01
  • 2016-09-17
  • 2014-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多