| From 9a57efb0f826a70ae360aa55504ee2de656b92b6 Mon Sep 17 00:00:00 2001 |
| From: Hongxu Jia <hongxu.jia@windriver.com> |
| Date: Fri, 23 Aug 2019 10:18:47 +0800 |
| Subject: [PATCH] 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 <raj.khem@gmail.com> |
| Upstream-Status: Inappropriate [workaround for musl] |
| |
| Rebase to 0.177 |
| Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> |
| |
| --- |
| 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 <stdarg.h> |
| +#include <stdio.h> |
| +#include <stdlib.h> |
| +#include <string.h> |
| +#include <errno.h> |
| + |
| +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 <errno.h> |
| #include <stdlib.h> |
| #include <string.h> |
| -#include <sys/cdefs.h> |
| |
| #include <system.h> |
| |
| 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 <stddef.h> |
| #include <stdint.h> |
| |
| 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 0434f1e..5afaee8 100644 |
| --- a/libdwfl/linux-kernel-modules.c |
| +++ b/libdwfl/linux-kernel-modules.c |
| @@ -50,6 +50,7 @@ |
| #include <sys/utsname.h> |
| #include <fcntl.h> |
| #include <unistd.h> |
| +#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 197b557..8e5b94c 100644 |
| --- a/libelf/elf.h |
| +++ b/libelf/elf.h |
| @@ -21,7 +21,9 @@ |
| |
| #include <features.h> |
| |
| -__BEGIN_DECLS |
| +#ifdef __cplusplus |
| +extern "C" { |
| +#endif |
| |
| /* Standard ELF types. */ |
| |
| @@ -4103,6 +4105,7 @@ enum |
| #define R_ARC_TLS_LE_S9 0x4a |
| #define R_ARC_TLS_LE_32 0x4b |
| |
| -__END_DECLS |
| - |
| +#ifdef __cplusplus |
| +} |
| +#endif |
| #endif /* elf.h */ |