Почему сегменты данных и стека являются исполняемыми?

Я только что заметил, что в моей простой программе есть исполняемые сегменты данных и стека. Я видел это в / 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, имеют неисполняемые данные, стек и кучу, так почему же программы, написанные на ассемблере, ведут себя по-другому?

17
задан witosx 22 October 2011 в 23:04
поделиться