use std::{env, fs::File, io::Write, path::PathBuf};
pub fn simink_gen_linker(offset: usize) {
let target = env::var("TARGET").unwrap();
let out = &PathBuf::from(env::var_os("OUT_DIR").unwrap());
if target.starts_with("aarch64") {
let mut f = File::create(out.join("linker.ld")).unwrap();
writeln!(f, "OUTPUT_ARCH(aarch64)\nENTRY(_text)\nSECTIONS\n{{").unwrap();
writeln!(
f,
" /DISCARD/ : {{
*(.discard)
*(.discard.*)
*(.interp .dynamic)
*(.dynsym, .dynstr .hash .gnu.hash)
*(.eh_frame)
}}"
)
.unwrap();
writeln!(f, " . = {:#x};", offset).unwrap();
writeln!(
f,
" .head.text : {{
_text = .;
KEEP(*(.head.text))
}}
.text : {{
_stext = .;
. = ALIGN(8);
*(.text.hot .text.* .text.fixup .text.unlikely)
*(.fixup)
*(.gnu.warning)
. = ALIGN(16);
*(.got)
}}
.got.plt : {{ *(.got.plt) }}
. = ALIGN(0x10000);
_etext = .;
. = ALIGN(4096);
.rodata : AT(ADDR(.rodata)) {{
__start_rodata = .;
*(.rodata) *(.rodata.*)
}}
.rodata1 : AT(ADDR(.rodata1)) {{
*(.rodata1)
__end_rodata = .;
}}
.notes : AT(ADDR(.notes)) {{
__start_notes = .;
KEEP(*(.note.*))
__stop_notes = .;
}}
. = ALIGN(4096);
.data : AT(ADDR(.data)) {{
_sdata = .;
. = ALIGN(1 << 14);
__start_stack = .;
. = __start_stack + (1 << 14);
__top_stack = .;
. = ALIGN(4096);
*(.data*)
CONSTRUCTORS
_edata = .;
}}
__bss_start = .;
.sbss : AT(ADDR(.sbss)) {{
*(.dynsbss) *(.sbss) *(.scommon)
}}
.bss : AT(ADDR(.bss)) {{
*(.dynbss) *(.bss*) *(COMMON)
}}
. = ALIGN(8);
__bss_stop = .;
_end = .;
}}"
)
.unwrap();
}
println!("cargo:rustc-link-search={}", out.display());
println!("cargo:rerun-if-changed=build.rs");
println!("cargo:rustc-link-arg=-Tlinker.ld");
}