[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CACqU3MU7MS7MjpyiSx-tUJ6c3rSexUB5=vTGy6gPv_OJevuOqw@mail.gmail.com>
Date: Sun, 22 Apr 2012 22:23:28 -0400
From: Arnaud Lacombe <lacombar@...il.com>
To: Sam Ravnborg <sam@...nborg.org>
Cc: linux arch <linux-arch@...r.kernel.org>,
linux-kbuild <linux-kbuild@...r.kernel.org>,
lkml <linux-kernel@...r.kernel.org>,
Michal Marek <mmarek@...e.cz>
Subject: Re: [RFC] move link of vmlinux to a script
Hi,
[some quick nits...]
On Sun, Apr 22, 2012 at 5:22 PM, Sam Ravnborg <sam@...nborg.org> wrote:
> [...]
> index 0000000..c5a46ae
> --- /dev/null
> +++ b/scripts/link-vmlinux.sh
> @@ -0,0 +1,238 @@
> +#!/bin/sh
> +#
> +# link vmlinux
> +#
> +# vmlinux is linked from the objects selected by $(KBUILD_VMLINUX_INIT) and
> +# $(KBUILD_VMLINUX_MAIN). Most are built-in.o files from top-level directories
> +# in the kernel tree, others are specified in arch/$(ARCH)/Makefile.
> +# Ordering when linking is important, and $(KBUILD_VMLINUX_INIT) must be first.
> +#
> +# vmlinux
> +# ^
> +# |
> +# +-< $(KBUILD_VMLINUX_INIT)
> +# | +--< init/version.o + more
> +# |
> +# +--< $(KBUILD_VMLINUX_MAIN)
> +# | +--< driver/built-in.o mm/built-in.o + more
> +# |
> +# +-< ${kallsymso} (see description in KALLSYMS section)
> +#
> +# vmlinux version (uname -v) cannot be updated during normal
> +# descending-into-subdirs phase since we do not yet know if we need to
> +# update vmlinux.
> +# Therefore this step is delayed until just before final link of vmlinux.
> +#
> +# System.map is generated to document addresses of all kernel symbols
> +
> +# We need access to CONFIG_ symbols
> +source ./.config
> +
> +# Error out on error
> +set -e
> +
> +# Link of vmlinux
> +# $1 output file
> +modpost_link()
> +{
> + ${LD} ${LDFLAGS} -r -o $1 ${KBUILD_VMLINUX_INIT} \
> + --start-group ${KBUILD_VMLINUX_MAIN} --end-group
> +}
> +
> +# Link of vmlinux
> +# $1 - optional extra .o files
> +# $2 output file
> +vmlinux_link()
> +{
> + local lds=${srctree}/arch/${SRCARCH}/kernel/vmlinux.lds
> +echo srcarch=${SRCARCH} CF=${CFLAGS_vmlinux}
debugging leftover ?
> + if [ "${SRCARCH}" != "um" ]; then
> + ${LD} ${LDFLAGS} ${LDFLAGS_vmlinux} -o $2 \
> + -T ${lds} ${KBUILD_VMLINUX_INIT} \
> + --start-group ${KBUILD_VMLINUX_MAIN} --end-group $1
> + else
> + ${CC} ${CFLAGS_vmlinux} -o $2 \
> + -Wl,-T,${lds} ${KBUILD_VMLINUX_INIT} \
> + -Wl,--start-group \
> + ${KBUILD_VMLINUX_MAIN} \
> + -Wl,--end-group \
> + -lutil $1
> + rm -f linux
> + fi
> +}
> +
> +
> +# Create $2 .o file with all symbols from $1 .o file
> +kallsyms()
> +{
> + info KSYM $2
> + local kallsymopt;
> +
> + if [ "${CONFIG_KALLSYMS_ALL}" != "" ]; then
> + kallsymopt=--all-symbols
> + fi
> +
> + local aflags="${KBUILD_AFLAGS} ${AFLAGS_KERNEL} ${NOSTDINC_FLAGS} ${LINUXINCLUDE} ${KBUILD_CPPFLAGS} ${modkern_aflags}"
might be worse splitting that line.
> + ${NM} -n $1 | \
> + scripts/kallsyms ${kallsymopt} | \
> + ${CC} ${aflags} -c -o $2 -x assembler-with-cpp -
> +}
> +
> +# Based on the vmlinux file create the System.map file
> +# System.map is used by module-init tools and some debugging
> +# tools to retrieve the actual addresses of symbols in the kernel.
> +# Generate System.map (actual filename passed as second argument)
> +
> +# $NM produces the following output:
> +# f0081e80 T alloc_vfsmnt
> +
> +# The second row specify the type of the symbol:
> +# A = Absolute
> +# B = Uninitialised data (.bss)
> +# C = Comon symbol
> +# D = Initialised data
> +# G = Initialised data for small objects
> +# I = Indirect reference to another symbol
> +# N = Debugging symbol
> +# R = Read only
> +# S = Uninitialised data for small objects
> +# T = Text code symbol
> +# U = Undefined symbol
> +# V = Weak symbol
> +# W = Weak symbol
> +# Corresponding small letters are local symbols
> +
> +# For System.map filter away:
> +# a - local absolute symbols
> +# U - undefined global symbols
> +# N - debugging symbols
> +# w - local weak symbols
> +
> +# readprofile starts reading symbols when _stext is found, and
> +# continue until it finds a symbol which is not either of 'T', 't',
> +# 'W' or 'w'. __crc_ are 'A' and placed in the middle
> +# so we just ignore them to let readprofile continue to work.
> +# (At least sparc64 has __crc_ in the middle).
> +mksysmap()
> +{
> + $NM -n $1 | \
> + grep -v '\( [aNUw] \)\|\(__crc_\)\|\( \$[adt]\)' > $2
> +}
> +
you don't seem to consistently use #{FOO} vs. $FOO.
> +
> +# Delete output files in case of error
> +trap cleanup SIGHUP SIGINT SIGQUIT SIGTERM ERR
> +cleanup()
> +{
> + rm -f vmlinux.o
> + rm -f .old_version
> + rm -f .tmp_vmlinux*
> + rm -f .tmp_kallsyms*
> + rm -f vmlinux
> + rm -f .tmp_System.map
> + rm -f System.map
> +}
> +
> +# non-verbose output
> +info()
> +{
> + printf " %-7s %s\n" $1 $2
> +}
> +
> +# Use "make V=L" to debug this script
> +case "${KBUILD_VERBOSE}" in
> +*L*)
> + set -x
> + ;;
> +esac
> +
> +# Override MAKEFLAGS to avoid parrallel builds
> +MAKEFLAGS='--no-print-directory -Rr'
> +
> +#link vmlinux.o
> +info LD vmlinux.o
> +modpost_link vmlinux.o
> +
> +# modpost vmlinux.o to check for section mismatches
> +${MAKE} -f ${srctree}/scripts/Makefile.modpost vmlinux.o
> +
> +# Update version
> +info GEN .version
> +if [ ! -r .version ]; then
why '-r' specifically ? '-e' might be just enough.
> + rm -f .version;
> + echo 1 >.version;
> +else
> + mv .version .old_version;
> + expr 0$(cat .old_version) + 1 >.version;
> +fi;
> +
> +# final build of init/
> +${MAKE} -f ${srctree}/scripts/Makefile.build obj=init
> +
are spaces allowed in `srctree' ? if so, this will break here.
> +
> +kallsymso=""
> +kallsyms_vmlinux=""
> +
> +if [ "${CONFIG_KALLSYMS}" != "" ]; then
> +
[ -n "${CONFIG_KALLSYMS}" ] would work too, as well as the other
places where you use the [ "${FOO}" != "" ] syntax.
- Arnaud
> + # kallsyms support
> + # Generate section listing all symbols and add it into vmlinux
> + # It's a three step process:
> + # 1) Link .tmp_vmlinux1 so it has all symbols and sections,
> + # but __kallsyms is empty.
> + # Running kallsyms on that gives us .tmp_kallsyms1.o with
> + # the right size
> + # 2) Link .tmp_vmlinux2 so it now has a __kallsyms section of
> + # the right size, but due to the added section, some
> + # addresses have shifted.
> + # From here, we generate a correct .tmp_kallsyms2.o
> + # 2a) We may use an extra pass as this has been necessary to
> + # woraround some alignment related bugs.
> + # KALLSYMS_EXTRA_PASS=1 is used to trigger this.
> + # 3) The correct ${kallsymso} is linked into the final vmlinux.
> + #
> + # a) Verify that the System.map from vmlinux matches the map from
> + # ${kallsymso}.
> +
> + kallsymso=.tmp_kallsyms2.o
> + kallsyms_vmlinux=.tmp_vmlinux2
> +
> + # step 1
> + vmlinux_link "" .tmp_vmlinux1
> + kallsyms .tmp_vmlinux1 .tmp_kallsyms1.o
> +
> + # step 2
> + vmlinux_link .tmp_kallsyms1.o .tmp_vmlinux2
> + kallsyms .tmp_vmlinux2 .tmp_kallsyms2.o
> +
> + # step 2a
> + if [ "${KALLSYMS_EXTRA_PASS}" != "" ]; then
> + kallsymso=.tmp_kallsyms3.o
> + kallsyms_vmlinux=.tmp_vmlinux2
> +
> + vmlinux_link .tmp_kallsyms2.o .tmp_vmlinux3
> +
> + kallsyms .tmp_vmlinux3 .tmp_kallsyms3.o
> + fi
> +fi
> +
> +vmlinux_link "${kallsymso}" vmlinux
> +
> +info SYSMAP System.map
> +mksysmap vmlinux System.map
> +
> +# step a (see comment above)
> +if [ "${CONFIG_KALLSYMS}" != "" ]; then
> + mksysmap ${kallsyms_vmlinux} .tmp_System.map
> +
> + if [ $(cmp -s System.map .tmp_System.map) ]; then
> + echo Inconsistent kallsyms data
> + echo This is a bug - please report about it
> + echo echo Try "make KALLSYMS_EXTRA_PASS=1" as a workaround
> + cleanup
> + exit 1
> + fi
> +fi
> +
> +# We made a new kernel - delete old version file
> +rm -f .old_version
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists