055f1c02d3
Upstream has a large number of patches lined up for the next 0.9.33.x bugfix release; http://git.uclibc.org/uClibc/log/?h=0.9.33 Add them here, as atleast some of them are quite critical (E.G. the eventfd issue gets triggered by recent glib versions). I've skipped the microblaze and xtensa fixes as we don't currently support those with 0.9.33.2. Drop uclibc-0002-Add-definition-of-MSG_WAITFORONE-and-MSG_CMSG_CMSG_CLOEXE.patch as that is a subset of uclibc-0035-socket.h-pull-socket_type.h-from-eglibc.patch Signed-off-by: Peter Korsgaard <jacmet@sunsite.dk>
169 lines
6.2 KiB
Diff
169 lines
6.2 KiB
Diff
From 6b2250a1a39362abe53e78a45897caecf65ec73f Mon Sep 17 00:00:00 2001
|
|
From: Filippo Arcidiacono <filippo.arcidiacono@st.com>
|
|
Date: Thu, 9 May 2013 11:42:23 +0200
|
|
Subject: [PATCH] libubacktrace: fix backtrace for statically linked
|
|
application
|
|
|
|
libgcc_s.so's unwinder could not access unwind tables of statically
|
|
linked binaries, so we really want to use _Unwind_* stuff from
|
|
libgcc_eh.a.
|
|
It required to build backtrace.c differentiating between shared and
|
|
static case.
|
|
|
|
Signed-off-by: Filippo Arcidiacono <filippo.arcidiacono@st.com>
|
|
Signed-off-by: Carmelo Amoroso <carmelo.amoroso@st.com>
|
|
(cherry picked from commit 71c10c484e7dc113396cccb7e503befb759c6346)
|
|
|
|
Signed-off-by: Carmelo Amoroso <carmelo.amoroso@st.com>
|
|
---
|
|
libubacktrace/Makefile.in | 23 ++++++++++++++---------
|
|
libubacktrace/arm/Makefile.arch | 2 +-
|
|
libubacktrace/arm/backtrace.c | 7 +++++++
|
|
libubacktrace/backtrace.c | 7 +++++++
|
|
4 files changed, 29 insertions(+), 10 deletions(-)
|
|
|
|
diff --git a/libubacktrace/Makefile.in b/libubacktrace/Makefile.in
|
|
index 8a4b081..612bf2d 100644
|
|
--- a/libubacktrace/Makefile.in
|
|
+++ b/libubacktrace/Makefile.in
|
|
@@ -25,11 +25,13 @@ libubacktrace_ARCH_OUT:=$(libubacktrace_OUT)/$(TARGET_ARCH)
|
|
-include $(libubacktrace_ARCH_DIR)/Makefile.arch
|
|
|
|
libubacktrace_SRC-y :=
|
|
-libubacktrace_SRC-$(UCLIBC_HAS_BACKTRACE) := backtrace.c backtracesyms.c backtracesymsfd.c
|
|
+libubacktrace_SRC-$(UCLIBC_HAS_BACKTRACE) := backtracesyms.c backtracesymsfd.c
|
|
+libubacktrace_SRC_SHARED-$(UCLIBC_HAS_BACKTRACE) := backtrace.c
|
|
|
|
# remove generic sources, if arch specific version is present
|
|
ifneq ($(strip $(libubacktrace_ARCH_SRC-y)),)
|
|
libubacktrace_SRC-y := $(filter-out $(notdir $(libubacktrace_ARCH_SRC-y)),$(libubacktrace_SRC-y))
|
|
+libubacktrace_SRC_SHARED-y := $(filter-out $(notdir $(libubacktrace_ARCH_SRC-y)),$(libubacktrace_SRC_SHARED-y))
|
|
endif
|
|
|
|
# -fasynchronous-unwind-tables is required for backtrace to work using dwarf2
|
|
@@ -43,12 +45,19 @@ endif
|
|
libubacktrace_SRCS := $(patsubst %.c,$(libubacktrace_DIR)/%.c,$(libubacktrace_SRC-y))
|
|
libubacktrace_OBJS := $(patsubst $(libubacktrace_DIR)/%.c,$(libubacktrace_OUT)/%.o,$(libubacktrace_SRCS))
|
|
|
|
+libubacktrace_SHARED_SRCS := $(patsubst %.c,$(libubacktrace_DIR)/%.c,$(libubacktrace_SHARED_SRC-y))
|
|
+libubacktrace_SHARED_OBJS := $(patsubst $(libubacktrace_DIR)/%.c,$(libubacktrace_OUT)/%.s,$(libubacktrace_SHARED_SRCS))
|
|
+
|
|
+libubacktrace-shared-y := $(libubacktrace_SHARED_OBJS:.os=.oS)
|
|
+libubacktrace-static-y := $(libubacktrace_SHARED_OBJS)
|
|
+
|
|
ifeq ($(DOPIC),y)
|
|
-libubacktrace-a-y += $(libubacktrace_OBJS:.o=.os)
|
|
+libubacktrace-a-y += $(libubacktrace_OBJS:.o=.os) $(libubacktrace-static-y:.o=.os)
|
|
else
|
|
-libubacktrace-a-y += $(libubacktrace_OBJS)
|
|
+libubacktrace-a-y += $(libubacktrace_OBJS) $(libubacktrace-static-y)
|
|
endif
|
|
-libubacktrace-so-y += $(libubacktrace_OBJS:.o=.os)
|
|
+libubacktrace-so-y += $(libubacktrace_OBJS:.o=.os) $(libubacktrace-shared-y)
|
|
+
|
|
|
|
lib-a-$(UCLIBC_HAS_BACKTRACE) += $(top_builddir)lib/libubacktrace.a
|
|
lib-so-$(UCLIBC_HAS_BACKTRACE) += $(top_builddir)lib/libubacktrace.so
|
|
@@ -56,11 +65,7 @@ lib-so-$(UCLIBC_HAS_BACKTRACE) += $(top_builddir)lib/libubacktrace.so
|
|
objclean-y += CLEAN_libubacktrace
|
|
|
|
ifeq ($(DOMULTI),n)
|
|
-ifeq ($(DOPIC),y)
|
|
-$(top_builddir)lib/libubacktrace.so: $(top_builddir)lib/libubacktrace.a $(libdl.depend)
|
|
-else
|
|
$(top_builddir)lib/libubacktrace.so: $(libubacktrace_OUT)/libubacktrace_so.a $(libdl.depend)
|
|
-endif
|
|
$(call link.so,$(libubacktrace_FULL_NAME),$(ABI_VERSION))
|
|
else
|
|
$(top_builddir)lib/libubacktrace.so: $(libubacktrace_OUT)/libubacktrace.oS | $(libdl.depend)
|
|
@@ -71,7 +76,7 @@ $(libubacktrace_OUT)/libubacktrace_so.a: $(libubacktrace-so-y)
|
|
$(Q)$(RM) $@
|
|
$(do_ar)
|
|
|
|
-$(libubacktrace_OUT)/libubacktrace.oS: $(libubacktrace_SRCS) $(libubacktrace_ARCH_SRCS)
|
|
+$(libubacktrace_OUT)/libubacktrace.oS: $(libubacktrace_SRCS) $(libubacktrace_ARCH_SRCS) $(libubacktrace_SHARED_SRCS)
|
|
$(Q)$(RM) $@
|
|
$(compile-m)
|
|
|
|
diff --git a/libubacktrace/arm/Makefile.arch b/libubacktrace/arm/Makefile.arch
|
|
index 53b8c0e..b3fb500 100644
|
|
--- a/libubacktrace/arm/Makefile.arch
|
|
+++ b/libubacktrace/arm/Makefile.arch
|
|
@@ -14,4 +14,4 @@ libubacktrace-a-y+=$(libubacktrace_ARCH_OBJS:.o=.os)
|
|
else
|
|
libubacktrace-a-y+=$(libubacktrace_ARCH_OBJS)
|
|
endif
|
|
-libubacktrace-so-y+=$(libubacktrace_ARCH_OBJS:.o=.os)
|
|
+libubacktrace-so-y+=$(libubacktrace_ARCH_OBJS:.o=.oS)
|
|
diff --git a/libubacktrace/arm/backtrace.c b/libubacktrace/arm/backtrace.c
|
|
index d4eca32..5955189 100644
|
|
--- a/libubacktrace/arm/backtrace.c
|
|
+++ b/libubacktrace/arm/backtrace.c
|
|
@@ -25,6 +25,7 @@ struct trace_arg
|
|
int cnt, size;
|
|
};
|
|
|
|
+#ifdef SHARED
|
|
static _Unwind_Reason_Code (*unwind_backtrace) (_Unwind_Trace_Fn, void *);
|
|
static _Unwind_VRS_Result (*unwind_vrs_get) (_Unwind_Context *,
|
|
_Unwind_VRS_RegClass,
|
|
@@ -42,6 +43,10 @@ static void backtrace_init (void)
|
|
abort();
|
|
}
|
|
}
|
|
+#else
|
|
+# define unwind_backtrace _Unwind_Backtrace
|
|
+# define unwind_vrs_get _Unwind_VRS_Get
|
|
+#endif
|
|
/* This function is identical to "_Unwind_GetGR", except that it uses
|
|
"unwind_vrs_get" instead of "_Unwind_VRS_Get". */
|
|
static inline _Unwind_Word
|
|
@@ -80,8 +85,10 @@ int backtrace (void **array, int size)
|
|
{
|
|
struct trace_arg arg = { .array = array, .size = size, .cnt = -1 };
|
|
|
|
+#ifdef SHARED
|
|
if (unwind_backtrace == NULL)
|
|
backtrace_init();
|
|
+#endif
|
|
|
|
if (size >= 1)
|
|
unwind_backtrace (backtrace_helper, &arg);
|
|
diff --git a/libubacktrace/backtrace.c b/libubacktrace/backtrace.c
|
|
index fdd5981..1e0a0ec 100644
|
|
--- a/libubacktrace/backtrace.c
|
|
+++ b/libubacktrace/backtrace.c
|
|
@@ -33,6 +33,7 @@ struct trace_arg
|
|
int cnt, size;
|
|
};
|
|
|
|
+#ifdef SHARED
|
|
static _Unwind_Reason_Code (*unwind_backtrace) (_Unwind_Trace_Fn, void *);
|
|
static _Unwind_Ptr (*unwind_getip) (struct _Unwind_Context *);
|
|
|
|
@@ -47,6 +48,10 @@ static void backtrace_init (void)
|
|
abort();
|
|
}
|
|
}
|
|
+#else
|
|
+# define unwind_backtrace _Unwind_Backtrace
|
|
+# define unwind_getip _Unwind_GetIP
|
|
+#endif
|
|
|
|
static _Unwind_Reason_Code
|
|
backtrace_helper (struct _Unwind_Context *ctx, void *a)
|
|
@@ -71,8 +76,10 @@ int backtrace (void **array, int size)
|
|
{
|
|
struct trace_arg arg = { .array = array, .size = size, .cnt = -1 };
|
|
|
|
+#ifdef SHARED
|
|
if (unwind_backtrace == NULL)
|
|
backtrace_init();
|
|
+#endif
|
|
|
|
if (size >= 1)
|
|
unwind_backtrace (backtrace_helper, &arg);
|
|
--
|
|
1.7.10.4
|
|
|