Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/libcfa/interpose.c

    rde94a60 r169d944  
    1010// Created On       : Wed Mar 29 16:10:31 2017
    1111// Last Modified By : Peter A. Buhr
    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
     12// Last Modified On : Thu Feb  8 16:18:09 2018
     13// Update Count     : 75
     14//
     15
     16#include <stdarg.h>
     17#include <stddef.h>
     18
     19extern "C" {
     20#include <stdio.h>
     21#include <string.h>
     22#include <dlfcn.h>
     23#include <unistd.h>
    1924#define __USE_GNU
    2025#include <signal.h>
    2126#undef __USE_GNU
    22 extern "C" {
    23 #include <dlfcn.h>                                                                              // dlopen, dlsym
    24 #include <execinfo.h>                                                                   // backtrace, messages
     27#include <execinfo.h>
    2528}
    2629
    2730#include "bits/debug.h"
    2831#include "bits/defs.h"
    29 #include "bits/signal.h"                                                                // sigHandler_?
    30 #include "startup.h"                                                                    // STARTUP_PRIORITY_CORE
     32#include "bits/signal.h"
     33#include "startup.h"
    3134
    3235//=============================================================================================
     
    3437//=============================================================================================
    3538
    36 typedef void (* generic_fptr_t)(void);
    37 generic_fptr_t interpose_symbol( const char * symbol, const char * version ) {
     39typedef void (*generic_fptr_t)(void);
     40generic_fptr_t interpose_symbol( const char* symbol, const char *version ) {
    3841        const char * error;
    3942
     
    5255        } // if
    5356
    54         union { generic_fptr_t fptr; void * ptr; } originalFunc;
     57        union { generic_fptr_t fptr; void* ptr; } originalFunc;
    5558
    5659        #if defined( _GNU_SOURCE )
     
    7073}
    7174
    72 #define INTERPOSE_LIBC( x, ver ) __cabi_libc.x = (typeof(__cabi_libc.x))interpose_symbol( #x, ver )
    73 
    74 //=============================================================================================
    75 // Interposition Startup logic
     75forall(dtype T)
     76static 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
    7691//=============================================================================================
    7792
     
    8095void sigHandler_fpe  ( __CFA_SIGPARMS__ );
    8196void sigHandler_abort( __CFA_SIGPARMS__ );
    82 void sigHandler_term ( __CFA_SIGPARMS__ );
    8397
    8498struct {
    85         void (* exit)( int ) __attribute__(( __noreturn__ ));
    86         void (* abort)( void ) __attribute__(( __noreturn__ ));
     99        void (* exit)( int ) __attribute__ (( __noreturn__ ));
     100        void (* abort)( void ) __attribute__ (( __noreturn__ ));
    87101} __cabi_libc;
    88102
     
    92106                const char *version = NULL;
    93107
    94 #pragma GCC diagnostic push
    95 #pragma GCC diagnostic ignored "-Wdiscarded-qualifiers"
    96108                INTERPOSE_LIBC( abort, version );
    97109                INTERPOSE_LIBC( exit , version );
    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 );
     110
     111                __cfaabi_sigaction( SIGSEGV, sigHandler_segv , SA_SIGINFO ); // Failure handler
     112                __cfaabi_sigaction( SIGBUS , sigHandler_segv , SA_SIGINFO ); // Failure handler
     113                __cfaabi_sigaction( SIGILL , sigHandler_ill  , SA_SIGINFO ); // Failure handler
     114                __cfaabi_sigaction( SIGFPE , sigHandler_fpe  , SA_SIGINFO ); // Failure handler
     115                __cfaabi_sigaction( SIGABRT, sigHandler_abort, SA_SIGINFO ); // Failure handler
    108116        }
    109117}
     
    114122
    115123// Forward declare abort after the __typeof__ call to avoid ambiguities
    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__ ));
     124void exit( int status, const char fmt[], ... ) __attribute__ (( format(printf, 2, 3), __nothrow__, __leaf__, __noreturn__ ));
     125void abort( const char fmt[], ... ) __attribute__ (( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ ));
    118126
    119127extern "C" {
    120         void abort( void ) __attribute__(( __nothrow__, __leaf__, __noreturn__ )) {
     128        void abort( void ) __attribute__ (( __nothrow__, __leaf__, __noreturn__ )) {
    121129                abort( NULL );
    122130        }
    123131
    124         void __cabi_abort( const char fmt[], ... ) __attribute__(( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ )) {
     132        void __cabi_abort( const char fmt[], ... ) __attribute__ (( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ )) {
    125133                va_list argp;
    126134                va_start( argp, fmt );
     
    129137        }
    130138
    131         void exit( int status ) __attribute__(( __nothrow__, __leaf__, __noreturn__ )) {
     139        void exit( int status ) __attribute__ (( __nothrow__, __leaf__, __noreturn__ )) {
    132140                __cabi_libc.exit( status );
    133141        }
    134142}
    135143
    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; }
     144void * kernel_abort    ( void ) __attribute__ (( __nothrow__, __leaf__, __weak__ )) { return NULL; }
     145void   kernel_abort_msg( void * data, char * buffer, int size ) __attribute__ (( __nothrow__, __leaf__, __weak__ )) {}
     146int kernel_abort_lastframe( void ) __attribute__ (( __nothrow__, __leaf__, __weak__ )) { return 4; }
    139147
    140148enum { abort_text_size = 1024 };
     
    142150static int abort_lastframe;
    143151
    144 void exit( int status, const char fmt[], ... ) __attribute__(( format(printf, 2, 3), __nothrow__, __leaf__, __noreturn__ )) {
     152void exit( int status, const char fmt[], ... ) __attribute__ (( format(printf, 2, 3), __nothrow__, __leaf__, __noreturn__ )) {
    145153    va_list args;
    146154    va_start( args, fmt );
     
    150158}
    151159
    152 void abort( const char fmt[], ... ) __attribute__(( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ )) {
     160void abort( const char fmt[], ... ) __attribute__ (( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ )) {
    153161        void * kernel_data = kernel_abort();                    // must be done here to lock down kernel
    154162        int len;
     
    260268}
    261269
    262 void sigHandler_term( __CFA_SIGPARMS__ ) {
    263         abort( "Application stopped by %s signal.", sig == SIGINT ? "an interrupt (SIGINT)" : "a terminate (SIGTERM)" );
    264 }
    265 
    266270// Local Variables: //
    267271// mode: c //
Note: See TracChangeset for help on using the changeset viewer.