https://sourceware.org/bugzilla/show_bug.cgi?id=21002 --- a/lib/system.h +++ b/lib/system.h @@ -30,7 +30,18 @@ #define LIB_SYSTEM_H 1 #include -#include +#ifdef HAVE_ERROR_H +#include "error.h" +#else +#include "err.h" +#include +#define error(status, errno, ...) \ + do { \ + fflush(stdout); \ + warn(__VA_ARGS__); \ + if (status) exit(status); \ + } while(0) +#endif #include #include #include @@ -38,6 +49,10 @@ #include #include +#ifndef __GLIBC__ +#define canonicalize_file_name(name) realpath(name,NULL) +#endif + #if __BYTE_ORDER == __LITTLE_ENDIAN # define LE32(n) (n) # define LE64(n) (n) --- a/libdw/libdw_alloc.c +++ b/libdw/libdw_alloc.c @@ -73,5 +73,5 @@ __attribute ((noreturn)) attribute_hidde __libdw_oom (void) { while (1) - error (EXIT_FAILURE, ENOMEM, "libdw"); + error (EXIT_FAILURE, errno, gettext ("cannot allocate memory")); } --- a/libdwfl/dwfl_error.c +++ b/libdwfl/dwfl_error.c @@ -140,6 +140,7 @@ __libdwfl_seterrno (Dwfl_Error error) const char * dwfl_errmsg (int error) { + static __thread char s[64] = ""; if (error == 0 || error == -1) { int last_error = global_error; @@ -154,7 +155,8 @@ dwfl_errmsg (int error) switch (error &~ 0xffff) { case OTHER_ERROR (ERRNO): - return strerror_r (error & 0xffff, "bad", 0); + strerror_r (error & 0xffff, s, sizeof(s)); + return s; case OTHER_ERROR (LIBELF): return elf_errmsg (error & 0xffff); case OTHER_ERROR (LIBDW):