rustld 0.1.55

A modern ELF loader (static & dynamic linker + compatible glibc & musl) written in Rust
Documentation
use std::arch::asm;

use super::trampoline::indirect_syscall6;
use crate::io_macros::syscall_debug_assert;

#[inline(always)]
pub unsafe fn set_thread_pointer(new_pointer: *mut ()) {
    const ARCH_PRCTL: usize = 158;
    const ARCH_SET_FS: usize = 4098;

    unsafe {
        indirect_syscall6(ARCH_PRCTL, ARCH_SET_FS, new_pointer as usize, 0, 0, 0, 0);
    }
    syscall_debug_assert!(*new_pointer.cast::<*mut ()>() == new_pointer);
    syscall_debug_assert!(get_thread_pointer() == new_pointer);
}

#[inline(always)]
pub unsafe fn get_thread_pointer() -> *mut () {
    let pointer;
    asm!(
        "mov {}, fs:0",
        out(reg) pointer,
        options(nostack, preserves_flags, readonly)
    );
    pointer
}