Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/interpose.cfa

    re10714a ra20be49  
    1010// Created On       : Wed Mar 29 16:10:31 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Mar 27 21:09:03 2023
    13 // Update Count     : 196
    14 //
    15 
     12// Last Modified On : Thu Jan  5 22:23:57 2023
     13// Update Count     : 180
     14//
     15
     16#include <stdarg.h>                                                                             // va_start, va_end
    1617#include <stdio.h>
     18#include <string.h>                                                                             // strlen
    1719#include <unistd.h>                                                                             // _exit, getpid
     20#include <signal.h>
    1821extern "C" {
    1922#include <dlfcn.h>                                                                              // dlopen, dlsym
     
    2124}
    2225
     26#include "bits/debug.hfa"
    2327#include "bits/defs.hfa"
    2428#include "bits/signal.hfa"                                                              // sigHandler_?
     
    3640
    3741typedef void (* generic_fptr_t)(void);
    38 
    3942static generic_fptr_t do_interpose_symbol( void * library, const char symbol[], const char version[] ) {
     43        const char * error;
     44
    4045        union { generic_fptr_t fptr; void * ptr; } originalFunc;
    4146
    4247        #if defined( _GNU_SOURCE )
    43         if ( version ) {
    44                 originalFunc.ptr = dlvsym( library, symbol, version );
    45         } else {
     48                if ( version ) {
     49                        originalFunc.ptr = dlvsym( library, symbol, version );
     50                } else {
     51                        originalFunc.ptr = dlsym( library, symbol );
     52                }
     53        #else
    4654                originalFunc.ptr = dlsym( library, symbol );
     55        #endif // _GNU_SOURCE
     56
     57        error = dlerror();
     58        if ( error ) abort( "interpose_symbol : internal error, %s\n", error );
     59
     60        return originalFunc.fptr;
     61}
     62
     63static generic_fptr_t interpose_symbol( const char symbol[], const char version[] ) {
     64        const char * error;
     65
     66        static void * library;
     67        static void * pthread_library;
     68        if ( ! library ) {
     69                #if defined( RTLD_NEXT )
     70                        library = RTLD_NEXT;
     71                #else
     72                        // missing RTLD_NEXT => must hard-code library name, assuming libstdc++
     73                        library = dlopen( "libc.so.6", RTLD_LAZY );
     74                        error = dlerror();
     75                        if ( error ) {
     76                                abort( "interpose_symbol : failed to open libc, %s\n", error );
     77                        }
     78                #endif
    4779        } // if
    48         #else
    49         originalFunc.ptr = dlsym( library, symbol );
    50         #endif // _GNU_SOURCE
    51 
    52         if ( ! originalFunc.ptr ) {                                                     // == nullptr
    53                 abort( "interpose_symbol : internal error, %s\n", dlerror() );
     80        if ( ! pthread_library ) {
     81                #if defined( RTLD_NEXT )
     82                        pthread_library = RTLD_NEXT;
     83                #else
     84                        // missing RTLD_NEXT => must hard-code library name, assuming libstdc++
     85                        pthread_library = dlopen( "libpthread.so", RTLD_LAZY );
     86                        error = dlerror();
     87                        if ( error ) {
     88                                abort( "interpose_symbol : failed to open libpthread, %s\n", error );
     89                        }
     90                #endif
    5491        } // if
    55         return originalFunc.fptr;
    56 }
    57 
    58 static generic_fptr_t interpose_symbol( const char symbol[], const char version[] ) {
    59         void * library;
    60 
    61         #if defined( RTLD_NEXT )
    62         library = RTLD_NEXT;
    63         #else
    64         // missing RTLD_NEXT => must hard-code library name, assuming libstdc++
    65         library = dlopen( "libc.so.6", RTLD_LAZY );
    66         if ( ! library ) {                                                                      // == nullptr
    67                 abort( "interpose_symbol : failed to open libc, %s\n", dlerror() );
    68         } // if
    69         #endif // RTLD_NEXT
    70 
    71         return do_interpose_symbol( library, symbol, version );
     92
     93        return do_interpose_symbol(library, symbol, version);
    7294}
    7395
     
    99121                preload_libgcc();
    100122
    101                 #pragma GCC diagnostic push
    102                 #pragma GCC diagnostic ignored "-Wdiscarded-qualifiers"
     123#pragma GCC diagnostic push
     124#pragma GCC diagnostic ignored "-Wdiscarded-qualifiers"
    103125                INTERPOSE_LIBC( abort, version );
    104126                INTERPOSE_LIBC( exit , version );
    105                 #pragma GCC diagnostic pop
     127#pragma GCC diagnostic pop
    106128
    107129                if(__cfathreadabi_interpose_startup) __cfathreadabi_interpose_startup( do_interpose_symbol );
    108 
    109                 // SKULLDUGGERY: In Ubuntu 22.04, someone augmented signal.h to allow SIGSTKSZ to be "sysconf(_SC_SIGSTKSZ)" in
    110                 // sigstksz.h, as well as 8192 in sigstack.h. HOWEVER, they forgot to provide a mechanism to tell signal.h to
    111                 // use sigstack.h rather than sigstksz.h. (I'm not happy.) By undefining _GNU_SOURCE before signal.h and
    112                 // redefining it afterwards, you can get 8192, but then nothing works correctly inside of signal.h without
    113                 // _GNU_SOURCE defined.  So what is needed is a way to get signal.h to use sigstack.h WITH _GNU_SOURCE defined.
    114                 // Basically something is wrong with features.h and its use in signal.h.
    115 
    116                 #undef SIGSTKSZ
    117                 #define SIGSTKSZ 8192
    118130
    119131                // As a precaution (and necessity), errors that result in termination are delivered on a separate stack because
     
    281293        va_start( args, fmt );
    282294        __abort( false, fmt, args );
    283         // CONTROL NEVER REACHES HERE!
     295    // CONTROL NEVER REACHES HERE!
    284296        va_end( args );
    285297}
    286298
    287299void abort( bool signalAbort, const char fmt[], ... ) {
    288         va_list args;
    289         va_start( args, fmt );
    290         __abort( signalAbort, fmt, args );
    291         // CONTROL NEVER REACHES HERE!
    292         va_end( args );
     300    va_list args;
     301    va_start( args, fmt );
     302    __abort( signalAbort, fmt, args );
     303    // CONTROL NEVER REACHES HERE!
     304    va_end( args );
    293305}
    294306
Note: See TracChangeset for help on using the changeset viewer.