Generating userland debugging symbols

Mark Johnston markjdb at gmail.com
Fri Oct 29 19:18:45 UTC 2010


Hello all,

I've been working on some changes to the system build scripts that make
it easier to create and install debugging symbols files for the base
userland. What we do in the tree at my work (Sandvine) is use a script
that invokes strip(1) and objcopy(1) to create a separate file containing
the debugging symbols for each binary; so for example, the symbols for 
/bin/ls get placed in another directory, e.g.
/usr/local/lib/debug/bin/ls.symbols.

The name of the symbols file for each binary is encoded in the
.gnu_debuglink segment; when gdb comes across it, it searches a set
of directories for the debug symbols file and loads it if found.

It turns out to be pretty convenient - one can keep the debugging symbols
on a separate slice or on an NFS-mounted directory if space is an issue,
or package the debug symbols separately and keep them on an FTP server,
ready to install if needed.

I'm not aware of any infrastructure in place that makes it easy to do
this for the userland programs. What I'm hoping to find out is whether
there's any interest in adding such support. I've discussed this with
Ed Maste to some degree, but it'd be nice to get some additional feedback.

My basic idea is to add an option to /etc/src.conf that indicates that the
build system should build all the userland programs with debugging symbols
and later extract them. So a user would define something like
WITH_DEBUG_SYMBOLS in src.conf, and then in bsd.own.mk, have something
like

.if !defined(_WITHOUT_SRCCONF)
.if defined(WITH_DEBUG_SYMBOLS)
SYMBOLS_DIR?=/usr/local/lib/debug
STRIP_BIN:="<program to perform the operation> ${SYMBOLS_DIR}"
.endif
.endif

and then in bsd.prog.mk:

.if defined(STRIP_BIN)
.PHONY:
	export STRIPBIN=${STRIP_BIN}
.endif

so that when install(1) gets run, STRIPBIN will be in the environment.

In our setup, STRIPBIN points to a script which just uses strip(1) and
objcopy(1) to extract the debug symbols for each binary that gets
installed. Ed suggested that I could just add an option to strip(1) to
do all of this in one command so that we wouldn't need to add a separate
script to the FreeBSD tree for this. It's pretty simple to do - I can
post the patch if anyone wants to see it. This also requires a smallish
change to install(1) which I can also post.

Any thoughts or suggestions on this approach in general? I'm still
getting to know the FreeBSD system, so I'm open to alternatives. If
there's agreement that this feature might be useful, I'll post my patches.

Thanks,
-Mark


More information about the freebsd-hackers mailing list