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:
- enable the splitdebug feature (or rather: it is "recommended" to enable).
- enable debugging symbols for glibc.
- 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!