From ea908c7009de5a208383abf4bec4c6b3d9519ca3 Mon Sep 17 00:00:00 2001 From: Hongxu Jia Date: Fri, 23 Aug 2019 10:18:47 +0800 Subject: [PATCH 2/4] musl-libs Collection of fixes needed to compile libelf and other libraries provided by elfutils for musl targets error is glibc specific API, so this patch will mostly not accepted upstream given that elfutils has been closely tied to glibc Signed-off-by: Khem Raj Upstream-Status: Inappropriate [workaround for musl] Rebase to 0.177 Signed-off-by: Hongxu Jia --- lib/error.h | 27 +++++++++++++++++++++++++++ lib/fixedsizehash.h | 1 - lib/libeu.h | 1 + libdwfl/dwfl_error.c | 9 +++++++++ libdwfl/linux-kernel-modules.c | 1 + libelf/elf.h | 9 ++++++--- 6 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 lib/error.h diff --git a/lib/error.h b/lib/error.h new file mode 100644 index 0000000..ef06827 --- /dev/null +++ b/lib/error.h @@ -0,0 +1,27 @@ +#ifndef _ERROR_H_ +#define _ERROR_H_ + +#include +#include +#include +#include +#include + +static unsigned int error_message_count = 0; + +static inline void error(int status, int errnum, const char* format, ...) +{ + va_list ap; + fprintf(stderr, "%s: ", program_invocation_name); + va_start(ap, format); + vfprintf(stderr, format, ap); + va_end(ap); + if (errnum) + fprintf(stderr, ": %s", strerror(errnum)); + fprintf(stderr, "\n"); + error_message_count++; + if (status) + exit(status); +} + +#endif /* _ERROR_H_ */ diff --git a/lib/fixedsizehash.h b/lib/fixedsizehash.h index dac2a5f..43016fc 100644 --- a/lib/fixedsizehash.h +++ b/lib/fixedsizehash.h @@ -30,7 +30,6 @@ #include #include #include -#include #include diff --git a/lib/libeu.h b/lib/libeu.h index ecb4d01..edc85e3 100644 --- a/lib/libeu.h +++ b/lib/libeu.h @@ -29,6 +29,7 @@ #ifndef LIBEU_H #define LIBEU_H +#include "system.h" #include #include diff --git a/libdwfl/dwfl_error.c b/libdwfl/dwfl_error.c index 7bcf61c..11dcc8b 100644 --- a/libdwfl/dwfl_error.c +++ b/libdwfl/dwfl_error.c @@ -154,7 +154,16 @@ dwfl_errmsg (int error) switch (error &~ 0xffff) { case OTHER_ERROR (ERRNO): +#if defined(__GLIBC__) return strerror_r (error & 0xffff, "bad", 0); +#else + { + static __thread char buf[128] = ""; + if (strerror_r (error & 0xffff, buf, sizeof(buf)) == 0) + return buf; + } + return "strerror_r() failed"; +#endif case OTHER_ERROR (LIBELF): return elf_errmsg (error & 0xffff); case OTHER_ERROR (LIBDW): diff --git a/libdwfl/linux-kernel-modules.c b/libdwfl/linux-kernel-modules.c index d46ab5a..1c3faee 100644 --- a/libdwfl/linux-kernel-modules.c +++ b/libdwfl/linux-kernel-modules.c @@ -50,6 +50,7 @@ #include #include #include +#include "system.h" /* If fts.h is included before config.h, its indirect inclusions may not give us the right LFS aliases of these functions, so map them manually. */ diff --git a/libelf/elf.h b/libelf/elf.h index bed273d..be228e6 100644 --- a/libelf/elf.h +++ b/libelf/elf.h @@ -21,7 +21,9 @@ #include -__BEGIN_DECLS +#ifdef __cplusplus +extern "C" { +#endif /* Standard ELF types. */ @@ -4029,6 +4031,7 @@ enum #define R_NDS32_TLS_TPOFF 102 #define R_NDS32_TLS_DESC 119 -__END_DECLS - +#ifdef __cplusplus +} +#endif #endif /* elf.h */ -- 2.17.1