This has been tested on SPARC, i386, PowerPC and ARM.
Closes #2767.
---
.../sparc/erc32/make/custom/erc32-testsuite.tcfg | 4 -
cpukit/libdl/Makefile.am | 1 +
cpukit/libdl/dlfcn.c | 2 +-
cpukit/libdl/rtl-allocator.c | 26 ++-
cpukit/libdl/rtl-allocator.h | 7 +-
cpukit/libdl/rtl-debugger.c| 14 +-
cpukit/libdl/rtl-elf.c | 94 +++
cpukit/libdl/rtl-elf.h | 26 ++-
cpukit/libdl/rtl-error.c | 17 +-
cpukit/libdl/rtl-mdreloc-arm.c | 147 +++--
cpukit/libdl/rtl-mdreloc-bfin.c| 29
cpukit/libdl/rtl-mdreloc-h8300.c | 29
cpukit/libdl/rtl-mdreloc-i386.c| 29
cpukit/libdl/rtl-mdreloc-lm32.c| 29
cpukit/libdl/rtl-mdreloc-m68k.c| 29
cpukit/libdl/rtl-mdreloc-mips.c| 29
cpukit/libdl/rtl-mdreloc-moxie.c | 29
cpukit/libdl/rtl-mdreloc-powerpc.c | 43 +
cpukit/libdl/rtl-mdreloc-sparc.c | 43 -
cpukit/libdl/rtl-mdreloc-v850.c| 29
cpukit/libdl/rtl-obj.c | 178 +
cpukit/libdl/rtl-obj.h | 169 +++
cpukit/libdl/rtl-rap.c | 55 ---
cpukit/libdl/rtl-rap.h | 7 +
cpukit/libdl/rtl-unwind-dw2.c | 71
cpukit/libdl/rtl-unwind-dw2.h | 83 ++
cpukit/libdl/rtl-unwind.h | 63
cpukit/libdl/rtl.c | 33 +++-
cpukit/libdl/rtl.h | 2 +-
testsuites/libtests/dl01/init.c| 3 +-
testsuites/libtests/dl02/init.c| 2 +
testsuites/libtests/dl03/init.c| 2 +
testsuites/libtests/dl04/init.c| 2 +
testsuites/libtests/dl05/dl-cpp.cpp| 24 ++-
testsuites/libtests/dl05/dl-load.c | 34 ++--
testsuites/libtests/dl05/dl-load.h | 30 +++-
testsuites/libtests/dl05/dl-o5.cpp | 15 +-
testsuites/libtests/dl05/init.c| 8 +-
38 files changed, 1182 insertions(+), 255 deletions(-)
delete mode 100644
c/src/lib/libbsp/sparc/erc32/make/custom/erc32-testsuite.tcfg
create mode 100644 cpukit/libdl/rtl-unwind-dw2.c
create mode 100644 cpukit/libdl/rtl-unwind-dw2.h
create mode 100644 cpukit/libdl/rtl-unwind.h
diff --git a/c/src/lib/libbsp/sparc/erc32/make/custom/erc32-testsuite.tcfg
b/c/src/lib/libbsp/sparc/erc32/make/custom/erc32-testsuite.tcfg
deleted file mode 100644
index cee7ce5..000
--- a/c/src/lib/libbsp/sparc/erc32/make/custom/erc32-testsuite.tcfg
+++ /dev/null
@@ -1,4 +0,0 @@
-#
-# Excpected failures.
-#
-expected-fail: dl05
diff --git a/cpukit/libdl/Makefile.am b/cpukit/libdl/Makefile.am
index 5c3cd15..b21c167 100644
--- a/cpukit/libdl/Makefile.am
+++ b/cpukit/libdl/Makefile.am
@@ -25,6 +25,7 @@ libdl_a_SOURCES = \
rtl-string.c \
rtl-sym.c \
rtl-trace.c \
+ rtl-unwind-dw2.c \
rtl-unresolved.c
libdl_a_SOURCES += rtl-mdreloc-@RTEMS_CPU@.c
diff --git a/cpukit/libdl/dlfcn.c b/cpukit/libdl/dlfcn.c
index 19feaaf..3b31bb2 100644
--- a/cpukit/libdl/dlfcn.c
+++ b/cpukit/libdl/dlfcn.c
@@ -130,7 +130,7 @@ dlerror (void)
{
static char msg[64];
rtems_rtl_get_error (msg, sizeof (msg));
- return msg;
+ return msg;
}
int
diff --git a/cpukit/libdl/rtl-allocator.c b/cpukit/libdl/rtl-allocator.c
index 9880940..39b4bcd 100644
--- a/cpukit/libdl/rtl-allocator.c
+++ b/cpukit/libdl/rtl-allocator.c
@@ -152,6 +152,7 @@ rtems_rtl_alloc_indirect_del (rtems_rtl_alloc_tag_t tag,
bool
rtems_rtl_alloc_module_new (void** text_base, size_t text_size,
void** const_base, size_t const_size,
+void** eh_base, size_t eh_size,
void** data_base, size_t data_size,
void** bss_base, size_t bss_size)
{
@@ -173,7 +174,20 @@ rtems_rtl_alloc_module_new (void** text_base, size_t
text_size,
const_size, false);
if (!*const_base)
{
- rtems_rtl_alloc_module_del (text_base, const_base, data_base, bss_base);
+ rtems_rtl_alloc_module_del (text_base, const_base, eh_base,
+ data_base, bss_base);
+ return false;
+}
+ }
+
+ if (eh_size)
+ {
+*eh_base = rtems_rtl_alloc_new (RTEMS_RTL_ALLOC_READ,
+eh_size, false);
+if (!*eh_base)
+{
+ rtems_rtl_alloc_module_del (text_base, const_base, eh_base,
+