| # Copyright (c) 2014 The Native Client Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| # We use a special toolchain to build nacl_helper_bootstrap. This |
| # seems a bit excessive for compiling one source file. But it is |
| # the most reasonable way to instantiate the configs with different |
| # settings such as use_gold=false. The minimal set of configs used |
| # for that file (see below) will sometimes try to use the switch |
| # -gsplit-dwarf under use_gold=true. But without some other configs |
| # that add a -B option pointing at a custom-built binutils, on some |
| # builders (e.g. on older bots) Clang will fail with -gsplit-dwarf. |
| # Fortunately, -gsplit-dwarf is pointless for this build anyway |
| # since there is just one small file. And we're not actually using |
| # Gold for the link, so use_gold=true is a false statement and might |
| # cause other problems. |
| |
| here = get_label_info(".", "dir") |
| bootstrap_toolchain = here + "/toolchain:nacl_bootstrap_" + target_cpu |
| compiler = "g++" |
| |
| if (default_toolchain == "//build/toolchain/cros:target") { |
| import("//build/toolchain/cros_toolchain.gni") |
| bootstrap_toolchain = "//build/toolchain/cros:nacl_bootstrap" |
| compiler = cros_target_cxx |
| } else if (current_cpu == "arm" && !is_android) { |
| compiler = "arm-linux-gnueabihf-g++" |
| } else if (current_cpu == "mipsel" && !is_android) { |
| compiler = "mipsel-linux-gnu-g++" |
| } |
| |
| if (current_toolchain == bootstrap_toolchain) { |
| bootstrap_lib_path = "$target_out_dir/libnacl_bootstrap_lib.a" |
| bootstrap_raw_path = "$target_out_dir/nacl_bootstrap_raw" |
| bootstrap_exe_path = "$root_out_dir/nacl_helper_bootstrap" |
| |
| linker_script_path = rebase_path("nacl_bootstrap.x") |
| |
| if (current_cpu == "x64") { |
| nacl_reserve_top = "0x0" |
| linker_emulation = "elf_x86_64" |
| } |
| if (current_cpu == "x86") { |
| nacl_reserve_top = "0x40000000" |
| linker_emulation = "elf_i386" |
| } |
| if (current_cpu == "arm") { |
| nacl_reserve_top = "0x40002000" |
| linker_emulation = "armelf_linux_eabi" |
| } |
| if (current_cpu == "mipsel") { |
| nacl_reserve_top = "0x40008000" |
| linker_emulation = "elf32ltsmip" |
| } |
| |
| static_library("nacl_bootstrap_lib") { |
| # This code has very specific requirements related to its static |
| # linking and minimal libc use. It cannot support the normal variety |
| # of build configs that the rest of the code is built with. So it |
| # resets the list of configs to empty, and then builds up from scratch |
| # using only the basics that work here. |
| configs = [] |
| configs += [ |
| "//build/config/compiler:compiler_cpu_abi", |
| "//build/config/compiler:runtime_library", |
| "//build/config/compiler:chromium_code", |
| "//build/config/compiler:clang_revision", |
| "//build/config/compiler:default_optimization", |
| "//build/config/compiler:default_symbols", |
| ] |
| |
| include_dirs = [ "//" ] |
| |
| cflags = [ |
| "-fno-builtin", |
| |
| # These might be the defaults in the compiler configuration, |
| # but we want them all disabled for this build. |
| "-fno-stack-protector", |
| "-fno-pic", |
| "-fno-PIC", |
| "-fno-pie", |
| "-fno-PIE", |
| ] |
| |
| sources = [ |
| "nacl_bootstrap.c", |
| ] |
| |
| deps = [ |
| "//build/config/nacl:nacl_base", |
| ] |
| } |
| |
| action("nacl_bootstrap_raw") { |
| deps = [ |
| ":nacl_bootstrap_lib", |
| ] |
| script = "ld_bfd.py" |
| |
| sources = [ |
| bootstrap_lib_path, |
| linker_script_path, |
| ] |
| outputs = [ |
| bootstrap_raw_path, |
| ] |
| args = [ |
| "--compiler", |
| compiler, |
| "-m", |
| linker_emulation, |
| "--build-id", |
| |
| # This program is (almost) entirely |
| # standalone. It has its own startup code, so |
| # no crt1.o for it. It is statically linked, |
| # and on x86 it does not use libc at all. |
| # However, on ARM it needs a few (safe) things |
| # from libc. |
| "-static", |
| |
| # On x86-64, the default page size with some linkers is 2M |
| # rather than the real Linux page size of 4K. And on ARM, the |
| # default page size is 32K. A larger page size is |
| # incompatible with our custom linker script's special layout. |
| # NOTE: It's important that this option come before --script! |
| "-z", |
| "max-page-size=0x1000", |
| |
| # Link with custom linker script for special |
| # layout. The script uses the symbol RESERVE_TOP. |
| "--defsym", |
| "RESERVE_TOP=" + nacl_reserve_top, |
| "--script=" + rebase_path(linker_script_path, root_build_dir), |
| "-o", |
| rebase_path(bootstrap_raw_path, root_build_dir), |
| |
| "--whole-archive", |
| rebase_path(bootstrap_lib_path, root_build_dir), |
| "--no-whole-archive", |
| ] |
| } |
| |
| action("munge_nacl_helper_bootstrap") { |
| deps = [ |
| ":nacl_bootstrap_raw", |
| ] |
| |
| script = "nacl_bootstrap_munge_phdr.py" |
| inputs = [ |
| bootstrap_raw_path, |
| ] |
| outputs = [ |
| bootstrap_exe_path, |
| ] |
| args = rebase_path(inputs + outputs, root_build_dir) |
| } |
| } else if (is_linux) { |
| copy("bootstrap") { |
| bootstrap = ":munge_nacl_helper_bootstrap($bootstrap_toolchain)" |
| |
| bootstrap_out_dir = get_label_info(bootstrap, "root_out_dir") |
| |
| deps = [ |
| bootstrap, |
| ] |
| sources = [ |
| "$bootstrap_out_dir/nacl_helper_bootstrap", |
| ] |
| outputs = [ |
| "$root_out_dir/nacl_helper_bootstrap", |
| ] |
| } |
| |
| # Mark the compiler arg as used. |
| compiler = compiler |
| } |