#include #include #include #include static void backtracer (void) __attribute__((__noinline__)); static void backtracer (void) { void *buf[512]; puts("dummy"); int i = backtrace (buf, 512); printf ("%d\n", i); fflush (stdout); backtrace_symbols_fd (buf, i, STDOUT_FILENO); #define RAFA(level) \ printf("RA (%d) = %p, FA (%d) = %p\n", \ level, __builtin_return_address (level), \ level, __builtin_frame_address (level)) RAFA(0); RAFA(1); RAFA(2); RAFA(3); RAFA(4); RAFA(5); } static int badone (void) __attribute__((__noinline__)); static int badone (void) { backtracer (); return 0; } asm( " .text \n" "clearstack: \n" " pushq $0 \n" " popq %rax \n" " ret \n" ); extern void clearstack(void); int main (void) { clearstack (); badone (); return 0; }