¿Por qué los datos y los segmentos de pila son ejecutables?

Acabo de notar que mi programa simple tiene sus datos y segmentos de pila ejecutables. Lo vi en / proc / [pid] / maps, y un código simple lo confirmó.

Por ejemplo

; prog.asm
section .data
    code:   db 0xCC    ;int3

section .text
global _start
_start:
    jmp    code

    mov    rax, 60    ; sys_exit
    mov    rdi, 0
    syscall

lueg

nasm -f elf64 prog.asm
ld -o prog prog.o
./prog

hace que prog ejecute la instrucción int3.

Los programas escritos en C y construidos con gcc tienen sus datos, pila y montón no ejecutables, entonces, ¿por qué los escritos en el ensamblaje se comportan de manera diferente?

Respuestas a la pregunta(1)

Su respuesta a la pregunta