build.rs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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. #[cfg(feature = "payload")]
  11. const LINKER_SCRIPT: &[u8] = b"OUTPUT_ARCH(riscv)
  12. ENTRY(_start)
  13. SECTIONS {
  14. . = 0x80000000;
  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. .text 0x80100000 : ALIGN(8) {
  53. *(.fw_fdt)
  54. }
  55. .text 0x80200000 : ALIGN(8) {
  56. *(.payload)
  57. }
  58. }";
  59. #[cfg(not(feature = "payload"))]
  60. const LINKER_SCRIPT: &[u8] = b"OUTPUT_ARCH(riscv)
  61. ENTRY(_start)
  62. SECTIONS {
  63. . = 0x80000000;
  64. .text : ALIGN(8) {
  65. *(.text.entry)
  66. *(.text .text.*)
  67. }
  68. .rodata : ALIGN(8) {
  69. srodata = .;
  70. *(.rodata .rodata.*)
  71. *(.srodata .srodata.*)
  72. . = ALIGN(8);
  73. }
  74. .dynsym : ALIGN(8) {
  75. *(.dynsym)
  76. }
  77. .rela.dyn : ALIGN(8) {
  78. __rel_dyn_start = .;
  79. *(.rela*)
  80. __rel_dyn_end = .;
  81. }
  82. erodata = .;
  83. .data : ALIGN(8) {
  84. sdata = .;
  85. *(.data .data.*)
  86. *(.sdata .sdata.*)
  87. . = ALIGN(8);
  88. edata = .;
  89. }
  90. sidata = LOADADDR(.data);
  91. .bss (NOLOAD) : ALIGN(8) {
  92. *(.bss.uninit)
  93. sbss = .;
  94. *(.bss .bss.*)
  95. *(.sbss .sbss.*)
  96. ebss = .;
  97. }
  98. /DISCARD/ : {
  99. *(.eh_frame)
  100. }
  101. }";