Blame view

scripts/link-vmlinux.sh 6.62 KB
1f2bfbd00   Sam Ravnborg   kbuild: link of v...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
  #!/bin/sh
  #
  # 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.
  #
  # vmlinux
  #   ^
  #   |
  #   +-< $(KBUILD_VMLINUX_INIT)
  #   |   +--< init/version.o + more
  #   |
  #   +--< $(KBUILD_VMLINUX_MAIN)
  #   |    +--< drivers/built-in.o mm/built-in.o + more
  #   |
  #   +-< ${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
  		printf "  %-7s %s
  " ${1} ${2}
  	fi
  }
a5967db9a   Stephen Rothwell   kbuild: allow arc...
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
  # Thin archive build here makes a final archive with
  # symbol table and indexes from vmlinux objects, which can be
  # used as input to linker.
  #
  # Traditional incremental style of link does not require this step
  #
  # built-in.o output file
  #
  archive_builtin()
  {
  	if [ -n "${CONFIG_THIN_ARCHIVES}" ]; then
  		info AR built-in.o
  		rm -f built-in.o;
  		${AR} rcsT${KBUILD_ARFLAGS} built-in.o			\
  					${KBUILD_VMLINUX_INIT}		\
  					${KBUILD_VMLINUX_MAIN}
  	fi
  }
1f2bfbd00   Sam Ravnborg   kbuild: link of v...
58
59
60
61
  # Link of vmlinux.o used for section mismatch analysis
  # ${1} output file
  modpost_link()
  {
a5967db9a   Stephen Rothwell   kbuild: allow arc...
62
63
64
65
66
67
68
69
70
71
72
  	local objects
  
  	if [ -n "${CONFIG_THIN_ARCHIVES}" ]; then
  		objects="--whole-archive built-in.o"
  	else
  		objects="${KBUILD_VMLINUX_INIT}				\
  			--start-group					\
  			${KBUILD_VMLINUX_MAIN}				\
  			--end-group"
  	fi
  	${LD} ${LDFLAGS} -r -o ${1} ${objects}
1f2bfbd00   Sam Ravnborg   kbuild: link of v...
73
74
75
76
77
78
79
80
  }
  
  # Link of vmlinux
  # ${1} - optional extra .o files
  # ${2} - output file
  vmlinux_link()
  {
  	local lds="${objtree}/${KBUILD_LDS}"
a5967db9a   Stephen Rothwell   kbuild: allow arc...
81
  	local objects
1f2bfbd00   Sam Ravnborg   kbuild: link of v...
82
83
  
  	if [ "${SRCARCH}" != "um" ]; then
a5967db9a   Stephen Rothwell   kbuild: allow arc...
84
85
86
87
88
89
90
91
92
93
94
95
  		if [ -n "${CONFIG_THIN_ARCHIVES}" ]; then
  			objects="--whole-archive built-in.o ${1}"
  		else
  			objects="${KBUILD_VMLINUX_INIT}			\
  				--start-group				\
  				${KBUILD_VMLINUX_MAIN}			\
  				--end-group				\
  				${1}"
  		fi
  
  		${LD} ${LDFLAGS} ${LDFLAGS_vmlinux} -o ${2}		\
  			-T ${lds} ${objects}
1f2bfbd00   Sam Ravnborg   kbuild: link of v...
96
  	else
a5967db9a   Stephen Rothwell   kbuild: allow arc...
97
98
99
100
101
102
103
104
105
106
107
108
109
110
  		if [ -n "${CONFIG_THIN_ARCHIVES}" ]; then
  			objects="-Wl,--whole-archive built-in.o ${1}"
  		else
  			objects="${KBUILD_VMLINUX_INIT}			\
  				-Wl,--start-group			\
  				${KBUILD_VMLINUX_MAIN}			\
  				-Wl,--end-group				\
  				${1}"
  		fi
  
  		${CC} ${CFLAGS_vmlinux} -o ${2}				\
  			-Wl,-T,${lds}					\
  			${objects}					\
  			-lutil -lrt -lpthread
1f2bfbd00   Sam Ravnborg   kbuild: link of v...
111
112
113
114
115
116
117
118
119
120
  		rm -f linux
  	fi
  }
  
  
  # Create ${2} .o file with all symbols from the ${1} object file
  kallsyms()
  {
  	info KSYM ${2}
  	local kallsymopt;
b92021b09   Rusty Russell   CONFIG_SYMBOL_PRE...
121
122
  	if [ -n "${CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX}" ]; then
  		kallsymopt="${kallsymopt} --symbol-prefix=_"
6895f97e1   James Hogan   kbuild: add symbo...
123
  	fi
1f2bfbd00   Sam Ravnborg   kbuild: link of v...
124
  	if [ -n "${CONFIG_KALLSYMS_ALL}" ]; then
6895f97e1   James Hogan   kbuild: add symbo...
125
  		kallsymopt="${kallsymopt} --all-symbols"
1f2bfbd00   Sam Ravnborg   kbuild: link of v...
126
  	fi
4d5d5664c   Ard Biesheuvel   x86: kallsyms: di...
127
  	if [ -n "${CONFIG_KALLSYMS_ABSOLUTE_PERCPU}" ]; then
c6bda7c98   Rusty Russell   kallsyms: fix per...
128
129
  		kallsymopt="${kallsymopt} --absolute-percpu"
  	fi
2213e9a66   Ard Biesheuvel   kallsyms: add sup...
130
131
132
  	if [ -n "${CONFIG_KALLSYMS_BASE_RELATIVE}" ]; then
  		kallsymopt="${kallsymopt} --base-relative"
  	fi
00e6c28c6   Sam Ravnborg   kbuild: fix ia64 ...
133
134
  	local aflags="${KBUILD_AFLAGS} ${KBUILD_AFLAGS_KERNEL}               \
  		      ${NOSTDINC_FLAGS} ${LINUXINCLUDE} ${KBUILD_CPPFLAGS}"
1f2bfbd00   Sam Ravnborg   kbuild: link of v...
135

a04393420   Ard Biesheuvel   scripts/link-vmli...
136
137
138
139
  	local afile="`basename ${2} .o`.S"
  
  	${NM} -n ${1} | scripts/kallsyms ${kallsymopt} > ${afile}
  	${CC} ${aflags} -c -o ${2} ${afile}
1f2bfbd00   Sam Ravnborg   kbuild: link of v...
140
141
142
143
144
145
146
147
  }
  
  # Create map file with all symbols from ${1}
  # See mksymap for additional details
  mksysmap()
  {
  	${CONFIG_SHELL} "${srctree}/scripts/mksysmap" ${1} ${2}
  }
1347a2ceb   Linus Torvalds   Merge branch 'kbu...
148
149
150
151
  sortextable()
  {
  	${objtree}/scripts/sortextable ${1}
  }
1f2bfbd00   Sam Ravnborg   kbuild: link of v...
152
  # Delete output files in case of error
1f2bfbd00   Sam Ravnborg   kbuild: link of v...
153
154
155
156
157
158
159
  cleanup()
  {
  	rm -f .old_version
  	rm -f .tmp_System.map
  	rm -f .tmp_kallsyms*
  	rm -f .tmp_version
  	rm -f .tmp_vmlinux*
a5967db9a   Stephen Rothwell   kbuild: allow arc...
160
  	rm -f built-in.o
1f2bfbd00   Sam Ravnborg   kbuild: link of v...
161
162
163
164
  	rm -f System.map
  	rm -f vmlinux
  	rm -f vmlinux.o
  }
ab160dbbc   Sylvain BERTRAND   scripts: fix link...
165
166
167
168
169
170
171
172
173
174
175
176
177
  on_exit()
  {
  	if [ $? -ne 0 ]; then
  		cleanup
  	fi
  }
  trap on_exit EXIT
  
  on_signals()
  {
  	exit 1
  }
  trap on_signals HUP INT QUIT TERM
1f2bfbd00   Sam Ravnborg   kbuild: link of v...
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
  #
  #
  # 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
423a8155f   Michal Marek   kbuild: Fix readi...
193
194
195
196
197
198
199
200
  case "${KCONFIG_CONFIG}" in
  */*)
  	. "${KCONFIG_CONFIG}"
  	;;
  *)
  	# Force using a file from the current directory
  	. "./${KCONFIG_CONFIG}"
  esac
1f2bfbd00   Sam Ravnborg   kbuild: link of v...
201

a5967db9a   Stephen Rothwell   kbuild: allow arc...
202
  archive_builtin
1f2bfbd00   Sam Ravnborg   kbuild: link of v...
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
  #link vmlinux.o
  info LD vmlinux.o
  modpost_link vmlinux.o
  
  # modpost vmlinux.o to check for section mismatches
  ${MAKE} -f "${srctree}/scripts/Makefile.modpost" vmlinux.o
  
  # Update version
  info GEN .version
  if [ ! -r .version ]; then
  	rm -f .version;
  	echo 1 >.version;
  else
  	mv .version .old_version;
  	expr 0$(cat .old_version) + 1 >.version;
  fi;
  
  # final build of init/
6b90bd4ba   Emese Revfy   GCC plugin infras...
221
  ${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init GCC_PLUGINS_CFLAGS="${GCC_PLUGINS_CFLAGS}"
1f2bfbd00   Sam Ravnborg   kbuild: link of v...
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
  
  kallsymso=""
  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
  	# 2a) We may use an extra pass as this has been necessary to
  	#     woraround some alignment related bugs.
  	#     KALLSYMS_EXTRA_PASS=1 is used to trigger this.
  	# 3)  The correct ${kallsymso} is linked into the final vmlinux.
  	#
  	# a)  Verify that the System.map from vmlinux matches the map from
  	#     ${kallsymso}.
  
  	kallsymso=.tmp_kallsyms2.o
  	kallsyms_vmlinux=.tmp_vmlinux2
  
  	# step 1
  	vmlinux_link "" .tmp_vmlinux1
  	kallsyms .tmp_vmlinux1 .tmp_kallsyms1.o
  
  	# step 2
  	vmlinux_link .tmp_kallsyms1.o .tmp_vmlinux2
  	kallsyms .tmp_vmlinux2 .tmp_kallsyms2.o
  
  	# step 2a
  	if [ -n "${KALLSYMS_EXTRA_PASS}" ]; then
  		kallsymso=.tmp_kallsyms3.o
  		kallsyms_vmlinux=.tmp_vmlinux3
  
  		vmlinux_link .tmp_kallsyms2.o .tmp_vmlinux3
  
  		kallsyms .tmp_vmlinux3 .tmp_kallsyms3.o
  	fi
  fi
  
  info LD vmlinux
  vmlinux_link "${kallsymso}" vmlinux
1347a2ceb   Linus Torvalds   Merge branch 'kbu...
270
271
272
273
  if [ -n "${CONFIG_BUILDTIME_EXTABLE_SORT}" ]; then
  	info SORTEX vmlinux
  	sortextable vmlinux
  fi
1f2bfbd00   Sam Ravnborg   kbuild: link of v...
274
275
276
277
278
279
280
281
  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   Michal Marek   kbuild: Print err...
282
  		echo >&2 Inconsistent kallsyms data
367e43c50   Michal Marek   link-vmlinux.sh: ...
283
  		echo >&2 Try "make KALLSYMS_EXTRA_PASS=1" as a workaround
1f2bfbd00   Sam Ravnborg   kbuild: link of v...
284
285
286
287
288
289
  		exit 1
  	fi
  fi
  
  # We made a new kernel - delete old version file
  rm -f .old_version