rustld 0.1.55

A modern ELF loader (static & dynamic linker + compatible glibc & musl) written in Rust
Documentation
use std::sync::atomic::{AtomicBool, Ordering};

use crate::arch;

pub(crate) unsafe fn getpid() -> i32 {
    arch::getpid()
}

unsafe fn syscall_gettid() -> i32 {
    arch::gettid()
}

pub(crate) unsafe fn raise(signal_number: i32) -> i32 {
    let process_id = getpid();
    let thread_id = syscall_gettid();

    arch::tgkill(process_id, thread_id, signal_number) as i32
}

pub(crate) unsafe fn abort() -> ! {
    const SIGABRT: i32 = 6;

    static ABORT_IN_PROGRESS: AtomicBool = AtomicBool::new(false);

    if ABORT_IN_PROGRESS
        .compare_exchange(false, true, Ordering::AcqRel, Ordering::Acquire)
        .is_err()
    {
        arch::trap();
    }

    raise(SIGABRT);

    arch::trap();
}