Changeset 358cba0 for src/libcfa/interpose.c
- Timestamp:
- May 15, 2018, 4:17:15 PM (6 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, with_gc
- Children:
- 2e5fa345
- Parents:
- 7d0a3ba (diff), a61fa0bb (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/interpose.c
r7d0a3ba r358cba0 10 10 // Created On : Wed Mar 29 16:10:31 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue May 1 15:05:35 2018 13 // Update Count : 83 14 // 15 16 #include <stdarg.h> 17 #include <stddef.h> 18 19 extern "C" { 20 #include <stdio.h> 21 #include <string.h> 22 #include <dlfcn.h> 23 #include <unistd.h> 12 // Last Modified On : Sat May 5 11:37:35 2018 13 // Update Count : 111 14 // 15 16 #include <stdarg.h> // va_start, va_end 17 #include <string.h> // strlen 18 #include <unistd.h> // _exit, getpid 24 19 #define __USE_GNU 25 20 #include <signal.h> 26 21 #undef __USE_GNU 27 #include <execinfo.h> 22 extern "C" { 23 #include <dlfcn.h> // dlopen, dlsym 24 #include <execinfo.h> // backtrace, messages 28 25 } 29 26 30 27 #include "bits/debug.h" 31 28 #include "bits/defs.h" 32 #include "bits/signal.h" 33 #include "startup.h" 29 #include "bits/signal.h" // sigHandler_? 30 #include "startup.h" // STARTUP_PRIORITY_CORE 34 31 35 32 //============================================================================================= … … 37 34 //============================================================================================= 38 35 39 typedef void (* generic_fptr_t)(void);40 generic_fptr_t interpose_symbol( const char * symbol, const char *version ) {36 typedef void (* generic_fptr_t)(void); 37 generic_fptr_t interpose_symbol( const char * symbol, const char * version ) { 41 38 const char * error; 42 39 … … 55 52 } // if 56 53 57 union { generic_fptr_t fptr; void * ptr; } originalFunc;54 union { generic_fptr_t fptr; void * ptr; } originalFunc; 58 55 59 56 #if defined( _GNU_SOURCE ) … … 73 70 } 74 71 75 forall(dtype T) 76 static inline void ptr_from_symbol( T** symbol_ptr, const char * symbol_name, const char * version) { 77 union { 78 generic_fptr_t gp; 79 T* tp; 80 } u; 81 82 u.gp = interpose_symbol( symbol_name, version ); 83 84 *symbol_ptr = u.tp; 85 } 86 87 #define INTERPOSE_LIBC( x, ver ) ptr_from_symbol( (void**)&__cabi_libc.x, #x, ver) 88 89 //============================================================================================= 90 // Terminating Signals logic 72 #define INTERPOSE_LIBC( x, ver ) __cabi_libc.x = (typeof(__cabi_libc.x))interpose_symbol( #x, ver ) 73 74 //============================================================================================= 75 // Interposition Startup logic 91 76 //============================================================================================= 92 77 … … 98 83 99 84 struct { 100 void (* exit)( int ) __attribute__ 101 void (* abort)( void ) __attribute__ 85 void (* exit)( int ) __attribute__(( __noreturn__ )); 86 void (* abort)( void ) __attribute__(( __noreturn__ )); 102 87 } __cabi_libc; 103 88 … … 107 92 const char *version = NULL; 108 93 94 #pragma GCC diagnostic push 95 #pragma GCC diagnostic ignored "-Wdiscarded-qualifiers" 109 96 INTERPOSE_LIBC( abort, version ); 110 97 INTERPOSE_LIBC( exit , version ); 111 112 __cfaabi_sigaction( SIGSEGV, sigHandler_segv , SA_SIGINFO ); // Failure handler 113 __cfaabi_sigaction( SIGBUS , sigHandler_segv , SA_SIGINFO ); // Failure handler 114 __cfaabi_sigaction( SIGILL , sigHandler_ill , SA_SIGINFO ); // Failure handler 115 __cfaabi_sigaction( SIGFPE , sigHandler_fpe , SA_SIGINFO ); // Failure handler 116 __cfaabi_sigaction( SIGABRT, sigHandler_abort, SA_SIGINFO ); // Failure handler 117 __cfaabi_sigaction( SIGTERM, sigHandler_term , SA_SIGINFO ); // Failure handler 118 __cfaabi_sigaction( SIGINT , sigHandler_term , SA_SIGINFO ); // Failure handler 98 #pragma GCC diagnostic pop 99 100 // Failure handler 101 __cfaabi_sigaction( SIGSEGV, sigHandler_segv , SA_SIGINFO ); 102 __cfaabi_sigaction( SIGBUS , sigHandler_segv , SA_SIGINFO ); 103 __cfaabi_sigaction( SIGILL , sigHandler_ill , SA_SIGINFO ); 104 __cfaabi_sigaction( SIGFPE , sigHandler_fpe , SA_SIGINFO ); 105 __cfaabi_sigaction( SIGABRT, sigHandler_abort, SA_SIGINFO | SA_RESETHAND); 106 __cfaabi_sigaction( SIGTERM, sigHandler_term , SA_SIGINFO ); 107 __cfaabi_sigaction( SIGINT , sigHandler_term , SA_SIGINFO ); 119 108 } 120 109 } … … 125 114 126 115 // Forward declare abort after the __typeof__ call to avoid ambiguities 127 void exit( int status, const char fmt[], ... ) __attribute__ 128 void abort( const char fmt[], ... ) __attribute__ 116 void exit( int status, const char fmt[], ... ) __attribute__(( format(printf, 2, 3), __nothrow__, __leaf__, __noreturn__ )); 117 void abort( const char fmt[], ... ) __attribute__(( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ )); 129 118 130 119 extern "C" { 131 void abort( void ) __attribute__ 120 void abort( void ) __attribute__(( __nothrow__, __leaf__, __noreturn__ )) { 132 121 abort( NULL ); 133 122 } 134 123 135 void __cabi_abort( const char fmt[], ... ) __attribute__ 124 void __cabi_abort( const char fmt[], ... ) __attribute__(( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ )) { 136 125 va_list argp; 137 126 va_start( argp, fmt ); … … 140 129 } 141 130 142 void exit( int status ) __attribute__ 131 void exit( int status ) __attribute__(( __nothrow__, __leaf__, __noreturn__ )) { 143 132 __cabi_libc.exit( status ); 144 133 } 145 134 } 146 135 147 void * kernel_abort ( void ) __attribute__ 148 void kernel_abort_msg( void * data, char * buffer, int size ) __attribute__ 149 int kernel_abort_lastframe( void ) __attribute__ 136 void * kernel_abort ( void ) __attribute__(( __nothrow__, __leaf__, __weak__ )) { return NULL; } 137 void kernel_abort_msg( void * data, char * buffer, int size ) __attribute__(( __nothrow__, __leaf__, __weak__ )) {} 138 int kernel_abort_lastframe( void ) __attribute__(( __nothrow__, __leaf__, __weak__ )) { return 4; } 150 139 151 140 enum { abort_text_size = 1024 }; … … 153 142 static int abort_lastframe; 154 143 155 void exit( int status, const char fmt[], ... ) __attribute__ 144 void exit( int status, const char fmt[], ... ) __attribute__(( format(printf, 2, 3), __nothrow__, __leaf__, __noreturn__ )) { 156 145 va_list args; 157 146 va_start( args, fmt ); … … 161 150 } 162 151 163 void abort( const char fmt[], ... ) __attribute__ 152 void abort( const char fmt[], ... ) __attribute__(( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ )) { 164 153 void * kernel_data = kernel_abort(); // must be done here to lock down kernel 165 154 int len;
Note: See TracChangeset
for help on using the changeset viewer.