blob: 37a4d05ae828e870fbeb2e9e5083b4b97aab4d80 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License..
use sgx_build_helper as build_helper;
use self::build_helper::native_lib_boilerplate;
use std::env;
use std::fs::File;
use std::path::Path;
fn main() {
let target = env::var("TARGET").expect("TARGET was not set");
let _ = build_libbacktrace(&target);
}
fn build_libbacktrace(_target: &str) -> Result<(), ()> {
let mut sdk_dir = env::var("SGX_SDK")
.unwrap_or_else(|_| "/opt/sgxsdk".to_string());
if !Path::new(&sdk_dir).exists() {
sdk_dir = "/opt/intel/sgxsdk".to_string();
}
let sdk_include = format!("{}/{}", sdk_dir, "include");
let native = native_lib_boilerplate(
"sgx_backtrace_sys/libbacktrace",
"libbacktrace",
"backtrace",
"",
&vec![])?;
let mut build = cc::Build::new();
build
.opt_level(2)
.flag("-fstack-protector")
.flag("-ffreestanding")
.flag("-fpie")
.flag("-fno-strict-overflow")
.flag("-fno-delete-null-pointer-checks")
.flag("-fvisibility=hidden")
.include("./libbacktrace")
.include(&native.out_dir)
.include(&sdk_include)
.out_dir(&native.out_dir)
.warnings(false)
.file("./libbacktrace/mmap.c")
.file("./libbacktrace/mmapio.c")
.file("./libbacktrace/backtrace.c")
.file("./libbacktrace/dwarf.c")
.file("./libbacktrace/fileline.c")
.file("./libbacktrace/posix.c")
.file("./libbacktrace/sort.c")
.file("./libbacktrace/state.c");
let mitigation_cflags1 = "-mindirect-branch-register";
let mitigation_cflags2 = "-mfunction-return=thunk-extern";
let mitigation_asflags = "-fno-plt";
let mitigation_loadflags1 = "-Wa,-mlfence-after-load=yes";
let mitigation_loadflags2 = "-Wa,-mlfence-before-ret=not";
let mitigation_cfflags1 = "-Wa,-mlfence-before-indirect-branch=register";
let mitigation_cfflags2 = "-Wa,-mlfence-before-ret=not";
let mitigation = env::var("MITIGATION_CVE_2020_0551").unwrap_or_default();
match mitigation.as_ref() {
"LOAD" => {
build
.flag(mitigation_cflags1)
.flag(mitigation_cflags2)
.flag(mitigation_asflags)
.flag(mitigation_loadflags1)
.flag(mitigation_loadflags2);
},
"CF" => {
build
.flag(mitigation_cflags1)
.flag(mitigation_cflags2)
.flag(mitigation_asflags)
.flag(mitigation_cfflags1)
.flag(mitigation_cfflags2);
},
_ => {},
}
let any_debug = env::var("RUSTC_DEBUGINFO").unwrap_or_default() == "true" ||
env::var("RUSTC_DEBUGINFO_LINES").unwrap_or_default() == "true";
build.debug(any_debug);
build.file("./libbacktrace/elf.c");
let pointer_width = env::var("CARGO_CFG_TARGET_POINTER_WIDTH").unwrap();
if pointer_width == "64" {
build.define("BACKTRACE_ELF_SIZE", "64");
} else {
build.define("BACKTRACE_ELF_SIZE", "32");
}
File::create(native.out_dir.join("backtrace-supported.h")).unwrap();
build.define("BACKTRACE_SUPPORTED", "1");
build.define("BACKTRACE_USES_MALLOC", "0");
build.define("BACKTRACE_SUPPORTS_THREADS", "0");
build.define("BACKTRACE_SUPPORTS_DATA", "0");
File::create(native.out_dir.join("config.h")).unwrap();
build.define("HAVE_DL_ITERATE_PHDR", "1");
build.define("_GNU_SOURCE", "1");
build.define("_LARGE_FILES", "1");
build.compile("backtrace");
Ok(())
}