/* file: segments.c original author: "The Linux Kernel Book", Card, Dumas & Mavel (Wiley) heavily adapted by: T.P. Baker purpose: Illustrate Linux process address space layout. */ #include #include static int i[1000]; /* uninitialized static storage (BSS) */ static int j = 2; /* initialized static storage (DATA) */ static int k = 3; /* read-only initialized static storage (RODATA) */ const char l[] = "linux"; extern int _end; /* end of BSS segment */ extern int _etext; /* end of code segment (text) */ extern int _start; /* entry point */ extern int _edata; /* end of initialized data segment */ extern int __bss_start; /* start of bss segment */ extern int __data_start; /* start of bss segment */ extern char **environ; /* pointer to environment */ int main (int argc, const char *argv[]) { int *m; /* local pointer (on stack) */ printf ("%09lx : environ[0] \n", environ[0]); printf ("%09lx : argv[0] \n", argv[0]); printf ("%09lx : &m \n", &m); m = malloc (100); printf ("%09lx : m \n", m); printf ("%09lx : &_end \n", &_end); printf ("%09lx : i \n", i); printf ("%09lx : &__bss_start \n", &__bss_start); printf ("%09lx : &_edata \n", &_edata); printf ("%09lx : &k \n", &k); printf ("%09lx : &j \n", &j); printf ("%09lx : &__data_start\n", &__data_start); printf ("%09lx : &l \n", &l); printf ("%09lx : &_etext \n", &_etext); printf ("%09lx : main \n", main); printf ("%09lx : &_start \n", &_start); return 0; } /* output with Red Hat 7.3 Linux distribution: 0bffffbdb : environ[0] 0bffffbd3 : argv[0] 0bffffa64 : &m 00804a8e8 : m 00804a8c0 : &_end 008049920 : i 0080498f8 : &__bss_start 0080498f8 : &_edata 0080497f4 : &k 0080497f0 : &j 0080497e0 : &__data_start 008048668 : &l 00804865e : &_etext 008048490 : main 008048390 : &_start */