Date: Wed, 21 Nov 2001 00:04:29 -0500 From: Garance A Drosihn <drosih@rpi.edu> To: Warner Losh <imp@harmony.village.org>, Ian Dowse <iedowse@maths.tcd.ie>, Arjan de Vet <devet@devet.org> Cc: bmah@FreeBSD.ORG, Sheldon Hearn <sheldonh@starjuice.net>, stable@FreeBSD.ORG Subject: Patches to Try wrt 'the size of stable /modules increased...' Message-ID: <p05101022b820d60f758e@[128.113.24.47]> In-Reply-To: <200111201614.fAKGEC785608@harmony.village.org> References: <200111201514.aa72952@salmon.maths.tcd.ie> <200111201614.fAKGEC785608@harmony.village.org>
next in thread | previous in thread | raw e-mail | index | archive | help
At 9:14 AM -0700 11/20/01, Warner Losh wrote:
>Ian Dowse writes:
>:
>: I probably missed something important earlier in this thread, but
>: installing the debug versions of the modules seems like a bug,
>: since we don't install the debug version of the kernel. Adding
>: "DEBUG=-g" has always simply required more space in /usr/src, but
>: not affected the installed size. Does installing the debug versions
>: of modules make sense at all, or is it just hard to fix the makefiles
>: to stop it happening?
>
>I think it is an oversight. The kernel makefile has special code to
>build -g, but not install (by doing a strip --debug, or the moral
>equivalent) the -g image. Likely we should do the same thing for
>modules, now that I think about it.
Well, this idea intrigued me, as did some of the comments from Arjan
in a separate message. So, I thought I'd try to come up with
something that might be useful and interesting for everyone.
So, here's a patch to sys/conf/Makefile.i386 and sys/conf/kmod.mk
that might be of interest. This has worked for me, but note that I
have NOT TESTED IT MUCH. It would be prudent to BACK UP all your
/kernel* and /modules* files before trying this! Also, I'm sure a
number of decisions I made are quite debatable, so I see this as more
of a "good starting point for a discussion" than anything else.
This patch is *ONLY* for stable. I have made no attempt to even
look at these makefiles in current, because I needed to be working
on stable today (for other reasons), and couldn't afford that much
of a detour.
I probably should write a few more disclaimers, but I don't want to
scare everyone away. I really do think this has some good ideas in
it, even if they need to be polished off a bit.
My email client sometimes mixes up a patch, so if you want to apply
the patch you may need to pick up the copy at:
http://people.freebsd.org/~gad/debugmod4.diff
Some notes on what these changes do:
1) I have modules processed the same way wrt DEBUG as the kernel
has been. Thus, the modules will be compiled with DEBUG on
(if it was set for the kernel), but that will be compiled into
<kmod>.ko.debug, and then run thru '${OBJCOPY} --strip-debug'
to create <kmod>.ko (with no .debug). It is the <kmod>.ko
which will get installed in /modules, and not the version with
all the symbolic-debugging info in it. All of this was just
a duplicate of how 'install' is done on a kernel when DEBUG
is set.
2) I changed the install targets for both kernel and the modules
to check if a symbol called KERNSAVDBGDIR is defined. That's
probably longer of a name than it needs to be, but I figured
there was no way that would conflict with any other variables!
Anyway, if you add 'KERNSAVDBGDIR=/somedir/somewhere' to your
/etc/make.conf, *and* that directory exists, *and* you have
specified DEBUG in your kernel, then the install target for
kernel will install kernel.debug (the version with the symbol
information) in /somedir/somewhere/kernel.debug . The install
target for modules will also install the <kmod>.ko.debug file
in /somedir/somewhere/modules.debug/<kmod>.ko.debug .
Note that I purposely picked a directory name of 'modules.debug',
and not 'modules' (even though all the files will also have a
.ko.debug on the end). If someone set KERNSAVDBGDIR='/', I
didn't want the processing of the debug-modules to run into the
same directory as the non-debug ones. (although, as I sit here,
I'm not completely sure that KERNSAVDBGDIR='/' will actually
*work*...).
3) these debug targets will also keep backups when installing a
new kernel, just like the main targets do.
4) when doing the backup of /modules, the makefile target had
been doing something along the lines of:
mkdir -p /modules.old
cp -p /modules/* /modules.old
As one who watched this fail several times with '/' running out
of disk space, I didn't much like that strategy. So, I changed
it to:
rm -Rf /modules.old ; sync
mv /modules /modules.old
mkdir -p /modules
The 'sync' is there for those of us who are running softupdates
on '/'. Maybe that's dumb, but it won't *hurt* anyone to have
it there.
It would not surprise me if there are good reasons to go with
the 'cp' method instead of the 'mv', but my thinking was this.
By 'mv'-ing the directory, you're sure that /modules.old is
*exactly* the same as /modules had been, and you are also sure
that /modules is being built from scratch. Also, it just seemed
like less work to do. Also, you're not going to run out of
disk space during that 'mv' operation, so you shouldn't end up
with a 'half-backed-up' /modules.old directory.
5) I noticed that the realinstall target for /modules in kmod.mk
was using a destination of '${DESTDIR}${KMODDIR}', but that
"backup of /modules" target (which is in Makefile.i386) had
hardwired references to '${DESTDIR}/modules'. I have no idea
when KMODDIR might be different from "/modules", but I did not
like the inconsistency so I changed Makefile.i386 to also use
KMODDIR. This might be something which is already correct in
-current, but I have not checked.
6) In Makefile.i386, there is a MKMODULESENV variable which is
built up, and then used when calling 'make' in the modules
directory. It is a bunch of environment settings. However,
in one target (modules-clobber) it is used as:
rm -rf ${MKMODULESENV}
which did not seem like it could possibly be correct. Again,
I have to claim ignorance here as I have no idea what that
target is used for. However, I neutralized that, as I can
not imagine it is correct.
7) I changed that MKMODULESENV variable to pass along the
setting of OBJCOPY to the modules makefile, for part #1 to
work right.
8) There was a comment that claimed that the target PROG for
a kernel module was <kmod>.o, when it's really <kmod>.ko,
so I changed that.
9) I have a few 'echo' statements in there, just so I could be
sure what was being executed when. Obviously those 'echo's
could be removed.
I might have a few other comments in the change, so obviously this
would merit some close scrutiny. However, I wanted to get this
much of it out there for discussion. I think something *like* this
would be very good to get into -stable before the next release,
just so people can turn on DEBUG in their kernel conf without
seeing so much disk space used up in '/'. And I did like the idea
of Arjan's that modules.debug should be copied out of it's obscure
location in
/usr/obj/usr/src/sys/${KERNCONF}/modules/usr/src/sys/modules/*/*.ko.debug
(I had to use a 'find' command to track that down!) and into the
same general location as the matching /kerel.debug is copied.
I have done three or four installs with this code in the makefiles,
and it has worked as I wanted it to for those. However, I certainly
did not test it extensively. All my installs were basically the
same environment, so people with different setups could easily run
into something that I didn't check.
+ + + + + + + + + + + + + + + +
Well, if anyone's still reading, here's the patch:
--- sys/conf/Makefile.i386.orig Mon Nov 12 20:19:21 2001
+++ sys/conf/Makefile.i386 Tue Nov 20 20:41:30 2001
@@ -221,6 +221,14 @@
.endif
install -c -m 555 -o root -g wheel -fschg \
${KERNEL}${.TARGET:S/kernel-install//} ${DESTDIR}/${KERNEL}
+.if defined(DEBUG) && defined(KERNSAVDBGDIR) && exists(${KERNSAVDBGDIR})
+.if exists(${KERNSAVDBGDIR}/${KERNEL}.debug)
+ -chflags noschg ${KERNSAVDBGDIR}/${KERNEL}.debug
+ mv ${KERNSAVDBGDIR}/${KERNEL}.debug
${KERNSAVDBGDIR}/${KERNEL}.old.debug
+.endif
+ install -c -m 555 -o root -g wheel \
+ ${KERNEL}.debug ${KERNSAVDBGDIR}/${KERNEL}.debug
+.endif
kernel-reinstall kernel-reinstall.debug:
install -c -m 555 -o root -g wheel -fschg \
@@ -237,7 +245,7 @@
reinstall reinstall.debug: modules-reinstall
.endif
-MKMODULESENV= MAKEOBJDIRPREFIX=${.OBJDIR}/modules
+MKMODULESENV= MAKEOBJDIRPREFIX=${.OBJDIR}/modules OBJCOPY=${OBJCOPY}
.if defined(MODULES_OVERRIDE)
MKMODULESENV+= MODULES_OVERRIDE="${MODULES_OVERRIDE}"
.endif
@@ -245,6 +253,7 @@
MKMODULESENV+= DEBUG="${DEBUG}" DEBUG_FLAGS="${DEBUG}"
.endif
+# XXXX - should all these references to /modules be ${KMODDIR} ? (gad)
modules:
@mkdir -p ${.OBJDIR}/modules
cd $S/modules ; env ${MKMODULESENV} ${MAKE} obj ; \
@@ -261,8 +270,10 @@
modules-cleandepend:
cd $S/modules ; env ${MKMODULESENV} ${MAKE} cleandepend
+# XXX - this doesn't make any sense... (gad)
modules-clobber: modules-clean
- rm -rf ${MKMODULESENV}
+ echo ; echo "Eh? we're going to 'rm -rf ${MKMODULESENV}'?"
+ /iDontThinkSo/rm -rf ${MKMODULESENV}
modules-cleandir:
cd $S/modules ; env ${MKMODULESENV} ${MAKE} cleandir
@@ -272,10 +283,22 @@
modules-install modules-install.debug:
.if !defined(NO_MODULES_OLD)
- if [ -d ${DESTDIR}/modules -a -n "`ls ${DESTDIR}/modules`" ]; then \
- mkdir -p ${DESTDIR}/modules.old; \
- cp -p ${DESTDIR}/modules/* ${DESTDIR}/modules.old; \
+ if [ -d ${DESTDIR}${KMODDIR} -a -n "`ls
${DESTDIR}${KMODDIR}`" ]; then \
+ rm -Rf ${DESTDIR}${KMODDIR}.old; sync ; \
+ mv ${DESTDIR}${KMODDIR} ${DESTDIR}${KMODDIR}.old; \
+ fi;
+ if [ ! -d ${DESTDIR}${KMODDIR} ]; then \
+ mkdir -p ${DESTDIR}${KMODDIR}; \
fi;
+.if defined(DEBUG) && defined(KERNSAVDBGDIR) && exists(${KERNSAVDBGDIR})
+ if [ -d ${KERNSAVDBGDIR}${KMODDIR}.debug -a -n "`ls
${KERNSAVDBGDIR}${KMODDIR}.debug`" ]; then \
+ rm -Rf ${KERNSAVDBGDIR}${KMODDIR}.old.debug; sync ; \
+ mv ${KERNSAVDBGDIR}${KMODDIR}.debug
${KERNSAVDBGDIR}${KMODDIR}.debug.old; \
+ fi;
+ if [ ! -d ${KERNSAVDBGDIR}${KMODDIR}.debug ] ; then \
+ mkdir -p ${KERNSAVDBGDIR}${KMODDIR}.debug; \
+ fi;
+.endif
.endif
cd $S/modules ; env ${MKMODULESENV} ${MAKE} install
--- sys/conf/kmod.mk.orig Sat Aug 11 15:42:51 2001
+++ sys/conf/kmod.mk Tue Nov 20 20:44:50 2001
@@ -35,7 +35,7 @@
# NOMAN KLD does not have a manual page if set.
#
# PROG The name of the kernel module to build.
-# If not supplied, ${KMOD}.o is used.
+# If not supplied, ${KMOD}.ko is used.
#
# SRCS List of source files
#
@@ -131,8 +131,21 @@
PROG= ${KMOD}.ko
.endif
-${PROG}: ${KMOD}.kld ${KMODDEPS}
+.if !defined(DEBUG)
+FULLPROG= ${PROG}
+.else
+FULLPROG= ${PROG}.debug
+${PROG}: ${FULLPROG}
+ @echo " - - - - - - - - - - - - - - -"
+ @echo " Making ${PROG} from ${FULLPROG}"
+ ${OBJCOPY} --strip-debug ${FULLPROG} ${PROG}
+.endif
+
+${FULLPROG}: ${KMOD}.kld ${KMODDEPS}
.if ${OBJFORMAT} == elf
+ @echo
+ @echo " - - - - - - - - - - - - - - -"
+ @echo " Making ${FULLPROG} with PROG = ${PROG} DEBUG = ${DEBUG}"
gensetdefs ${KMOD}.kld
${CC} ${CFLAGS} -c setdef0.c
${CC} ${CFLAGS} -c setdef1.c
@@ -221,6 +234,10 @@
realinstall: _SUBDIR
${INSTALL} ${COPY} -o ${KMODOWN} -g ${KMODGRP} -m ${KMODMODE} \
${_INSTALLFLAGS} ${PROG} ${DESTDIR}${KMODDIR}/
+.if defined(DEBUG) && defined(KERNSAVDBGDIR) && exists(${KERNSAVDBGDIR})
+ ${INSTALL} ${COPY} -o ${KMODOWN} -g ${KMODGRP} -m ${KMODMODE} \
+ ${PROG}.debug ${KERNSAVDBGDIR}${KMODDIR}.debug/${PROG}.debug
+.endif
.if defined(LINKS) && !empty(LINKS)
@set ${LINKS}; \
while test $$# -ge 2; do \
--
Garance Alistair Drosehn = gad@eclipse.acs.rpi.edu
Senior Systems Programmer or gad@freebsd.org
Rensselaer Polytechnic Institute or drosih@rpi.edu
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-stable" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?p05101022b820d60f758e>
