I have fixed the bug you reported when symbols were not printed. As shown below, if the lower 12 bits of Virtual Address are 0 and File Size is 0, then the a.out symbol will not be printed.
$ readelf -l a.out </snip> Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flags Align </snip> LOAD 0x0000000000001000 0x0000000000003000 0x0000000000003000 0x0000000000000000 0x0000000000000055 RW 1000 From: Otto Moerbeek <o...@drijf.net> Date: Tue, 5 Sep 2023 07:40:18 +0200 > On Tue, Sep 05, 2023 at 09:38:40AM +0900, Masato Asou wrote: > >> hi, >> >> I have fixed a bug in Valgrind. The Valgrind could not detect access >> outside the range of malloc. >> >> comments, ok? > > This works much better that before. Thanks for working on this! > > It now detects out of bounds read and writes correctly. A double > free is detected. > Also, the spurious reports for accesses to errno are gone. > > It does not report proper locations though, even if I compile my test > program with -g: > > ==23912== Invalid read of size 1 > ==23912== at 0x109B5D: ??? (in ./a.out) > ==23912== by 0x1098D1: ??? (in ./a.out) > ==23912== Address 0x4a42840 is 0 bytes after a block of size 10,240 alloc'd > ==23912== at 0x493A3A9: malloc (vg_replace_malloc.c:435) > ==23912== by 0x109B32: ??? (in ./a.out) > ==23912== by 0x1098D1: ??? (in ./a.out) > ==23912== > 0 The a.out symbol is now printed as shown below: $ cat malloctest.c #include <stdlib.h> #include <stdio.h> int main(int argc, char *argv[]) { size_t sz = atoi(argv[1]); unsigned char *p = malloc(sz); printf("%p\n", p); p[sz] = 0; printf("%x\n", p[sz]); free(p); free(p); return 0; } $ cc -g malloctest.c $ valgrind ./a.out 128 ==21074== Memcheck, a memory error detector ==21074== Copyright (C) 2002-2022, and GNU GPL'd, by Julian Seward et al. ==21074== Using Valgrind-3.21.0 and LibVEX; rerun with -h for copyright info ==21074== Command: ./a.out 128 ==21074== ==21074== Use of uninitialised value of size 8 ==21074== at 0x49C34CD: write (sys/w_write.c:26) ==21074== by 0x4A150D2: __sflush (stdio/fflush.c:80) ==21074== by 0x49B99C8: __sfvwrite (stdio/fvwrite.c:191) ==21074== by 0x4979E4D: __sprint (stdio/vfprintf.c:108) ==21074== by 0x4979E4D: __vfprintf (stdio/vfprintf.c:1064) ==21074== by 0x4976B05: vfprintf (stdio/vfprintf.c:263) ==21074== by 0x49D6434: printf (stdio/printf.c:44) ==21074== by 0x109B48: main (malloctest.c:9) ==21074== ==21074== Use of uninitialised value of size 8 ==21074== at 0x49C34DE: write (sys/w_write.c:26) ==21074== by 0x4A150D2: __sflush (stdio/fflush.c:80) ==21074== by 0x49B99C8: __sfvwrite (stdio/fvwrite.c:191) ==21074== by 0x4979E4D: __sprint (stdio/vfprintf.c:108) ==21074== by 0x4979E4D: __vfprintf (stdio/vfprintf.c:1064) ==21074== by 0x4976B05: vfprintf (stdio/vfprintf.c:263) ==21074== by 0x49D6434: printf (stdio/printf.c:44) ==21074== by 0x109B48: main (malloctest.c:9) > ==23912== Invalid free() / delete / delete[] / realloc() > ==23912== at 0x493C981: free (vg_replace_malloc.c:978) > ==23912== by 0x109B80: ??? (in ./a.out) > ==23912== by 0x1098D1: ??? (in ./a.out) > ==23912== Address 0x4a40040 is 0 bytes inside a block of size 10,240 free'd > ==23912== at 0x493C981: free (vg_replace_malloc.c:978) > ==23912== by 0x109B77: ??? (in ./a.out) > ==23912== by 0x1098D1: ??? (in ./a.out) > ==23912== Block was alloc'd at > ==23912== at 0x493A3A9: malloc (vg_replace_malloc.c:435) > ==23912== by 0x109B32: ??? (in ./a.out) > ==23912== by 0x1098D1: ??? (in ./a.out) > > addr2line -e ./a.out 0x109B80 also does not succeed in translating the > address. Address reported by Valgrind cannot be used for addr2line. Because the address is the address of the area where Valgrind mapped a.out with mmap(). The Makefile and patch-coregrind_m_replacemalloc_vg_replace_malloc_c in the following diff are the same as the first reported diff. ok, comments? -- ASOU Masato Index: devel/valgrind/Makefile =================================================================== RCS file: /cvs/ports/devel/valgrind/Makefile,v retrieving revision 1.32 diff -u -p -r1.32 Makefile --- devel/valgrind/Makefile 21 Sep 2023 09:50:07 -0000 1.32 +++ devel/valgrind/Makefile 29 Sep 2023 09:44:46 -0000 @@ -5,7 +5,7 @@ CATEGORIES = devel V = 3.21.0 DISTNAME = valgrind-${V} -REVISION = 0 +REVISION = 1 EXTRACT_SUFX = .tar.bz2 SITES = https://sourceware.org/pub/valgrind/ Index: devel/valgrind/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 --- devel/valgrind/patches/patch-coregrind_m_aspacemgr_aspacemgr_linux_c 18 Jul 2023 06:17:15 -0000 1.1 +++ devel/valgrind/patches/patch-coregrind_m_aspacemgr_aspacemgr_linux_c 29 Sep 2023 09:44:46 -0000 @@ -18,7 +18,41 @@ = (Addr) 0x04000000; // 64M #else #endif -@@ -1550,7 +1550,7 @@ +@@ -685,6 +685,7 @@ + break; + + case SkFileC: case SkFileV: ++#if !defined(VGO_openbsd) + if (s1->hasR == s2->hasR + && s1->hasW == s2->hasW && s1->hasX == s2->hasX + && s1->dev == s2->dev && s1->ino == s2->ino +@@ -695,6 +696,25 @@ + ML_(am_dec_refcount)(s1->fnIdx); + return True; + } ++ // The following is an excerpt from `readelf -l a.out'. ++ // ++ // LOAD 0x0000000000000e20 0x0000000000002e20 0x0000000000002e20 ++ // 0x00000000000001e0 0x00000000000001e0 RW 1000 ++ // LOAD 0x0000000000001000 0x0000000000003000 0x0000000000003000 ++ // 0x0000000000000000 0x0000000000000055 RW 1000 ++ // ++ // The above two areas are determined to be contiguous area in the ++ // above `if' statement, and they are merged by preen_nsegments(). ++ // Then, di->fsm.rw_map_count in the following `if' statement in ++ // VG_(di_notify_mmap)() would be 1, which does not match ++ // rw_load_count, and di_notify_ACHIEVE_ACCEPT_STATE() is not called. ++ // In the above program header, rw_load_count is 2. ++ // ++ // if (di->fsm.have_rx_map && ++ // rw_load_count >= 1 && ++ // di->fsm.rw_map_count == rw_load_count) { ++ // return di_notify_ACHIEVE_ACCEPT_STATE ( di ); ++#endif + break; + + case SkShmC: +@@ -1550,7 +1570,7 @@ if (filename || (dev != 0 && ino != 0)) seg.kind = SkFileV; @@ -27,7 +61,7 @@ // GrP fixme no dev/ino on darwin if (offset != 0) seg.kind = SkFileV; -@@ -2697,7 +2697,11 @@ +@@ -2697,7 +2717,11 @@ a client request to call the outer VG_(am_get_advisory). */ sres = VG_(am_do_mmap_NO_NOTIFY)( advised, length, @@ -39,7 +73,7 @@ VKI_MAP_FIXED|VKI_MAP_PRIVATE|VKI_MAP_ANONYMOUS, VM_TAG_VALGRIND, 0 ); -@@ -2742,6 +2746,54 @@ +@@ -2742,6 +2766,54 @@ return sres; } @@ -94,7 +128,7 @@ /* Really just a wrapper around VG_(am_mmap_anon_float_valgrind). */ SysRes VG_(am_shadow_alloc)(SizeT size) -@@ -3896,10 +3948,14 @@ +@@ -3896,10 +3968,14 @@ /*------END-procmaps-parser-for-Darwin---------------------------*/ /*------BEGIN-procmaps-parser-for-Freebsd------------------------*/ @@ -111,7 +145,7 @@ /* static ... to keep it out of the stack frame. */ static char procmap_buf[M_PROCMAP_BUF]; -@@ -3911,6 +3967,7 @@ +@@ -3911,6 +3987,7 @@ void (*record_gap)( Addr addr, SizeT len ) ) { @@ -119,7 +153,7 @@ Addr start, endPlusOne, gapStart; char* filename; char *p; -@@ -3968,6 +4025,57 @@ +@@ -3968,6 +4045,57 @@ if (record_gap && gapStart < Addr_MAX) (*record_gap) ( gapStart, Addr_MAX - gapStart + 1 ); Index: devel/valgrind/patches/patch-coregrind_m_replacemalloc_vg_replace_malloc_c =================================================================== RCS file: devel/valgrind/patches/patch-coregrind_m_replacemalloc_vg_replace_malloc_c diff -N devel/valgrind/patches/patch-coregrind_m_replacemalloc_vg_replace_malloc_c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ devel/valgrind/patches/patch-coregrind_m_replacemalloc_vg_replace_malloc_c 29 Sep 2023 09:44:46 -0000 @@ -0,0 +1,263 @@ +--- coregrind/m_replacemalloc/vg_replace_malloc.c.orig ++++ coregrind/m_replacemalloc/vg_replace_malloc.c +@@ -222,7 +222,7 @@ + #define SET_ERRNO_ENOMEM if (__errno_location) \ + (*__errno_location ()) = VKI_ENOMEM; + #define SET_ERRNO_EINVAL {} +-#elif defined(VGO_freebsd) ++#elif defined(VGO_freebsd) || defined(VGO_openbsd) + extern int *__error (void) __attribute__((weak)); + #define SET_ERRNO_ENOMEM if (__error) \ + (*__error ()) = VKI_ENOMEM; +@@ -430,7 +430,7 @@ + ALLOC_or_NULL(VG_Z_LIBC_SONAME, malloc, malloc); + ALLOC_or_NULL(SO_SYN_MALLOC, malloc, malloc); + +-#elif defined(VGO_freebsd) ++#elif defined(VGO_freebsd) || defined(VGO_openbsd) + ALLOC_or_NULL(VG_Z_LIBC_SONAME, malloc, malloc); + ALLOC_or_NULL(SO_SYN_MALLOC, malloc, malloc); + +@@ -472,7 +472,7 @@ + ALLOC_or_BOMB(SO_SYN_MALLOC, _Znwm, __builtin_new); + #endif + +-#elif defined(VGO_freebsd) ++#elif defined(VGO_freebsd) || defined(VGO_openbsd) + // operator new(unsigned int) + #if VG_WORDSIZE == 4 + ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znwj, __builtin_new); +@@ -532,7 +532,7 @@ + ALLOC_or_BOMB_ALIGNED(SO_SYN_MALLOC, _ZnwmSt11align_val_t, __builtin_new_aligned); + #endif + +-#elif defined(VGO_freebsd) ++#elif defined(VGO_freebsd) || defined(VGO_openbsd) + // operator new(unsigned int) + #if VG_WORDSIZE == 4 + ALLOC_or_BOMB_ALIGNED(VG_Z_LIBSTDCXX_SONAME, _ZnwjSt11align_val_t, __builtin_new_aligned); +@@ -592,7 +592,7 @@ + ALLOC_or_NULL(SO_SYN_MALLOC, _ZnwmRKSt9nothrow_t, __builtin_new); + #endif + +-#elif defined(VGO_freebsd) ++#elif defined(VGO_freebsd) || defined(VGO_openbsd) + // operator new(unsigned, std::nothrow_t const&) + #if VG_WORDSIZE == 4 + ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnwjRKSt9nothrow_t, __builtin_new); +@@ -652,7 +652,7 @@ + ALLOC_or_NULL_ALIGNED(SO_SYN_MALLOC, _ZnwmSt11align_val_tRKSt9nothrow_t, __builtin_new_aligned); + #endif + +-#elif defined(VGO_freebsd) ++#elif defined(VGO_freebsd) || defined(VGO_openbsd) + // operator new(unsigned int, std::align_val_t, std::nothrow_t const&) + #if VG_WORDSIZE == 4 + ALLOC_or_NULL_ALIGNED(VG_Z_LIBSTDCXX_SONAME, _ZnwjSt11align_val_tRKSt9nothrow_t, __builtin_new_aligned); +@@ -714,7 +714,7 @@ + ALLOC_or_BOMB(SO_SYN_MALLOC, _Znam, __builtin_vec_new ); + #endif + +-#elif defined(VGO_freebsd) ++#elif defined(VGO_freebsd) || defined(VGO_openbsd) + // operator new[](unsigned int) + #if VG_WORDSIZE == 4 + ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znaj, __builtin_vec_new ); +@@ -774,7 +774,7 @@ + ALLOC_or_BOMB_ALIGNED(SO_SYN_MALLOC, _ZnamSt11align_val_t, __builtin_vec_new_aligned ); + #endif + +-#elif defined(VGO_freebsd) ++#elif defined(VGO_freebsd) || defined(VGO_openbsd) + // operator new[](unsigned int, std::align_val_t) + #if VG_WORDSIZE == 4 + ALLOC_or_BOMB_ALIGNED(VG_Z_LIBSTDCXX_SONAME, _ZnajSt11align_val_t, __builtin_vec_new_aligned ); +@@ -835,7 +835,7 @@ + ALLOC_or_NULL(SO_SYN_MALLOC, _ZnamRKSt9nothrow_t, __builtin_vec_new ); + #endif + +-#elif defined(VGO_freebsd) ++#elif defined(VGO_freebsd) || defined(VGO_openbsd) + // operator new[](unsigned, std::nothrow_t const&) + #if VG_WORDSIZE == 4 + ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnajRKSt9nothrow_t, __builtin_vec_new ); +@@ -895,7 +895,7 @@ + ALLOC_or_NULL_ALIGNED(SO_SYN_MALLOC, _ZnamSt11align_val_tRKSt9nothrow_t, __builtin_vec_new_aligned ); + #endif + +-#elif defined(VGO_freebsd) ++#elif defined(VGO_freebsd) || defined(VGO_openbsd) + // operator new[](unsigned int, std::align_val_t, std::nothrow_t const&) + #if VG_WORDSIZE == 4 + ALLOC_or_NULL_ALIGNED(VG_Z_LIBSTDCXX_SONAME, _ZnajSt11align_val_tRKSt9nothrow_t, __builtin_vec_new_aligned ); +@@ -973,7 +973,7 @@ + FREE(VG_Z_LIBC_SONAME, free, free ); + FREE(SO_SYN_MALLOC, free, free ); + +-#elif defined(VGO_freebsd) ++#elif defined(VGO_freebsd) || defined(VGO_openbsd) + FREE(VG_Z_LIBC_SONAME, free, free ); + FREE(SO_SYN_MALLOC, free, free ); + +@@ -1024,7 +1024,7 @@ + FREE(VG_Z_LIBC_SONAME, _ZdlPv, __builtin_delete ); + FREE(SO_SYN_MALLOC, _ZdlPv, __builtin_delete ); + +-#elif defined(VGO_freebsd) ++#elif defined(VGO_freebsd) || defined(VGO_openbsd) + FREE(VG_Z_LIBSTDCXX_SONAME, _ZdlPv, __builtin_delete ); + FREE(VG_Z_LIBCXX_SONAME, _ZdlPv, __builtin_delete ); + FREE(SO_SYN_MALLOC, _ZdlPv, __builtin_delete ); +@@ -1072,7 +1072,7 @@ + DELETE_SIZED(SO_SYN_MALLOC, _ZdlPvm, __builtin_delete ); + #endif + +-#elif defined(VGO_freebsd) ++#elif defined(VGO_freebsd) || defined(VGO_openbsd) + // operator delete(void*, unsigned int) + #if __SIZEOF_SIZE_T__ == 4 + DELETE_SIZED(VG_Z_LIBSTDCXX_SONAME, _ZdlPvj, __builtin_delete ); +@@ -1160,7 +1160,7 @@ + DELETE_SIZED_ALIGNED(SO_SYN_MALLOC, _ZdlPvmSt11align_val_t, __builtin_delete_aligned ); + #endif + +-#elif defined(VGO_freebsd) ++#elif defined(VGO_freebsd) || defined(VGO_openbsd) + // operator delete(void*, std::align_val_t) + DELETE_ALIGNED(VG_Z_LIBSTDCXX_SONAME, _ZdlPvSt11align_val_t, __builtin_delete_aligned ); + DELETE_ALIGNED(VG_Z_LIBCXX_SONAME, _ZdlPvSt11align_val_t, __builtin_delete_aligned ); +@@ -1224,7 +1224,7 @@ + FREE(VG_Z_LIBC_SONAME, _ZdlPvRKSt9nothrow_t, __builtin_delete ); + FREE(SO_SYN_MALLOC, _ZdlPvRKSt9nothrow_t, __builtin_delete ); + +-#elif defined(VGO_freebsd) ++#elif defined(VGO_freebsd) || defined(VGO_openbsd) + // operator delete(void*, std::nothrow_t const&) + FREE(VG_Z_LIBSTDCXX_SONAME, _ZdlPvRKSt9nothrow_t, __builtin_delete ); + FREE(VG_Z_LIBCXX_SONAME, _ZdlPvRKSt9nothrow_t, __builtin_delete ); +@@ -1254,7 +1254,7 @@ + + // no sized version of this operator + +-#elif defined(VGO_freebsd) ++#elif defined(VGO_freebsd) || defined(VGO_openbsd) + // operator delete(void*, std::align_val_t, std::nothrow_t const&) + DELETE_ALIGNED(VG_Z_LIBSTDCXX_SONAME, _ZdlPvSt11align_val_tRKSt9nothrow_t, __builtin_delete_aligned ); + DELETE_ALIGNED(VG_Z_LIBCXX_SONAME, _ZdlPvSt11align_val_tRKSt9nothrow_t, __builtin_delete_aligned ); +@@ -1288,7 +1288,7 @@ + FREE(VG_Z_LIBC_SONAME, _ZdaPv, __builtin_vec_delete ); + FREE(SO_SYN_MALLOC, _ZdaPv, __builtin_vec_delete ); + +-#elif defined(VGO_freebsd) ++#elif defined(VGO_freebsd) || defined(VGO_openbsd) + // operator delete[](void*) + FREE(VG_Z_LIBSTDCXX_SONAME, _ZdaPv, __builtin_vec_delete ); + FREE(VG_Z_LIBCXX_SONAME, _ZdaPv, __builtin_vec_delete ); +@@ -1323,7 +1323,7 @@ + DELETE_SIZED(SO_SYN_MALLOC, _ZdaPvm, __builtin_vec_delete ); + #endif + +-#elif defined(VGO_freebsd) ++#elif defined(VGO_freebsd) || defined(VGO_openbsd) + // operator delete[](void*, unsigned int) + #if __SIZEOF_SIZE_T__ == 4 + DELETE_SIZED(VG_Z_LIBSTDCXX_SONAME, _ZdaPvj, __builtin_vec_delete ); +@@ -1383,7 +1383,7 @@ + DELETE_SIZED_ALIGNED(SO_SYN_MALLOC, _ZdaPvmSt11align_val_t, __builtin_vec_delete_aligned ); + #endif + +-#elif defined(VGO_freebsd) ++#elif defined(VGO_freebsd) || defined(VGO_openbsd) + // operator delete[](void*, std::align_val_t) + DELETE_ALIGNED(VG_Z_LIBSTDCXX_SONAME, _ZdaPvSt11align_val_t, __builtin_vec_delete_aligned ); + DELETE_ALIGNED(VG_Z_LIBCXX_SONAME, _ZdaPvSt11align_val_t, __builtin_vec_delete_aligned ); +@@ -1447,7 +1447,7 @@ + FREE(VG_Z_LIBC_SONAME, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete ); + FREE(SO_SYN_MALLOC, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete ); + +-#elif defined(VGO_freebsd) ++#elif defined(VGO_freebsd) || defined(VGO_openbsd) + // operator delete[](void*, std::nothrow_t const&) + FREE(VG_Z_LIBSTDCXX_SONAME, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete ); + FREE(VG_Z_LIBCXX_SONAME, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete ); +@@ -1477,7 +1477,7 @@ + + // no sized version of this operator + +-#elif defined(VGO_freebsd) ++#elif defined(VGO_freebsd) || defined(VGO_openbsd) + // operator delete[](void*, std::align_val_t, std::nothrow_t const&) + DELETE_ALIGNED(VG_Z_LIBSTDCXX_SONAME, _ZdaPvSt11align_val_tRKSt9nothrow_t, __builtin_vec_delete_aligned ); + DELETE_ALIGNED(VG_Z_LIBCXX_SONAME, _ZdaPvSt11align_val_tRKSt9nothrow_t, __builtin_vec_delete_aligned ); +@@ -1553,7 +1553,7 @@ + CALLOC(VG_Z_LIBC_SONAME, calloc); + CALLOC(SO_SYN_MALLOC, calloc); + +-#elif defined(VGO_freebsd) ++#elif defined(VGO_freebsd) || defined(VGO_openbsd) + CALLOC(VG_Z_LIBC_SONAME, calloc); + CALLOC(SO_SYN_MALLOC, calloc); + +@@ -1648,7 +1648,7 @@ + REALLOC(VG_Z_LIBC_SONAME, realloc); + REALLOC(SO_SYN_MALLOC, realloc); + +-#elif defined(VGO_freebsd) ++#elif defined(VGO_freebsd) || defined(VGO_openbsd) + REALLOC(VG_Z_LIBC_SONAME, realloc); + REALLOC(SO_SYN_MALLOC, realloc); + REALLOCF(VG_Z_LIBC_SONAME, reallocf); +@@ -1734,7 +1734,7 @@ + return v; \ + } + +-#if defined(VGO_freebsd) ++#if defined(VGO_freebsd) || defined(VGO_openbsd) + #define VG_MEMALIGN_MAKE_SIZE_MULTIPLE_ALIGN 1 + #else + #define VG_MEMALIGN_MAKE_SIZE_MULTIPLE_ALIGN 0 +@@ -1834,7 +1834,7 @@ + MEMALIGN(VG_Z_LIBC_SONAME, memalign); + MEMALIGN(SO_SYN_MALLOC, memalign); + +-#elif defined(VGO_freebsd) ++#elif defined(VGO_freebsd) || defined(VGO_openbsd) + MEMALIGN(VG_Z_LIBC_SONAME, memalign); + MEMALIGN(SO_SYN_MALLOC, memalign); + +@@ -1890,7 +1890,7 @@ + VALLOC(VG_Z_LIBC_SONAME, valloc); + VALLOC(SO_SYN_MALLOC, valloc); + +-#elif defined(VGO_freebsd) ++#elif defined(VGO_freebsd) || defined(VGO_openbsd) + VALLOC(VG_Z_LIBC_SONAME, valloc); + VALLOC(SO_SYN_MALLOC, valloc); + +@@ -2031,7 +2031,7 @@ + POSIX_MEMALIGN(VG_Z_LIBC_SONAME, posix_memalign); + POSIX_MEMALIGN(SO_SYN_MALLOC, posix_memalign); + +-#elif defined(VGO_freebsd) ++#elif defined(VGO_freebsd) || defined(VGO_openbsd) + POSIX_MEMALIGN(VG_Z_LIBC_SONAME, posix_memalign); + POSIX_MEMALIGN(SO_SYN_MALLOC, posix_memalign); + +@@ -2176,7 +2176,7 @@ + ALIGNED_ALLOC(VG_Z_LIBC_SONAME, aligned_alloc); + ALIGNED_ALLOC(SO_SYN_MALLOC, aligned_alloc); + +-#elif defined(VGO_freebsd) ++#elif defined(VGO_freebsd) || defined(VGO_openbsd) + ALIGNED_ALLOC(G_Z_LIBC_SONAME, aligned_alloc); + ALIGNED_ALLOC(SO_SYN_MALLOC, aligned_alloc); + +@@ -2220,7 +2220,7 @@ + MALLOC_USABLE_SIZE(SO_SYN_MALLOC, dlmalloc_usable_size); + # endif + +-#elif defined(VGO_freebsd) ++#elif defined(VGO_freebsd) || defined(VGO_openbsd) + MALLOC_USABLE_SIZE(VG_Z_LIBC_SONAME, malloc_usable_size); + MALLOC_USABLE_SIZE(SO_SYN_MALLOC, malloc_usable_size); + Index: devel/valgrind/patches/patch-coregrind_m_ume_elf_c =================================================================== RCS file: /cvs/ports/devel/valgrind/patches/patch-coregrind_m_ume_elf_c,v retrieving revision 1.3 diff -u -p -r1.3 patch-coregrind_m_ume_elf_c --- devel/valgrind/patches/patch-coregrind_m_ume_elf_c 18 Jul 2023 06:17:15 -0000 1.3 +++ devel/valgrind/patches/patch-coregrind_m_ume_elf_c 29 Sep 2023 09:44:46 -0000 @@ -71,8 +71,21 @@ for (i = 0; i < e->e.e_phnum; i++) { ESZ(Phdr) *ph = &e->p[i]; ESZ(Addr) addr, bss, brkaddr; -@@ -437,6 +476,11 @@ +@@ -435,8 +474,24 @@ + filesz = ph->p_filesz; + bss = addr+filesz; memsz = ph->p_memsz; ++#if defined(VGO_openbsd) ++ // On OpenBSD, p_filesz of the BSS area is set to 0. Also, if the lower ++ // 12 bits of addr is 0, bss and addr have the same value. Therefore, ++ // VG_PGROUNDUP(bss)-VG_PGROUNDDN(addr) = 0, the following ++ // `if (VG_PGROUNDUP(bss)-VG_PGROUNDDN(addr)' statement becomes false, ++ // and VG_(am_mmap_file_fixed_client)() is not called. Additionally, ++ // di_notify_ACHIEVE_ACCEPT_STATE() is not called and the first_epoch ++ // variable in DebugInfo is not set to a valid value. ++ if ((addr & 0xfff) == 0 && filesz == 0) ++ bss += memsz; ++#endif brkaddr = addr+memsz; +#if defined(VGO_openbsd) @@ -83,7 +96,7 @@ // Tom says: In the following, do what the Linux kernel does and only // map the pages that are required instead of rounding everything to // the specified alignment (ph->p_align). (AMD64 doesn't work if you -@@ -460,6 +504,7 @@ +@@ -460,6 +515,7 @@ if (memsz > filesz) { UInt bytes; @@ -91,7 +104,7 @@ bytes = VG_PGROUNDUP(brkaddr)-VG_PGROUNDUP(bss); if (bytes > 0) { if (0) VG_(debugLog)(0,"ume","mmap_anon_fixed_client #2\n"); -@@ -478,6 +523,42 @@ +@@ -478,6 +534,42 @@ bytes = VKI_PAGE_SIZE - bytes; VG_(memset)((void *)bss, 0, bytes); } @@ -134,7 +147,7 @@ } } -@@ -879,7 +960,7 @@ +@@ -879,7 +971,7 @@ return 0; }