build.rs 1.9 KB

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