aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicholas Piggin <npiggin@gmail.com>2017-06-19 11:52:05 -0400
committerMasahiro Yamada <yamada.masahiro@socionext.com>2017-06-29 20:03:03 -0400
commit3a166fc2d4ef7a6b7e440271ee6bd1799c066605 (patch)
treef0c4ea695592ad123e22c85d649ec917796a6652
parent9a6cfca4f4130444cb02536a4fdf7b6e285c713e (diff)
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>
-rw-r--r--Documentation/kbuild/kbuild.txt8
-rw-r--r--Makefile8
-rwxr-xr-xscripts/link-vmlinux.sh45
3 files changed, 46 insertions, 15 deletions
diff --git a/Documentation/kbuild/kbuild.txt b/Documentation/kbuild/kbuild.txt
index 0ff6a466a05b..ac2363ea05c5 100644
--- a/Documentation/kbuild/kbuild.txt
+++ b/Documentation/kbuild/kbuild.txt
@@ -236,5 +236,9 @@ Files specified with KBUILD_VMLINUX_INIT are linked first.
236KBUILD_VMLINUX_MAIN 236KBUILD_VMLINUX_MAIN
237-------------------------------------------------- 237--------------------------------------------------
238All object files for the main part of vmlinux. 238All object files for the main part of vmlinux.
239KBUILD_VMLINUX_INIT and KBUILD_VMLINUX_MAIN together specify 239
240all the object files used to link vmlinux. 240KBUILD_VMLINUX_LIBS
241--------------------------------------------------
242All .a "lib" files for vmlinux.
243KBUILD_VMLINUX_INIT, KBUILD_VMLINUX_MAIN, and KBUILD_VMLINUX_LIBS together
244specify all the object files used to link vmlinux.
diff --git a/Makefile b/Makefile
index 853ae9179af9..1177775fa410 100644
--- a/Makefile
+++ b/Makefile
@@ -952,19 +952,19 @@ core-y := $(patsubst %/, %/built-in.o, $(core-y))
952drivers-y := $(patsubst %/, %/built-in.o, $(drivers-y)) 952drivers-y := $(patsubst %/, %/built-in.o, $(drivers-y))
953net-y := $(patsubst %/, %/built-in.o, $(net-y)) 953net-y := $(patsubst %/, %/built-in.o, $(net-y))
954libs-y1 := $(patsubst %/, %/lib.a, $(libs-y)) 954libs-y1 := $(patsubst %/, %/lib.a, $(libs-y))
955libs-y2 := $(patsubst %/, %/built-in.o, $(libs-y)) 955libs-y2 := $(filter-out %.a, $(patsubst %/, %/built-in.o, $(libs-y)))
956libs-y := $(libs-y1) $(libs-y2)
957virt-y := $(patsubst %/, %/built-in.o, $(virt-y)) 956virt-y := $(patsubst %/, %/built-in.o, $(virt-y))
958 957
959# Externally visible symbols (used by link-vmlinux.sh) 958# Externally visible symbols (used by link-vmlinux.sh)
960export KBUILD_VMLINUX_INIT := $(head-y) $(init-y) 959export KBUILD_VMLINUX_INIT := $(head-y) $(init-y)
961export KBUILD_VMLINUX_MAIN := $(core-y) $(libs-y) $(drivers-y) $(net-y) $(virt-y) 960export KBUILD_VMLINUX_MAIN := $(core-y) $(libs-y2) $(drivers-y) $(net-y) $(virt-y)
961export KBUILD_VMLINUX_LIBS := $(libs-y1)
962export KBUILD_LDS := arch/$(SRCARCH)/kernel/vmlinux.lds 962export KBUILD_LDS := arch/$(SRCARCH)/kernel/vmlinux.lds
963export LDFLAGS_vmlinux 963export LDFLAGS_vmlinux
964# used by scripts/pacmage/Makefile 964# used by scripts/pacmage/Makefile
965export KBUILD_ALLDIRS := $(sort $(filter-out arch/%,$(vmlinux-alldirs)) arch Documentation include samples scripts tools) 965export KBUILD_ALLDIRS := $(sort $(filter-out arch/%,$(vmlinux-alldirs)) arch Documentation include samples scripts tools)
966 966
967vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN) 967vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN) $(KBUILD_VMLINUX_LIBS)
968 968
969# Include targets which we want to execute sequentially if the rest of the 969# Include targets which we want to execute sequentially if the rest of the
970# kernel build went well. If CONFIG_TRIM_UNUSED_KSYMS is set, this might be 970# kernel build went well. If CONFIG_TRIM_UNUSED_KSYMS is set, this might be
diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh
index 72a0aa627c56..e7b7eee31538 100755
--- a/scripts/link-vmlinux.sh
+++ b/scripts/link-vmlinux.sh
@@ -3,9 +3,12 @@
3# link vmlinux 3# link vmlinux
4# 4#
5# vmlinux is linked from the objects selected by $(KBUILD_VMLINUX_INIT) and 5# vmlinux is linked from the objects selected by $(KBUILD_VMLINUX_INIT) and
6# $(KBUILD_VMLINUX_MAIN). Most are built-in.o files from top-level directories 6# $(KBUILD_VMLINUX_MAIN) and $(KBUILD_VMLINUX_LIBS). Most are built-in.o files
7# in the kernel tree, others are specified in arch/$(ARCH)/Makefile. 7# from top-level directories in the kernel tree, others are specified in
8# Ordering when linking is important, and $(KBUILD_VMLINUX_INIT) must be first. 8# arch/$(ARCH)/Makefile. Ordering when linking is important, and
9# $(KBUILD_VMLINUX_INIT) must be first. $(KBUILD_VMLINUX_LIBS) are archives
10# which are linked conditionally (not within --whole-archive), and do not
11# require symbol indexes added.
9# 12#
10# vmlinux 13# vmlinux
11# ^ 14# ^
@@ -16,6 +19,9 @@
16# +--< $(KBUILD_VMLINUX_MAIN) 19# +--< $(KBUILD_VMLINUX_MAIN)
17# | +--< drivers/built-in.o mm/built-in.o + more 20# | +--< drivers/built-in.o mm/built-in.o + more
18# | 21# |
22# +--< $(KBUILD_VMLINUX_LIBS)
23# | +--< lib/lib.a + more
24# |
19# +-< ${kallsymso} (see description in KALLSYMS section) 25# +-< ${kallsymso} (see description in KALLSYMS section)
20# 26#
21# vmlinux version (uname -v) cannot be updated during normal 27# vmlinux version (uname -v) cannot be updated during normal
@@ -37,9 +43,10 @@ info()
37 fi 43 fi
38} 44}
39 45
40# Thin archive build here makes a final archive with 46# Thin archive build here makes a final archive with symbol table and indexes
41# symbol table and indexes from vmlinux objects, which can be 47# from vmlinux objects INIT and MAIN, which can be used as input to linker.
42# used as input to linker. 48# KBUILD_VMLINUX_LIBS archives should already have symbol table and indexes
49# added.
43# 50#
44# Traditional incremental style of link does not require this step 51# Traditional incremental style of link does not require this step
45# 52#
@@ -63,11 +70,17 @@ modpost_link()
63 local objects 70 local objects
64 71
65 if [ -n "${CONFIG_THIN_ARCHIVES}" ]; then 72 if [ -n "${CONFIG_THIN_ARCHIVES}" ]; then
66 objects="--whole-archive built-in.o --no-whole-archive" 73 objects="--whole-archive \
74 built-in.o \
75 --no-whole-archive \
76 --start-group \
77 ${KBUILD_VMLINUX_LIBS} \
78 --end-group"
67 else 79 else
68 objects="${KBUILD_VMLINUX_INIT} \ 80 objects="${KBUILD_VMLINUX_INIT} \
69 --start-group \ 81 --start-group \
70 ${KBUILD_VMLINUX_MAIN} \ 82 ${KBUILD_VMLINUX_MAIN} \
83 ${KBUILD_VMLINUX_LIBS} \
71 --end-group" 84 --end-group"
72 fi 85 fi
73 ${LD} ${LDFLAGS} -r -o ${1} ${objects} 86 ${LD} ${LDFLAGS} -r -o ${1} ${objects}
@@ -83,11 +96,18 @@ vmlinux_link()
83 96
84 if [ "${SRCARCH}" != "um" ]; then 97 if [ "${SRCARCH}" != "um" ]; then
85 if [ -n "${CONFIG_THIN_ARCHIVES}" ]; then 98 if [ -n "${CONFIG_THIN_ARCHIVES}" ]; then
86 objects="--whole-archive built-in.o ${1} --no-whole-archive" 99 objects="--whole-archive \
100 built-in.o \
101 --no-whole-archive \
102 --start-group \
103 ${KBUILD_VMLINUX_LIBS} \
104 --end-group \
105 ${1}"
87 else 106 else
88 objects="${KBUILD_VMLINUX_INIT} \ 107 objects="${KBUILD_VMLINUX_INIT} \
89 --start-group \ 108 --start-group \
90 ${KBUILD_VMLINUX_MAIN} \ 109 ${KBUILD_VMLINUX_MAIN} \
110 ${KBUILD_VMLINUX_LIBS} \
91 --end-group \ 111 --end-group \
92 ${1}" 112 ${1}"
93 fi 113 fi
@@ -96,11 +116,18 @@ vmlinux_link()
96 -T ${lds} ${objects} 116 -T ${lds} ${objects}
97 else 117 else
98 if [ -n "${CONFIG_THIN_ARCHIVES}" ]; then 118 if [ -n "${CONFIG_THIN_ARCHIVES}" ]; then
99 objects="-Wl,--whole-archive built-in.o ${1} -Wl,--no-whole-archive" 119 objects="-Wl,--whole-archive \
120 built-in.o \
121 -Wl,--no-whole-archive \
122 -Wl,--start-group \
123 ${KBUILD_VMLINUX_LIBS} \
124 -Wl,--end-group \
125 ${1}"
100 else 126 else
101 objects="${KBUILD_VMLINUX_INIT} \ 127 objects="${KBUILD_VMLINUX_INIT} \
102 -Wl,--start-group \ 128 -Wl,--start-group \
103 ${KBUILD_VMLINUX_MAIN} \ 129 ${KBUILD_VMLINUX_MAIN} \
130 ${KBUILD_VMLINUX_LIBS} \
104 -Wl,--end-group \ 131 -Wl,--end-group \
105 ${1}" 132 ${1}"
106 fi 133 fi