1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
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");
}