blob: afe121b87d422cbb32797940eaac9cd3e555473a [file] [log] [blame]
# Copyright 2019 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import("$zx/public/gn/toolchain/environment.gni")
import("$zx/public/gn/toolchain/environment_redirect.gni")
# The Multiboot trampoline gets its own toolchain to build x86-32 code.
if (current_toolchain == default_toolchain) {
# Define the special toolchain itself only in the default toolchain.
environment("multiboot") {
cpu = "x64"
configs += standard_fuchsia_configs + [ ":multiboot_config" ]
globals = {
is_kernel = true
}
strip = "--strip-sections"
}
} else if (toolchain.environment == "multiboot") {
# This is the top config for all code in the multiboot_toolchain.
config("multiboot_config") {
configs = [
"$zx/kernel:headers",
"$zx/kernel:standalone",
"$zx/kernel:warnings",
"$zx/kernel/arch/x86:kernel",
"$zx/public/gn/config:no_sanitizers",
]
compiler_flags = [
"-m32",
"-mregparm=3",
"-fno-pic",
]
asmflags = compiler_flags
cflags = compiler_flags
ldflags = compiler_flags
if (is_gcc) {
ldflags += [ "-no-pie" ]
} else {
ldflags += [ "-Wl,--no-pie" ]
}
}
# We could make a Multiboot image meant to be loaded without ELF headers
# and do `objcopy -O binary` here. But there's no reason to, and having
# an ELF binary to look at is nicer. To remove the ELF headers instead,
# the linker script would need to remove `+ SIZEOF_HEADERS` and then the
# multiboot header would be first thing in the raw binary. The toolchain
# implicitly strips executables, so `multiboot.bin` is a lean, fully
# stripped ELF/Multiboot image.
executable("multiboot") {
output_extension = "bin"
output_dir = root_build_dir
output_path = rebase_path("$output_dir/$target_name.$output_extension",
root_build_dir)
metadata = {
images = []
foreach(name,
[
"multiboot-kernel",
"qemu-kernel",
]) {
images += [
{
name = name
type = "kernel"
path = output_path
},
]
}
}
sources = [
"multiboot-main.c",
"multiboot-start.S",
"paging.c",
"trampoline.c",
"util.c",
]
deps = [
"$zx/kernel/arch/x86/page_tables:headers",
"$zx/kernel/platform/pc:headers",
"$zx/system/ulib/libzbi",
]
ldflags = [ "-Wl,-T," + rebase_path("multiboot.ld", root_build_dir) ]
inputs = [
"multiboot.ld",
]
}
} else {
# In any other toolchain, just redirect to the proper toolchain.
environment_redirect("multiboot") {
environment_label = ":multiboot"
deps = [
":multiboot",
]
}
}