137 lines
2.3 KiB
Rust
137 lines
2.3 KiB
Rust
#![no_std]
|
|
#![feature(linkage)]
|
|
#![deny(unsafe_op_in_unsafe_fn)]
|
|
|
|
use core::arch::global_asm;
|
|
|
|
#[cfg(target_arch = "aarch64")]
|
|
global_asm!(
|
|
"
|
|
.weak _DYNAMIC
|
|
.hidden _DYNAMIC
|
|
|
|
.global _start
|
|
_start:
|
|
mov x28, sp
|
|
// align stack to 16 bytes
|
|
and sp, x28, #0xfffffffffffffff0
|
|
adr x1, _start
|
|
mov x0, x28
|
|
adrp x2, _DYNAMIC
|
|
add x2, x2, #:lo12:_DYNAMIC
|
|
// ld_so_start(stack=x0, ld_entry=x1, dynamic=x2)
|
|
bl relibc_ld_so_start
|
|
// restore original stack, clear registers, and jump to the new start function
|
|
mov sp, x28
|
|
mov x1, xzr
|
|
mov x2, xzr
|
|
mov x3, xzr
|
|
mov x4, xzr
|
|
mov x5, xzr
|
|
mov x6, xzr
|
|
mov x7, xzr
|
|
mov x8, xzr
|
|
mov x9, xzr
|
|
mov x10, xzr
|
|
mov x11, xzr
|
|
mov x12, xzr
|
|
mov x13, xzr
|
|
mov x14, xzr
|
|
mov x15, xzr
|
|
mov x16, xzr
|
|
mov x17, xzr
|
|
mov x18, xzr
|
|
mov x19, xzr
|
|
mov x20, xzr
|
|
mov x21, xzr
|
|
mov x22, xzr
|
|
mov x23, xzr
|
|
mov x24, xzr
|
|
mov x25, xzr
|
|
mov x26, xzr
|
|
mov x27, xzr
|
|
mov x28, xzr
|
|
mov x29, xzr
|
|
mov x30, xzr
|
|
br x0
|
|
udf #0
|
|
"
|
|
);
|
|
|
|
#[cfg(target_arch = "x86")]
|
|
global_asm!(
|
|
"
|
|
.globl _start
|
|
_start:
|
|
push esp
|
|
call relibc_ld_so_start
|
|
pop esp
|
|
# TODO: x86
|
|
ud2
|
|
"
|
|
);
|
|
|
|
#[cfg(target_arch = "x86_64")]
|
|
global_asm!(
|
|
"
|
|
.weak _DYNAMIC
|
|
.hidden _DYNAMIC
|
|
|
|
.globl _start
|
|
_start:
|
|
lea rsi, [rip + _start]
|
|
|
|
# Save original stack and align stack to 16 bytes
|
|
mov rbp, rsp
|
|
and rsp, 0xfffffffffffffff0
|
|
|
|
# Call ld_so_start(stack=rdi, ld_entry=rsi, dynamic=rdx)
|
|
mov rdi, rbp
|
|
lea rdx, [rip + _DYNAMIC]
|
|
call relibc_ld_so_start
|
|
|
|
# Restore original stack, clear registers, and jump to new start function
|
|
mov rsp, rbp
|
|
xor rcx, rcx
|
|
xor rdx, rdx
|
|
xor rdi, rdi
|
|
xor rsi, rsi
|
|
xor r8, r8
|
|
xor r9, r9
|
|
xor r10, r10
|
|
xor r11, r11
|
|
fninit
|
|
jmp rax
|
|
ud2
|
|
"
|
|
);
|
|
|
|
#[cfg(target_arch = "riscv64")]
|
|
global_asm!(
|
|
"
|
|
.globl _start
|
|
_start:
|
|
mv a0, sp
|
|
jal relibc_ld_so_start
|
|
unimp
|
|
"
|
|
);
|
|
|
|
#[unsafe(no_mangle)]
|
|
pub unsafe extern "C" fn main(_argc: isize, _argv: *const *const i8) -> usize {
|
|
// LD
|
|
0x1D
|
|
}
|
|
|
|
#[linkage = "weak"]
|
|
#[unsafe(no_mangle)]
|
|
extern "C" fn relibc_panic(_pi: &::core::panic::PanicInfo) -> ! {
|
|
loop {}
|
|
}
|
|
|
|
#[panic_handler]
|
|
#[linkage = "weak"]
|
|
pub unsafe fn rust_begin_unwind(pi: &::core::panic::PanicInfo) -> ! {
|
|
relibc_panic(pi)
|
|
}
|