lib.rs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #![no_std]
  2. #![feature(asm)]
  3. #![feature(linkage)]
  4. #![feature(llvm_asm)]
  5. #![feature(naked_functions)]
  6. #[naked]
  7. #[no_mangle]
  8. pub unsafe extern "C" fn _start() {
  9. #[cfg(target_arch = "aarch64")]
  10. llvm_asm!("
  11. mov x0, sp
  12. bl relibc_ld_so_start
  13. # TODO: aarch64
  14. "
  15. :
  16. :
  17. :
  18. : "volatile"
  19. );
  20. #[cfg(target_arch = "x86_64")]
  21. llvm_asm!("
  22. # rsi = _start + 5
  23. call next
  24. next: pop rsi
  25. # Save original stack and align stack to 16 bytes
  26. mov rbp, rsp
  27. and rsp, 0xFFFFFFFFFFFFFFF0
  28. # Call ld_so_start(stack, entry)
  29. mov rdi, rbp
  30. sub rsi, 5
  31. call relibc_ld_so_start
  32. # Restore original stack, clear registers, and jump to new start function
  33. mov rsp, rbp
  34. xor rcx, rcx
  35. xor rdx, rdx
  36. xor rdi, rdi
  37. xor rsi, rsi
  38. xor r8, r8
  39. xor r9, r9
  40. xor r10, r10
  41. xor r11, r11
  42. fninit
  43. jmp rax
  44. "
  45. :
  46. :
  47. :
  48. : "intel", "volatile"
  49. );
  50. }
  51. #[naked]
  52. #[no_mangle]
  53. pub unsafe extern "C" fn main(_argc: isize, _argv: *const *const i8) -> usize {
  54. // LD
  55. 0x1D
  56. }
  57. #[linkage = "weak"]
  58. #[no_mangle]
  59. extern "C" fn relibc_panic(pi: &::core::panic::PanicInfo) -> ! {
  60. loop {}
  61. }
  62. #[panic_handler]
  63. #[linkage = "weak"]
  64. #[no_mangle]
  65. pub unsafe extern "C" fn rust_begin_unwind(pi: &::core::panic::PanicInfo) -> ! {
  66. relibc_panic(pi)
  67. }