Fix Valgrind must-be-redirected error in Gentoo

| 分类 Development  | 标签 gentoo  valgrind 

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/


上一篇     下一篇