elf_loader 0.15.0

A no_std-friendly ELF loader, runtime linker, and JIT linker for Rust.
pub(crate) const DYLIB_OFFSET: usize = 1;
pub(crate) const RESOLVE_FUNCTION_OFFSET: usize = 0;

#[unsafe(naked)]
pub(crate) extern "C" fn dl_runtime_resolve() {
    core::arch::naked_asm!(
        "
        addi.d  $sp, $sp, -224
        st.d    $ra, $sp, 0
        st.d    $a0, $sp, 8
        st.d    $a1, $sp, 16
        st.d    $a2, $sp, 24
        st.d    $a3, $sp, 32
        st.d    $a4, $sp, 40
        st.d    $a5, $sp, 48
        st.d    $a6, $sp, 56
        st.d    $a7, $sp, 64
        st.d    $t0, $sp, 72
        st.d    $t1, $sp, 80
        // 16 bytes padding to align vr0 to 16 bytes (sp + 96)
        vst     $vr0, $sp, 96
        vst     $vr1, $sp, 112
        vst     $vr2, $sp, 128
        vst     $vr3, $sp, 144
        vst     $vr4, $sp, 160
        vst     $vr5, $sp, 176
        vst     $vr6, $sp, 192
        vst     $vr7, $sp, 208

        move    $a0, $t0
        srli.d  $a1, $t1, 3
        la.local $t2, {0}
        jirl    $ra, $t2, 0

        move    $t2, $a0

        ld.d    $ra, $sp, 0
        ld.d    $a0, $sp, 8
        ld.d    $a1, $sp, 16
        ld.d    $a2, $sp, 24
        ld.d    $a3, $sp, 32
        ld.d    $a4, $sp, 40
        ld.d    $a5, $sp, 48
        ld.d    $a6, $sp, 56
        ld.d    $a7, $sp, 64
        ld.d    $t0, $sp, 72
        ld.d    $t1, $sp, 80
        vld     $vr0, $sp, 96
        vld     $vr1, $sp, 112
        vld     $vr2, $sp, 128
        vld     $vr3, $sp, 144
        vld     $vr4, $sp, 160
        vld     $vr5, $sp, 176
        vld     $vr6, $sp, 192
        vld     $vr7, $sp, 208

        addi.d  $sp, $sp, 224

        jr      $t2
    ",
        sym crate::relocation::dl_fixup,
    )
}