Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/libcfa/interpose.c

    rde94a60 r94dea96  
    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 : Tue May  1 15:05:35 2018
     13// Update Count     : 83
     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
     
    8398
    8499struct {
    85         void (* exit)( int ) __attribute__(( __noreturn__ ));
    86         void (* abort)( void ) __attribute__(( __noreturn__ ));
     100        void (* exit)( int ) __attribute__ (( __noreturn__ ));
     101        void (* abort)( void ) __attribute__ (( __noreturn__ ));
    87102} __cabi_libc;
    88103
     
    92107                const char *version = NULL;
    93108
    94 #pragma GCC diagnostic push
    95 #pragma GCC diagnostic ignored "-Wdiscarded-qualifiers"
    96109                INTERPOSE_LIBC( abort, version );
    97110                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 );
     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
    108119        }
    109120}
     
    114125
    115126// 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__ ));
     127void exit( int status, const char fmt[], ... ) __attribute__ (( format(printf, 2, 3), __nothrow__, __leaf__, __noreturn__ ));
     128void abort( const char fmt[], ... ) __attribute__ (( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ ));
    118129
    119130extern "C" {
    120         void abort( void ) __attribute__(( __nothrow__, __leaf__, __noreturn__ )) {
     131        void abort( void ) __attribute__ (( __nothrow__, __leaf__, __noreturn__ )) {
    121132                abort( NULL );
    122133        }
    123134
    124         void __cabi_abort( const char fmt[], ... ) __attribute__(( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ )) {
     135        void __cabi_abort( const char fmt[], ... ) __attribute__ (( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ )) {
    125136                va_list argp;
    126137                va_start( argp, fmt );
     
    129140        }
    130141
    131         void exit( int status ) __attribute__(( __nothrow__, __leaf__, __noreturn__ )) {
     142        void exit( int status ) __attribute__ (( __nothrow__, __leaf__, __noreturn__ )) {
    132143                __cabi_libc.exit( status );
    133144        }
    134145}
    135146
    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; }
     147void * kernel_abort    ( void ) __attribute__ (( __nothrow__, __leaf__, __weak__ )) { return NULL; }
     148void   kernel_abort_msg( void * data, char * buffer, int size ) __attribute__ (( __nothrow__, __leaf__, __weak__ )) {}
     149int kernel_abort_lastframe( void ) __attribute__ (( __nothrow__, __leaf__, __weak__ )) { return 4; }
    139150
    140151enum { abort_text_size = 1024 };
     
    142153static int abort_lastframe;
    143154
    144 void exit( int status, const char fmt[], ... ) __attribute__(( format(printf, 2, 3), __nothrow__, __leaf__, __noreturn__ )) {
     155void exit( int status, const char fmt[], ... ) __attribute__ (( format(printf, 2, 3), __nothrow__, __leaf__, __noreturn__ )) {
    145156    va_list args;
    146157    va_start( args, fmt );
     
    150161}
    151162
    152 void abort( const char fmt[], ... ) __attribute__(( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ )) {
     163void abort( const char fmt[], ... ) __attribute__ (( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ )) {
    153164        void * kernel_data = kernel_abort();                    // must be done here to lock down kernel
    154165        int len;
Note: See TracChangeset for help on using the changeset viewer.