1 #include <stdint.h> 2 #include <stdio.h> 3 4 __attribute__ (( noreturn, section ( ".text.null_trap" ) )) null_function_trap(void)5void null_function_trap ( void ) { 6 void *stack; 7 8 /* 128 bytes of NOPs; the idea of this is that if something 9 * dereferences a NULL pointer and overwrites us, we at least 10 * have some chance of still getting to execute the printf() 11 * statement. 12 */ 13 __asm__ __volatile__ ( "nop ; nop ; nop ; nop" ); 14 __asm__ __volatile__ ( "nop ; nop ; nop ; nop" ); 15 __asm__ __volatile__ ( "nop ; nop ; nop ; nop" ); 16 __asm__ __volatile__ ( "nop ; nop ; nop ; nop" ); 17 __asm__ __volatile__ ( "nop ; nop ; nop ; nop" ); 18 __asm__ __volatile__ ( "nop ; nop ; nop ; nop" ); 19 __asm__ __volatile__ ( "nop ; nop ; nop ; nop" ); 20 __asm__ __volatile__ ( "nop ; nop ; nop ; nop" ); 21 __asm__ __volatile__ ( "nop ; nop ; nop ; nop" ); 22 __asm__ __volatile__ ( "nop ; nop ; nop ; nop" ); 23 __asm__ __volatile__ ( "nop ; nop ; nop ; nop" ); 24 __asm__ __volatile__ ( "nop ; nop ; nop ; nop" ); 25 __asm__ __volatile__ ( "nop ; nop ; nop ; nop" ); 26 __asm__ __volatile__ ( "nop ; nop ; nop ; nop" ); 27 __asm__ __volatile__ ( "nop ; nop ; nop ; nop" ); 28 __asm__ __volatile__ ( "nop ; nop ; nop ; nop" ); 29 __asm__ __volatile__ ( "nop ; nop ; nop ; nop" ); 30 __asm__ __volatile__ ( "nop ; nop ; nop ; nop" ); 31 __asm__ __volatile__ ( "nop ; nop ; nop ; nop" ); 32 __asm__ __volatile__ ( "nop ; nop ; nop ; nop" ); 33 __asm__ __volatile__ ( "nop ; nop ; nop ; nop" ); 34 __asm__ __volatile__ ( "nop ; nop ; nop ; nop" ); 35 __asm__ __volatile__ ( "nop ; nop ; nop ; nop" ); 36 __asm__ __volatile__ ( "nop ; nop ; nop ; nop" ); 37 __asm__ __volatile__ ( "nop ; nop ; nop ; nop" ); 38 __asm__ __volatile__ ( "nop ; nop ; nop ; nop" ); 39 __asm__ __volatile__ ( "nop ; nop ; nop ; nop" ); 40 __asm__ __volatile__ ( "nop ; nop ; nop ; nop" ); 41 __asm__ __volatile__ ( "nop ; nop ; nop ; nop" ); 42 __asm__ __volatile__ ( "nop ; nop ; nop ; nop" ); 43 __asm__ __volatile__ ( "nop ; nop ; nop ; nop" ); 44 __asm__ __volatile__ ( "nop ; nop ; nop ; nop" ); 45 46 __asm__ __volatile__ ( "movl %%esp, %0" : "=r" ( stack ) ); 47 printf ( "NULL method called from %p (stack %p)\n", 48 __builtin_return_address ( 0 ), stack ); 49 DBG_HD ( stack, 256 ); 50 while ( 1 ) {} 51 } 52