Hi ports, The Valgrind specifies 'READ | WRITE | EXEC' when allocating memory for target program as follows:
int fd = open("a.out", O_RDONLY); void *addr = mmap(..., prot = PROT_READ | PROT_WRITE | PROT_EXEC, ...); read(fd, addr, LENGTH); /* Execute target program */ I modified to specify 'READ | EXEC' after readind the target program as folloes: int fd = open("a.out", O_RDONLY); void *addr = mmap(..., prot = PROT_READ | PROT_WRITE, ...); read(fd, addr, LENGTH); mmap(addr, LENGTH, prot = PROT_READ | PROT_EXEC, ...); /* Execute target program */ Therefor, the target program area can not be rewritten. How about it? -- ASOU Masato Index: Makefile =================================================================== RCS file: /cvs/ports/devel/valgrind/Makefile,v retrieving revision 1.21 diff -u -p -r1.21 Makefile --- Makefile 23 Oct 2019 02:35:05 -0000 1.21 +++ Makefile 25 Oct 2019 04:23:10 -0000 @@ -1,7 +1,5 @@ # $OpenBSD: Makefile,v 1.21 2019/10/23 02:35:05 asou Exp $ -USE_WXNEEDED = Yes - ONLY_FOR_ARCHS = amd64 COMMENT = instrumentation framework for dynamic analysis tools Index: patches/patch-coregrind_link_tool_exe_openbsd_in =================================================================== RCS file: /cvs/ports/devel/valgrind/patches/patch-coregrind_link_tool_exe_openbsd_in,v retrieving revision 1.3 diff -u -p -r1.3 patch-coregrind_link_tool_exe_openbsd_in --- patches/patch-coregrind_link_tool_exe_openbsd_in 2 Oct 2019 17:19:29 -0000 1.3 +++ patches/patch-coregrind_link_tool_exe_openbsd_in 25 Oct 2019 04:23:10 -0000 @@ -5,12 +5,12 @@ system(sprintf "sed -e 's|%x|%x|g' < $ldscript > $temp", $origbase, $notebase); -my $cmd = sprintf "$cc -static -nopie -Wl,-Ttext=0x%x -Wl,-T,$temp", $textbase; -+my $cmd = sprintf "$cc -static -nopie -Wl,--strip-all -Wl,-zwxneeded -Wl,-Ttext=0x%x -Wl,-T,$temp", $textbase; +# XXX The '-s' option was not specified when executing the install command. +# Instead '--strip-all' is now executed at link time. +# strip command rewrite offset and align in ELF file. Therefor, when valgrind +# launch memcheck-amd64-openbsd, an Abort trap occurs in the execvp() system +# call. ++my $cmd = sprintf "$cc -static -nopie -Wl,--strip-all -Wl,-Ttext=0x%x -Wl,-T,$temp", $textbase; # Add the rest of the parameters foreach my $n (2 .. $#ARGV) { Index: patches/patch-coregrind_m_aspacemgr_aspacemgr-linux_c =================================================================== RCS file: /cvs/ports/devel/valgrind/patches/patch-coregrind_m_aspacemgr_aspacemgr-linux_c,v retrieving revision 1.1 diff -u -p -r1.1 patch-coregrind_m_aspacemgr_aspacemgr-linux_c --- patches/patch-coregrind_m_aspacemgr_aspacemgr-linux_c 2 Oct 2019 17:19:29 -0000 1.1 +++ patches/patch-coregrind_m_aspacemgr_aspacemgr-linux_c 25 Oct 2019 04:23:10 -0000 @@ -1,5 +1,17 @@ --- coregrind/m_aspacemgr/aspacemgr-linux.c.orig +++ coregrind/m_aspacemgr/aspacemgr-linux.c +@@ -2498,7 +2498,11 @@ + a client request to call the outer VG_(am_get_advisory). */ + sres = VG_(am_do_mmap_NO_NOTIFY)( + advised, length, ++#if defined(__OpenBSD__) ++ VKI_PROT_READ|VKI_PROT_WRITE, ++#else + VKI_PROT_READ|VKI_PROT_WRITE|VKI_PROT_EXEC, ++#endif + VKI_MAP_FIXED|VKI_MAP_PRIVATE|VKI_MAP_ANONYMOUS, + VM_TAG_VALGRIND, 0 + ); @@ -2543,6 +2543,54 @@ SysRes VG_(am_mmap_anon_float_valgrind)( SizeT length ) return sres; } @@ -30,7 +42,7 @@ + any resulting failure immediately. */ + sres = VG_(am_do_mmap_NO_NOTIFY)( + advised, length, -+ VKI_PROT_READ|VKI_PROT_WRITE|VKI_PROT_EXEC, ++ VKI_PROT_READ|VKI_PROT_WRITE, + VKI_MAP_PRIVATE|VKI_MAP_ANONYMOUS|VKI_MAP_STACK, + VM_TAG_VALGRIND, 0 + ); Index: patches/patch-coregrind_m_initimg_initimg-openbsd_c =================================================================== RCS file: /cvs/ports/devel/valgrind/patches/patch-coregrind_m_initimg_initimg-openbsd_c,v retrieving revision 1.1 diff -u -p -r1.1 patch-coregrind_m_initimg_initimg-openbsd_c --- patches/patch-coregrind_m_initimg_initimg-openbsd_c 4 Feb 2019 23:34:10 -0000 1.1 +++ patches/patch-coregrind_m_initimg_initimg-openbsd_c 25 Oct 2019 04:23:10 -0000 @@ -12,3 +12,21 @@ Index: coregrind/m_initimg/initimg-openb /* --- !!! --- EXTERNAL HEADERS end --- !!! --- */ +@@ -575,7 +575,7 @@ + res = VG_(am_mmap_anon_fixed_client)( + anon_start -inner_HACK, + anon_size +inner_HACK, +- VKI_PROT_READ|VKI_PROT_WRITE|VKI_PROT_EXEC ++ VKI_PROT_READ|VKI_PROT_WRITE + ); + } + if ((!ok) || sr_isError(res)) { +@@ -758,7 +758,7 @@ + sres = VG_(am_mmap_anon_fixed_client)( + anon_start, + anon_size, +- VKI_PROT_READ|VKI_PROT_WRITE|VKI_PROT_EXEC ++ VKI_PROT_READ|VKI_PROT_WRITE + ); + vg_assert(!sr_isError(sres)); + vg_assert(sr_Res(sres) == anon_start); Index: patches/patch-coregrind_m_mallocfree_c =================================================================== RCS file: patches/patch-coregrind_m_mallocfree_c diff -N patches/patch-coregrind_m_mallocfree_c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-coregrind_m_mallocfree_c 25 Oct 2019 04:23:10 -0000 @@ -0,0 +1,14 @@ +--- coregrind/m_mallocfree.c.orig ++++ coregrind/m_mallocfree.c +@@ -854,7 +854,11 @@ + if (a->clientmem) { + // client allocation -- return 0 to client if it fails + sres = VG_(am_mmap_anon_float_client) ++#if defined(__OpenBSD__) ++ ( cszB, VKI_PROT_READ|VKI_PROT_WRITE ); ++#else + ( cszB, VKI_PROT_READ|VKI_PROT_WRITE|VKI_PROT_EXEC ); ++#endif + if (sr_isError(sres)) + return 0; + sb = (Superblock*)(AddrH)sr_Res(sres); Index: patches/patch-coregrind_m_scheduler_scheduler_c =================================================================== RCS file: /cvs/ports/devel/valgrind/patches/patch-coregrind_m_scheduler_scheduler_c,v retrieving revision 1.1 diff -u -p -r1.1 patch-coregrind_m_scheduler_scheduler_c --- patches/patch-coregrind_m_scheduler_scheduler_c 2 Oct 2019 17:19:29 -0000 1.1 +++ patches/patch-coregrind_m_scheduler_scheduler_c 25 Oct 2019 04:23:10 -0000 @@ -1,74 +0,0 @@ ---- coregrind/m_scheduler/scheduler.c.orig -+++ coregrind/m_scheduler/scheduler.c -@@ -854,6 +854,9 @@ void run_thread_for_a_while ( /*OUT*/HWord* two_words, - volatile ThreadState* tst = NULL; /* stop gcc complaining */ - volatile Int done_this_time = 0; - volatile HWord host_code_addr = 0; -+#if defined(__OpenBSD__) -+ volatile UInt host_code_len = 0; -+#endif - - /* Paranoia */ - vg_assert(VG_(is_valid_tid)(tid)); -@@ -879,8 +882,15 @@ void run_thread_for_a_while ( /*OUT*/HWord* two_words, - } else { - /* normal case -- redir translation */ - UInt cno = (UInt)VG_TT_FAST_HASH((Addr)tst->arch.vex.VG_INSTR_PTR); -+#if defined(__OpenBSD__) -+ if (LIKELY(VG_(tt_fast)[cno].guest == (Addr)tst->arch.vex.VG_INSTR_PTR)) { -+ host_code_addr = VG_(tt_fast)[cno].host; -+ host_code_len = VG_(tt_fast)[cno].len; -+ } -+#else - if (LIKELY(VG_(tt_fast)[cno].guest == (Addr)tst->arch.vex.VG_INSTR_PTR)) - host_code_addr = VG_(tt_fast)[cno].host; -+#endif - else { - AddrH res = 0; - /* not found in VG_(tt_fast). Searching here the transtab -@@ -932,6 +942,22 @@ void run_thread_for_a_while ( /*OUT*/HWord* two_words, - vg_assert(VG_(in_generated_code) == False); - VG_(in_generated_code) = True; - -+#if defined(__OpenBSD__) -+ if (host_code_len > 0) { -+ SysRes sres; -+ -+ /* Protect the guard areas. */ -+ sres = VG_(am_do_mprotect_NO_NOTIFY)( -+ host_code_addr, host_code_len, -+ VKI_PROT_READ | VKI_PROT_EXEC -+ ); -+ if (sr_isError(sres)) { -+ VG_(printf)("valgrind: m_ume.c: mprotect failed\n"); -+ vg_assert(0); -+ } -+ } -+#endif -+ - SCHEDSETJMP( - tid, - jumped, -@@ -942,6 +968,22 @@ void run_thread_for_a_while ( /*OUT*/HWord* two_words, - ) - ); - -+#if defined(__OpenBSD__) -+ if (host_code_len > 0) { -+ SysRes sres; -+ -+ /* Protect the guard areas. */ -+ sres = VG_(am_do_mprotect_NO_NOTIFY)( -+ host_code_addr, host_code_len, -+ VKI_PROT_READ | VKI_PROT_WRITE | VKI_PROT_EXEC -+ ); -+ if (sr_isError(sres)) { -+ VG_(printf)("valgrind: m_ume.c: mprotect failed\n"); -+ vg_assert(0); -+ } -+ } -+#endif -+ - vg_assert(VG_(in_generated_code) == True); - VG_(in_generated_code) = False; - Index: patches/patch-coregrind_m_transtab_c =================================================================== RCS file: /cvs/ports/devel/valgrind/patches/patch-coregrind_m_transtab_c,v retrieving revision 1.1 diff -u -p -r1.1 patch-coregrind_m_transtab_c --- patches/patch-coregrind_m_transtab_c 2 Oct 2019 17:19:29 -0000 1.1 +++ patches/patch-coregrind_m_transtab_c 25 Oct 2019 04:23:10 -0000 @@ -1,60 +1,95 @@ --- coregrind/m_transtab.c.orig Wed Nov 26 04:41:21 2014 +++ coregrind/m_transtab.c Mon Dec 10 17:05:02 2018 -@@ -1322,11 +1321,18 @@ - return k32 % N_TTES_PER_SECTOR; - } +@@ -749,6 +749,10 @@ + /* Get the CPU info established at startup. */ + VexArch arch_host = VexArch_INVALID; + VexArchInfo archinfo_host; ++#if defined(__OpenBSD__) ++ UInt len; ++ SysRes sres; ++#endif + VG_(bzero_inline)(&archinfo_host, sizeof(archinfo_host)); + VG_(machine_get_VexArchInfo)( &arch_host, &archinfo_host ); + VexEndness endness_host = archinfo_host.endness; +@@ -789,6 +793,18 @@ + + TTEntry* from_tte = index_tte(from_sNo, from_tteNo); +#if defined(__OpenBSD__) -+static void setFastCacheEntry ( Addr64 key, ULong* tcptr, UInt len ) -+#else - static void setFastCacheEntry ( Addr64 key, ULong* tcptr ) -+#endif - { - UInt cno = (UInt)VG_TT_FAST_HASH(key); - VG_(tt_fast)[cno].guest = (Addr)key; - VG_(tt_fast)[cno].host = (Addr)tcptr; -+#if defined(__OpenBSD__) -+ VG_(tt_fast)[cno].len = (Addr)len; -+#endif - n_fast_updates++; - /* This shouldn't fail. It should be assured by m_translate - which should reject any attempt to make translation of code -@@ -1670,7 +1676,11 @@ - } ++ /* Protect the host code areas. */ ++ len = (Long)sectors[to_sNo].tc_next - (Long)host_code; ++ sres = VG_(am_do_mprotect_NO_NOTIFY)( ++ (Addr)sectors[to_sNo].tc, 8 * tc_sector_szQ, VKI_PROT_READ | VKI_PROT_WRITE ++ ); ++ if (sr_isError(sres)) { ++ VG_(printf)("valgrind: m_ume.c: mprotect failed\n"); ++ vg_assert(0); ++ } ++#endif ++ + /* Get VEX to do the patching itself. We have to hand it off + since it is host-dependent. */ + VexInvalRange vir +@@ -802,6 +818,17 @@ + ); + VG_(invalidate_icache)( (void*)vir.start, vir.len ); - /* Update the fast-cache. */ +#if defined(__OpenBSD__) -+ setFastCacheEntry( entry, tcptr, code_len ); -+#else - setFastCacheEntry( entry, tcptr ); ++ /* Protect the host code areas. */ ++ sres = VG_(am_do_mprotect_NO_NOTIFY)( ++ (Addr)sectors[to_sNo].tc, 8 * tc_sector_szQ, VKI_PROT_READ | VKI_PROT_EXEC ++ ); ++ if (sr_isError(sres)) { ++ VG_(printf)("valgrind: m_ume.c: mprotect failed\n"); ++ vg_assert(0); ++ } ++#endif ++ + /* Now do the tricky bit -- update the ch_succs and ch_preds info + for the two translations involved, so we can undo the chaining + later, which we will have to do if the to_ block gets removed +@@ -1530,6 +1550,9 @@ + ULong *tcptr, *tcptr2; + UChar* srcP; + UChar* dstP; ++#if defined(__OpenBSD__) ++ SysRes sres; +#endif - /* Note the eclass numbers for this translation. */ - upd_eclasses_after_add( §ors[y], i ); -@@ -1712,8 +1722,13 @@ - && sectors[sno].tt[k].entry == guest_addr) { - /* found it */ - if (upd_cache) -+#if defined(__OpenBSD__) -+ setFastCacheEntry( -+ guest_addr, sectors[sno].tt[k].tcptr, 0 ); -+#else - setFastCacheEntry( - guest_addr, sectors[sno].tt[k].tcptr ); -+#endif - if (res_hcode) - *res_hcode = (AddrH)sectors[sno].tt[k].tcptr; - if (res_sNo) -@@ -2204,7 +2219,12 @@ - vg_assert(sizeof(Addr64) == 8); - /* check fast cache entries really are 2 words long */ - vg_assert(sizeof(Addr) == sizeof(void*)); -+#if defined(__OpenBSD__) -+ vg_assert(sizeof(FastCacheEntry) == -+ (2 * sizeof(Addr) + (2 * sizeof (UInt)))); -+#else - vg_assert(sizeof(FastCacheEntry) == 2 * sizeof(Addr)); -+#endif - /* check fast cache entries are packed back-to-back with no spaces */ - vg_assert(sizeof( VG_(tt_fast) ) == VG_TT_FAST_SIZE * sizeof(FastCacheEntry)); - /* check fast cache is aligned as we requested. Not fatal if it + vg_assert(init_done); + vg_assert(vge->n_used >= 1 && vge->n_used <= 3); +@@ -1629,12 +1629,34 @@ + tcptr = sectors[y].tc_next; + vg_assert(tcptr >= §ors[y].tc[0]); + vg_assert(tcptr <= §ors[y].tc[tc_sector_szQ]); ++ ++#if defined(__OpenBSD__) ++ /* Protect the host code areas. */ ++ sres = VG_(am_do_mprotect_NO_NOTIFY)( ++ (Addr)sectors[y].tc, 8 * tc_sector_szQ, VKI_PROT_READ | VKI_PROT_WRITE ++ ); ++ if (sr_isError(sres)) { ++ VG_(printf)("valgrind: m_ume.c: mprotect failed\n"); ++ vg_assert(0); ++ } ++#endif + + dstP = (UChar*)tcptr; + srcP = (UChar*)code; + VG_(memcpy)(dstP, srcP, code_len); + sectors[y].tc_next += reqdQ; + sectors[y].tt_n_inuse++; ++ ++#if defined(__OpenBSD__) ++ /* Protect the host code areas. */ ++ sres = VG_(am_do_mprotect_NO_NOTIFY)( ++ (Addr)sectors[y].tc, 8 * tc_sector_szQ, VKI_PROT_READ | VKI_PROT_EXEC ++ ); ++ if (sr_isError(sres)) { ++ VG_(printf)("valgrind: m_ume.c: mprotect failed\n"); ++ vg_assert(0); ++ } ++#endif + + /* more paranoia */ + tcptr2 = sectors[y].tc_next; Index: patches/patch-coregrind_pub_core_transtab_h =================================================================== RCS file: /cvs/ports/devel/valgrind/patches/patch-coregrind_pub_core_transtab_h,v retrieving revision 1.1 diff -u -p -r1.1 patch-coregrind_pub_core_transtab_h --- patches/patch-coregrind_pub_core_transtab_h 2 Oct 2019 17:19:29 -0000 1.1 +++ patches/patch-coregrind_pub_core_transtab_h 25 Oct 2019 04:23:10 -0000 @@ -1,12 +0,0 @@ ---- coregrind/pub_core_transtab.h.orig -+++ coregrind/pub_core_transtab.h -@@ -45,6 +45,9 @@ typedef - struct { - Addr guest; - Addr host; -+#if defined(__OpenBSD__) -+ UInt len; -+#endif - } - FastCacheEntry; -