Add a new knob WITH_DEBUG_FILES to control the building of standalone

debug files for userland programs and libraries.  The "-g" debug flag
is automatically applied when WITH_DEBUG_FILES is set.

The debug files are now named ${prog}.debug and ${shlib}.debug for
consistency with other systems and documentation.  In addition they are
installed under /usr/lib/debug, to simplify the process of installing
them if needed after a crash.  Users of bsd.{prog,lib}.mk outside of the
base system place the standalone debug files in a .debug subdirectory.
GDB automatically searches both of these directories for standalone
debug files.

Thanks to everyone who contributed changes, review, and testing during
development.
This commit is contained in:
emaste 2013-06-07 21:40:02 +00:00
parent 6445326c71
commit 390d8402e0
19 changed files with 180 additions and 41 deletions

View File

@ -470,6 +470,13 @@ _worldtmp:
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.include.dist \
-p ${WORLDTMP}/usr/include >/dev/null
ln -sf ${.CURDIR}/sys ${WORLDTMP}
.if ${MK_DEBUG_FILES} != "no"
# We could instead disable debug files for these build stages
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.debug.dist \
-p ${WORLDTMP}/legacy/usr/lib >/dev/null
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.debug.dist \
-p ${WORLDTMP}/usr/lib >/dev/null
.endif
.if ${MK_BIND_LIBS} != "no"
mtree -deU -f ${.CURDIR}/etc/mtree/BIND.include.dist \
-p ${WORLDTMP}/usr/include >/dev/null
@ -555,6 +562,10 @@ build32:
-p ${LIB32TMP}/usr >/dev/null
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.include.dist \
-p ${LIB32TMP}/usr/include >/dev/null
.if ${MK_DEBUG_FILES} != "no"
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.debug.dist \
-p ${LIB32TMP}/usr/lib >/dev/null
.endif
mkdir -p ${WORLDTMP}
ln -sf ${.CURDIR}/sys ${WORLDTMP}
.for _t in obj includes
@ -779,6 +790,10 @@ distributeworld installworld: installcheck installcheck_UGID
-p ${DESTDIR}/${DISTDIR}/${dist}/usr >/dev/null
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.include.dist \
-p ${DESTDIR}/${DISTDIR}/${dist}/usr/include >/dev/null
.if ${MK_DEBUG_FILES} != "no"
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.debug.dist \
-p ${DESTDIR}/${DISTDIR}/${dist}/usr/lib >/dev/null
.endif
.if defined(NO_ROOT)
${IMAKEENV} nmtree -C -f ${.CURDIR}/etc/mtree/BSD.root.dist | \
sed -e 's#^\./#./${dist}/#' >> ${METALOG}

View File

@ -143,6 +143,9 @@ MTREE+= BIND.chroot.dist
MTREE+= BIND.include.dist
.endif
.endif
.if ${MK_DEBUG_FILES} != "no"
MTREE+= BSD.debug.dist
.endif
PPPCNF= ppp.conf
@ -312,6 +315,9 @@ MTREES= mtree/BSD.root.dist / \
mtree/BSD.var.dist /var \
mtree/BSD.usr.dist /usr \
mtree/BSD.include.dist /usr/include
.if ${MK_DEBUG_FILES} != "no"
MTREES+= mtree/BSD.debug.dist /usr/lib
.endif
.if ${MK_BIND_LIBS} != "no"
MTREES+= mtree/BIND.include.dist /usr/include
.endif

48
etc/mtree/BSD.debug.dist Normal file
View File

@ -0,0 +1,48 @@
# $FreeBSD$
#
# Please see the file src/etc/mtree/README before making changes to this file.
#
/set type=dir uname=root gname=wheel mode=0755
.
debug
bin
..
boot
..
lib
geom
..
..
libexec
..
sbin
..
usr
bin
..
games
..
lib
engines
..
..
lib32
..
libexec
bsdinstall
..
lpr
ru
..
..
sendmail
..
sm.bin
..
..
sbin
..
..
..
..

View File

@ -4,6 +4,7 @@
FILES= ${_BIND.chroot.dist} \
${_BIND.include.dist} \
${_BSD.debug.dist} \
BSD.include.dist \
BSD.root.dist \
${_BSD.sendmail.dist} \
@ -16,6 +17,9 @@ _BIND.chroot.dist= BIND.chroot.dist
_BIND.include.dist= BIND.include.dist
.endif
.endif
.if ${MK_DEBUG_FILES} != "no"
_BSD.debug.dist= BSD.debug.dist
.endif
.if ${MK_GROFF} != "no"
_BSD.groff.dist= BSD.groff.dist
.endif

View File

@ -37,6 +37,7 @@ GDB_CROSS_DEBUGGER=
${CNTRB_GDB}/gdb/signals ${CNTRB_GDB}/gdb/tui ${TARGET_SUBDIR}
CFLAGS+= -DHAVE_CONFIG_H -DRL_NO_COMPAT -DMI_OUT=1 -DTUI=1
CFLAGS+= -DDEBUGDIR=\"${DEBUGDIR}\"
CFLAGS+= -I.
CFLAGS+= -I${TARGET_SUBDIR}
CFLAGS+= -I${BMAKE_BU}/libbfd -I${BMAKE_BU}/libbfd/${TARGET_CPUARCH}

View File

@ -439,9 +439,6 @@
/* Name of this package. */
#define PACKAGE "gdb"
/* Global directory for separate debug files. */
#define DEBUGDIR "/usr/local/lib/debug"
/* Define to BFD's default architecture. */
#define DEFAULT_BFD_ARCH bfd_i386_arch

View File

@ -451,9 +451,6 @@
/* Name of this package. */
#define PACKAGE "gdb"
/* Global directory for separate debug files. */
#define DEBUGDIR "/usr/local/lib/debug"
/* Define to BFD's default architecture. */
#define DEFAULT_BFD_ARCH bfd_arm_arch

View File

@ -439,9 +439,6 @@
/* Name of this package. */
#define PACKAGE "gdb"
/* Global directory for separate debug files. */
#define DEBUGDIR "/usr/local/lib/debug"
/* Define to BFD's default architecture. */
#define DEFAULT_BFD_ARCH bfd_i386_arch

View File

@ -439,9 +439,6 @@
/* Name of this package. */
#define PACKAGE "gdb"
/* Global directory for separate debug files. */
#define DEBUGDIR "/usr/local/lib/debug"
/* Define to BFD's default architecture. */
#define DEFAULT_BFD_ARCH bfd_ia64_arch

View File

@ -439,9 +439,6 @@
/* Name of this package. */
#define PACKAGE "gdb"
/* Global directory for separate debug files. */
#define DEBUGDIR "/usr/local/lib/debug"
/* Define to BFD's default architecture. */
#define DEFAULT_BFD_ARCH bfd_mips_arch

View File

@ -439,9 +439,6 @@
/* Name of this package. */
#define PACKAGE "gdb"
/* Global directory for separate debug files. */
#define DEBUGDIR "/usr/local/lib/debug"
/* Define to BFD's default architecture. */
#define DEFAULT_BFD_ARCH bfd_rs6000_arch

View File

@ -439,9 +439,6 @@
/* Name of this package. */
#define PACKAGE "gdb"
/* Global directory for separate debug files. */
#define DEBUGDIR "/usr/local/lib/debug"
/* Define to BFD's default architecture. */
#define DEFAULT_BFD_ARCH bfd_rs6000_arch

View File

@ -439,9 +439,6 @@
/* Name of this package. */
#define PACKAGE "gdb"
/* Global directory for separate debug files. */
#define DEBUGDIR "/usr/local/lib/debug"
/* Define to BFD's default architecture. */
#define DEFAULT_BFD_ARCH bfd_sparc_arch

View File

@ -15,3 +15,4 @@ DPADD= ${GDBLIBS} ${BULIBS} ${LIBM} ${LIBREADLINE} ${LIBTERMCAP} ${LIBGNUREGEX}
LDADD= ${GDBLIBS} ${BULIBS} -lm -lreadline -ltermcap -lgnuregex
.include <bsd.prog.mk>
CFLAGS+= -DDEBUGDIR=\"${DEBUGDIR}\"

View File

@ -47,6 +47,9 @@ CRUNCH_GENERATE_LINKS?= yes
CLEANFILES+= $(CONF) *.o *.lo *.c *.mk *.cache *.a *.h
# Don't try to extract debug info from ${PROG}.
NO_DEBUG_FILES=
# Program names and their aliases contribute hardlinks to 'rescue' executable,
# except for those that get suppressed.
.for D in $(CRUNCH_SRCDIRS)

View File

@ -43,6 +43,12 @@ CTFFLAGS+= -g
STRIP?= -s
.endif
.if ${MK_DEBUG_FILES} != "no" && empty(DEBUG_FLAGS:M-g) && \
empty(DEBUG_FLAGS:M-gdwarf*)
CFLAGS+= -g
CTFFLAGS+= -g
.endif
.include <bsd.libnames.mk>
# prefer .s to a .c, add .po, remove stuff not used in the BSD libraries
@ -114,8 +120,17 @@ PO_FLAG=-pg
all: objwarn
.if defined(SHLIB_NAME)
.if defined(DEBUG_FLAGS)
SHLIB_NAME_FULL=${SHLIB_NAME}.debug
.if ${MK_DEBUG_FILES} != "no"
SHLIB_NAME_FULL=${SHLIB_NAME}.full
# Use ${DEBUGDIR} for base system debug files, else .debug subdirectory
.if ${SHLIBDIR} == "/boot" ||\
${SHLIBDIR:C%/lib(/.*)?$%/lib%} == "/lib" ||\
${SHLIBDIR:C%/usr/lib(32)?(/.*)?%/usr/lib%} == "/usr/lib"
DEBUGFILEDIR=${DEBUGDIR}${SHLIBDIR}
.else
DEBUGFILEDIR=${SHLIBDIR}/.debug
DEBUGMKDIR=
.endif
.else
SHLIB_NAME_FULL=${SHLIB_NAME}
.endif
@ -201,13 +216,13 @@ ${SHLIB_NAME_FULL}: ${SOBJS}
${CTFMERGE} ${CTFFLAGS} -o ${.TARGET} ${SOBJS}
.endif
.if defined(DEBUG_FLAGS)
CLEANFILES+= ${SHLIB_NAME_FULL} ${SHLIB_NAME}.symbols
${SHLIB_NAME}: ${SHLIB_NAME_FULL} ${SHLIB_NAME}.symbols
${OBJCOPY} --strip-debug --add-gnu-debuglink=${SHLIB_NAME}.symbols \
.if ${MK_DEBUG_FILES} != "no"
CLEANFILES+= ${SHLIB_NAME_FULL} ${SHLIB_NAME}.debug
${SHLIB_NAME}: ${SHLIB_NAME_FULL} ${SHLIB_NAME}.debug
${OBJCOPY} --strip-debug --add-gnu-debuglink=${SHLIB_NAME}.debug \
${SHLIB_NAME_FULL} ${.TARGET}
${SHLIB_NAME}.symbols: ${SHLIB_NAME_FULL}
${SHLIB_NAME}.debug: ${SHLIB_NAME_FULL}
${OBJCOPY} --only-keep-debug ${SHLIB_NAME_FULL} ${.TARGET}
.endif
.endif #defined(SHLIB_NAME)
@ -286,10 +301,13 @@ _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} \
.if ${MK_DEBUG_FILES} != "no"
.if defined(DEBUGMKDIR)
${INSTALL} -T debug -d ${DESTDIR}${DEBUGFILEDIR}
.endif
${INSTALL} -T debug -o ${LIBOWN} -g ${LIBGRP} -m ${DEBUGMODE} \
${_INSTALLFLAGS} \
${SHLIB_NAME}.symbols ${DESTDIR}${SHLIBDIR}
${SHLIB_NAME}.debug ${DESTDIR}${DEBUGFILEDIR}
.endif
.if defined(SHLIB_LINK)
# ${_SHLIBDIRPREFIX} and ${_LDSCRIPTROOT} are both needed when cross-building

View File

@ -43,6 +43,11 @@
# LIBMODE Library mode. [${NOBINMODE}]
#
#
# DEBUGDIR Base path for standalone debug files. [/usr/lib/debug]
#
# DEBUGMODE Mode for debug files. [${NOBINMODE}]
#
#
# KMODDIR Base path for loadable kernel modules
# (see kld(4)). [/boot/kernel]
#
@ -147,6 +152,9 @@ LIBOWN?= ${BINOWN}
LIBGRP?= ${BINGRP}
LIBMODE?= ${NOBINMODE}
DEBUGDIR?= /usr/lib/debug
DEBUGMODE?= ${NOBINMODE}
# Share files
SHAREDIR?= /usr/share
@ -213,6 +221,7 @@ COMPRESS_EXT?= .gz
#
.for var in \
CTF \
DEBUG_FILES \
INSTALLLIB \
MAN \
PROFILE
@ -365,6 +374,7 @@ __DEFAULT_NO_OPTIONS = \
BSD_GREP \
CLANG_EXTRAS \
CTF \
DEBUG_FILES \
GPL_DTC \
HESIOD \
ICONV \

View File

@ -24,8 +24,24 @@ CTFFLAGS+= -g
.endif
.endif
.if defined(PROG_CXX)
PROG= ${PROG_CXX}
.endif
.if defined(PROG) && target(${PROG})
MK_DEBUG_FILES= no
.elif !empty(LDFLAGS:M-Wl,*--oformat,*) || !empty(LDFLAGS:M-static)
MK_DEBUG_FILES= no
.endif
.if defined(CRUNCH_CFLAGS)
CFLAGS+=${CRUNCH_CFLAGS}
.else
.if ${MK_DEBUG_FILES} != "no" && empty(DEBUG_FLAGS:M-g) && \
empty(DEBUG_FLAGS:M-gdwarf-*)
CFLAGS+= -g
CTFFLAGS+= -g
.endif
.endif
.if !defined(DEBUG_FLAGS)
@ -36,21 +52,36 @@ STRIP?= -s
LDFLAGS+= -static
.endif
.if defined(PROG_CXX)
PROG= ${PROG_CXX}
.if ${MK_DEBUG_FILES} != "no"
PROG_FULL=${PROG}.full
# Use ${DEBUGDIR} for base system debug files, else .debug subdirectory
.if defined(BINDIR) && (\
${BINDIR} == "/bin" ||\
${BINDIR} == "/libexec" ||\
${BINDIR} == "/sbin" ||\
${BINDIR:C%/usr/(bin|bsdinstall|games|libexec|lpr|sendmail|sm.bin|sbin)(/.*)?%/usr/bin%} == "/usr/bin"\
)
DEBUGFILEDIR= ${DEBUGDIR}${BINDIR}
.else
DEBUGFILEDIR?= ${BINDIR}/.debug
DEBUGMKDIR=
.endif
.else
PROG_FULL= ${PROG}
.endif
.if defined(PROG)
PROGNAME?= ${PROG}
.if defined(SRCS)
OBJS+= ${SRCS:N*.h:R:S/$/.o/g}
.if target(beforelinking)
beforelinking: ${OBJS}
${PROG}: beforelinking
${PROG_FULL}: beforelinking
.endif
${PROG}: ${OBJS}
${PROG_FULL}: ${OBJS}
.if defined(PROG_CXX)
${CXX} ${CXXFLAGS} ${LDFLAGS} -o ${.TARGET} ${OBJS} ${LDADD}
.else
@ -78,9 +109,9 @@ OBJS+= ${PROG}.o
.if target(beforelinking)
beforelinking: ${OBJS}
${PROG}: beforelinking
${PROG_FULL}: beforelinking
.endif
${PROG}: ${OBJS}
${PROG_FULL}: ${OBJS}
.if defined(PROG_CXX)
${CXX} ${CXXFLAGS} ${LDFLAGS} -o ${.TARGET} ${OBJS} ${LDADD}
.else
@ -89,10 +120,19 @@ ${PROG}: ${OBJS}
.if ${MK_CTF} != "no"
${CTFMERGE} ${CTFFLAGS} -o ${.TARGET} ${OBJS}
.endif
.endif
.endif # !target(${PROG})
.endif # !defined(SRCS)
.if ${MK_DEBUG_FILES} != "no"
${PROG}: ${PROG_FULL} ${PROGNAME}.debug
${OBJCOPY} --strip-debug --add-gnu-debuglink=${PROGNAME}.debug \
${PROG_FULL} ${.TARGET}
${PROGNAME}.debug: ${PROG_FULL}
${OBJCOPY} --only-keep-debug ${PROG_FULL} ${.TARGET}
.endif
.if ${MK_MAN} != "no" && !defined(MAN) && \
!defined(MAN1) && !defined(MAN2) && !defined(MAN3) && \
!defined(MAN4) && !defined(MAN5) && !defined(MAN6) && \
@ -109,6 +149,9 @@ all: _manpages
.if defined(PROG)
CLEANFILES+= ${PROG}
.if ${MK_DEBUG_FILES} != "no"
CLEANFILES+= ${PROG_FULL} ${PROGNAME}.debug
.endif
.endif
.if defined(OBJS)
@ -156,6 +199,13 @@ _proginstall:
.if defined(PROG)
${INSTALL} ${STRIP} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \
${_INSTALLFLAGS} ${PROG} ${DESTDIR}${BINDIR}/${PROGNAME}
.if ${MK_DEBUG_FILES} != "no"
.if defined(DEBUGMKDIR)
${INSTALL} -T debug -d ${DESTDIR}${DEBUGFILEDIR}
.endif
${INSTALL} -T debug -o ${BINOWN} -g ${BINGRP} -m ${DEBUGMODE} \
${PROGNAME}.debug ${DESTDIR}${DEBUGFILEDIR}/${PROGNAME}.debug
.endif
.endif
.endif # !target(realinstall)

View File

@ -0,0 +1,7 @@
.\" $FreeBSD$
Set to strip debug info into a separate file for each executable binary
and shared library.
The debug files will be placed in a subdirectory of
.Pa /usr/lib/debug
and are located automatically by
.Xr gdb 1 .