fn write_and_set_linker_script()

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(())
    }