Я только что заметил, что моя простая программа имеет исполняемые сегменты данных и сегментов стека.
Я видел это в / proc / [pid] / maps, и простой код подтвердил это.
Например:
; prog.asm
section .data
code: db 0xCC ;int3
section .text
global _start
_start:
jmp code
mov rax, 60 ; sys_exit
mov rdi, 0
syscall
тогда
nasm -f elf64 prog.asm
ld -o prog prog.o
./prog
заставляет прогу выполнить инструкцию int3.
Программы, написанные на C и построенные с помощью gcc, имеют свои данные, стек и кучу неисполняемыми, так почему программы, написанные на ассемблере, ведут себя по-разному?