[rtems commit] libdl/arm: Fix ARM mode trampoline parsing of relocs

Chris Johns chrisj at rtems.org
Sat Jul 27 23:17:08 UTC 2019


Module:    rtems
Branch:    master
Commit:    5a678de90ccbce64ff7c39a6a660019494f2a770
Changeset: http://git.rtems.org/rtems/commit/?id=5a678de90ccbce64ff7c39a6a660019494f2a770

Author:    Chris Johns <chrisj at rtems.org>
Date:      Sun Jul 28 09:12:53 2019 +1000

libdl/arm: Fix ARM mode trampoline parsing of relocs

- No need to dump globals syms in test dl01 when tracing

Closes #3775

---

 cpukit/libdl/rtl-mdreloc-arm.c     | 32 ++++++++++++++++----------------
 testsuites/libtests/dl01/dl-load.c |  1 -
 2 files changed, 16 insertions(+), 17 deletions(-)

diff --git a/cpukit/libdl/rtl-mdreloc-arm.c b/cpukit/libdl/rtl-mdreloc-arm.c
index 4d5a245..9e5d66e 100644
--- a/cpukit/libdl/rtl-mdreloc-arm.c
+++ b/cpukit/libdl/rtl-mdreloc-arm.c
@@ -279,32 +279,32 @@ rtems_rtl_elf_reloc_rel (rtems_rtl_obj*            obj,
     case R_TYPE(V4BX):
       /* Miscellaneous, ignore */
       if (!parsing && rtems_rtl_trace (RTEMS_RTL_TRACE_RELOC)) {
-        printf ("rtl: V4BX %p @ %p in %s\n",
-                (void *)*where, where, rtems_rtl_obj_oname (obj));
+        printf ("rtl: V4BX @ %p in %s\n",
+                where, rtems_rtl_obj_oname (obj));
       }
       break;
 
     case R_TYPE(MOVT_ABS):
     case R_TYPE(MOVW_ABS_NC):
-      insn = *where;
+      if (!parsing) {
+        insn = *where;
 
-      addend = ((insn >> 4) & 0xf000) | (insn & 0x0fff);
-      if (addend & 0x8000)
-        addend |= 0xffff0000;
+        addend = ((insn >> 4) & 0xf000) | (insn & 0x0fff);
+        if (addend & 0x8000)
+          addend |= 0xffff0000;
 
-      tmp = symvalue + addend;
+        tmp = symvalue + addend;
 
-      if (ELF_R_TYPE(rel->r_info) == R_TYPE(MOVW_ABS_NC))
-        tmp &= 0xffff;
-      else {
-        tmp = (Elf_Sword)tmp >> 16;
-        if (((Elf_Sword)tmp > 0x7fff) || ((Elf_Sword)tmp < -0x8000)) {
-          printf("MOVT_ABS Overflow\n");
-          return rtems_rtl_elf_rel_failure;
+        if (ELF_R_TYPE(rel->r_info) == R_TYPE(MOVW_ABS_NC))
+          tmp &= 0xffff;
+        else {
+          tmp = (Elf_Sword)tmp >> 16;
+          if (((Elf_Sword)tmp > 0x7fff) || ((Elf_Sword)tmp < -0x8000)) {
+            printf("MOVT_ABS Overflow\n");
+            return rtems_rtl_elf_rel_failure;
+          }
         }
-      }
 
-      if (!parsing) {
         *where = (insn & 0xfff0f000) | ((tmp & 0xf000) << 4) | (tmp & 0xfff);
 
         if (rtems_rtl_trace (RTEMS_RTL_TRACE_RELOC))
diff --git a/testsuites/libtests/dl01/dl-load.c b/testsuites/libtests/dl01/dl-load.c
index f807d2a..d93550d 100644
--- a/testsuites/libtests/dl01/dl-load.c
+++ b/testsuites/libtests/dl01/dl-load.c
@@ -26,7 +26,6 @@
                       RTEMS_RTL_TRACE_ALLOCATOR | \
                       RTEMS_RTL_TRACE_UNRESOLVED | \
                       RTEMS_RTL_TRACE_ARCHIVES | \
-                      RTEMS_RTL_TRACE_GLOBAL_SYM | \
                       RTEMS_RTL_TRACE_DEPENDENCY)
  #define DL_DEBUG_TRACE DEBUG_TRACE /* RTEMS_RTL_TRACE_ALL */
  #define DL_RTL_CMDS    1



More information about the vc mailing list