diff --git a/sys/conf/kern.post.mk b/sys/conf/kern.post.mk index 9de9e88409c2..d9849be3ce48 100644 --- a/sys/conf/kern.post.mk +++ b/sys/conf/kern.post.mk @@ -76,7 +76,7 @@ assym.s: $S/kern/genassym.sh genassym.o NM=${NM} OBJFORMAT=elf sh $S/kern/genassym.sh genassym.o > ${.TARGET} genassym.o: $S/$M/$M/genassym.c - ${CC} -c ${CFLAGS} $S/$M/$M/genassym.c + ${CC} -c ${CFLAGS:N-fno-common} $S/$M/$M/genassym.c ${SYSTEM_OBJS} genassym.o vers.o: opt_global.h diff --git a/sys/conf/kern.pre.mk b/sys/conf/kern.pre.mk index 06fdf848295f..0feec79b000d 100644 --- a/sys/conf/kern.pre.mk +++ b/sys/conf/kern.pre.mk @@ -38,7 +38,7 @@ INCLUDES+= -I/usr/include .endif COPTS= ${INCLUDES} ${IDENT} -D_KERNEL -ffreestanding -include opt_global.h -CFLAGS= ${COPTFLAGS} ${CWARNFLAGS} ${DEBUG} ${COPTS} +CFLAGS= ${COPTFLAGS} ${CWARNFLAGS} ${DEBUG} ${COPTS} -fno-common # XXX LOCORE means "don't declare C stuff" not "for locore.s". ASM_CFLAGS= -x assembler-with-cpp -DLOCORE ${CFLAGS} @@ -76,7 +76,7 @@ SYSTEM_SFILES= $S/$M/$M/locore.s SYSTEM_DEP= Makefile ${SYSTEM_OBJS} SYSTEM_OBJS= locore.o vnode_if.o ${OBJS} hints.o env.o config.o hack.So SYSTEM_LD= @${LD} ${FMT} -Bdynamic -T $S/conf/ldscript.$M \ - -export-dynamic -dynamic-linker /red/herring \ + -warn-common -export-dynamic -dynamic-linker /red/herring \ -o ${.TARGET} -X ${SYSTEM_OBJS} vers.o SYSTEM_LD_TAIL= @${OBJCOPY} --strip-symbol gcc2_compiled. ${.TARGET} ; \ ${SIZE} ${FMT} ${.TARGET} ; chmod 755 ${.TARGET} diff --git a/sys/conf/kmod.mk b/sys/conf/kmod.mk index 7f7e65399f02..72e93a16b9b2 100644 --- a/sys/conf/kmod.mk +++ b/sys/conf/kmod.mk @@ -51,6 +51,11 @@ # MFILES Optionally a list of interfaces used by the module. # This file contains a default list of interfaces. # +# EXPORT_SYMS A list of symbols that should be exported from the module, +# or the name of a file containing a list of symbols, or NO +# to export no symbols. If missing, all global symbols are +# exported. +# # +++ targets +++ # # distribute: @@ -119,6 +124,11 @@ CFLAGS+= -I${DESTDIR}/usr/include CFLAGS+= -I@/../include -I${DESTDIR}/usr/include .endif # @ +# Disallow common variables, and if we end up with commons from +# somewhere unexpected, allocate storage for them in the module itself. +CFLAGS+= -fno-common +LDFLAGS+= -d -warn-common + CFLAGS+= ${DEBUG_FLAGS} .if ${OBJFORMAT} == elf @@ -143,8 +153,25 @@ ${PROG}: ${FULLPROG} ${FULLPROG}: ${KMOD}.kld ${LD} -Bshareable ${LDFLAGS} -o ${.TARGET} ${KMOD}.kld +.if defined(EXPORT_SYMS) +CLEANFILES+= ${.OBJDIR}/export_syms +.endif + ${KMOD}.kld: ${OBJS} - ${LD} ${LDFLAGS} -r -o ${.TARGET} ${OBJS} + ${LD} ${LDFLAGS} -r -d -o ${.TARGET} ${OBJS} +.if defined(EXPORT_SYMS) +.if ${EXPORT_SYMS} == NO + touch ${.OBJDIR}/export_syms +.elif !exists(${.CURDIR}/${EXPORT_SYMS}) + echo ${EXPORT_SYMS} > ${.OBJDIR}/export_syms +.else + grep -v '^#' < ${EXPORT_SYMS} > ${.OBJDIR}/export_syms +.endif + awk -f ${SYSDIR}/conf/kmod_syms.awk ${.TARGET} \ + ${.OBJDIR}/export_syms | \ + xargs -t -J% ${OBJCOPY} % ${.TARGET} +.endif + .if !defined(NOMAN) .if 0 diff --git a/sys/conf/kmod_syms.awk b/sys/conf/kmod_syms.awk new file mode 100644 index 000000000000..3aa3eeb61f52 --- /dev/null +++ b/sys/conf/kmod_syms.awk @@ -0,0 +1,27 @@ +# $FreeBSD$ + +# Read global symbols from object file. +BEGIN { + while ("nm -g " ARGV[1] | getline) { + if (match($0, /^[^[:space:]]+ [^AU] (.*)$/)) { + syms[$3] = $2 + } + } +} + +# De-list symbols from the export list. +// { + if (ARGIND == 1) + nextfile + delete syms[$0] +} + +# Strip commons, make everything else local. +END { + for (member in syms) { + if (syms[member] == "C") + print "-N" member + else + print "-L" member + } +}