build.rs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. use std::{env, path::PathBuf};
  2. fn main() {
  3. let out = PathBuf::from(env::var_os("OUT_DIR").unwrap());
  4. let ld = &out.join("rustsbi-prototyper.ld");
  5. std::fs::write(ld, LINKER_SCRIPT).unwrap();
  6. println!("cargo:rerun-if-env-changed=RUST_LOG,PROTOTYPER_FDT,PROTOTYPER_IMAGE");
  7. println!("cargo:rustc-link-arg=-T{}", ld.display());
  8. println!("cargo:rustc-link-search={}", out.display());
  9. }
  10. const LINKER_SCRIPT: &[u8] = b"OUTPUT_ARCH(riscv)
  11. ENTRY(_start)
  12. SECTIONS {
  13. . = 0x80000000;
  14. sbi_start = .;
  15. .text : ALIGN(8) {
  16. *(.text.entry)
  17. *(.text .text.*)
  18. }
  19. .rodata : ALIGN(8) {
  20. srodata = .;
  21. *(.rodata .rodata.*)
  22. *(.srodata .srodata.*)
  23. . = ALIGN(8);
  24. }
  25. .dynsym : ALIGN(8) {
  26. *(.dynsym)
  27. }
  28. .rela.dyn : ALIGN(8) {
  29. __rel_dyn_start = .;
  30. *(.rela*)
  31. __rel_dyn_end = .;
  32. }
  33. erodata = .;
  34. .data : ALIGN(8) {
  35. sdata = .;
  36. *(.data .data.*)
  37. *(.sdata .sdata.*)
  38. . = ALIGN(8);
  39. edata = .;
  40. }
  41. sidata = LOADADDR(.data);
  42. .bss (NOLOAD) : ALIGN(8) {
  43. *(.bss.uninit)
  44. sbss = .;
  45. *(.bss .bss.*)
  46. *(.sbss .sbss.*)
  47. ebss = .;
  48. }
  49. /DISCARD/ : {
  50. *(.eh_frame)
  51. }
  52. . = ALIGN(8);
  53. sbi_end = .;
  54. .text 0x80100000 : ALIGN(8) {
  55. *(.fw_fdt)
  56. }
  57. .text 0x80200000 : ALIGN(8) {
  58. *(.payload)
  59. }
  60. }";