]> sourceware.org Git - valgrind.git/commitdiff
Bug 390871 - ELF debug info reader confused with multiple .rodata* sections
authorJogn Reiser <jreiser@bitwagon.com>
Sat, 7 Oct 2023 14:02:24 +0000 (16:02 +0200)
committerPaul Floyd <pjfloyd@wanadoo.fr>
Sun, 8 Oct 2023 07:40:07 +0000 (09:40 +0200)
NEWS
coregrind/m_debuginfo/readelf.c

diff --git a/NEWS b/NEWS
index 9a05f5486d3c84e7e00ae33358d02c47f73f209e..ad302827044a9c779ceba88c899f6a0fce890812 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -55,6 +55,7 @@ bugzilla (https://bugs.kde.org/enter_bug.cgi?product=valgrind) rather
 than mailing the developers (or mailing lists) directly -- bugs that
 are not entered into bugzilla tend to get forgotten about or ignored.
 
+390871  ELF debug info reader confused with multiple .rodata* sections
 426751  Valgrind reports "still reachable" memory using musl (alpine running inside docker)
 432801  Valgrind 3.16.1 reports a jump based on uninitialized memory somehow related to clang and signals
 433857  Add validation to C++17 aligned new/delete alignment size
index 9bb60f42ad558a9cad12cafde30958bb8fe59d4c..fb64ed9769d28e7f64762c8a34ebab8e353bc21f 100644 (file)
@@ -2334,7 +2334,7 @@ Bool ML_(read_elf_object) ( struct _DebugInfo* di )
          leave the relevant pointer at NULL. */
       RangeAndBias* inrx = NULL;
       RangeAndBias* inrw1 = NULL;
-      /* Depending on the link editro there may be two RW PT_LOAD headers
+      /* Depending on the link editor there may be two RW PT_LOAD headers
        * If so this will point to the seond one */
       RangeAndBias* inrw2 = NULL;
       /* used to switch between inrw1 and inrw2 */
@@ -2478,35 +2478,42 @@ Bool ML_(read_elf_object) ( struct _DebugInfo* di )
       }
 
       /* Accept .rodata where mapped as rx or rw (data), even if zero-sized */
-      if (0 == VG_(strcmp)(name, ".rodata")) {
-         if (!di->rodata_present) {
+      /* Also accept .rodata.<subr_name>, and aggregate adjacent after alignment. */
+      if (0 == VG_(strncmp)(name, ".rodata", 7)) {
+         if ((inrx||inrw1) && !di->rodata_present) { /* first .rodata* */
             di->rodata_svma = svma;
             di->rodata_avma = svma;
             di->rodata_size = size;
             di->rodata_debug_svma = svma;
-            if (inrx) {
-               di->rodata_avma += inrx->bias;
-               di->rodata_bias = inrx->bias;
-               di->rodata_debug_bias = inrx->bias;
-            } else if (inrw1) {
-               di->rodata_avma += inrw1->bias;
-               di->rodata_bias = inrw1->bias;
-               di->rodata_debug_bias = inrw1->bias;
+         } else if ((inrx||inrw1) && di->rodata_present) { /* not first .rodata* */
+            Addr tmp = VG_ROUNDUP(di->rodata_size + di->rodata_svma, alyn);
+            if (svma == tmp) { /* adjacent to previous .rodata* */
+               di->rodata_size = size + tmp - di->rodata_svma;
             } else {
-               BAD(".rodata");
+               BAD(".rodata"); /* is OK, but we cannot handle multiple .rodata* */
             }
-            di->rodata_present = True;
-            TRACE_SYMTAB("acquiring .rodata svma = %#lx .. %#lx\n",
-                         di->rodata_svma,
-                         di->rodata_svma + di->rodata_size - 1);
-            TRACE_SYMTAB("acquiring .rodata avma = %#lx .. %#lx\n",
-                         di->rodata_avma,
-                         di->rodata_avma + di->rodata_size - 1);
-            TRACE_SYMTAB("acquiring .rodata bias = %#lx\n",
-                         (UWord)di->rodata_bias);
-         } else {
-            BAD(".rodata");
          }
+         if (inrx) {
+            di->rodata_avma += inrx->bias;
+            di->rodata_bias = inrx->bias;
+            di->rodata_debug_bias = inrx->bias;
+         } else if (inrw1) {
+            di->rodata_avma += inrw1->bias;
+            di->rodata_bias = inrw1->bias;
+            di->rodata_debug_bias = inrw1->bias;
+         }
+         else {
+            BAD(".rodata");  /* should not happen? */
+         }
+         di->rodata_present = True;
+         TRACE_SYMTAB("acquiring .rodata svma = %#lx .. %#lx\n",
+                      di->rodata_svma,
+                      di->rodata_svma + di->rodata_size - 1);
+         TRACE_SYMTAB("acquiring .rodata avma = %#lx .. %#lx\n",
+                      di->rodata_avma,
+                      di->rodata_avma + di->rodata_size - 1);
+         TRACE_SYMTAB("acquiring .rodata bias = %#lx\n",
+                      (UWord)di->rodata_bias);
       }
 
       if (0 == VG_(strcmp)(name, ".dynbss")) {
This page took 0.03742 seconds and 5 git commands to generate.