- rel 2; support ld -z separate-code generated binaries auto/th/valgrind-3.13.0-2
authorArkadiusz Miśkiewicz <arekm@maven.pl>
Sun, 15 Jul 2018 09:34:57 +0000 (11:34 +0200)
committerArkadiusz Miśkiewicz <arekm@maven.pl>
Sun, 15 Jul 2018 09:34:57 +0000 (11:34 +0200)
valgrind-3.13.0-ld-separate-code.patch [new file with mode: 0644]
valgrind.spec

diff --git a/valgrind-3.13.0-ld-separate-code.patch b/valgrind-3.13.0-ld-separate-code.patch
new file mode 100644 (file)
index 0000000..a8f8a90
--- /dev/null
@@ -0,0 +1,93 @@
+commit 3bce9544deab0261c7c55ccdc46ce1f36e468040
+Author: Mark Wielaard <mark@klomp.org>
+Date:   Thu Jul 12 13:56:00 2018 +0200
+
+    Accept read-only PT_LOAD segments and .rodata.
+    
+    The new binutils ld -z separate-code option creates multiple read-only
+    PT_LOAD segments and might place .rodata in a non-executable segment.
+    
+    Allow and keep track of separate read-only segments and allow a readonly
+    page with .rodata section.
+    
+    Based on patches from Tom Hughes <tom@compton.nu> and
+    H.J. Lu <hjl.tools@gmail.com>.
+    
+    https://bugs.kde.org/show_bug.cgi?id=395682
+
+index 13991b6..c36d498 100644
+--- a/coregrind/m_debuginfo/debuginfo.c
++++ b/coregrind/m_debuginfo/debuginfo.c
+@@ -1126,9 +1126,7 @@ ULong VG_(di_notify_mmap)( Addr a, Bool allow_SkFileV, Int use_fd )
+ #    error "Unknown platform"
+ #  endif
+-#  if defined(VGP_x86_darwin) && DARWIN_VERS >= DARWIN_10_7
+    is_ro_map = seg->hasR && !seg->hasW && !seg->hasX;
+-#  endif
+ #  if defined(VGO_solaris)
+    is_rx_map = seg->hasR && seg->hasX && !seg->hasW;
+diff --git a/coregrind/m_debuginfo/readelf.c b/coregrind/m_debuginfo/readelf.c
+index 62192f0..95b97d6 100644
+--- a/coregrind/m_debuginfo/readelf.c
++++ b/coregrind/m_debuginfo/readelf.c
+@@ -1881,7 +1881,7 @@ Bool ML_(read_elf_debug_info) ( struct _DebugInfo* di )
+                Bool loaded = False;
+                for (j = 0; j < VG_(sizeXA)(di->fsm.maps); j++) {
+                   const DebugInfoMapping* map = VG_(indexXA)(di->fsm.maps, j);
+-                  if (   (map->rx || map->rw)
++                  if (   (map->rx || map->rw || map->ro)
+                       && map->size > 0 /* stay sane */
+                       && a_phdr.p_offset >= map->foff
+                       && a_phdr.p_offset <  map->foff + map->size
+@@ -1912,6 +1912,16 @@ Bool ML_(read_elf_debug_info) ( struct _DebugInfo* di )
+                            i, (UWord)item.bias);
+                         loaded = True;
+                      }
++                     if (map->ro
++                         && (a_phdr.p_flags & (PF_R | PF_W | PF_X))
++                            == PF_R) {
++                        item.exec = False;
++                        VG_(addToXA)(svma_ranges, &item);
++                        TRACE_SYMTAB(
++                           "PT_LOAD[%ld]:   acquired as ro, bias 0x%lx\n",
++                           i, (UWord)item.bias);
++                        loaded = True;
++                     }
+                   }
+                }
+                if (!loaded) {
+@@ -2179,17 +2189,25 @@ Bool ML_(read_elf_debug_info) ( struct _DebugInfo* di )
+          }
+       }
+-      /* Accept .rodata where mapped as rx (data), even if zero-sized */
++      /* Accept .rodata where mapped as rx or rw (data), even if zero-sized */
+       if (0 == VG_(strcmp)(name, ".rodata")) {
+-         if (inrx && !di->rodata_present) {
+-            di->rodata_present = True;
++         if (!di->rodata_present) {
+             di->rodata_svma = svma;
+-            di->rodata_avma = svma + inrx->bias;
++            di->rodata_avma = svma;
+             di->rodata_size = size;
+-            di->rodata_bias = inrx->bias;
+             di->rodata_debug_svma = svma;
+-            di->rodata_debug_bias = inrx->bias;
+-                                    /* NB was 'inrw' prior to r11794 */
++            if (inrx) {
++               di->rodata_avma += inrx->bias;
++               di->rodata_bias = inrx->bias;
++               di->rodata_debug_bias = inrx->bias;
++            } else if (inrw) {
++               di->rodata_avma += inrw->bias;
++               di->rodata_bias = inrw->bias;
++               di->rodata_debug_bias = inrw->bias;
++            } else {
++               BAD(".rodata");
++            }
++            di->rodata_present = True;
+             TRACE_SYMTAB("acquiring .rodata svma = %#lx .. %#lx\n",
+                          di->rodata_svma,
+                          di->rodata_svma + di->rodata_size - 1);
index 7d9d01aa0006b3af8b0e020e9467a39b7f968fbf..81e5d03d0c355f805c5b075f57fa105f72a3ad16 100644 (file)
@@ -8,13 +8,14 @@ Summary:      An open-source memory debugger
 Summary(pl.UTF-8):     Otwarty odpluskwiacz pamięci
 Name:          valgrind
 Version:       3.13.0
-Release:       1
+Release:       2
 License:       GPL v2+
 Group:         Development/Tools
 Source0:       ftp://sourceware.org/pub/valgrind/%{name}-%{version}.tar.bz2
 # Source0-md5: 817dd08f1e8a66336b9ff206400a5369
 Patch0:                %{name}-native-cpuid.patch
 Patch1:                %{name}-ld_linux_strlen.patch
+Patch2:                valgrind-3.13.0-ld-separate-code.patch
 URL:           http://valgrind.org/
 BuildRequires: autoconf >= 2.50
 BuildRequires: automake >= 1:1.10
@@ -57,6 +58,7 @@ pracować.
 %setup -q
 %patch0 -p1
 %patch1 -p1
+%patch2 -p1
 
 sed -i -e 's:^CFLAGS="-Wno-long-long":CFLAGS="$CFLAGS -Wno-long-long":' configure.ac
 
This page took 0.067797 seconds and 4 git commands to generate.