use crate::elf::ElfPhdr;
use elf::abi::PT_TLS;
#[derive(Clone, Copy, Default)]
pub struct TlsInfo {
pub vaddr: usize,
pub filesz: usize,
pub memsz: usize,
pub align: usize,
pub image: &'static [u8],
}
impl core::fmt::Debug for TlsInfo {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.debug_struct("TlsInfo")
.field("vaddr", &format_args!("0x{:x}", self.vaddr))
.field("filesz", &self.filesz)
.field("memsz", &self.memsz)
.field("align", &self.align)
.field("image_len", &self.image.len())
.finish()
}
}
impl TlsInfo {
pub fn new(phdr: &ElfPhdr, image: &'static [u8]) -> Self {
assert_eq!(phdr.p_type, PT_TLS);
Self {
vaddr: phdr.p_vaddr as usize,
filesz: phdr.p_filesz as usize,
memsz: phdr.p_memsz as usize,
align: phdr.p_align as usize,
image,
}
}
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct TlsIndex {
pub ti_module: usize,
pub ti_offset: usize,
}
#[repr(C)]
#[derive(Debug)]
pub(crate) struct TlsDescDynamicArg {
pub tls_get_addr: usize,
pub ti: TlsIndex,
}