[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Porting valgrind to Debian/kFreeBSD



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


Reply to: