From aa32c53332336f888cea1ad464a98e9103cad061 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Arkadiusz=20Mi=C5=9Bkiewicz?= Date: Sun, 15 Jul 2018 11:34:57 +0200 Subject: [PATCH] - rel 2; support ld -z separate-code generated binaries --- valgrind-3.13.0-ld-separate-code.patch | 93 ++++++++++++++++++++++++++ valgrind.spec | 4 +- 2 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 valgrind-3.13.0-ld-separate-code.patch diff --git a/valgrind-3.13.0-ld-separate-code.patch b/valgrind-3.13.0-ld-separate-code.patch new file mode 100644 index 0000000..a8f8a90 --- /dev/null +++ b/valgrind-3.13.0-ld-separate-code.patch @@ -0,0 +1,93 @@ +commit 3bce9544deab0261c7c55ccdc46ce1f36e468040 +Author: Mark Wielaard +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 and + H.J. Lu . + + 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); diff --git a/valgrind.spec b/valgrind.spec index 7d9d01a..81e5d03 100644 --- a/valgrind.spec +++ b/valgrind.spec @@ -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 -- 2.43.0