// layout.c — dónde viven el código, los datos, el heap y la pila.
// Imprime direcciones (virtuales) de cada región del espacio de direcciones.
//   ./layout              (con ASLR: cambian en cada ejecución)
//   setarch -R ./layout   (sin ASLR: siempre las mismas)
#define _DEFAULT_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <unistd.h>

int global_init = 42;   // datos inicializados (.data)
int global_zero;        // datos en cero (.bss)

int main(void) {
    int local = 7;                       // en la pila
    int *small = malloc(16);             // heap (vía brk)
    int *big = malloc(1 << 20);          // 1 MiB: glibc usa mmap
    void *brk_end = sbrk(0);             // fin actual del heap

    printf("código  main()       %p\n", (void *)main);
    printf("datos   global_init  %p\n", (void *)&global_init);
    printf("bss     global_zero  %p\n", (void *)&global_zero);
    printf("heap    malloc(16)   %p\n", (void *)small);
    printf("heap    sbrk(0)      %p\n", brk_end);
    printf("mmap    malloc(1MiB) %p\n", (void *)big);
    printf("pila    local        %p\n", (void *)&local);

    free(big);
    free(small);
    return 0;
}
