source: mainline/kernel/Makefile@ 167616c

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 167616c was cfdeedc, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 7 years ago

Keep kernel in ELF format

By keeping kernel in an ELF file (instead of converting it to
a flat binary), we can use the information it contains, like
symbol table and debug info.

We can also later implement more advanced functionality, like
loading kernel at multiple discontiguous blocks, or loading
a position-independent kernel at a randomized address.

Currently the functionality is quite restricted, to keep changes
to a minimum. Code in boot/generic/src/kernel.c validates that
the kernel image was built with the same addresses as the boot
loader uses, giving an extra level of sanity checking compared
to a flat binary.

  • Property mode set to 100644
File size: 12.0 KB
Line 
1#
2# Copyright (c) 2005 Martin Decky
3# All rights reserved.
4#
5# Redistribution and use in source and binary forms, with or without
6# modification, are permitted provided that the following conditions
7# are met:
8#
9# - Redistributions of source code must retain the above copyright
10# notice, this list of conditions and the following disclaimer.
11# - Redistributions in binary form must reproduce the above copyright
12# notice, this list of conditions and the following disclaimer in the
13# documentation and/or other materials provided with the distribution.
14# - The name of the author may not be used to endorse or promote products
15# derived from this software without specific prior written permission.
16#
17# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27#
28
29## Configuration
30#
31
32ROOT_PATH = ..
33
34VERSION_DEF = $(ROOT_PATH)/version
35
36COMMON_MAKEFILE = $(ROOT_PATH)/Makefile.common
37COMMON_HEADER = $(ROOT_PATH)/common.h
38COMMON_HEADER_ARCH = arch/$(KARCH)/include/arch/common.h
39
40CONFIG_MAKEFILE = $(ROOT_PATH)/Makefile.config
41CONFIG_HEADER = $(ROOT_PATH)/config.h
42
43-include $(VERSION_DEF)
44-include $(COMMON_MAKEFILE)
45-include $(CONFIG_MAKEFILE)
46
47## Common names
48#
49
50AUTOCHECK = $(realpath $(ROOT_PATH)/tools/autocheck.awk)
51KERNEL = kernel.elf
52MAP = kernel.map
53JOB = kernel.job
54MAP_PREV = $(MAP).prev
55DISASM = kernel.disasm
56DUMP = kernel.dump
57REAL_MAP = generic/src/debug/real_map
58
59GENMAP = tools/genmap.py
60
61LINK = arch/$(KARCH)/_link.ld
62EMPTY_MAP = generic/src/debug/empty_map.o
63SIZEOK_MAP = generic/src/debug/sizeok_map.o
64
65ifeq ($(PRECHECK),y)
66 JOBFILE = $(ROOT_PATH)/tools/jobfile.py
67 # XXX: Do not change the order of arguments.
68 CC_JOB = $(JOBFILE) $(JOB) $(CC) $< -o $@
69else
70 CC_JOB = $(CC) $< -o $@
71endif
72
73.PHONY: all clean autogen_clean depend
74.DELETE_ON_ERROR:
75
76all: $(VERSION_DEF) $(COMMON_MAKEFILE) $(COMMON_HEADER) $(CONFIG_MAKEFILE) $(CONFIG_HEADER) $(KERNEL) $(DISASM)
77
78clean: autogen_clean
79 rm -f $(KERNEL) $(MAP) $(JOB) $(MAP_PREV) $(DISASM) $(DUMP) $(REAL_MAP).* arch/*/_link.ld arch/*/include/arch/common.h
80 find generic/src/ arch/*/src/ genarch/src/ test/ -name '*.o' -follow -exec rm '{}' \;
81 find generic/src/ arch/*/src/ genarch/src/ test/ -name '*.d' -follow -exec rm '{}' \;
82
83## Common compiler flags
84#
85
86INCLUDES = generic/include genarch/include arch/$(KARCH)/include ../abi/arch/$(KARCH)/include ../abi/include
87INCLUDES_FLAGS = $(addprefix -I,$(INCLUDES))
88
89DEFS = -DKERNEL -DRELEASE=$(RELEASE) "-DCOPYRIGHT=$(COPYRIGHT)" "-DNAME=$(NAME)" -D__$(BITS)_BITS__ -D__$(ENDIANESS)__
90
91COMMON_CFLAGS = $(INCLUDES_FLAGS) -O$(OPTIMIZATION) -imacros $(CONFIG_HEADER) \
92 -ffreestanding -nostdlib \
93 -fexec-charset=UTF-8 -finput-charset=UTF-8 -fno-common \
94 -fdebug-prefix-map=$(realpath $(ROOT_PATH))=.
95
96GCC_CFLAGS = -std=gnu99 -Wall -Wextra -Wno-unused-parameter \
97 -Wmissing-prototypes -Werror-implicit-function-declaration \
98 -Wwrite-strings -pipe -Wno-cast-function-type
99
100CLANG_CFLAGS = -std=gnu99 -Wall -Wextra -Wno-unused-parameter \
101 -Wno-missing-field-initializers -Wno-unused-command-line-argument \
102 -Wmissing-prototypes -Werror-implicit-function-declaration \
103 -Wwrite-strings -pipe -fno-stack-protector -fno-PIC
104
105ifeq ($(CONFIG_DEBUG),y)
106 COMMON_CFLAGS += -Werror
107endif
108
109ifeq ($(CONFIG_UBSAN_KERNEL),y)
110 COMMON_CFLAGS += -fsanitize=undefined
111endif
112
113ifeq ($(CONFIG_LTO),y)
114 COMMON_CFLAGS += -flto
115endif
116
117ifeq ($(CONFIG_LINE_DEBUG),y)
118 COMMON_CFLAGS += -g
119endif
120
121AFLAGS += --fatal-warnings
122LDFLAGS += -Wl,-n -T $(LINK) -Wl,-M,--fatal-warnings,--warn-common
123
124ifeq ($(CONFIG_STRIP_BINARIES),y)
125 LDFLAGS += -s
126endif
127
128-include arch/$(KARCH)/Makefile.inc
129-include genarch/Makefile.inc
130
131## The at-sign
132#
133# The $(ATSIGN) variable holds the ASCII character representing the at-sign
134# ('@') used in various $(AS) constructs (e.g. @progbits). On architectures that
135# don't use '@' for starting a comment, $(ATSIGN) is merely '@'. However, on
136# those that do use it for starting a comment (e.g. arm32), $(ATSIGN) must be
137# defined as the percentile-sign ('%') in the architecture-dependent
138# Makefile.inc.
139#
140
141ATSIGN ?= @
142
143## Cross-platform assembly to start a symtab.data section
144#
145
146SYMTAB_SECTION = .section symtab.data, \"a\", $(ATSIGN)progbits;
147
148## Compilation options
149#
150
151ifeq ($(COMPILER),clang)
152 CFLAGS = $(COMMON_CFLAGS) $(CLANG_CFLAGS)
153else
154 CFLAGS = $(COMMON_CFLAGS) $(GCC_CFLAGS)
155endif
156
157INSTRUMENTATION = -finstrument-functions
158
159## Generic kernel sources
160#
161
162GENERIC_SOURCES = \
163 generic/src/adt/avl.c \
164 generic/src/adt/bitmap.c \
165 generic/src/adt/btree.c \
166 generic/src/adt/cht.c \
167 generic/src/adt/hash_table.c \
168 generic/src/adt/list.c \
169 generic/src/console/chardev.c \
170 generic/src/console/console.c \
171 generic/src/console/prompt.c \
172 generic/src/cpu/cpu.c \
173 generic/src/cpu/cpu_mask.c \
174 generic/src/ddi/ddi.c \
175 generic/src/ddi/irq.c \
176 generic/src/debug/symtab.c \
177 generic/src/debug/stacktrace.c \
178 generic/src/debug/panic.c \
179 generic/src/debug/debug.c \
180 generic/src/interrupt/interrupt.c \
181 generic/src/log/log.c \
182 generic/src/main/main.c \
183 generic/src/main/kinit.c \
184 generic/src/main/uinit.c \
185 generic/src/main/version.c \
186 generic/src/main/shutdown.c \
187 generic/src/proc/program.c \
188 generic/src/proc/scheduler.c \
189 generic/src/proc/thread.c \
190 generic/src/proc/task.c \
191 generic/src/proc/the.c \
192 generic/src/syscall/syscall.c \
193 generic/src/syscall/copy.c \
194 generic/src/mm/km.c \
195 generic/src/mm/reserve.c \
196 generic/src/mm/frame.c \
197 generic/src/mm/page.c \
198 generic/src/mm/tlb.c \
199 generic/src/mm/as.c \
200 generic/src/mm/backend_anon.c \
201 generic/src/mm/backend_elf.c \
202 generic/src/mm/backend_phys.c \
203 generic/src/mm/backend_user.c \
204 generic/src/mm/slab.c \
205 generic/src/lib/halt.c \
206 generic/src/lib/mem.c \
207 generic/src/lib/memfnc.c \
208 generic/src/lib/gsort.c \
209 generic/src/lib/str.c \
210 generic/src/lib/str_error.c \
211 generic/src/lib/elf.c \
212 generic/src/lib/ra.c \
213 generic/src/lib/rd.c \
214 generic/src/lib/ubsan.c \
215 generic/src/printf/printf_core.c \
216 generic/src/printf/printf.c \
217 generic/src/printf/snprintf.c \
218 generic/src/printf/vprintf.c \
219 generic/src/printf/vsnprintf.c \
220 generic/src/time/clock.c \
221 generic/src/time/timeout.c \
222 generic/src/time/delay.c \
223 generic/src/preempt/preemption.c \
224 generic/src/synch/spinlock.c \
225 generic/src/synch/condvar.c \
226 generic/src/synch/mutex.c \
227 generic/src/synch/semaphore.c \
228 generic/src/synch/smc.c \
229 generic/src/synch/smp_memory_barrier.c \
230 generic/src/synch/waitq.c \
231 generic/src/synch/futex.c \
232 generic/src/synch/workqueue.c \
233 generic/src/synch/rcu.c \
234 generic/src/smp/ipi.c \
235 generic/src/smp/smp.c \
236 generic/src/smp/smp_call.c \
237 generic/src/ipc/ipc.c \
238 generic/src/ipc/sysipc.c \
239 generic/src/ipc/sysipc_ops.c \
240 generic/src/ipc/ops/conctmeto.c \
241 generic/src/ipc/ops/concttome.c \
242 generic/src/ipc/ops/dataread.c \
243 generic/src/ipc/ops/datawrite.c \
244 generic/src/ipc/ops/debug.c \
245 generic/src/ipc/ops/pagein.c \
246 generic/src/ipc/ops/sharein.c \
247 generic/src/ipc/ops/shareout.c \
248 generic/src/ipc/ops/stchngath.c \
249 generic/src/ipc/ipcrsc.c \
250 generic/src/ipc/irq.c \
251 generic/src/ipc/event.c \
252 generic/src/cap/cap.c \
253 generic/src/security/perm.c \
254 generic/src/sysinfo/sysinfo.c \
255 generic/src/sysinfo/stats.c
256
257## Kernel console support
258#
259
260ifeq ($(CONFIG_KCONSOLE),y)
261GENERIC_SOURCES += \
262 generic/src/console/kconsole.c \
263 generic/src/console/cmd.c
264endif
265
266## Udebug interface sources
267#
268
269ifeq ($(CONFIG_UDEBUG),y)
270GENERIC_SOURCES += \
271 generic/src/ipc/kbox.c \
272 generic/src/udebug/udebug.c \
273 generic/src/udebug/udebug_ops.c \
274 generic/src/udebug/udebug_ipc.c
275endif
276
277## Test sources
278#
279
280ifeq ($(CONFIG_TEST),y)
281 CFLAGS += -Itest/
282 GENERIC_SOURCES += \
283 test/test.c \
284 test/atomic/atomic1.c \
285 test/btree/btree1.c \
286 test/cht/cht1.c \
287 test/avltree/avltree1.c \
288 test/fault/fault1.c \
289 test/mm/falloc1.c \
290 test/mm/falloc2.c \
291 test/mm/mapping1.c \
292 test/mm/slab1.c \
293 test/mm/slab2.c \
294 test/synch/semaphore1.c \
295 test/synch/semaphore2.c \
296 test/synch/workqueue2.c \
297 test/synch/workqueue3.c \
298 test/synch/rcu1.c \
299 test/print/print1.c \
300 test/print/print2.c \
301 test/print/print3.c \
302 test/print/print4.c \
303 test/print/print5.c \
304 test/thread/thread1.c \
305 test/smpcall/smpcall1.c
306
307 ifeq ($(KARCH),mips32)
308 GENERIC_SOURCES += test/debug/mips1.c
309 else
310 GENERIC_SOURCES += test/debug/mips1_skip.c
311 endif
312
313 ifeq ($(KARCH),ia64)
314 GENERIC_SOURCES += test/mm/purge1.c
315 else
316 GENERIC_SOURCES += test/mm/purge1_skip.c
317 endif
318
319endif
320
321## Sources where instrumentation is enabled
322#
323
324ifeq ($(CONFIG_TRACE),y)
325 INSTRUMENTED_SOURCES = \
326 generic/src/adt/btree.c \
327 generic/src/cpu/cpu.c \
328 generic/src/ddi/ddi.c \
329 generic/src/interrupt/interrupt.c \
330 generic/src/main/main.c \
331 generic/src/main/kinit.c \
332 generic/src/proc/the.c \
333 generic/src/mm/frame.c \
334 generic/src/mm/page.c \
335 generic/src/mm/tlb.c \
336 generic/src/mm/as.c \
337 generic/src/mm/slab.c \
338 generic/src/sysinfo/sysinfo.c \
339 generic/src/console/kconsole.c
340else
341 INSTRUMENTED_SOURCES =
342endif
343
344ARCH_SOURCES += $(ARCH_AUTOCHECK_HEADERS:%.h=%.check.c)
345GENARCH_SOURCES += $(GENARCH_AUTOCHECK_HEADERS:%.h=%.check.c)
346
347GENERIC_OBJECTS := $(addsuffix .o,$(basename $(GENERIC_SOURCES)))
348ARCH_OBJECTS := $(addsuffix .o,$(basename $(ARCH_SOURCES)))
349GENARCH_OBJECTS := $(addsuffix .o,$(basename $(GENARCH_SOURCES)))
350
351GENERIC_DEPENDS := $(addsuffix .d,$(basename $(GENERIC_SOURCES)))
352ARCH_DEPENDS := $(addsuffix .d,$(basename $(ARCH_SOURCES)))
353GENARCH_DEPENDS := $(addsuffix .d,$(basename $(GENARCH_SOURCES)))
354
355AS_CFLAGS := $(addprefix -Xassembler ,$(AFLAGS))
356
357-include $(GENERIC_DEPENDS)
358-include $(ARCH_DEPENDS)
359-include $(GENARCH_DEPENDS)
360
361ifeq ($(COMPILER),clang)
362 AS_CFLAGS += -mllvm -asm-macro-max-nesting-depth=1000
363endif
364
365ifeq ($(CONFIG_SYMTAB),y)
366 SYMTAB_OBJECTS := generic/src/debug/real_map.o
367else
368 SYMTAB_OBJECTS :=
369endif
370
371$(DISASM): $(KERNEL)
372ifeq ($(CONFIG_LINE_DEBUG),y)
373 $(OBJDUMP) -d -S $< > $@
374else
375 $(OBJDUMP) -d $< > $@
376endif
377
378$(KERNEL): $(LINK) $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(SYMTAB_OBJECTS)
379 $(CC) $(DEFS) $(CFLAGS) $(LDFLAGS) -Wl,-Map,$(MAP) -o $@ $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) $(SYMTAB_OBJECTS)
380
381$(LINK): $(LINK).in
382 $(CC) $(DEFS) $(CFLAGS) -D__ASSEMBLER__ -D__LINKER__ -E -x c $< | grep -v "^\#" > $@
383
384%.check.c: %.h $(AUTOCHECK)
385 cd $(<D) && $(AUTOCHECK) $(<F) > $(@F)
386
387%.o: %.S
388 $(CC_JOB) -c -MD -MP $(DEFS) $(CFLAGS) $(AS_CFLAGS)
389
390%.o: %.s
391 $(CC_JOB) -c -MD -MP $(DEFS) $(CFLAGS) $(AS_CFLAGS)
392
393%.o: %.c
394 $(CC_JOB) -c -MD -MP $(DEFS) $(CFLAGS) $(EXTRA_FLAGS) $(FPU_NO_CFLAGS) $(if $(findstring $<,$(INSTRUMENTED_SOURCES)),$(INSTRUMENTATION))
395
396$(REAL_MAP).o: $(REAL_MAP).bin
397 echo "$(AS_PROLOG)""$(SYMTAB_SECTION)"" .incbin \"$<\"" | $(CC) $(CFLAGS) $(AS_CFLAGS) -x assembler -c -o $@ -
398
399$(REAL_MAP).bin: $(LINK) $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS)
400 echo "$(AS_PROLOG)""$(SYMTAB_SECTION)" | $(CC) $(CFLAGS) $(AS_CFLAGS) -x assembler -c -o $(EMPTY_MAP) -
401 $(CC) $(DEFS) $(CFLAGS) $(LDFLAGS) -Wl,-Map,$(MAP_PREV) -o $@ $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) $(EMPTY_MAP)
402 $(OBJDUMP) -t $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) > $(DUMP)
403 $(GENMAP) $(MAP_PREV) $(DUMP) $@
404
405 # Do it once again, this time to get correct even the symbols
406 # on architectures that have bss after symtab
407
408 echo "$(AS_PROLOG)""$(SYMTAB_SECTION)"" .incbin \"$@\"" | $(CC) $(CFLAGS) $(AS_CFLAGS) -x assembler -c -o $(SIZEOK_MAP) -
409 $(CC) $(DEFS) $(CFLAGS) $(LDFLAGS) -Wl,-Map,$(MAP_PREV) -o $@ $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) $(SIZEOK_MAP)
410 $(OBJDUMP) -t $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) > $(DUMP)
411 $(GENMAP) $(MAP_PREV) $(DUMP) $@
Note: See TracBrowser for help on using the repository browser.