// aslr.c: imprime una direccion de cada region del proceso (codigo, datos,
// heap, pila y una funcion de la biblioteca C). Con ASLR activo, casi todas
// cambian en cada corrida; con `setarch -R ./aslr` quedan fijas. Compilado sin
// PIE (-no-pie), codigo y datos quedan fijos aunque ASLR siga activo: eso es
// justo lo que agrega PIE.
//   uso: ./aslr
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>

static int global_var = 7;            // vive en el segmento de datos

int main(void) {
    int local_var = 0;                // vive en la pila
    int *heap = malloc(sizeof(int));  // vive en el heap

    printf("codigo  (main)    %p\n", (void *)main);
    printf("datos   (global)  %p\n", (void *)&global_var);
    printf("heap    (malloc)  %p\n", (void *)heap);
    printf("pila    (local)   %p\n", (void *)&local_var);
    printf("libc    (printf)  %p\n", (void *)printf);

    free(heap);
    return 0;
}
