Date: Fri, 29 Oct 2010 18:05:08 -0700 From: Garrett Cooper <gcooper@FreeBSD.org> To: Kostik Belousov <kostikbel@gmail.com> Cc: freebsd-hackers@freebsd.org, Mark Johnston <markjdb@gmail.com> Subject: Re: Generating userland debugging symbols Message-ID: <AANLkTimXjj=GDXBEhTPwOTD38UL8iWEu2q4kbqePyDx-@mail.gmail.com> In-Reply-To: <20101029233900.GC2392@deviant.kiev.zoral.com.ua> References: <20101029191827.GC1443@mark-laptop-bsd.mark-home> <20101029233900.GC2392@deviant.kiev.zoral.com.ua>
next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, Oct 29, 2010 at 4:39 PM, Kostik Belousov <kostikbel@gmail.com> wrot= e: > On Fri, Oct 29, 2010 at 03:18:27PM -0400, Mark Johnston wrote: >> 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 containin= g >> 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 symbol= s >> 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 feedbac= k. >> >> My basic idea is to add an option to /etc/src.conf that indicates that t= he >> build system should build all the userland programs with debugging symbo= ls >> 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?=3D/usr/local/lib/debug >> STRIP_BIN:=3D"<program to perform the operation> ${SYMBOLS_DIR}" >> .endif >> .endif >> >> and then in bsd.prog.mk: >> >> .if defined(STRIP_BIN) >> .PHONY: >> =A0 =A0 =A0 export STRIPBIN=3D${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. But having a strip script might be useful. Some companies brand binaries for their own purposes, so having a hook into a strip script (it should be no more than a few lines), should suffice. Something that my old group used was similar to what's described in the objcopy manpage: The intention is that this option will be used in conjunction w= ith --add-gnu-debuglink to create a two part executable. One= a stripped binary which will occupy less space in RAM and in a d= is- tribution and the second a debugging information file which is o= nly needed if debugging abilities are required. The suggested pro= ce- dure to create these files is as follows: 1.<Link the executable as normal. Assuming that is is called> "foo" then... 1.<Run "objcopy --only-keep-debug foo foo.dbg" to> create a file containing the debugging info. 1.<Run "objcopy --strip-debug foo" to create a> stripped executable. 1.<Run "objcopy --add-gnu-debuglink=3Dfoo.dbg foo"> to add a link to the debugging info into the stripped e= xe- cutable. That's probably similar to what your group is doing... Of course a more generalized solution also might be smart if clang / llvm decides to go off in a completely different direction syntactically from binutils. Hence a custom tailored set of scripts may or may not be the way to go (is pmake's .USE directive another option?). >> 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 patche= s. > I do think that something like this would be useful. But, shouldn't > the DEBUG_FLAGS be also involved in the patch ? The goal would be > to have debug symbols for userland staff. esp. the libraries, > handled in a similar manner to kernel symbols. > > But I do like the intent of keeping the symbols in the separate directory= . I agree with kib@ on both counts and I like this idea. Maybe the directory should be something like /usr/obj/stripped for the stripped binaries and /usr/obj/debug for the debug symbols? (just something I'm tossing out... the hierarchy could be better organized than that..). It might get a bit more hairy to clean up later, but oh well, it's for development :D... Thanks! -Garrett
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?AANLkTimXjj=GDXBEhTPwOTD38UL8iWEu2q4kbqePyDx->