Blame view
scripts/link-vmlinux.sh
7.7 KB
1f2bfbd00
|
1 |
#!/bin/sh |
b24413180
|
2 |
# SPDX-License-Identifier: GPL-2.0 |
1f2bfbd00
|
3 4 5 |
# # link vmlinux # |
d151e9719
|
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
|
11 12 13 14 |
# # vmlinux # ^ # | |
d151e9719
|
15 16 |
# +--< $(KBUILD_VMLINUX_OBJS) # | +--< init/built-in.a drivers/built-in.a mm/built-in.a + more |
1f2bfbd00
|
17 |
# | |
3a166fc2d
|
18 19 20 |
# +--< $(KBUILD_VMLINUX_LIBS) # | +--< lib/lib.a + more # | |
1f2bfbd00
|
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# +-< ${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 # Nice output in kbuild format # Will be supressed by "make -s" info() { if [ "${quiet}" != "silent_" ]; then |
e83b9f554
|
38 39 |
printf " %-7s %s " "${1}" "${2}" |
1f2bfbd00
|
40 41 42 43 44 45 46 |
fi } # Link of vmlinux.o used for section mismatch analysis # ${1} output file modpost_link() { |
a5967db9a
|
47 |
local objects |
6358d6e8b
|
48 |
objects="--whole-archive \ |
d151e9719
|
49 |
${KBUILD_VMLINUX_OBJS} \ |
6358d6e8b
|
50 51 52 53 |
--no-whole-archive \ --start-group \ ${KBUILD_VMLINUX_LIBS} \ --end-group" |
d503ac531
|
54 |
${LD} ${KBUILD_LDFLAGS} -r -o ${1} ${objects} |
1f2bfbd00
|
55 56 57 |
} # Link of vmlinux |
341dfcf8d
|
58 |
# ${1} - output file |
618916a4b
|
59 |
# ${2}, ${3}, ... - optional extra .o files |
1f2bfbd00
|
60 61 62 |
vmlinux_link() { local lds="${objtree}/${KBUILD_LDS}" |
618916a4b
|
63 |
local output=${1} |
a5967db9a
|
64 |
local objects |
1f2bfbd00
|
65 |
|
d7b0827f2
|
66 |
info LD ${output} |
618916a4b
|
67 68 |
# skip output file argument shift |
1f2bfbd00
|
69 |
if [ "${SRCARCH}" != "um" ]; then |
6358d6e8b
|
70 |
objects="--whole-archive \ |
d151e9719
|
71 |
${KBUILD_VMLINUX_OBJS} \ |
6358d6e8b
|
72 73 74 75 |
--no-whole-archive \ --start-group \ ${KBUILD_VMLINUX_LIBS} \ --end-group \ |
618916a4b
|
76 |
${@}" |
a5967db9a
|
77 |
|
618916a4b
|
78 79 |
${LD} ${KBUILD_LDFLAGS} ${LDFLAGS_vmlinux} \ -o ${output} \ |
a5967db9a
|
80 |
-T ${lds} ${objects} |
1f2bfbd00
|
81 |
else |
6358d6e8b
|
82 |
objects="-Wl,--whole-archive \ |
d151e9719
|
83 |
${KBUILD_VMLINUX_OBJS} \ |
6358d6e8b
|
84 85 86 87 |
-Wl,--no-whole-archive \ -Wl,--start-group \ ${KBUILD_VMLINUX_LIBS} \ -Wl,--end-group \ |
618916a4b
|
88 |
${@}" |
a5967db9a
|
89 |
|
618916a4b
|
90 91 |
${CC} ${CFLAGS_vmlinux} \ -o ${output} \ |
6358d6e8b
|
92 93 |
-Wl,-T,${lds} \ ${objects} \ |
a5967db9a
|
94 |
-lutil -lrt -lpthread |
1f2bfbd00
|
95 96 97 |
rm -f linux fi } |
e83b9f554
|
98 |
# generate .BTF typeinfo from DWARF debuginfo |
341dfcf8d
|
99 100 |
# ${1} - vmlinux image # ${2} - file to dump raw BTF data into |
e83b9f554
|
101 102 |
gen_btf() { |
341dfcf8d
|
103 104 |
local pahole_ver local bin_arch |
e83b9f554
|
105 |
|
581b31c36
|
106 |
if ! [ -x "$(command -v ${PAHOLE})" ]; then |
ea038a527
|
107 |
echo >&2 "BTF: ${1}: pahole (${PAHOLE}) is not available" |
341dfcf8d
|
108 |
return 1 |
581b31c36
|
109 |
fi |
e83b9f554
|
110 111 |
pahole_ver=$(${PAHOLE} --version | sed -E 's/v([0-9]+)\.([0-9]+)/\1\2/') if [ "${pahole_ver}" -lt "113" ]; then |
ea038a527
|
112 |
echo >&2 "BTF: ${1}: pahole version $(${PAHOLE} --version) is too old, need at least v1.13" |
341dfcf8d
|
113 |
return 1 |
e83b9f554
|
114 |
fi |
341dfcf8d
|
115 116 |
info "BTF" ${2} vmlinux_link ${1} |
e83b9f554
|
117 |
LLVM_OBJCOPY=${OBJCOPY} ${PAHOLE} -J ${1} |
341dfcf8d
|
118 119 |
# dump .BTF section into raw binary file to link with final vmlinux |
fdf370376
|
120 |
bin_arch=$(LANG=C ${OBJDUMP} -f ${1} | grep architecture | \ |
341dfcf8d
|
121 |
cut -d, -f1 | cut -d' ' -f2) |
fdf370376
|
122 123 |
bin_format=$(LANG=C ${OBJDUMP} -f ${1} | grep 'file format' | \ awk '{print $4}') |
c2227983d
|
124 125 126 |
${OBJCOPY} --change-section-address .BTF=0 \ --set-section-flags .BTF=alloc -O binary \ --only-section=.BTF ${1} .btf.vmlinux.bin |
fdf370376
|
127 |
${OBJCOPY} -I binary -O ${bin_format} -B ${bin_arch} \ |
7fd785685
|
128 |
--rename-section .data=.BTF .btf.vmlinux.bin ${2} |
e83b9f554
|
129 |
} |
1f2bfbd00
|
130 131 132 133 134 135 136 137 |
# Create ${2} .o file with all symbols from the ${1} object file kallsyms() { info KSYM ${2} local kallsymopt; if [ -n "${CONFIG_KALLSYMS_ALL}" ]; then |
6895f97e1
|
138 |
kallsymopt="${kallsymopt} --all-symbols" |
1f2bfbd00
|
139 |
fi |
4d5d5664c
|
140 |
if [ -n "${CONFIG_KALLSYMS_ABSOLUTE_PERCPU}" ]; then |
c6bda7c98
|
141 142 |
kallsymopt="${kallsymopt} --absolute-percpu" fi |
2213e9a66
|
143 144 145 |
if [ -n "${CONFIG_KALLSYMS_BASE_RELATIVE}" ]; then kallsymopt="${kallsymopt} --base-relative" fi |
00e6c28c6
|
146 147 |
local aflags="${KBUILD_AFLAGS} ${KBUILD_AFLAGS_KERNEL} \ ${NOSTDINC_FLAGS} ${LINUXINCLUDE} ${KBUILD_CPPFLAGS}" |
1f2bfbd00
|
148 |
|
a04393420
|
149 150 151 152 |
local afile="`basename ${2} .o`.S" ${NM} -n ${1} | scripts/kallsyms ${kallsymopt} > ${afile} ${CC} ${aflags} -c -o ${2} ${afile} |
1f2bfbd00
|
153 |
} |
8959e3927
|
154 155 156 157 158 159 160 |
# Perform one step in kallsyms generation, including temporary linking of # vmlinux. kallsyms_step() { kallsymso_prev=${kallsymso} kallsymso=.tmp_kallsyms${1}.o kallsyms_vmlinux=.tmp_vmlinux${1} |
d7b0827f2
|
161 |
vmlinux_link ${kallsyms_vmlinux} "${kallsymso_prev}" ${btf_vmlinux_bin_o} |
8959e3927
|
162 163 |
kallsyms ${kallsyms_vmlinux} ${kallsymso} } |
1f2bfbd00
|
164 165 166 167 168 169 |
# Create map file with all symbols from ${1} # See mksymap for additional details mksysmap() { ${CONFIG_SHELL} "${srctree}/scripts/mksysmap" ${1} ${2} } |
1347a2ceb
|
170 171 172 173 |
sortextable() { ${objtree}/scripts/sortextable ${1} } |
1f2bfbd00
|
174 |
# Delete output files in case of error |
1f2bfbd00
|
175 176 |
cleanup() { |
341dfcf8d
|
177 |
rm -f .btf.* |
1f2bfbd00
|
178 179 |
rm -f .tmp_System.map rm -f .tmp_kallsyms* |
1f2bfbd00
|
180 181 182 183 184 |
rm -f .tmp_vmlinux* rm -f System.map rm -f vmlinux rm -f vmlinux.o } |
ab160dbbc
|
185 186 187 188 189 190 191 192 193 194 195 196 197 |
on_exit() { if [ $? -ne 0 ]; then cleanup fi } trap on_exit EXIT on_signals() { exit 1 } trap on_signals HUP INT QUIT TERM |
1f2bfbd00
|
198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 |
# # # 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
|
213 |
. include/config/auto.conf |
1f2bfbd00
|
214 |
|
1f2bfbd00
|
215 216 |
# Update version info GEN .version |
278ae6040
|
217 218 219 |
if [ -r .version ]; then VERSION=$(expr 0$(cat .version) + 1) echo $VERSION > .version |
1f2bfbd00
|
220 |
else |
278ae6040
|
221 222 |
rm -f .version echo 1 > .version |
1f2bfbd00
|
223 224 225 |
fi; # final build of init/ |
a7b151fff
|
226 |
${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init |
1f2bfbd00
|
227 |
|
abac4c897
|
228 229 230 231 232 |
#link vmlinux.o info LD vmlinux.o modpost_link vmlinux.o # modpost vmlinux.o to check for section mismatches |
a721588d9
|
233 |
${MAKE} -f "${srctree}/scripts/Makefile.modpost" MODPOST_VMLINUX=1 |
abac4c897
|
234 |
|
898490c01
|
235 236 |
info MODINFO modules.builtin.modinfo ${OBJCOPY} -j .modinfo -O binary vmlinux.o modules.builtin.modinfo |
7fd785685
|
237 |
btf_vmlinux_bin_o="" |
341dfcf8d
|
238 |
if [ -n "${CONFIG_DEBUG_INFO_BTF}" ]; then |
7fd785685
|
239 240 |
if gen_btf .tmp_vmlinux.btf .btf.vmlinux.bin.o ; then btf_vmlinux_bin_o=.btf.vmlinux.bin.o |
c8b4a8e3b
|
241 242 243 244 |
else echo >&2 "Failed to generate BTF for vmlinux" echo >&2 "Try to disable CONFIG_DEBUG_INFO_BTF" exit 1 |
341dfcf8d
|
245 246 |
fi fi |
1f2bfbd00
|
247 |
kallsymso="" |
8959e3927
|
248 |
kallsymso_prev="" |
1f2bfbd00
|
249 250 251 252 253 254 255 256 257 258 259 260 261 262 |
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
|
263 264 265 266 267 268 269 270 |
# 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
|
271 272 273 |
# # a) Verify that the System.map from vmlinux matches the map from # ${kallsymso}. |
8959e3927
|
274 275 |
kallsyms_step 1 kallsyms_step 2 |
1f2bfbd00
|
276 |
|
7e2b37c97
|
277 |
# step 3 |
8959e3927
|
278 279 |
size1=$(${CONFIG_SHELL} "${srctree}/scripts/file-size.sh" ${kallsymso_prev}) size2=$(${CONFIG_SHELL} "${srctree}/scripts/file-size.sh" ${kallsymso}) |
7e2b37c97
|
280 281 |
if [ $size1 -ne $size2 ] || [ -n "${KALLSYMS_EXTRA_PASS}" ]; then |
8959e3927
|
282 |
kallsyms_step 3 |
1f2bfbd00
|
283 284 |
fi fi |
d7b0827f2
|
285 |
vmlinux_link vmlinux "${kallsymso}" ${btf_vmlinux_bin_o} |
e83b9f554
|
286 |
|
1347a2ceb
|
287 288 289 290 |
if [ -n "${CONFIG_BUILDTIME_EXTABLE_SORT}" ]; then info SORTEX vmlinux sortextable vmlinux fi |
1f2bfbd00
|
291 292 293 294 295 296 297 298 |
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
|
299 |
echo >&2 Inconsistent kallsyms data |
367e43c50
|
300 |
echo >&2 Try "make KALLSYMS_EXTRA_PASS=1" as a workaround |
1f2bfbd00
|
301 302 303 |
exit 1 fi fi |