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-unsubscr...@freebsd.org"


_______________________________________________
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org"

Reply via email to