.text 和 .data 之间的区别
difference between .text and .data
我想知道数据部分和文本部分在特定部分的整个代码方面有什么区别。
我正在尝试 运行 我在此处添加的代码。
在数据部分 运行s 并打印 "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:
预期代码会产生相同的结果,但事实证明并非如此。
difference between .text
and .data
我不知道 MASM 汇编器,但 GNU 汇编器有两个区别:
- 名称(在一种情况下为
.text
,在另一种情况下为.data
)。但是,此名称被操作系统忽略。
- 可执行文件中的段标志:
SHF_ALLOC | SHF_EXECINSTR
对于 .text
和
SHF_ALLOC | SHF_WRITE
对于 .data
"section flags" 告诉操作系统该部分中存在什么样的数据以及允许什么样的操作:
SHF_EXECINSTR
表示该段包含可以执行的代码。如果此标志未命中,如果该部分包含代码,程序将在大多数 OS 秒内崩溃。旧的 32 位 CPU 不支持这个,所以这个标志在 运行 32 位程序时被许多 OS 忽略。显然,你的 OS 忽略了这个标志;否则程序的 .data
变体会崩溃,因为代码位于 .data
部分。
SHF_WRITE
表示该段中的数据可以被覆盖。如果缺少此标志并且您正在尝试对该部分中的数据执行写操作,程序将崩溃。
当然可以通过 .text
部分设置 SHF_WRITE
标志的方式来操作可执行文件。 (并且一些汇编器允许直接为 .text
部分设置此标志。)在这种情况下,如果您写入 .text
部分,您的程序将不会崩溃。
我想知道数据部分和文本部分在特定部分的整个代码方面有什么区别。
我正在尝试 运行 我在此处添加的代码。 在数据部分 运行s 并打印 "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:
预期代码会产生相同的结果,但事实证明并非如此。
difference between
.text
and.data
我不知道 MASM 汇编器,但 GNU 汇编器有两个区别:
- 名称(在一种情况下为
.text
,在另一种情况下为.data
)。但是,此名称被操作系统忽略。 - 可执行文件中的段标志:
SHF_ALLOC | SHF_EXECINSTR
对于.text
和SHF_ALLOC | SHF_WRITE
对于.data
"section flags" 告诉操作系统该部分中存在什么样的数据以及允许什么样的操作:
SHF_EXECINSTR
表示该段包含可以执行的代码。如果此标志未命中,如果该部分包含代码,程序将在大多数 OS 秒内崩溃。旧的 32 位 CPU 不支持这个,所以这个标志在 运行 32 位程序时被许多 OS 忽略。显然,你的 OS 忽略了这个标志;否则程序的.data
变体会崩溃,因为代码位于.data
部分。SHF_WRITE
表示该段中的数据可以被覆盖。如果缺少此标志并且您正在尝试对该部分中的数据执行写操作,程序将崩溃。
当然可以通过 .text
部分设置 SHF_WRITE
标志的方式来操作可执行文件。 (并且一些汇编器允许直接为 .text
部分设置此标志。)在这种情况下,如果您写入 .text
部分,您的程序将不会崩溃。