Fix Valgrind's must-be-redirected error in Gentoo

Last week, I tried to use Valgrind to identify potential memory related bugs, since segmentation faults occured randomly in a Python C library. However, Valgrind failed to start and displayed the following error message:

valgrind:  Fatal error at startup: a function redirection
                valgrind:  which is mandatory for this platform-tool combination
                valgrind:  cannot be set up.  Details of the redirection are:
                valgrind:
                valgrind:  A must-be-redirected function
                valgrind:  whose name matches the pattern:      strlen
                valgrind:  in an object with soname matching:   ld-linux.so.2
                valgrind:  was not found whilst processing
                valgrind:  symbols from the object with soname: ld-linux.so.2
                valgrind:
                valgrind:  Possible fixes: (1, short term): install glibc's debuginfo
                valgrind:  package on this machine.  (2, longer term): ask the packagers
                valgrind:  for your Linux distribution to please in future ship a non-
                valgrind:  stripped ld.so (or whatever the dynamic linker .so is called)
                valgrind:  that exports the above-named function using the standard
                valgrind:  calling conventions for this platform.  The package you need
                valgrind:  to install for fix (1) is called
                valgrind:
                valgrind:    On Debian, Ubuntu:                 libc6-dbg
                valgrind:    On SuSE, openSuSE, Fedora, RHEL:   glibc-debuginfo
                valgrind:
                valgrind:  Cannot continue -- exiting now.  Sorry.
                

The message mentions how to fix this error in various distributions (Debian, Ubuntu, Fedora, etc), except for Gentoo. Note that there is no such thing as a "debugging symbols package" in Gentoo, because Portage will compile all packages from scratch.

In order to fix this error, it is necessary to:

  1. enable the splitdebug feature (or rather: it is "recommended" to enable).
  2. enable debugging symbols for glibc.
  3. recompile sys-libs/glibc.

The first step is trivial: add splitdebug to FEATURES in /etc/make.conf:

FEATURES="$FEATURES splitdebug"
                

The second step, enabling debugging symbols, can also be set globally. However Portage allows you to specify CFLAGS and CXXFLAGS per package. So adding -ggdb to both CFLAGS and CXXFLAGS will complete the second step. Create the file /etc/portage/env/debug.conf and add:

CFLAGS="${CFLAGS} -ggdb"
                CXXFLAGS="${CFLAGS} -ggdb"
                

Next, add the following line to /etc/portage/package.env/glibc:

sys-libs/glibc debug.conf
                

Note: It is also possible to enable splitdebug on a per package basis, but in my humble opinion it is useful to have debugging symbols system-wide in case you want to backtrace a segfault of an arbitrary executable using gdb.

The final step is recompiling glibc: emerge sys-libs/glibc (this part should be straightforward). Once glibc is emerged, you should see the file /usr/lib/debug/lib/ld-2.12.2.so.debug (substitute 2.12.2 with your glibc version number), which contains the stripped debugging symbols of glibc. To confirm this, file will show that the file is not stripped:

/usr/lib/debug/lib/ld-2.12.2.so.debug: ELF 32-bit LSB shared object, Intel
                80386, version 1 (SYSV), dynamically linked, not stripped
                

If all steps succeeded, you should be able to run Valgrind successfully on Gentoo!

http://blog.kompiler.org/post/10/2011-11-30/Fix_Valgrind's_must-be-redirected_error_in_Gentoo/
posted @ 2013-12-20 13:24 英超 Views(...) Comments(...) Edit 收藏