1# Copyright 2018 The Fuchsia Authors 2# 3# Use of this source code is governed by a MIT-style 4# license that can be found in the LICENSE file or at 5# https://opensource.org/licenses/MIT 6 7LOCAL_DIR := $(GET_LOCAL_DIR) 8 9MULTIBOOT_BIN := $(BUILDDIR)/multiboot.bin 10MULTIBOOT_ELF := $(BUILDDIR)/multiboot.elf 11 12MULTIBOOT_LDFLAGS := -m elf_i386 13MULTIBOOT_LDSCRIPT := $(LOCAL_DIR)/multiboot.ld 14MULTIBOOT_COMPILEFLAGS := \ 15 $(NO_SAFESTACK) $(NO_SANITIZERS) \ 16 -m32 -mregparm=3 -fno-pic \ 17 -Ikernel/arch/x86/page_tables/include \ 18 -Ikernel/platform/pc/include \ 19 -Isystem/ulib/zbi/include 20MULTIBOOT_SRCDEPS := $(KERNEL_CONFIG_HEADER) 21 22MULTIBOOT_SRCS := \ 23 $(LOCAL_DIR)/multiboot-start.S \ 24 $(LOCAL_DIR)/multiboot-main.c \ 25 $(LOCAL_DIR)/paging.c \ 26 $(LOCAL_DIR)/trampoline.c \ 27 $(LOCAL_DIR)/util.c \ 28 system/ulib/libzbi/zbi.c 29 30MULTIBOOT_OBJS := $(MULTIBOOT_SRCS:%=$(BUILDDIR)/$(LOCAL_DIR)/%.o) 31 32$(filter %.S.o,$(MULTIBOOT_OBJS)): \ 33 $(BUILDDIR)/$(LOCAL_DIR)/%.S.o: %.S $(MULTIBOOT_SRCDEPS) 34 @$(MKDIR) 35 $(call BUILDECHO, assembling $<) 36 $(NOECHO)$(CC) $(GLOBAL_COMPILEFLAGS) $(ARCH_COMPILEFLAGS) \ 37 $(GLOBAL_OPTFLAGS) $(GLOBAL_ASMFLAGS) \ 38 $(KERNEL_ASMFLAGS) $(ARCH_ASMFLAGS) \ 39 $(KERNEL_COMPILEFLAGS) $(MULTIBOOT_COMPILEFLAGS) \ 40 $(KERNEL_INCLUDES) $(GLOBAL_INCLUDES) \ 41 -c $< -MMD -MP -MT $@ -MF $(@:%o=%d) -o $@ 42 43$(filter %.c.o,$(MULTIBOOT_OBJS)): \ 44 $(BUILDDIR)/$(LOCAL_DIR)/%.c.o: %.c $(MULTIBOOT_SRCDEPS) 45 @$(MKDIR) 46 $(call BUILDECHO, compiling $<) 47 $(NOECHO)$(CC) $(GLOBAL_COMPILEFLAGS) $(ARCH_COMPILEFLAGS) \ 48 $(GLOBAL_OPTFLAGS) $(GLOBAL_CFLAGS) \ 49 $(KERNEL_CFLAGS) $(ARCH_CFLAGS) \ 50 $(KERNEL_COMPILEFLAGS) $(MULTIBOOT_COMPILEFLAGS) \ 51 $(KERNEL_INCLUDES) $(GLOBAL_INCLUDES) \ 52 -c $< -MMD -MP -MT $@ -MF $(@:%o=%d) -o $@ 53 54ALLSRCS += $(MULTIBOOT_SRCS) 55ALLOBJS += $(MULTIBOOT_OBJS) 56 57$(MULTIBOOT_ELF): $(MULTIBOOT_LDSCRIPT) $(MULTIBOOT_OBJS) 58 $(call BUILDECHO,linking $@) 59 $(NOECHO)$(LD) $(GLOBAL_LDFLAGS) $(KERNEL_LDFLAGS) \ 60 $(MULTIBOOT_LDFLAGS) -o $@ -T $^ 61GENERATED += $(MULTIBOOT_ELF) 62EXTRA_IDFILES += $(MULTIBOOT_ELF).id 63 64# We could make a Multiboot image meant to be loaded without ELF headers 65# and do `objcopy -O binary` here. But there's no reason to, and having an 66# ELF binary to look at is nicer. To remove the ELF headers instead, the 67# linker script would need to remove `+ SIZEOF_HEADERS` and then the 68# multiboot header would be first thing in the raw binary. 69$(MULTIBOOT_BIN): $(MULTIBOOT_ELF).strip 70 $(call BUILDECHO, generating $@) 71 $(NOECHO)ln -f $< $@ 72GENERATED += $(MULTIBOOT_BIN) $(MULTIBOOT_ELF).strip 73 74# Build the multiboot trampoline whenever building the kernel. 75kernel: $(MULTIBOOT_BIN) 76