From: Ivo Raisr Date: Fri, 12 Aug 2016 22:28:50 +0000 (+0000) Subject: Follow recent Solaris development with respect to X-Git-Tag: svn/VALGRIND_3_12_0~87 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6260274e4ed84f02d3fbe73adbd3b65893e73bd8;p=thirdparty%2Fvalgrind.git Follow recent Solaris development with respect to SUNWDTRACE program header. Newer Solaris no longer utilizes this program header as a scratchspace for DTrace fasttrap provider, before libc is loaded. For the time being, it serves as a space for initial thread pointer. n-i-bz git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15936 --- diff --git a/configure.ac b/configure.ac index da433137b9..4ebea04535 100644 --- a/configure.ac +++ b/configure.ac @@ -3649,6 +3649,29 @@ AC_DEFINE([SOLARIS_SCHEDCTL_PAGE_EXEC], 1, [Define to 1 if you have the schedctl page executable.]) ]) + +# Solaris-specific check determining if PT_SUNWDTRACE program header provides +# scratch space for DTrace fasttrap provider (illumos, older Solaris) or just +# an initial thread pointer for libc (newer Solaris). +# +# C-level symbol: SOLARIS_PT_SUNDWTRACE_THRP +# Automake-level symbol: none +# +AC_MSG_CHECKING([if PT_SUNWDTRACE serves for initial thread pointer (Solaris-specific)]) +AC_RUN_IFELSE([AC_LANG_PROGRAM([[ +#include +]], [[ + return !FT_SCRATCHSIZE; +]])], [ +solaris_pt_sunwdtrace_thrp=yes +AC_MSG_RESULT([yes]) +AC_DEFINE([SOLARIS_PT_SUNDWTRACE_THRP], 1, + [Define to 1 if PT_SUNWDTRACE program header provides just an initial thread pointer for libc.]) +], [ +solaris_pt_sunwdtrace_thrp=no +AC_MSG_RESULT([no]) +]) + else AM_CONDITIONAL(SOLARIS_SUN_STUDIO_AS, false) AM_CONDITIONAL(SOLARIS_XPG_SYMBOLS_PRESENT, false) diff --git a/coregrind/m_debuginfo/readelf.c b/coregrind/m_debuginfo/readelf.c index 60ab3cb6ad..81f94ee1b5 100644 --- a/coregrind/m_debuginfo/readelf.c +++ b/coregrind/m_debuginfo/readelf.c @@ -1594,6 +1594,10 @@ Bool ML_(read_elf_debug_info) ( struct _DebugInfo* di ) XArray* /* of RangeAndBias */ svma_ranges = NULL; +# if defined(SOLARIS_PT_SUNDWTRACE_THRP) + Addr dtrace_data_vaddr = 0; +# endif + vg_assert(di); vg_assert(di->fsm.have_rx_map == True); vg_assert(di->fsm.have_rw_map == True); @@ -1815,6 +1819,16 @@ Bool ML_(read_elf_debug_info) ( struct _DebugInfo* di ) } } if (!loaded) { +# if defined(SOLARIS_PT_SUNDWTRACE_THRP) + if ((a_phdr.p_memsz == VKI_PT_SUNWDTRACE_SIZE) + && ((a_phdr.p_flags & (PF_R | PF_W | PF_X)) == PF_R)) { + TRACE_SYMTAB("PT_LOAD[%ld]: ignore dtrace_data program " + "header\n", i); + dtrace_data_vaddr = a_phdr.p_vaddr; + continue; + } +# endif /* SOLARIS_PT_SUNDWTRACE_THRP */ + ML_(symerr)(di, False, "ELF section outside all mapped regions"); /* This problem might be solved by further memory mappings. @@ -2020,6 +2034,12 @@ Bool ML_(read_elf_debug_info) ( struct _DebugInfo* di ) /* Accept .data where mapped as rw (data), even if zero-sized */ if (0 == VG_(strcmp)(name, ".data")) { +# if defined(SOLARIS_PT_SUNDWTRACE_THRP) + if ((size == VKI_PT_SUNWDTRACE_SIZE) && (svma == dtrace_data_vaddr)) { + TRACE_SYMTAB("ignoring .data section for dtrace_data " + "%#lx .. %#lx\n", svma, svma + size - 1); + } else +# endif /* SOLARIS_PT_SUNDWTRACE_THRP */ if (inrw && !di->data_present) { di->data_present = True; di->data_svma = svma; diff --git a/coregrind/m_ume/elf.c b/coregrind/m_ume/elf.c index e6f6bb1a4c..2cc1231e8c 100644 --- a/coregrind/m_ume/elf.c +++ b/coregrind/m_ume/elf.c @@ -55,6 +55,11 @@ #include #if defined(VGO_solaris) # include // PT_SUNWDTRACE_SIZE +# if defined(SOLARIS_PT_SUNDWTRACE_THRP) +# define PT_SUNWDTRACE_PROTECTION (PF_R) +# else +# define PT_SUNWDTRACE_PROTECTION (PF_R | PF_W | PF_X) +# endif #endif /* --- !!! --- EXTERNAL HEADERS end --- !!! --- */ @@ -617,11 +622,15 @@ Int VG_(load_ELF)(Int fd, const HChar* name, /*MOD*/ExeInfo* info) # if defined(VGO_solaris) case PT_SUNWDTRACE: - if (ph->p_memsz < PT_SUNWDTRACE_SIZE || - (ph->p_flags & (PF_R | PF_W | PF_X)) != (PF_R | PF_W | PF_X)) { + if (ph->p_memsz < PT_SUNWDTRACE_SIZE) { VG_(printf)("valgrind: m_ume.c: too small SUNWDTRACE size\n"); return VKI_ENOEXEC; } + if ((ph->p_flags & PT_SUNWDTRACE_PROTECTION) + != PT_SUNWDTRACE_PROTECTION) { + VG_(printf)("valgrind: m_ume.c: SUNWDTRACE protection mismatch\n"); + return VKI_ENOEXEC; + } info->init_thrptr = ph->p_vaddr + ebase; break; @@ -657,12 +666,16 @@ Int VG_(load_ELF)(Int fd, const HChar* name, /*MOD*/ExeInfo* info) # if defined(VGO_solaris) if (iph->p_type == PT_SUNWDTRACE) { - if (iph->p_memsz < PT_SUNWDTRACE_SIZE || - (iph->p_flags & (PF_R | PF_W | PF_X)) - != (PF_R | PF_W | PF_X)) { + if (iph->p_memsz < PT_SUNWDTRACE_SIZE) { VG_(printf)("valgrind: m_ume.c: too small SUNWDTRACE size\n"); return VKI_ENOEXEC; } + if ((iph->p_flags & PT_SUNWDTRACE_PROTECTION) + != PT_SUNWDTRACE_PROTECTION) { + VG_(printf)("valgrind: m_ume.c: SUNWDTRACE protection " + "mismatch\n"); + return VKI_ENOEXEC; + } /* Store the thrptr value into a temporary because we do not know yet where the interpreter is mapped. */ diff --git a/include/vki/vki-solaris.h b/include/vki/vki-solaris.h index 14a6a40b3b..113813afbf 100644 --- a/include/vki/vki-solaris.h +++ b/include/vki/vki-solaris.h @@ -483,6 +483,10 @@ typedef struct vki_kcf_door_arg_s { #endif /* SOLARIS_EXECVE_SYSCALL_TAKES_FLAGS */ +#include +#define VKI_PT_SUNWDTRACE_SIZE PT_SUNWDTRACE_SIZE + + #include #define VKI_O_RDONLY O_RDONLY #define VKI_O_WRONLY O_WRONLY