Por que o VMA da pilha deve ser executável?

2

Atualmente estou lendo Linux Kernel Development de Robert Love.

No capítulo "15 O espaço de endereço do processo", ele imprime o mapa de memória de um processo.

user@machine:~$ pmap 1424
#all the processes mapped memory (skipped for readability)
bfffe000 (8KB)        rwxp (0:00 0)         [ stack ]

A última linha mostra a pilha (conforme ela cresce).
Ele agora afirma:

The stack is, naturally, readable, writeable and executable - not of much use otherwise.

Até onde eu sei, usamos a pilha para endereços de dados e códigos (funções e seus parâmetros / variáveis).

Eu não entendo porque a pilha deve ser executável?

    
por Altoyr 23.02.2017 / 11:39

1 resposta

5

Essa informação está desatualizada e a pilha normalmente não é mais executável:

00007ffd884fa000    356K rw---   [ stack ]

O GCC precisa de uma pilha executável se gerar blocos de trampolins para chamadas de função aninhadas . Esses trampolins são pequenos pedaços de código gerados em tempo de execução e armazenados na pilha - portanto, se forem usados, a pilha precisa ser executável. O compilador controla esse requisito e gera um sinalizador em binários (bibliotecas e executáveis) para indicar se precisam de uma pilha executável. Você pode ver e manipular o valor desse sinalizador usando execstack(8) .

    
por 23.02.2017 / 11:57