Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 13 Dec 2012 16:07:39 -0600
From:      Eric van Gyzen <eric@vangyzen.net>
To:        Ed Maste <emaste@freebsd.org>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: [PATCH] Shared library debug .symbols files
Message-ID:  <50CA51AB.6060801@vangyzen.net>
In-Reply-To: <20121213160847.GA78448@sandvine.com>
References:  <20121213160847.GA78448@sandvine.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On 12/13/2012 10:08, Ed Maste wrote:
> I've been working generating userland debugging symbols, with the goal
> that we'll build them for each release.  The user could install them
> along with the system, or later on when needed for debugging.  The
> symbols files will also be useful for profiling and tools such as
> Valgrind, without needing to build and install world first.
>
> This patch enables .symbols files for shared libraries when DEBUG_FLAGS
> is set.  Future changes will be needed to address static libraries and
> base system binaries, and the release build bits.
>
> This is a different approach to the patches Mark Johnston posted to
> -hackers about two years ago.  I've followed the example of kmod.mk in
> generating a .debug file which is split into the two components with
> objcopy at build time.  (Mark's patch overloaded strip to do it at
> install time.)
>
> Note that I used --strip-all and not --strip-debug, as the latter
> results in duplication in the symtab and strtab between the shared lib
> and its .symbols file.

Excellent.  I've wanted this for a while, and I like your approach.

I have one comment below; otherwise, the patch looks fine (not that I 
have any authority on the subject...).

> diff --git a/share/mk/bsd.lib.mk b/share/mk/bsd.lib.mk
> index 2c96df1..6a1b476 100644
> --- a/share/mk/bsd.lib.mk
> +++ b/share/mk/bsd.lib.mk
> @@ -34,14 +34,13 @@ NO_WERROR=
>   .endif
>   
>   .if defined(DEBUG_FLAGS)
> +OBJCOPY?=	objcopy
>   CFLAGS+= ${DEBUG_FLAGS}
>   
>   .if ${MK_CTF} != "no" && ${DEBUG_FLAGS:M-g} != ""
>   CTFFLAGS+= -g
>   .endif
> -.endif
> -
> -.if !defined(DEBUG_FLAGS)
> +.else
>   STRIP?=	-s
>   .endif
>   
> @@ -173,14 +172,17 @@ SOLINKOPTS+=	-Wl,--fatal-warnings -Wl,--warn-shared-textrel
>   .endif
>   
>   .if target(beforelinking)
> -${SHLIB_NAME}: ${SOBJS} beforelinking
> +${SHLIB_NAME}: beforelinking
> +.endif
> +.if defined(DEBUG_FLAGS)
> +${SHLIB_NAME}.debug: ${SOBJS}
>   .else
>   ${SHLIB_NAME}: ${SOBJS}
>   .endif
>   	@${ECHO} building shared library ${SHLIB_NAME}
> -	@rm -f ${.TARGET} ${SHLIB_LINK}
> +	@rm -f ${.SHLIB_NAME} ${SHLIB_LINK}

dot-SHLIB_NAME?  I'm not aware of this magic.

>   .if defined(SHLIB_LINK)
> -	@ln -fs ${.TARGET} ${SHLIB_LINK}
> +	@ln -fs ${.SHLIB_NAME} ${SHLIB_LINK}
>   .endif
>   .if !defined(NM)
>   	@${CC} ${LDFLAGS} ${SSP_CFLAGS} ${SOLINKOPTS} \
> @@ -194,6 +196,15 @@ ${SHLIB_NAME}: ${SOBJS}
>   .if ${MK_CTF} != "no"
>   	${CTFMERGE} ${CTFFLAGS} -o ${.TARGET} ${SOBJS}
>   .endif
> +
> +.if defined(DEBUG_FLAGS)
> +${SHLIB_NAME}: ${SHLIB_NAME}.debug ${SHLIB_NAME}.symbols
> +	${OBJCOPY} --strip-all --add-gnu-debuglink=${SHLIB_NAME}.symbols\
> +	    ${SHLIB_NAME}.debug ${.TARGET}
> +
> +${SHLIB_NAME}.symbols:
> +	${OBJCOPY} --only-keep-debug ${SHLIB_NAME}.debug ${.TARGET}
> +.endif
>   .endif
>   
>   .if defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB) && ${MK_TOOLCHAIN} != "no"
> @@ -270,6 +281,11 @@ _libinstall:
>   	${INSTALL} ${STRIP} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
>   	    ${_INSTALLFLAGS} ${_SHLINSTALLFLAGS} \
>   	    ${SHLIB_NAME} ${DESTDIR}${SHLIBDIR}
> +.if defined(DEBUG_FLAGS)
> +	${INSTALL} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
> +	    ${_INSTALLFLAGS} ${_SHLINSTALLFLAGS} \
> +	    ${SHLIB_NAME}.symbols ${DESTDIR}${SHLIBDIR}
> +.endif
>   .if defined(SHLIB_LINK)
>   # ${_SHLIBDIRPREFIX} and ${_LDSCRIPTROOT} are both needed when cross-building
>   # and when building 32 bits library shims.  ${_SHLIBDIRPREFIX} is the directory
> _______________________________________________
> freebsd-hackers@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@freebsd.org"
>




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?50CA51AB.6060801>