Re: [PATCH v3 1/2] kbuild: remove top-level built-in.a

From: Masahiro Yamada
Date: Wed Jan 23 2019 - 23:28:01 EST


On Thu, Jan 17, 2019 at 10:23 AM Masahiro Yamada
<yamada.masahiro@xxxxxxxxxxxxx> wrote:
>
> The symbol table in the final archive is unneeded; the linker does not
> require the symbol table after the --whole-archive option. Every object
> file in the archive is included in the link anyway.
>
> Pass thin archives from subdirectories directly to the linker, and
> remove the final archiving step.
>
> Fix up the document and comments as well.
>
> Signed-off-by: Masahiro Yamada <yamada.masahiro@xxxxxxxxxxxxx>
> Acked-by: Nicholas Piggin <npiggin@xxxxxxxxx>
> ---

Applied to linux-kbuild.



> Changes in v3: None
> Changes in v2:
> - Update the document and comments
> - Add Nicholas' Ack
>
> Documentation/kbuild/makefiles.txt | 9 ++-------
> scripts/Makefile.build | 8 ++------
> scripts/link-vmlinux.sh | 30 ++++++------------------------
> 3 files changed, 10 insertions(+), 37 deletions(-)
>
> diff --git a/Documentation/kbuild/makefiles.txt b/Documentation/kbuild/makefiles.txt
> index bf28c47..48eab0b 100644
> --- a/Documentation/kbuild/makefiles.txt
> +++ b/Documentation/kbuild/makefiles.txt
> @@ -154,13 +154,8 @@ more details, with real examples.
>
> Kbuild compiles all the $(obj-y) files. It then calls
> "$(AR) rcSTP" to merge these files into one built-in.a file.
> - This is a thin archive without a symbol table, which makes it
> - unsuitable as a linker input.
> -
> - The scripts/link-vmlinux.sh script later makes an aggregate
> - built-in.a with "${AR} rcsTP", which creates the thin archive
> - with a symbol table and an index, making it a valid input for
> - the final vmlinux link passes.
> + This is a thin archive without a symbol table. It will be later
> + linked into vmlinux by scripts/link-vmlinux.sh
>
> The order of files in $(obj-y) is significant. Duplicates in
> the lists are allowed: the first instance will be linked into
> diff --git a/scripts/Makefile.build b/scripts/Makefile.build
> index fd03d60..681ab58 100644
> --- a/scripts/Makefile.build
> +++ b/scripts/Makefile.build
> @@ -394,14 +394,10 @@ $(obj)/%.asn1.c $(obj)/%.asn1.h: $(src)/%.asn1 $(objtree)/scripts/asn1_compiler
> $(sort $(subdir-obj-y)): $(subdir-ym) ;
>
> #
> -# Rule to compile a set of .o files into one .o file
> +# Rule to compile a set of .o files into one .a file (without symbol table)
> #
> ifdef builtin-target
>
> -# built-in.a archives are made with no symbol table or index which
> -# makes them small and fast, but unable to be used by the linker.
> -# scripts/link-vmlinux.sh builds an aggregate built-in.a with a symbol
> -# table and index.
> quiet_cmd_ar_builtin = AR $@
> cmd_ar_builtin = rm -f $@; \
> $(AR) rcSTP$(KBUILD_ARFLAGS) $@ $(filter $(real-obj-y), $^)
> @@ -426,7 +422,7 @@ $(modorder-target): $(subdir-ym) FORCE
> $(Q)(cat /dev/null; $(modorder-cmds)) > $@
>
> #
> -# Rule to compile a set of .o files into one .a file
> +# Rule to compile a set of .o files into one .a file (with symbol table)
> #
> ifdef lib-target
> quiet_cmd_link_l_target = AR $@
> diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh
> index c8cf453..4788def 100755
> --- a/scripts/link-vmlinux.sh
> +++ b/scripts/link-vmlinux.sh
> @@ -44,24 +44,6 @@ info()
> fi
> }
>
> -# Thin archive build here makes a final archive with symbol table and indexes
> -# from vmlinux objects INIT and MAIN, which can be used as input to linker.
> -# KBUILD_VMLINUX_LIBS archives should already have symbol table and indexes
> -# added.
> -#
> -# Traditional incremental style of link does not require this step
> -#
> -# built-in.a output file
> -#
> -archive_builtin()
> -{
> - info AR built-in.a
> - rm -f built-in.a;
> - ${AR} rcsTP${KBUILD_ARFLAGS} built-in.a \
> - ${KBUILD_VMLINUX_INIT} \
> - ${KBUILD_VMLINUX_MAIN}
> -}
> -
> # Link of vmlinux.o used for section mismatch analysis
> # ${1} output file
> modpost_link()
> @@ -69,7 +51,8 @@ modpost_link()
> local objects
>
> objects="--whole-archive \
> - built-in.a \
> + ${KBUILD_VMLINUX_INIT} \
> + ${KBUILD_VMLINUX_MAIN} \
> --no-whole-archive \
> --start-group \
> ${KBUILD_VMLINUX_LIBS} \
> @@ -88,7 +71,8 @@ vmlinux_link()
>
> if [ "${SRCARCH}" != "um" ]; then
> objects="--whole-archive \
> - built-in.a \
> + ${KBUILD_VMLINUX_INIT} \
> + ${KBUILD_VMLINUX_MAIN} \
> --no-whole-archive \
> --start-group \
> ${KBUILD_VMLINUX_LIBS} \
> @@ -99,7 +83,8 @@ vmlinux_link()
> -T ${lds} ${objects}
> else
> objects="-Wl,--whole-archive \
> - built-in.a \
> + ${KBUILD_VMLINUX_INIT} \
> + ${KBUILD_VMLINUX_MAIN} \
> -Wl,--no-whole-archive \
> -Wl,--start-group \
> ${KBUILD_VMLINUX_LIBS} \
> @@ -160,7 +145,6 @@ cleanup()
> rm -f .tmp_System.map
> rm -f .tmp_kallsyms*
> rm -f .tmp_vmlinux*
> - rm -f built-in.a
> rm -f System.map
> rm -f vmlinux
> rm -f vmlinux.o
> @@ -217,8 +201,6 @@ fi;
> # final build of init/
> ${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init
>
> -archive_builtin
> -
> #link vmlinux.o
> info LD vmlinux.o
> modpost_link vmlinux.o
> --
> 2.7.4
>


--
Best Regards
Masahiro Yamada