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