Blame view
scripts/link-vmlinux.sh
10.9 KB
1f2bfbd00 kbuild: link of v... |
1 |
#!/bin/sh |
b24413180 License cleanup: ... |
2 |
# SPDX-License-Identifier: GPL-2.0 |
1f2bfbd00 kbuild: link of v... |
3 4 5 |
# # link vmlinux # |
d151e9719 kbuild: merge KBU... |
6 7 8 9 10 |
# vmlinux is linked from the objects selected by $(KBUILD_VMLINUX_OBJS) and # $(KBUILD_VMLINUX_LIBS). Most are built-in.a files from top-level directories # in the kernel tree, others are specified in arch/$(ARCH)/Makefile. # $(KBUILD_VMLINUX_LIBS) are archives which are linked conditionally # (not within --whole-archive), and do not require symbol indexes added. |
1f2bfbd00 kbuild: link of v... |
11 12 13 14 |
# # vmlinux # ^ # | |
d151e9719 kbuild: merge KBU... |
15 16 |
# +--< $(KBUILD_VMLINUX_OBJS) # | +--< init/built-in.a drivers/built-in.a mm/built-in.a + more |
1f2bfbd00 kbuild: link of v... |
17 |
# | |
3a166fc2d kbuild: handle li... |
18 19 20 |
# +--< $(KBUILD_VMLINUX_LIBS) # | +--< lib/lib.a + more # | |
1f2bfbd00 kbuild: link of v... |
21 22 23 24 25 26 27 28 29 30 31 |
# +-< ${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 # Error out on error set -e |
3ec8a5b33 kbuild: do not ex... |
32 33 34 |
LD="$1" KBUILD_LDFLAGS="$2" LDFLAGS_vmlinux="$3" |
1f2bfbd00 kbuild: link of v... |
35 36 37 38 39 |
# Nice output in kbuild format # Will be supressed by "make -s" info() { if [ "${quiet}" != "silent_" ]; then |
e83b9f554 kbuild: add abili... |
40 41 |
printf " %-7s %s " "${1}" "${2}" |
1f2bfbd00 kbuild: link of v... |
42 43 |
fi } |
110784e04 FROMLIST: init: l... |
44 45 46 47 48 49 50 51 52 53 |
# Generate a linker script to ensure correct ordering of initcalls. gen_initcalls() { info GEN .tmp_initcalls.lds ${PYTHON} ${srctree}/scripts/jobserver-exec \ ${PERL} ${srctree}/scripts/generate_initcall_order.pl \ ${KBUILD_VMLINUX_OBJS} ${KBUILD_VMLINUX_LIBS} \ > .tmp_initcalls.lds } |
93f3831e2 FROMLIST: kbuild:... |
54 55 56 57 58 59 60 61 62 63 64 65 66 |
# If CONFIG_LTO_CLANG is selected, collect generated symbol versions into # .tmp_symversions.lds gen_symversions() { info GEN .tmp_symversions.lds rm -f .tmp_symversions.lds for o in ${KBUILD_VMLINUX_OBJS} ${KBUILD_VMLINUX_LIBS}; do if [ -f ${o}.symversions ]; then cat ${o}.symversions >> .tmp_symversions.lds fi done } |
1f2bfbd00 kbuild: link of v... |
67 68 69 70 |
# Link of vmlinux.o used for section mismatch analysis # ${1} output file modpost_link() { |
a5967db9a kbuild: allow arc... |
71 |
local objects |
93f3831e2 FROMLIST: kbuild:... |
72 |
local lds="" |
a5967db9a kbuild: allow arc... |
73 |
|
6358d6e8b kbuild: remove in... |
74 |
objects="--whole-archive \ |
d151e9719 kbuild: merge KBU... |
75 |
${KBUILD_VMLINUX_OBJS} \ |
6358d6e8b kbuild: remove in... |
76 77 78 79 |
--no-whole-archive \ --start-group \ ${KBUILD_VMLINUX_LIBS} \ --end-group" |
ba01e93b4 FROMLIST: kbuild:... |
80 |
if [ -n "${CONFIG_LTO_CLANG}" ]; then |
110784e04 FROMLIST: init: l... |
81 82 |
gen_initcalls lds="-T .tmp_initcalls.lds" |
93f3831e2 FROMLIST: kbuild:... |
83 84 85 86 |
if [ -n "${CONFIG_MODVERSIONS}" ]; then gen_symversions lds="${lds} -T .tmp_symversions.lds" fi |
ba01e93b4 FROMLIST: kbuild:... |
87 88 89 90 91 92 |
# This might take a while, so indicate that we're doing # an LTO link info LTO ${1} else info LD ${1} fi |
93f3831e2 FROMLIST: kbuild:... |
93 |
${LD} ${KBUILD_LDFLAGS} -r -o ${1} ${lds} ${objects} |
1f2bfbd00 kbuild: link of v... |
94 |
} |
6804c1afd kbuild/objtool: A... |
95 96 |
objtool_link() { |
6dd43b98c FROMLIST: kbuild:... |
97 |
local objtoolcmd; |
6804c1afd kbuild/objtool: A... |
98 |
local objtoolopt; |
6dd43b98c FROMLIST: kbuild:... |
99 100 101 102 103 104 105 106 107 108 109 110 111 |
if [ "${CONFIG_LTO_CLANG} ${CONFIG_STACK_VALIDATION}" = "y y" ]; then # Don't perform vmlinux validation unless explicitly requested, # but run objtool on vmlinux.o now that we have an object file. if [ -n "${CONFIG_UNWINDER_ORC}" ]; then objtoolcmd="orc generate" fi objtoolopt="${objtoolopt} --duplicate" if [ -n "${CONFIG_FTRACE_MCOUNT_USE_OBJTOOL}" ]; then objtoolopt="${objtoolopt} --mcount" fi fi |
6804c1afd kbuild/objtool: A... |
112 |
if [ -n "${CONFIG_VMLINUX_VALIDATION}" ]; then |
6dd43b98c FROMLIST: kbuild:... |
113 114 115 116 117 118 119 120 |
objtoolopt="${objtoolopt} --noinstr" fi if [ -n "${objtoolopt}" ]; then if [ -z "${objtoolcmd}" ]; then objtoolcmd="check" fi objtoolopt="${objtoolopt} --vmlinux" |
6804c1afd kbuild/objtool: A... |
121 122 123 |
if [ -z "${CONFIG_FRAME_POINTER}" ]; then objtoolopt="${objtoolopt} --no-fp" fi |
6dd43b98c FROMLIST: kbuild:... |
124 |
if [ -n "${CONFIG_GCOV_KERNEL}" ] || [ -n "${CONFIG_LTO_CLANG}" ]; then |
6804c1afd kbuild/objtool: A... |
125 126 127 128 129 130 131 132 133 |
objtoolopt="${objtoolopt} --no-unreachable" fi if [ -n "${CONFIG_RETPOLINE}" ]; then objtoolopt="${objtoolopt} --retpoline" fi if [ -n "${CONFIG_X86_SMAP}" ]; then objtoolopt="${objtoolopt} --uaccess" fi info OBJTOOL ${1} |
6dd43b98c FROMLIST: kbuild:... |
134 |
tools/objtool/objtool ${objtoolcmd} ${objtoolopt} ${1} |
6804c1afd kbuild/objtool: A... |
135 136 |
fi } |
1f2bfbd00 kbuild: link of v... |
137 |
# Link of vmlinux |
341dfcf8d btf: expose BTF i... |
138 |
# ${1} - output file |
618916a4b kbuild: replace B... |
139 |
# ${2}, ${3}, ... - optional extra .o files |
1f2bfbd00 kbuild: link of v... |
140 141 142 |
vmlinux_link() { local lds="${objtree}/${KBUILD_LDS}" |
618916a4b kbuild: replace B... |
143 |
local output=${1} |
a5967db9a kbuild: allow arc... |
144 |
local objects |
af73d78bd kbuild: Remove de... |
145 |
local strip_debug |
1f2bfbd00 kbuild: link of v... |
146 |
|
d7b0827f2 Merge tag 'kbuild... |
147 |
info LD ${output} |
618916a4b kbuild: replace B... |
148 149 |
# skip output file argument shift |
af73d78bd kbuild: Remove de... |
150 151 152 153 |
# The kallsyms linking does not need debug symbols included. if [ "$output" != "${output#.tmp_vmlinux.kallsyms}" ] ; then strip_debug=-Wl,--strip-debug fi |
1f2bfbd00 kbuild: link of v... |
154 |
if [ "${SRCARCH}" != "um" ]; then |
ba01e93b4 FROMLIST: kbuild:... |
155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 |
if [ -n "${CONFIG_LTO_CLANG}" ]; then # Use vmlinux.o instead of performing the slow LTO # link again. objects="--whole-archive \ vmlinux.o \ --no-whole-archive \ ${@}" else objects="--whole-archive \ ${KBUILD_VMLINUX_OBJS} \ --no-whole-archive \ --start-group \ ${KBUILD_VMLINUX_LIBS} \ --end-group \ ${@}" fi |
a5967db9a kbuild: allow arc... |
171 |
|
618916a4b kbuild: replace B... |
172 |
${LD} ${KBUILD_LDFLAGS} ${LDFLAGS_vmlinux} \ |
af73d78bd kbuild: Remove de... |
173 |
${strip_debug#-Wl,} \ |
618916a4b kbuild: replace B... |
174 |
-o ${output} \ |
a5967db9a kbuild: allow arc... |
175 |
-T ${lds} ${objects} |
1f2bfbd00 kbuild: link of v... |
176 |
else |
6358d6e8b kbuild: remove in... |
177 |
objects="-Wl,--whole-archive \ |
d151e9719 kbuild: merge KBU... |
178 |
${KBUILD_VMLINUX_OBJS} \ |
6358d6e8b kbuild: remove in... |
179 180 181 182 |
-Wl,--no-whole-archive \ -Wl,--start-group \ ${KBUILD_VMLINUX_LIBS} \ -Wl,--end-group \ |
618916a4b kbuild: replace B... |
183 |
${@}" |
a5967db9a kbuild: allow arc... |
184 |
|
618916a4b kbuild: replace B... |
185 |
${CC} ${CFLAGS_vmlinux} \ |
af73d78bd kbuild: Remove de... |
186 |
${strip_debug} \ |
618916a4b kbuild: replace B... |
187 |
-o ${output} \ |
6358d6e8b kbuild: remove in... |
188 189 |
-Wl,-T,${lds} \ ${objects} \ |
a5967db9a kbuild: allow arc... |
190 |
-lutil -lrt -lpthread |
1f2bfbd00 kbuild: link of v... |
191 192 193 |
rm -f linux fi } |
e83b9f554 kbuild: add abili... |
194 |
# generate .BTF typeinfo from DWARF debuginfo |
341dfcf8d btf: expose BTF i... |
195 196 |
# ${1} - vmlinux image # ${2} - file to dump raw BTF data into |
e83b9f554 kbuild: add abili... |
197 198 |
gen_btf() { |
341dfcf8d btf: expose BTF i... |
199 |
local pahole_ver |
e83b9f554 kbuild: add abili... |
200 |
|
581b31c36 kbuild: tolerate ... |
201 |
if ! [ -x "$(command -v ${PAHOLE})" ]; then |
2a67a6ccb bpf, btf: Always ... |
202 |
echo >&2 "BTF: ${1}: pahole (${PAHOLE}) is not available" |
341dfcf8d btf: expose BTF i... |
203 |
return 1 |
581b31c36 kbuild: tolerate ... |
204 |
fi |
e83b9f554 kbuild: add abili... |
205 |
pahole_ver=$(${PAHOLE} --version | sed -E 's/v([0-9]+)\.([0-9]+)/\1\2/') |
21a85bd60 scripts: Require ... |
206 207 |
if [ "${pahole_ver}" -lt "116" ]; then echo >&2 "BTF: ${1}: pahole version $(${PAHOLE} --version) is too old, need at least v1.16" |
341dfcf8d btf: expose BTF i... |
208 |
return 1 |
e83b9f554 kbuild: add abili... |
209 |
fi |
341dfcf8d btf: expose BTF i... |
210 |
vmlinux_link ${1} |
af73d78bd kbuild: Remove de... |
211 212 |
info "BTF" ${2} |
e83b9f554 kbuild: add abili... |
213 |
LLVM_OBJCOPY=${OBJCOPY} ${PAHOLE} -J ${1} |
341dfcf8d btf: expose BTF i... |
214 |
|
90ceddcb4 bpf: Support llvm... |
215 216 217 218 219 220 221 222 223 224 |
# Create ${2} which contains just .BTF section but no symbols. Add # SHF_ALLOC because .BTF will be part of the vmlinux image. --strip-all # deletes all symbols including __start_BTF and __stop_BTF, which will # be redefined in the linker script. Add 2>/dev/null to suppress GNU # objcopy warnings: "empty loadable segment detected at ..." ${OBJCOPY} --only-section=.BTF --set-section-flags .BTF=alloc,readonly \ --strip-all ${1} ${2} 2>/dev/null # Change e_type to ET_REL so that it can be used to link final vmlinux. # Unlike GNU ld, lld does not allow an ET_EXEC input. printf '\1' | dd of=${2} conv=notrunc bs=1 seek=16 status=none |
e83b9f554 kbuild: add abili... |
225 |
} |
1f2bfbd00 kbuild: link of v... |
226 |
|
08beb669c kbuild: split the... |
227 |
# Create ${2} .S file with all symbols from the ${1} object file |
1f2bfbd00 kbuild: link of v... |
228 229 |
kallsyms() { |
1f2bfbd00 kbuild: link of v... |
230 231 232 |
local kallsymopt; if [ -n "${CONFIG_KALLSYMS_ALL}" ]; then |
6895f97e1 kbuild: add symbo... |
233 |
kallsymopt="${kallsymopt} --all-symbols" |
1f2bfbd00 kbuild: link of v... |
234 |
fi |
4d5d5664c x86: kallsyms: di... |
235 |
if [ -n "${CONFIG_KALLSYMS_ABSOLUTE_PERCPU}" ]; then |
c6bda7c98 kallsyms: fix per... |
236 237 |
kallsymopt="${kallsymopt} --absolute-percpu" fi |
2213e9a66 kallsyms: add sup... |
238 239 240 |
if [ -n "${CONFIG_KALLSYMS_BASE_RELATIVE}" ]; then kallsymopt="${kallsymopt} --base-relative" fi |
08beb669c kbuild: split the... |
241 242 |
info KSYMS ${2} ${NM} -n ${1} | scripts/kallsyms ${kallsymopt} > ${2} |
1f2bfbd00 kbuild: link of v... |
243 |
} |
8959e3927 kbuild: Parameter... |
244 245 246 247 248 |
# Perform one step in kallsyms generation, including temporary linking of # vmlinux. kallsyms_step() { kallsymso_prev=${kallsymso} |
af73d78bd kbuild: Remove de... |
249 250 |
kallsyms_vmlinux=.tmp_vmlinux.kallsyms${1} kallsymso=${kallsyms_vmlinux}.o |
08beb669c kbuild: split the... |
251 |
kallsyms_S=${kallsyms_vmlinux}.S |
8959e3927 kbuild: Parameter... |
252 |
|
d7b0827f2 Merge tag 'kbuild... |
253 |
vmlinux_link ${kallsyms_vmlinux} "${kallsymso_prev}" ${btf_vmlinux_bin_o} |
08beb669c kbuild: split the... |
254 255 256 257 258 259 |
kallsyms ${kallsyms_vmlinux} ${kallsyms_S} info AS ${kallsyms_S} ${CC} ${NOSTDINC_FLAGS} ${LINUXINCLUDE} ${KBUILD_CPPFLAGS} \ ${KBUILD_AFLAGS} ${KBUILD_AFLAGS_KERNEL} \ -c -o ${kallsymso} ${kallsyms_S} |
8959e3927 kbuild: Parameter... |
260 |
} |
1f2bfbd00 kbuild: link of v... |
261 262 263 264 265 266 |
# Create map file with all symbols from ${1} # See mksymap for additional details mksysmap() { ${CONFIG_SHELL} "${srctree}/scripts/mksysmap" ${1} ${2} } |
109167063 scripts/sorttable... |
267 |
sorttable() |
1347a2ceb Merge branch 'kbu... |
268 |
{ |
109167063 scripts/sorttable... |
269 |
${objtree}/scripts/sorttable ${1} |
1347a2ceb Merge branch 'kbu... |
270 |
} |
1f2bfbd00 kbuild: link of v... |
271 |
# Delete output files in case of error |
1f2bfbd00 kbuild: link of v... |
272 273 |
cleanup() { |
341dfcf8d btf: expose BTF i... |
274 |
rm -f .btf.* |
1f2bfbd00 kbuild: link of v... |
275 |
rm -f .tmp_System.map |
110784e04 FROMLIST: init: l... |
276 |
rm -f .tmp_initcalls.lds |
93f3831e2 FROMLIST: kbuild:... |
277 |
rm -f .tmp_symversions.lds |
1f2bfbd00 kbuild: link of v... |
278 279 280 281 282 |
rm -f .tmp_vmlinux* rm -f System.map rm -f vmlinux rm -f vmlinux.o } |
ab160dbbc scripts: fix link... |
283 284 285 286 287 288 289 290 291 292 293 294 295 |
on_exit() { if [ $? -ne 0 ]; then cleanup fi } trap on_exit EXIT on_signals() { exit 1 } trap on_signals HUP INT QUIT TERM |
1f2bfbd00 kbuild: link of v... |
296 297 298 299 300 301 302 303 304 305 306 307 308 |
# Use "make V=1" to debug this script case "${KBUILD_VERBOSE}" in *1*) set -x ;; esac if [ "$1" = "clean" ]; then cleanup exit 0 fi # We need access to CONFIG_ symbols |
94cf8acc3 kbuild: source in... |
309 |
. include/config/auto.conf |
1f2bfbd00 kbuild: link of v... |
310 |
|
1f2bfbd00 kbuild: link of v... |
311 312 |
# Update version info GEN .version |
278ae6040 kbuild: link-vmli... |
313 314 315 |
if [ -r .version ]; then VERSION=$(expr 0$(cat .version) + 1) echo $VERSION > .version |
1f2bfbd00 kbuild: link of v... |
316 |
else |
278ae6040 kbuild: link-vmli... |
317 318 |
rm -f .version echo 1 > .version |
1f2bfbd00 kbuild: link of v... |
319 320 321 |
fi; # final build of init/ |
083bc0e1c kbuild: fix misma... |
322 |
${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init need-builtin=1 |
1f2bfbd00 kbuild: link of v... |
323 |
|
abac4c897 kbuild: minor imp... |
324 |
#link vmlinux.o |
abac4c897 kbuild: minor imp... |
325 |
modpost_link vmlinux.o |
6804c1afd kbuild/objtool: A... |
326 |
objtool_link vmlinux.o |
abac4c897 kbuild: minor imp... |
327 328 |
# modpost vmlinux.o to check for section mismatches |
a721588d9 kbuild: modpost: ... |
329 |
${MAKE} -f "${srctree}/scripts/Makefile.modpost" MODPOST_VMLINUX=1 |
abac4c897 kbuild: minor imp... |
330 |
|
898490c01 moduleparam: Save... |
331 332 |
info MODINFO modules.builtin.modinfo ${OBJCOPY} -j .modinfo -O binary vmlinux.o modules.builtin.modinfo |
8b41fc445 kbuild: create mo... |
333 334 335 336 337 338 |
info GEN modules.builtin # The second line aids cases where multiple modules share the same object. tr '\0' ' ' < modules.builtin.modinfo | sed -n 's/^[[:alnum:]:_]*\.file=//p' | tr ' ' ' ' | uniq | sed -e 's:^:kernel/:' -e 's/$/.ko/' > modules.builtin |
898490c01 moduleparam: Save... |
339 |
|
7fd785685 btf: rename /sys/... |
340 |
btf_vmlinux_bin_o="" |
341dfcf8d btf: expose BTF i... |
341 |
if [ -n "${CONFIG_DEBUG_INFO_BTF}" ]; then |
af73d78bd kbuild: Remove de... |
342 343 |
btf_vmlinux_bin_o=.btf.vmlinux.bin.o if ! gen_btf .tmp_vmlinux.btf $btf_vmlinux_bin_o ; then |
da5fb1822 bpf: Support pre-... |
344 345 346 |
echo >&2 "Failed to generate BTF for vmlinux" echo >&2 "Try to disable CONFIG_DEBUG_INFO_BTF" exit 1 |
341dfcf8d btf: expose BTF i... |
347 348 |
fi fi |
1f2bfbd00 kbuild: link of v... |
349 |
kallsymso="" |
8959e3927 kbuild: Parameter... |
350 |
kallsymso_prev="" |
1f2bfbd00 kbuild: link of v... |
351 352 353 354 355 356 357 358 359 360 361 362 363 364 |
kallsyms_vmlinux="" if [ -n "${CONFIG_KALLSYMS}" ]; then # 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 |
7e2b37c97 kbuild: kallsyms ... |
365 366 367 368 369 370 371 372 |
# 3) That link may have expanded the kernel image enough that # more linker branch stubs / trampolines had to be added, which # introduces new names, which further expands kallsyms. Do another # pass if that is the case. In theory it's possible this results # in even more stubs, but unlikely. # KALLSYMS_EXTRA_PASS=1 may also used to debug or work around # other bugs. # 4) The correct ${kallsymso} is linked into the final vmlinux. |
1f2bfbd00 kbuild: link of v... |
373 374 375 |
# # a) Verify that the System.map from vmlinux matches the map from # ${kallsymso}. |
8959e3927 kbuild: Parameter... |
376 377 |
kallsyms_step 1 kallsyms_step 2 |
1f2bfbd00 kbuild: link of v... |
378 |
|
7e2b37c97 kbuild: kallsyms ... |
379 |
# step 3 |
8959e3927 kbuild: Parameter... |
380 381 |
size1=$(${CONFIG_SHELL} "${srctree}/scripts/file-size.sh" ${kallsymso_prev}) size2=$(${CONFIG_SHELL} "${srctree}/scripts/file-size.sh" ${kallsymso}) |
7e2b37c97 kbuild: kallsyms ... |
382 383 |
if [ $size1 -ne $size2 ] || [ -n "${KALLSYMS_EXTRA_PASS}" ]; then |
8959e3927 kbuild: Parameter... |
384 |
kallsyms_step 3 |
1f2bfbd00 kbuild: link of v... |
385 386 |
fi fi |
d7b0827f2 Merge tag 'kbuild... |
387 |
vmlinux_link vmlinux "${kallsymso}" ${btf_vmlinux_bin_o} |
e83b9f554 kbuild: add abili... |
388 |
|
c9a0f3b85 bpf: Resolve BTF ... |
389 |
# fill in BTF IDs |
017dab341 bpf: Check CONFIG... |
390 391 392 |
if [ -n "${CONFIG_DEBUG_INFO_BTF}" -a -n "${CONFIG_BPF}" ]; then info BTFIDS vmlinux ${RESOLVE_BTFIDS} vmlinux |
c9a0f3b85 bpf: Resolve BTF ... |
393 |
fi |
109167063 scripts/sorttable... |
394 395 |
if [ -n "${CONFIG_BUILDTIME_TABLE_SORT}" ]; then info SORTTAB vmlinux |
f14bf6a35 x86/unwind/orc: R... |
396 397 398 399 |
if ! sorttable vmlinux; then echo >&2 Failed to sort kernel tables exit 1 fi |
1347a2ceb Merge branch 'kbu... |
400 |
fi |
1f2bfbd00 kbuild: link of v... |
401 402 403 404 405 406 407 408 |
info SYSMAP System.map mksysmap vmlinux System.map # step a (see comment above) if [ -n "${CONFIG_KALLSYMS}" ]; then mksysmap ${kallsyms_vmlinux} .tmp_System.map if ! cmp -s System.map .tmp_System.map; then |
5369f5502 kbuild: Print err... |
409 |
echo >&2 Inconsistent kallsyms data |
367e43c50 link-vmlinux.sh: ... |
410 |
echo >&2 Try "make KALLSYMS_EXTRA_PASS=1" as a workaround |
1f2bfbd00 kbuild: link of v... |
411 412 413 |
exit 1 fi fi |