![Max Filippov](/assets/img/avatar_default.png)
This fixes segfault in xtensa ltrace caused by infinite recursion in the function dwfl_report_elf calling other version of that function. Signed-off-by: Max Filippov <jcmvbkbc@gmail.com> Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
140 lines
4.9 KiB
Diff
140 lines
4.9 KiB
Diff
From bafacacaf7659a4933604662daba26a480b29a8d Mon Sep 17 00:00:00 2001
|
|
From: Max Filippov <jcmvbkbc@gmail.com>
|
|
Date: Thu, 23 Apr 2015 20:46:59 +0200
|
|
Subject: [PATCH] Allow disabling symbol versioning at configure time
|
|
|
|
Due to missing symbol versioning support in uClibc calls to versioned
|
|
functions that internally call different version of themselves results
|
|
in infinite recursion.
|
|
|
|
Introduce macro SYMBOL_VERSIONING and use it instead of plain SHARED to
|
|
decide whether symbol versioning is needed. Control this macro
|
|
definition with new configure option --disable-symbol-versioning.
|
|
|
|
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
|
|
Signed-off-by: Mark Wielaard <mjw@redhat.com>
|
|
---
|
|
Backported from: bafacacaf7659a4933604662daba26a480b29a8d
|
|
Changes to ChangeLogs are dropped.
|
|
|
|
config/eu.am | 10 ++++++++--
|
|
configure.ac | 7 +++++++
|
|
lib/eu-config.h | 6 +++---
|
|
libdwfl/core-file.c | 2 +-
|
|
libdwfl/dwfl_module_build_id.c | 2 +-
|
|
libdwfl/dwfl_report_elf.c | 2 +-
|
|
|
|
diff --git a/config/eu.am b/config/eu.am
|
|
index faf8add..6103a3e 100644
|
|
--- a/config/eu.am
|
|
+++ b/config/eu.am
|
|
@@ -38,16 +38,22 @@ AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 \
|
|
|
|
COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE))
|
|
|
|
+DEFS.os = -DPIC -DSHARED
|
|
+if SYMBOL_VERSIONING
|
|
+DEFS.os += -DSYMBOL_VERSIONING
|
|
+else
|
|
+endif
|
|
+
|
|
%.os: %.c %.o
|
|
if AMDEP
|
|
- if $(COMPILE.os) -c -o $@ -fpic -DPIC -DSHARED -MT $@ -MD -MP \
|
|
+ if $(COMPILE.os) -c -o $@ -fpic $(DEFS.os) -MT $@ -MD -MP \
|
|
-MF "$(DEPDIR)/$*.Tpo" `test -f '$<' || echo '$(srcdir)/'`$<; \
|
|
then cat "$(DEPDIR)/$*.Tpo" >> "$(DEPDIR)/$*.Po"; \
|
|
rm -f "$(DEPDIR)/$*.Tpo"; \
|
|
else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
|
|
fi
|
|
else
|
|
- $(COMPILE.os) -c -o $@ -fpic -DPIC -DSHARED $<
|
|
+ $(COMPILE.os) -c -o $@ -fpic $(DEFS.os) $<
|
|
endif
|
|
|
|
CLEANFILES = *.gcno *.gcda
|
|
diff --git a/configure.ac b/configure.ac
|
|
index ed2c964..be01573 100644
|
|
--- a/configure.ac
|
|
+++ b/configure.ac
|
|
@@ -241,6 +241,13 @@ AS_HELP_STRING([--disable-textrelcheck],
|
|
[Disable textrelcheck being a fatal error]))
|
|
AM_CONDITIONAL(FATAL_TEXTREL, [test "x$enable_textrelcheck" != "xno"])
|
|
|
|
+AC_ARG_ENABLE([symbol-versioning],
|
|
+AS_HELP_STRING([--disable-symbol-versioning],
|
|
+ [Disable symbol versioning in shared objects]))
|
|
+AM_CONDITIONAL(SYMBOL_VERSIONING, [test "x$enable_symbol_versioning" != "xno"])
|
|
+AS_IF([test "x$enable_symbol_versioning" = "xno"],
|
|
+ [AC_MSG_WARN([Disabling symbol versioning breaks ABI compatibility.])])
|
|
+
|
|
dnl The directories with content.
|
|
|
|
dnl Documentation.
|
|
diff --git a/lib/eu-config.h b/lib/eu-config.h
|
|
index 3afff26..5bb21c1 100644
|
|
--- a/lib/eu-config.h
|
|
+++ b/lib/eu-config.h
|
|
@@ -163,7 +163,7 @@ asm (".section predict_data, \"aw\"; .previous\n"
|
|
#define ELFUTILS_HEADER(name) <lib##name.h>
|
|
|
|
|
|
-#ifdef SHARED
|
|
+#ifdef SYMBOL_VERSIONING
|
|
# define OLD_VERSION(name, version) \
|
|
asm (".globl _compat." #version "." #name "\n" \
|
|
"_compat." #version "." #name " = " #name "\n" \
|
|
@@ -181,8 +181,8 @@ asm (".section predict_data, \"aw\"; .previous\n"
|
|
# define OLD_VERSION(name, version) /* Nothing for static linking. */
|
|
# define NEW_VERSION(name, version) /* Nothing for static linking. */
|
|
# define COMPAT_VERSION_NEWPROTO(name, version, prefix) \
|
|
- error "should use #ifdef SHARED"
|
|
-# define COMPAT_VERSION(name, version, prefix) error "should use #ifdef SHARED"
|
|
+ error "should use #ifdef SYMBOL_VERSIONING"
|
|
+# define COMPAT_VERSION(name, version, prefix) error "should use #ifdef SYMBOL_VERSIONING"
|
|
#endif
|
|
|
|
|
|
diff --git a/libdwfl/core-file.c b/libdwfl/core-file.c
|
|
index 324e9d2..bbe0899 100644
|
|
--- a/libdwfl/core-file.c
|
|
+++ b/libdwfl/core-file.c
|
|
@@ -588,7 +588,7 @@ dwfl_core_file_report (Dwfl *dwfl, Elf *elf, const char *executable)
|
|
INTDEF (dwfl_core_file_report)
|
|
NEW_VERSION (dwfl_core_file_report, ELFUTILS_0.158)
|
|
|
|
-#ifdef SHARED
|
|
+#ifdef SYMBOL_VERSIONING
|
|
int _compat_without_executable_dwfl_core_file_report (Dwfl *dwfl, Elf *elf);
|
|
COMPAT_VERSION_NEWPROTO (dwfl_core_file_report, ELFUTILS_0.146,
|
|
without_executable)
|
|
diff --git a/libdwfl/dwfl_module_build_id.c b/libdwfl/dwfl_module_build_id.c
|
|
index 350bbf8..c9a42ca 100644
|
|
--- a/libdwfl/dwfl_module_build_id.c
|
|
+++ b/libdwfl/dwfl_module_build_id.c
|
|
@@ -101,7 +101,7 @@ dwfl_module_build_id (Dwfl_Module *mod,
|
|
INTDEF (dwfl_module_build_id)
|
|
NEW_VERSION (dwfl_module_build_id, ELFUTILS_0.138)
|
|
|
|
-#ifdef SHARED
|
|
+#ifdef SYMBOL_VERSIONING
|
|
COMPAT_VERSION (dwfl_module_build_id, ELFUTILS_0.130, vaddr_at_end)
|
|
|
|
int
|
|
diff --git a/libdwfl/dwfl_report_elf.c b/libdwfl/dwfl_report_elf.c
|
|
index 3a4ae2e..624284c 100644
|
|
--- a/libdwfl/dwfl_report_elf.c
|
|
+++ b/libdwfl/dwfl_report_elf.c
|
|
@@ -321,7 +321,7 @@ dwfl_report_elf (Dwfl *dwfl, const char *name, const char *file_name, int fd,
|
|
INTDEF (dwfl_report_elf)
|
|
NEW_VERSION (dwfl_report_elf, ELFUTILS_0.156)
|
|
|
|
-#ifdef SHARED
|
|
+#ifdef SYMBOL_VERSIONING
|
|
Dwfl_Module *
|
|
_compat_without_add_p_vaddr_dwfl_report_elf (Dwfl *dwfl, const char *name,
|
|
const char *file_name, int fd,
|
|
--
|
|
1.8.1.4
|
|
|