X-Git-Url: https://ruderich.org/simon/gitweb/?p=coloredstderr%2Fcoloredstderr.git;a=blobdiff_plain;f=src%2Fldpreload.h;h=af416b39dd9f4c4ef23611410d0a1a951965d1c4;hp=33a2e752d6e775bb03fbd3902ca2918f924475cc;hb=8a65b4486febf00e3fad5bafc3773a811e675a4c;hpb=abc3d7889f3774717baf5795ffab2efb396d2570 diff --git a/src/ldpreload.h b/src/ldpreload.h index 33a2e75..af416b3 100644 --- a/src/ldpreload.h +++ b/src/ldpreload.h @@ -2,7 +2,7 @@ * Helper header for LD_PRELOAD related headers macros. Must be loaded _first_ * (for RTLD_NEXT)! * - * Copyright (C) 2012-2013 Simon Ruderich + * Copyright (C) 2012-2015 Simon Ruderich * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,22 +28,33 @@ #include /* dlsym() */ #include +#include +static void *dlsym_function(char const *name) noinline; +/* Load the function name using dlsym() and return it. Terminate program on + * failure. Split in function and macro to reduce code inserted into the + * function using the macro. */ +static void *dlsym_function(char const *name) { + void *result; + + int saved_errno = errno; /* just in case */ + + /* Clear possibly existing error. */ + dlerror(); + result = dlsym(RTLD_NEXT, name); + /* Not much we can do. Most likely the other output functions failed to + * load too. */ + if (dlerror() != NULL) { + abort(); + } + + errno = saved_errno; + return result; +} -/* Load the function name using dlsym() if necessary and store it in pointer. - * Terminate program on failure. */ #define DLSYM_FUNCTION(pointer, name) \ - if (NULL == (pointer)) { \ - char *error; \ - dlerror(); /* Clear possibly existing error. */ \ - \ - *(void **) (&(pointer)) = dlsym(RTLD_NEXT, (name)); \ - \ - if (NULL != (error = dlerror())) { \ - /* Not much we can do. Most likely the other output functions \ - * failed to load too. */ \ - abort(); \ - } \ + if (unlikely(!(pointer))) { \ + *(void **) (&(pointer)) = dlsym_function(name); \ } #endif