kbuild: handle libs-y archives separately from built-in.o archives
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>
This commit is contained in:
parent
9a6cfca4f4
commit
3a166fc2d4
3 changed files with 46 additions and 15 deletions
|
@ -236,5 +236,9 @@ Files specified with KBUILD_VMLINUX_INIT are linked first.
|
||||||
KBUILD_VMLINUX_MAIN
|
KBUILD_VMLINUX_MAIN
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
All object files for the main part of vmlinux.
|
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.
|
||||||
|
|
8
Makefile
8
Makefile
|
@ -952,19 +952,19 @@ core-y := $(patsubst %/, %/built-in.o, $(core-y))
|
||||||
drivers-y := $(patsubst %/, %/built-in.o, $(drivers-y))
|
drivers-y := $(patsubst %/, %/built-in.o, $(drivers-y))
|
||||||
net-y := $(patsubst %/, %/built-in.o, $(net-y))
|
net-y := $(patsubst %/, %/built-in.o, $(net-y))
|
||||||
libs-y1 := $(patsubst %/, %/lib.a, $(libs-y))
|
libs-y1 := $(patsubst %/, %/lib.a, $(libs-y))
|
||||||
libs-y2 := $(patsubst %/, %/built-in.o, $(libs-y))
|
libs-y2 := $(filter-out %.a, $(patsubst %/, %/built-in.o, $(libs-y)))
|
||||||
libs-y := $(libs-y1) $(libs-y2)
|
|
||||||
virt-y := $(patsubst %/, %/built-in.o, $(virt-y))
|
virt-y := $(patsubst %/, %/built-in.o, $(virt-y))
|
||||||
|
|
||||||
# Externally visible symbols (used by link-vmlinux.sh)
|
# Externally visible symbols (used by link-vmlinux.sh)
|
||||||
export KBUILD_VMLINUX_INIT := $(head-y) $(init-y)
|
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 KBUILD_LDS := arch/$(SRCARCH)/kernel/vmlinux.lds
|
||||||
export LDFLAGS_vmlinux
|
export LDFLAGS_vmlinux
|
||||||
# used by scripts/pacmage/Makefile
|
# used by scripts/pacmage/Makefile
|
||||||
export KBUILD_ALLDIRS := $(sort $(filter-out arch/%,$(vmlinux-alldirs)) arch Documentation include samples scripts tools)
|
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
|
# 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
|
# kernel build went well. If CONFIG_TRIM_UNUSED_KSYMS is set, this might be
|
||||||
|
|
|
@ -3,9 +3,12 @@
|
||||||
# link vmlinux
|
# link vmlinux
|
||||||
#
|
#
|
||||||
# vmlinux is linked from the objects selected by $(KBUILD_VMLINUX_INIT) and
|
# 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
|
# $(KBUILD_VMLINUX_MAIN) and $(KBUILD_VMLINUX_LIBS). Most are built-in.o files
|
||||||
# in the kernel tree, others are specified in arch/$(ARCH)/Makefile.
|
# from top-level directories in the kernel tree, others are specified in
|
||||||
# Ordering when linking is important, and $(KBUILD_VMLINUX_INIT) must be first.
|
# 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
|
# vmlinux
|
||||||
# ^
|
# ^
|
||||||
|
@ -16,6 +19,9 @@
|
||||||
# +--< $(KBUILD_VMLINUX_MAIN)
|
# +--< $(KBUILD_VMLINUX_MAIN)
|
||||||
# | +--< drivers/built-in.o mm/built-in.o + more
|
# | +--< drivers/built-in.o mm/built-in.o + more
|
||||||
# |
|
# |
|
||||||
|
# +--< $(KBUILD_VMLINUX_LIBS)
|
||||||
|
# | +--< lib/lib.a + more
|
||||||
|
# |
|
||||||
# +-< ${kallsymso} (see description in KALLSYMS section)
|
# +-< ${kallsymso} (see description in KALLSYMS section)
|
||||||
#
|
#
|
||||||
# vmlinux version (uname -v) cannot be updated during normal
|
# vmlinux version (uname -v) cannot be updated during normal
|
||||||
|
@ -37,9 +43,10 @@ info()
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# Thin archive build here makes a final archive with
|
# Thin archive build here makes a final archive with symbol table and indexes
|
||||||
# symbol table and indexes from vmlinux objects, which can be
|
# from vmlinux objects INIT and MAIN, which can be used as input to linker.
|
||||||
# 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
|
# Traditional incremental style of link does not require this step
|
||||||
#
|
#
|
||||||
|
@ -63,11 +70,17 @@ modpost_link()
|
||||||
local objects
|
local objects
|
||||||
|
|
||||||
if [ -n "${CONFIG_THIN_ARCHIVES}" ]; then
|
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
|
else
|
||||||
objects="${KBUILD_VMLINUX_INIT} \
|
objects="${KBUILD_VMLINUX_INIT} \
|
||||||
--start-group \
|
--start-group \
|
||||||
${KBUILD_VMLINUX_MAIN} \
|
${KBUILD_VMLINUX_MAIN} \
|
||||||
|
${KBUILD_VMLINUX_LIBS} \
|
||||||
--end-group"
|
--end-group"
|
||||||
fi
|
fi
|
||||||
${LD} ${LDFLAGS} -r -o ${1} ${objects}
|
${LD} ${LDFLAGS} -r -o ${1} ${objects}
|
||||||
|
@ -83,11 +96,18 @@ vmlinux_link()
|
||||||
|
|
||||||
if [ "${SRCARCH}" != "um" ]; then
|
if [ "${SRCARCH}" != "um" ]; then
|
||||||
if [ -n "${CONFIG_THIN_ARCHIVES}" ]; 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
|
else
|
||||||
objects="${KBUILD_VMLINUX_INIT} \
|
objects="${KBUILD_VMLINUX_INIT} \
|
||||||
--start-group \
|
--start-group \
|
||||||
${KBUILD_VMLINUX_MAIN} \
|
${KBUILD_VMLINUX_MAIN} \
|
||||||
|
${KBUILD_VMLINUX_LIBS} \
|
||||||
--end-group \
|
--end-group \
|
||||||
${1}"
|
${1}"
|
||||||
fi
|
fi
|
||||||
|
@ -96,11 +116,18 @@ vmlinux_link()
|
||||||
-T ${lds} ${objects}
|
-T ${lds} ${objects}
|
||||||
else
|
else
|
||||||
if [ -n "${CONFIG_THIN_ARCHIVES}" ]; then
|
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
|
else
|
||||||
objects="${KBUILD_VMLINUX_INIT} \
|
objects="${KBUILD_VMLINUX_INIT} \
|
||||||
-Wl,--start-group \
|
-Wl,--start-group \
|
||||||
${KBUILD_VMLINUX_MAIN} \
|
${KBUILD_VMLINUX_MAIN} \
|
||||||
|
${KBUILD_VMLINUX_LIBS} \
|
||||||
-Wl,--end-group \
|
-Wl,--end-group \
|
||||||
${1}"
|
${1}"
|
||||||
fi
|
fi
|
||||||
|
|
Loading…
Reference in a new issue