build.rs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. . = ALIGN(0x1000); /* Need this to create proper sections */
  15. sbi_start = .;
  16. .text : ALIGN(0x1000) {
  17. *(.text.entry)
  18. *(.text .text.*)
  19. }
  20. .rodata : ALIGN(0x1000) {
  21. sbi_rodata_start = .;
  22. *(.rodata .rodata.*)
  23. *(.srodata .srodata.*)
  24. . = ALIGN(0x1000);
  25. }
  26. .dynsym : ALIGN(8) {
  27. *(.dynsym)
  28. }
  29. .rela.dyn : ALIGN(8) {
  30. __rel_dyn_start = .;
  31. *(.rela*)
  32. __rel_dyn_end = .;
  33. }
  34. sbi_rodata_end = .;
  35. /*
  36. * PMP regions must be to be power-of-2. RX/RW will have separate
  37. * regions, so ensure that the split is power-of-2.
  38. */
  39. . = ALIGN(1 << LOG2CEIL((SIZEOF(.rodata) + SIZEOF(.text)
  40. + SIZEOF(.dynsym) + SIZEOF(.rela.dyn))));
  41. .data : ALIGN(0x1000) {
  42. sbi_data_start = .;
  43. *(.data .data.*)
  44. *(.sdata .sdata.*)
  45. . = ALIGN(0x1000);
  46. sbi_data_end = .;
  47. }
  48. sidata = LOADADDR(.data);
  49. .bss (NOLOAD) : ALIGN(0x1000) {
  50. *(.bss.stack)
  51. sbi_heap_start = .;
  52. *(.bss.heap)
  53. sbi_heap_end = .;
  54. sbi_bss_start = .;
  55. *(.bss .bss.*)
  56. *(.sbss .sbss.*)
  57. sbi_bss_end = .;
  58. }
  59. /DISCARD/ : {
  60. *(.eh_frame)
  61. }
  62. . = ALIGN(0x1000); /* Need this to create proper sections */
  63. sbi_end = .;
  64. .text 0x80200000 : ALIGN(0x1000) {
  65. *(.payload)
  66. }
  67. }";