Com dois arquivos, um compilado e vinculado gcc
e o outro manualmente nasm
e ld
recebo
- Objeto compartilhado LSB de 32 bits ELF ...
- Executável LSB de 32 bits ELF ...
Qual é a diferença entre essas duas coisas? Eu posso ver com readelf -h
aquele é
- Modelo:
DYN (Shared object file)
- Modelo:
EXEC (Executable file)
Eu posso ver estes documentados na Wikipedia como ET_DYN
eET_EXEC
. Quais são as diferenças práticas entre esses dois?
Parece que isso tem algo a ver com o Executável Independente de Posição (PIE). Quando o GCC compila o executável por padrão, ele os torna PIE, o que altera o sinalizador de saída no cabeçalho ELF para
ET_DYN
.Você pode desabilitar a geração de executáveis PIE com
gcc -no-pie
Se você estiver vendo isso, verifique as opções padrão com as quais o gcc está configurado
gcc -v
, você deverá ver algo como--enable-default-pie
.Resposta inspirada por este envio no StackOverflow . Pretendo brincar mais com ele e explicar mais aqui.
Parece que o principal efeito de ET_EXEC vs ET_DYN no kernel Linux/carregador dinâmico é informar se o executável pode ser colocado em locais aleatórios de memória ou não com ASLR.
Como você concluiu, os executáveis do PIE são DYN, pois podem ser randomizados, exatamente como as bibliotecas compartilhadas.
Eu explorei isso com mais detalhes e: