Hi! From some time ago there is available a port of Valgrind to FreeBSD [1] I tried to compile it on Debian/kFreeBSD, and after some patching I was able to compile it on kfreebsd-amd64 sid (didn't tested i386). Here are some quick instructions to replicate what I did (valgrind_kfreebsd.patch is attached) # wget https://bitbucket.org/stass/valgrind-freebsd/downloads/valgrind-freebsd-3.8.0.tar.bz2 # tar xfav valgrind-freebsd-3.8.0.tar.bz2 # cd valgrind-freebsd-3.8.0 # wget 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD' -qO config.guess # wget 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD' -qO config.sub # cat /tmp/valgrind_kfreebsd.patch | patch -p1 # ./autogen.sh # ./configure --prefix=/usr --enable-only64bit # make # make install [2] However, it don't works as expected when you run it. It fails with the error: cannot set up thread-local storage: cannot set %fs base address for thread-local storage Which I have no real idea about how to fix. See the example output when running it over this test.c http://cs.ecs.baylor.edu/~donahoo/tools/valgrind/ debian-kfreebsd-64 test-valgrind # valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes --main-stacksize=8 ./test ==21190== Memcheck, a memory error detector ==21190== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al. ==21190== Using Valgrind-3.8.0 and LibVEX; rerun with -h for copyright info ==21190== Command: ./test ==21190== cannot set up thread-local storage: cannot set %fs base address for thread-local storage ==21190== ==21190== FILE DESCRIPTORS: 3 open at exit. ==21190== Open file descriptor 2: /dev/ttyp0 ==21190== <inherited from parent> ==21190== ==21190== Open file descriptor 1: /dev/ttyp0 ==21190== <inherited from parent> ==21190== ==21190== Open file descriptor 0: /dev/ttyp0 ==21190== <inherited from parent> ==21190== ==21190== ==21190== HEAP SUMMARY: ==21190== in use at exit: 0 bytes in 0 blocks ==21190== total heap usage: 0 allocs, 0 frees, 0 bytes allocated ==21190== ==21190== All heap blocks were freed -- no leaks are possible ==21190== ==21190== For counts of detected and suppressed errors, rerun with: -v ==21190== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) I'm sharing this with the hope that somebody can point some ideas about how to continue. Regards! -------- [1] https://wiki.freebsd.org/Valgrind http://valgrind.org/info/platforms.html [2] If want to use checkinstall check #702314
diff -ruN valgrind-freebsd-3.8.0/coregrind/launcher-freebsd.c valgrind-kfreebsd-3.8.0/coregrind/launcher-freebsd.c --- valgrind-freebsd-3.8.0/coregrind/launcher-freebsd.c 2012-08-15 22:34:00.000000000 +0200 +++ valgrind-kfreebsd-3.8.0/coregrind/launcher-freebsd.c 2013-03-05 05:53:13.000000000 +0100 @@ -194,7 +194,7 @@ char launcher_name[PATH_MAX+1]; char* new_line; char** new_env; -#if __FreeBSD__ >= 7 +#if __FreeBSD__ >= 7 || defined(__FreeBSD_kernel__) int oid[4]; vki_size_t len; #endif @@ -269,7 +269,7 @@ invocations of valgrind on child processes. */ memset(launcher_name, 0, PATH_MAX+1); -#if __FreeBSD__ >= 7 +#if __FreeBSD__ >= 7 || defined(__FreeBSD_kernel__) oid[0] = CTL_KERN; oid[1] = KERN_PROC; oid[2] = KERN_PROC_PATHNAME; diff -ruN valgrind-freebsd-3.8.0/coregrind/m_debuginfo/readstabs.c valgrind-kfreebsd-3.8.0/coregrind/m_debuginfo/readstabs.c --- valgrind-freebsd-3.8.0/coregrind/m_debuginfo/readstabs.c 2012-08-15 22:34:00.000000000 +0200 +++ valgrind-kfreebsd-3.8.0/coregrind/m_debuginfo/readstabs.c 2013-03-05 05:53:13.000000000 +0100 @@ -62,7 +62,9 @@ # endif #elif defined(VGO_freebsd) # include <a.out.h> +#if !defined(__FreeBSD_kernel__) # include <sys/nlist_aout.h> +#endif #else # error "Unknown OS" #endif diff -ruN valgrind-freebsd-3.8.0/coregrind/m_libcsignal.c valgrind-kfreebsd-3.8.0/coregrind/m_libcsignal.c --- valgrind-freebsd-3.8.0/coregrind/m_libcsignal.c 2012-08-15 22:34:00.000000000 +0200 +++ valgrind-kfreebsd-3.8.0/coregrind/m_libcsignal.c 2013-03-05 05:53:14.000000000 +0100 @@ -495,7 +495,7 @@ * there was no 32 bit syscall version until FreeBSD-7. So on older * platforms we have to check. */ -# if __FreeBSD__ < 7 +# if defined(__FreeBSD__) && __FreeBSD__ < 7 static void sigtimedwait_zero_handler ( Int sig ) { vg_assert(sig != VKI_SIGILL); @@ -510,7 +510,7 @@ Int VG_(sigtimedwait_zero)( const vki_sigset_t *set, vki_siginfo_t *info ) { -# if __FreeBSD__ < 7 +# if defined(__FreeBSD__) && __FreeBSD__ < 7 Int i, ir; SysRes sr; vki_sigset_t pending, blocked, allbutone; @@ -523,7 +523,7 @@ # endif static const struct vki_timespec zero = { 0, 0 }; -# if __FreeBSD__ < 7 +# if defined(__FreeBSD__) && __FreeBSD__ < 7 osreldate = VG_(getosreldate)(); if (osreldate < 600000) have_sigtimedwait_zero = False; @@ -538,7 +538,8 @@ SysRes res = VG_(do_syscall3)(__NR_sigtimedwait, (UWord)set, (UWord)info, (UWord)&zero); return sr_isError(res) ? -1 : sr_Res(res); -# if __FreeBSD__ < 7 +# if defined(__FreeBSD__) && __FreeBSD__ < 7 + } /* Find out what's pending: FreeBSD sigpending */ diff -ruN valgrind-freebsd-3.8.0/getpath/getpath_fromaddr.c valgrind-kfreebsd-3.8.0/getpath/getpath_fromaddr.c --- valgrind-freebsd-3.8.0/getpath/getpath_fromaddr.c 2012-08-15 22:34:00.000000000 +0200 +++ valgrind-kfreebsd-3.8.0/getpath/getpath_fromaddr.c 2013-03-05 05:53:18.000000000 +0100 @@ -21,7 +21,7 @@ #include <vm/vm_object.h> -#if __FreeBSD_version < 500000 +#if defined(__FreeBSD_version) && __FreeBSD_version < 500000 #define VM_OBJECT_LOCK(x) do { } while (0) #define VM_OBJECT_UNLOCK(x) do { } while (0) #define PROCP(td) (td) diff -ruN valgrind-freebsd-3.8.0/getpath/getpath_fromfd.c valgrind-kfreebsd-3.8.0/getpath/getpath_fromfd.c --- valgrind-freebsd-3.8.0/getpath/getpath_fromfd.c 2012-08-15 22:34:00.000000000 +0200 +++ valgrind-kfreebsd-3.8.0/getpath/getpath_fromfd.c 2013-03-05 05:53:18.000000000 +0100 @@ -14,7 +14,7 @@ #include <sys/unistd.h> #include <sys/sysctl.h> -#if __FreeBSD_version < 500000 +#if defined(__FreeBSD_version) && __FreeBSD_version < 500000 #define PROCP(td) (td) #define RETVAL p_retval #define thread proc diff -ruN valgrind-freebsd-3.8.0/include/valgrind.h valgrind-kfreebsd-3.8.0/include/valgrind.h --- valgrind-freebsd-3.8.0/include/valgrind.h 2012-08-15 22:34:00.000000000 +0200 +++ valgrind-kfreebsd-3.8.0/include/valgrind.h 2013-03-05 05:53:44.000000000 +0100 @@ -126,9 +126,9 @@ # define PLAT_x86_darwin 1 #elif defined(__APPLE__) && defined(__x86_64__) # define PLAT_amd64_darwin 1 -#elif defined(__FreeBSD__) && defined(__i386__) +#elif ( defined(__FreeBSD__) || defined(__FreeBSD_kernel__) ) && defined(__i386__) # define PLAT_x86_freebsd 1 -#elif defined(__FreeBSD__) && defined(__amd64__) +#elif ( defined(__FreeBSD__) || defined(__FreeBSD_kernel__) ) && defined(__amd64__) # define PLAT_amd64_freebsd 1 #elif defined(__MINGW32__) || defined(__CYGWIN32__) \ || (defined(_WIN32) && defined(_M_IX86)) diff -ruN valgrind-freebsd-3.8.0/include/vki/vki-freebsd.h valgrind-kfreebsd-3.8.0/include/vki/vki-freebsd.h --- valgrind-freebsd-3.8.0/include/vki/vki-freebsd.h 2012-08-15 22:34:00.000000000 +0200 +++ valgrind-kfreebsd-3.8.0/include/vki/vki-freebsd.h 2013-03-05 06:05:35.000000000 +0100 @@ -346,6 +346,27 @@ struct vki_timespec st_mtimespec; struct vki_timespec st_ctimespec; #else +/* The file included from /usr/include/$(gcc -dumpmachine)/bits/stat.h + * sets a macro for the names st_atime, st_mtime and st_ctime that + * makes the build fail. + * + * See similar problem commented at line 48 of include/pub_tool_libcfile.h + * + * Revert such macros. + */ + +#ifdef st_atime +#undef st_atime +#endif + +#ifdef st_mtime +#undef st_mtime +#endif + +#ifdef st_ctime +#undef st_ctime +#endif + vki_time_t st_atime; long st_atime_nsec; vki_time_t st_mtime; diff -ruN valgrind-freebsd-3.8.0/memcheck/tests/badjump2.c valgrind-kfreebsd-3.8.0/memcheck/tests/badjump2.c --- valgrind-freebsd-3.8.0/memcheck/tests/badjump2.c 2012-08-15 22:34:00.000000000 +0200 +++ valgrind-kfreebsd-3.8.0/memcheck/tests/badjump2.c 2013-03-05 05:53:22.000000000 +0100 @@ -25,7 +25,7 @@ memset(&sigsegv_new, 0, sizeof(sigsegv_new)); sigsegv_new.sa_handler = SIGSEGV_handler; sigsegv_new.sa_flags = 0; -#if !defined(__APPLE__) && !defined(__FreeBSD__) +#if !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__FreeBSD_kernel__) sigsegv_new.sa_restorer = NULL; #endif res = sigemptyset( &sigsegv_new.sa_mask ); diff -ruN valgrind-freebsd-3.8.0/memcheck/tests/mallinfo.c valgrind-kfreebsd-3.8.0/memcheck/tests/mallinfo.c --- valgrind-freebsd-3.8.0/memcheck/tests/mallinfo.c 2012-08-15 22:34:00.000000000 +0200 +++ valgrind-kfreebsd-3.8.0/memcheck/tests/mallinfo.c 2013-03-05 05:53:25.000000000 +0100 @@ -9,6 +9,7 @@ #if defined(HAVE_MALLINFO) +#include <malloc.h> static size_t check(size_t min, size_t max) { struct mallinfo mi; diff -ruN valgrind-freebsd-3.8.0/none/tests/amd64/bug156404-amd64.c valgrind-kfreebsd-3.8.0/none/tests/amd64/bug156404-amd64.c --- valgrind-freebsd-3.8.0/none/tests/amd64/bug156404-amd64.c 2012-08-15 22:34:00.000000000 +0200 +++ valgrind-kfreebsd-3.8.0/none/tests/amd64/bug156404-amd64.c 2013-03-05 05:53:30.000000000 +0100 @@ -14,7 +14,7 @@ #define VG_STRINGIFZ(__str) #__str #define VG_STRINGIFY(__str) VG_STRINGIFZ(__str) -#if defined(__FreeBSD__) +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) # define __NR_readlink 58 #endif diff -ruN valgrind-freebsd-3.8.0/perf/tinycc.c valgrind-kfreebsd-3.8.0/perf/tinycc.c --- valgrind-freebsd-3.8.0/perf/tinycc.c 2012-08-15 22:34:01.000000000 +0200 +++ valgrind-kfreebsd-3.8.0/perf/tinycc.c 2013-03-05 06:20:48.000000000 +0100 @@ -19178,8 +19178,14 @@ } /* name of ELF interpreter */ -#ifdef __FreeBSD__ +#if defined(__FreeBSD__) static char elf_interp[] = "/usr/libexec/ld-elf.so.1"; +#elif defined(__FreeBSD_kernel__) +#if defined(__amd64__) +static char elf_interp[] = "/lib/x86_64-kfreebsd-gnu/ld-2.13.so" +#else +static char elf_interp[] = "/lib/i386-kfreebsd-gnu/ld-2.13.so" +#endif #else static char elf_interp[] = "/lib/ld-linux.so.2"; #endif
Attachment:
signature.asc
Description: OpenPGP digital signature