alocar endereço zero no Linux com mmap falha
Sep 08 2020
Estou escrevendo um carregador de programa estático para Linux, lendo cabeçalhos de programa ELF e mapeando os segmentos para a memória.
Encontrei um executável que assume que o endereço virtual de seu primeiro segmento está em 0. Meu mapeamento de memória falha, recebo um erro ao alocar página virtual no endereço 0.
Eu me pergunto se é possível alocar toda a memória no endereço 0para o espaço do usuário.
Veja este exemplo de código:
/*mmaptests.c*/
#include <sys/mman.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
int main()
{
void* p = mmap(0, sysconf(_SC_PAGE_SIZE), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS, -1, 0);
printf("mmap result %p (errno %s)\n",p,strerror(errno));
return 0;
}
Eu compilo com:
gcc mmaptests.c
Isso é o que ele retorna:
$./a.out
mmap result 0xffffffffffffffff (errno Operation not permitted)
Ficarei feliz por quaisquer insights.
Obrigado B
Respostas
1 PSkocik Sep 08 2020 at 16:18
O Linux só permitirá mmapa 0ª página se tiver privilégios.
gcc mmaptests.c && sudo ./a.out
deve pegar você:
mmap result (nil) (errno Success)
O que significa um erro “Não é possível encontrar o símbolo” ou “Não é possível resolver o símbolo”?
George Harrison ficou chateado por suas letras de 'Hurdy Gurdy Man' de Donovan não terem sido usadas