in optee-utee-build/src/linker.rs [124:176]
fn write_and_set_linker_script(
&self,
out_dir: PathBuf,
ta_dev_kit_dir: PathBuf,
) -> Result<(), Error> {
const ENV_TARGET_TA: &str = "TARGET_TA";
println!("cargo:rerun-if-env-changed={}", ENV_TARGET_TA);
let mut aarch64_flag = true;
match env::var(ENV_TARGET_TA) {
Ok(ref v) if v == "arm-unknown-linux-gnueabihf" || v == "arm-unknown-optee" => {
match self.linker_type {
LinkerType::Cc => println!("cargo:rustc-link-arg=-Wl,--no-warn-mismatch"),
LinkerType::Ld => println!("cargo:rustc-link-arg=--no-warn-mismatch"),
};
aarch64_flag = false;
}
_ => {}
};
let f = BufReader::new(File::open(ta_dev_kit_dir.join("src/ta.ld.S"))?);
let ta_lds_file_path = out_dir.join("ta.lds");
let mut ta_lds = File::create(ta_lds_file_path.clone())?;
for line in f.lines() {
let l = line?;
if aarch64_flag {
if l.starts_with('#')
|| l == "OUTPUT_FORMAT(\"elf32-littlearm\")"
|| l == "OUTPUT_ARCH(arm)"
{
continue;
}
} else {
if l.starts_with('#')
|| l == "OUTPUT_FORMAT(\"elf64-littleaarch64\")"
|| l == "OUTPUT_ARCH(aarch64)"
{
continue;
}
}
if l == "\t. = ALIGN(4096);" {
write!(ta_lds, "\t. = ALIGN(65536);\n")?;
} else {
write!(ta_lds, "{}\n", l)?;
}
}
println!("cargo:rustc-link-search={}", out_dir.display());
println!("cargo:rerun-if-changed={}", ta_lds_file_path.display());
println!("cargo:rustc-link-arg=-T{}", ta_lds_file_path.display());
Ok(())
}