#include #include /* $ clang --version Ubuntu clang version 11.0.0-2~ubuntu20.04.1 $ clang stack_inspect.c $ a.out 0: Address 0x7ffe7d80defc contains 3 <- e[0] 1: Address 0x7ffe7d80df00 contains 7 <- e[1] 2: Address 0x7ffe7d80df04 contains 5 <- d 3: Address 0x7ffe7d80df08 contains 9 <- c 4: Address 0x7ffe7d80df0c contains 2a <- b 5: Address 0x7ffe7d80df10 contains 7d80df30 <- saved frame pointer of main (lower 32 bits) 6: Address 0x7ffe7d80df14 contains 7ffe <- saved frame pointer of main (upper 32 bits) 7: Address 0x7ffe7d80df18 contains 4011d3 <- saved return address of main (lower 32 bits) 8: Address 0x7ffe7d80df1c contains 0 <- saved return address of main (upper 32 bits) 9: Address 0x7ffe7d80df20 contains 7d80e020 <- STACK pointer (???) (lower 32 bits) 10: Address 0x7ffe7d80df24 contains 7ffe <- STACK pointer (???) (upper 32 bits) 11: Address 0x7ffe7d80df28 contains 9 <- a 12: Address 0x7ffe7d80df2c contains 0 <- padding (for next 64-bit pointer ^) 13: Address 0x7ffe7d80df30 contains 0 <- saved frame pointer of _start (lower 32 bits) 14: Address 0x7ffe7d80df34 contains 0 <- saved frame pointer of _start (upper 32 bits) 15: Address 0x7ffe7d80df38 contains 9fbb30b3 <- saved return address of _start (lower 32 bits) 16: Address 0x7ffe7d80df3c contains 7f98 <- saved return address of _start (upper 32 bits) 17: Address 0x7ffe7d80df40 contains 71 <- ??? 18: Address 0x7ffe7d80df44 contains 0 <- ??? 19: Address 0x7ffe7d80df48 contains 7d80e028 <- source information 20: Address 0x7ffe7d80df4c contains 7ffe <- source information $ gcc --version gcc (Ubuntu 10.3.0-1ubuntu1~20.04) 10.3.0 $ gcc stack_inspect.c $ a.out # GCC stores local arrays first in the stack, so some things are missing from the start of the output. 9 <- c 2a <- b <- TEXT pointer (???) <- TEXT pointer (???) 0 <- padding (for next 64-bit pointer ^) 5 <- d 0: Address 0x7ffccc6e6e90 contains 3 <- e[0] 1: Address 0x7ffccc6e6e94 contains 7 <- e[1] 2: Address 0x7ffccc6e6e98 contains f08e2f00 <- ??? 3: Address 0x7ffccc6e6e9c contains 8c526a01 <- ??? 4: Address 0x7ffccc6e6ea0 contains cc6e6ec0 <- saved frame pointer of main (lower 32 bits) 5: Address 0x7ffccc6e6ea4 contains 7ffc <- saved frame pointer of main (upper 32 bits) 6: Address 0x7ffccc6e6ea8 contains 11c6a221 <- saved return address of main (lower 32 bits) 7: Address 0x7ffccc6e6eac contains 5582 <- saved return address of main (upper 32 bits) 8: Address 0x7ffccc6e6eb0 contains cc6e6fb0 <- STACK pointer (???) (lower 32 bits) 9: Address 0x7ffccc6e6eb4 contains 7ffc <- STACK pointer (???) (upper 32 bits) 10: Address 0x7ffccc6e6eb8 contains 0 <- padding (for next 64-bit pointer ^) 11: Address 0x7ffccc6e6ebc contains 9 <- a 12: Address 0x7ffccc6e6ec0 contains 0 <- saved frame pointer of _start (lower 32 bits) 13: Address 0x7ffccc6e6ec4 contains 0 <- saved frame pointer of _start (upper 32 bits) 14: Address 0x7ffccc6e6ec8 contains 6f6d70b3 <- saved return address of _start (lower 32 bits) 15: Address 0x7ffccc6e6ecc contains 7fba <- saved return address of _start (upper 32 bits) 16: Address 0x7ffccc6e6ed0 contains 71 <- ??? 17: Address 0x7ffccc6e6ed4 contains 0 <- ??? 18: Address 0x7ffccc6e6ed8 contains cc6e6fb8 <- source information 19: Address 0x7ffccc6e6edc contains 7ffc <- source information 20: Address 0x7ffccc6e6ee0 contains 6f898618 <- ??? (upper 32 bits) */ void f(int b, int c) { int d = 5; uint32_t e[2] = { 3, 7 }; for (int i = 0; i < 20; i++) printf("%2d: Address %p contains %8x\n", i, &e[i], e[0 + i]); } int main(void) { int a = 9; f(42, a); return 0; }