kbuild: handle libs-y archives separately from built-in.o archives
authorNicholas Piggin <npiggin@gmail.com>
Mon, 19 Jun 2017 15:52:05 +0000 (01:52 +1000)
committerMasahiro Yamada <yamada.masahiro@socionext.com>
Fri, 30 Jun 2017 00:03:03 +0000 (09:03 +0900)
The thin archives build currently puts all lib.a and built-in.o
files together and links them with --whole-archive.

This works because thin archives can recursively refer to thin
archives. However some architectures include libgcc.a, which may
not be a thin archive, or it may not be constructed with the "P"
option, in which case its contents do not get linked correctly.

So don't pull .a libs into the root built-in.o archive. These
libs should already have symbol tables and indexes built, so they
can be direct linker inputs. Move them out of the --whole-archive
option, which restore the conditional linking behaviour of lib.a
to thin archives builds.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Documentation/kbuild/kbuild.txt
Makefile
scripts/link-vmlinux.sh

index 0ff6a466a05b242bbba0a1ce9bf640b6a05fa8e7..ac2363ea05c5eec4db604a5056aed47a946f9c78 100644 (file)
@@ -236,5 +236,9 @@ Files specified with KBUILD_VMLINUX_INIT are linked first.
 KBUILD_VMLINUX_MAIN
 --------------------------------------------------
 All object files for the main part of vmlinux.
-KBUILD_VMLINUX_INIT and KBUILD_VMLINUX_MAIN together specify
-all the object files used to link vmlinux.
+
+KBUILD_VMLINUX_LIBS
+--------------------------------------------------
+All .a "lib" files for vmlinux.
+KBUILD_VMLINUX_INIT, KBUILD_VMLINUX_MAIN, and KBUILD_VMLINUX_LIBS together
+specify all the object files used to link vmlinux.
index 853ae9179af93a0ca9751a7faf40372e7fdb15dd..1177775fa41057e26faa29b9bcfcae69c7a819fa 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -952,19 +952,19 @@ core-y            := $(patsubst %/, %/built-in.o, $(core-y))
 drivers-y      := $(patsubst %/, %/built-in.o, $(drivers-y))
 net-y          := $(patsubst %/, %/built-in.o, $(net-y))
 libs-y1                := $(patsubst %/, %/lib.a, $(libs-y))
-libs-y2                := $(patsubst %/, %/built-in.o, $(libs-y))
-libs-y         := $(libs-y1) $(libs-y2)
+libs-y2                := $(filter-out %.a, $(patsubst %/, %/built-in.o, $(libs-y)))
 virt-y         := $(patsubst %/, %/built-in.o, $(virt-y))
 
 # Externally visible symbols (used by link-vmlinux.sh)
 export KBUILD_VMLINUX_INIT := $(head-y) $(init-y)
-export KBUILD_VMLINUX_MAIN := $(core-y) $(libs-y) $(drivers-y) $(net-y) $(virt-y)
+export KBUILD_VMLINUX_MAIN := $(core-y) $(libs-y2) $(drivers-y) $(net-y) $(virt-y)
+export KBUILD_VMLINUX_LIBS := $(libs-y1)
 export KBUILD_LDS          := arch/$(SRCARCH)/kernel/vmlinux.lds
 export LDFLAGS_vmlinux
 # used by scripts/pacmage/Makefile
 export KBUILD_ALLDIRS := $(sort $(filter-out arch/%,$(vmlinux-alldirs)) arch Documentation include samples scripts tools)
 
-vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN)
+vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN) $(KBUILD_VMLINUX_LIBS)
 
 # Include targets which we want to execute sequentially if the rest of the
 # kernel build went well. If CONFIG_TRIM_UNUSED_KSYMS is set, this might be
index 72a0aa627c56614a63ff1d49b0bba3e6f2ddbe3b..e7b7eee31538e69963874ae3e326a254dac54622 100755 (executable)
@@ -3,9 +3,12 @@
 # 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.
+# $(KBUILD_VMLINUX_MAIN) and $(KBUILD_VMLINUX_LIBS). 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. $(KBUILD_VMLINUX_LIBS) are archives
+# which are linked conditionally (not within --whole-archive), and do not
+# require symbol indexes added.
 #
 # vmlinux
 #   ^
@@ -16,6 +19,9 @@
 #   +--< $(KBUILD_VMLINUX_MAIN)
 #   |    +--< drivers/built-in.o mm/built-in.o + more
 #   |
+#   +--< $(KBUILD_VMLINUX_LIBS)
+#   |    +--< lib/lib.a + more
+#   |
 #   +-< ${kallsymso} (see description in KALLSYMS section)
 #
 # vmlinux version (uname -v) cannot be updated during normal
@@ -37,9 +43,10 @@ info()
        fi
 }
 
-# Thin archive build here makes a final archive with
-# symbol table and indexes from vmlinux objects, which can be
-# used as input to linker.
+# 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
 #
@@ -63,11 +70,17 @@ modpost_link()
        local objects
 
        if [ -n "${CONFIG_THIN_ARCHIVES}" ]; then
-               objects="--whole-archive built-in.o --no-whole-archive"
+               objects="--whole-archive                                \
+                       built-in.o                                      \
+                       --no-whole-archive                              \
+                       --start-group                                   \
+                       ${KBUILD_VMLINUX_LIBS}                          \
+                       --end-group"
        else
                objects="${KBUILD_VMLINUX_INIT}                         \
                        --start-group                                   \
                        ${KBUILD_VMLINUX_MAIN}                          \
+                       ${KBUILD_VMLINUX_LIBS}                          \
                        --end-group"
        fi
        ${LD} ${LDFLAGS} -r -o ${1} ${objects}
@@ -83,11 +96,18 @@ vmlinux_link()
 
        if [ "${SRCARCH}" != "um" ]; then
                if [ -n "${CONFIG_THIN_ARCHIVES}" ]; then
-                       objects="--whole-archive built-in.o ${1} --no-whole-archive"
+                       objects="--whole-archive                        \
+                               built-in.o                              \
+                               --no-whole-archive                      \
+                               --start-group                           \
+                               ${KBUILD_VMLINUX_LIBS}                  \
+                               --end-group                             \
+                               ${1}"
                else
                        objects="${KBUILD_VMLINUX_INIT}                 \
                                --start-group                           \
                                ${KBUILD_VMLINUX_MAIN}                  \
+                               ${KBUILD_VMLINUX_LIBS}                  \
                                --end-group                             \
                                ${1}"
                fi
@@ -96,11 +116,18 @@ vmlinux_link()
                        -T ${lds} ${objects}
        else
                if [ -n "${CONFIG_THIN_ARCHIVES}" ]; then
-                       objects="-Wl,--whole-archive built-in.o ${1} -Wl,--no-whole-archive"
+                       objects="-Wl,--whole-archive                    \
+                               built-in.o                              \
+                               -Wl,--no-whole-archive                  \
+                               -Wl,--start-group                       \
+                               ${KBUILD_VMLINUX_LIBS}                  \
+                               -Wl,--end-group                         \
+                               ${1}"
                else
                        objects="${KBUILD_VMLINUX_INIT}                 \
                                -Wl,--start-group                       \
                                ${KBUILD_VMLINUX_MAIN}                  \
+                               ${KBUILD_VMLINUX_LIBS}                  \
                                -Wl,--end-group                         \
                                ${1}"
                fi