[PATCH] Shared library debug .symbols files
Eric van Gyzen
eric at vangyzen.net
Thu Dec 13 22:08:48 UTC 2012
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 at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to "freebsd-hackers-unsubscribe at freebsd.org"
>
More information about the freebsd-hackers
mailing list