#![allow(missing_docs)]
use crate::endian::{BigEndian as BE, I16, U16, U32, U64};
use crate::pod::Pod;
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct FileHeader32 {
pub f_magic: U16<BE>,
pub f_nscns: U16<BE>,
pub f_timdat: U32<BE>,
pub f_symptr: U32<BE>,
pub f_nsyms: U32<BE>,
pub f_opthdr: U16<BE>,
pub f_flags: U16<BE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct FileHeader64 {
pub f_magic: U16<BE>,
pub f_nscns: U16<BE>,
pub f_timdat: U32<BE>,
pub f_symptr: U64<BE>,
pub f_opthdr: U16<BE>,
pub f_flags: U16<BE>,
pub f_nsyms: U32<BE>,
}
pub const MAGIC_64: u16 = 0x01F7;
pub const MAGIC_32: u16 = 0x01DF;
pub const F_RELFLG: u16 = 0x0001;
pub const F_EXEC: u16 = 0x0002;
pub const F_LNNO: u16 = 0x0004;
pub const F_FDPR_PROF: u16 = 0x0010;
pub const F_FDPR_OPTI: u16 = 0x0020;
pub const F_DSA: u16 = 0x0040;
pub const F_VARPG: u16 = 0x0100;
pub const F_DYNLOAD: u16 = 0x1000;
pub const F_SHROBJ: u16 = 0x2000;
pub const F_LOADONLY: u16 = 0x4000;
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct AuxHeader32 {
pub o_mflag: U16<BE>,
pub o_vstamp: U16<BE>,
pub o_tsize: U32<BE>,
pub o_dsize: U32<BE>,
pub o_bsize: U32<BE>,
pub o_entry: U32<BE>,
pub o_text_start: U32<BE>,
pub o_data_start: U32<BE>,
pub o_toc: U32<BE>,
pub o_snentry: U16<BE>,
pub o_sntext: U16<BE>,
pub o_sndata: U16<BE>,
pub o_sntoc: U16<BE>,
pub o_snloader: U16<BE>,
pub o_snbss: U16<BE>,
pub o_algntext: U16<BE>,
pub o_algndata: U16<BE>,
pub o_modtype: U16<BE>,
pub o_cpuflag: u8,
pub o_cputype: u8,
pub o_maxstack: U32<BE>,
pub o_maxdata: U32<BE>,
pub o_debugger: U32<BE>,
pub o_textpsize: u8,
pub o_datapsize: u8,
pub o_stackpsize: u8,
pub o_flags: u8,
pub o_sntdata: U16<BE>,
pub o_sntbss: U16<BE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct AuxHeader64 {
pub o_mflag: U16<BE>,
pub o_vstamp: U16<BE>,
pub o_debugger: U32<BE>,
pub o_text_start: U64<BE>,
pub o_data_start: U64<BE>,
pub o_toc: U64<BE>,
pub o_snentry: U16<BE>,
pub o_sntext: U16<BE>,
pub o_sndata: U16<BE>,
pub o_sntoc: U16<BE>,
pub o_snloader: U16<BE>,
pub o_snbss: U16<BE>,
pub o_algntext: U16<BE>,
pub o_algndata: U16<BE>,
pub o_modtype: U16<BE>,
pub o_cpuflag: u8,
pub o_cputype: u8,
pub o_textpsize: u8,
pub o_datapsize: u8,
pub o_stackpsize: u8,
pub o_flags: u8,
pub o_tsize: U64<BE>,
pub o_dsize: U64<BE>,
pub o_bsize: U64<BE>,
pub o_entry: U64<BE>,
pub o_maxstack: U64<BE>,
pub o_maxdata: U64<BE>,
pub o_sntdata: U16<BE>,
pub o_sntbss: U16<BE>,
pub o_x64flags: U16<BE>,
pub o_resv3a: U16<BE>,
pub o_resv3: [U32<BE>; 2],
}
pub const AOUTHSZ_SHORT: u16 = 28;
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct SectionHeader32 {
pub s_name: [u8; 8],
pub s_paddr: U32<BE>,
pub s_vaddr: U32<BE>,
pub s_size: U32<BE>,
pub s_scnptr: U32<BE>,
pub s_relptr: U32<BE>,
pub s_lnnoptr: U32<BE>,
pub s_nreloc: U16<BE>,
pub s_nlnno: U16<BE>,
pub s_flags: U32<BE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct SectionHeader64 {
pub s_name: [u8; 8],
pub s_paddr: U64<BE>,
pub s_vaddr: U64<BE>,
pub s_size: U64<BE>,
pub s_scnptr: U64<BE>,
pub s_relptr: U64<BE>,
pub s_lnnoptr: U64<BE>,
pub s_nreloc: U32<BE>,
pub s_nlnno: U32<BE>,
pub s_flags: U32<BE>,
pub s_reserve: U32<BE>,
}
pub const STYP_REG: u16 = 0x00;
pub const STYP_PAD: u16 = 0x08;
pub const STYP_DWARF: u16 = 0x10;
pub const STYP_TEXT: u16 = 0x20;
pub const STYP_DATA: u16 = 0x40;
pub const STYP_BSS: u16 = 0x80;
pub const STYP_EXCEPT: u16 = 0x0100;
pub const STYP_INFO: u16 = 0x0200;
pub const STYP_TDATA: u16 = 0x0400;
pub const STYP_TBSS: u16 = 0x0800;
pub const STYP_LOADER: u16 = 0x1000;
pub const STYP_DEBUG: u16 = 0x2000;
pub const STYP_TYPCHK: u16 = 0x4000;
pub const STYP_OVRFLO: u16 = 0x8000;
pub const SIZEOF_SYMBOL: usize = 18;
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct SymbolBytes(pub [u8; SIZEOF_SYMBOL]);
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct Symbol32 {
pub n_name: [u8; 8],
pub n_value: U32<BE>,
pub n_scnum: I16<BE>,
pub n_type: U16<BE>,
pub n_sclass: u8,
pub n_numaux: u8,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct Symbol64 {
pub n_value: U64<BE>,
pub n_offset: U32<BE>,
pub n_scnum: I16<BE>,
pub n_type: U16<BE>,
pub n_sclass: u8,
pub n_numaux: u8,
}
pub const N_DEBUG: i16 = -2;
pub const N_ABS: i16 = -1;
pub const N_UNDEF: i16 = 0;
pub const SYM_V_MASK: u16 = 0xF000;
pub const SYM_V_INTERNAL: u16 = 0x1000;
pub const SYM_V_HIDDEN: u16 = 0x2000;
pub const SYM_V_PROTECTED: u16 = 0x3000;
pub const SYM_V_EXPORTED: u16 = 0x4000;
pub const C_FILE: u8 = 103;
pub const C_BINCL: u8 = 108;
pub const C_EINCL: u8 = 109;
pub const C_GSYM: u8 = 128;
pub const C_STSYM: u8 = 133;
pub const C_BCOMM: u8 = 135;
pub const C_ECOMM: u8 = 137;
pub const C_ENTRY: u8 = 141;
pub const C_BSTAT: u8 = 143;
pub const C_ESTAT: u8 = 144;
pub const C_GTLS: u8 = 145;
pub const C_STTLS: u8 = 146;
pub const C_DWARF: u8 = 112;
pub const C_LSYM: u8 = 129;
pub const C_PSYM: u8 = 130;
pub const C_RSYM: u8 = 131;
pub const C_RPSYM: u8 = 132;
pub const C_ECOML: u8 = 136;
pub const C_FUN: u8 = 142;
pub const C_EXT: u8 = 2;
pub const C_WEAKEXT: u8 = 111;
pub const C_NULL: u8 = 0;
pub const C_STAT: u8 = 3;
pub const C_BLOCK: u8 = 100;
pub const C_FCN: u8 = 101;
pub const C_HIDEXT: u8 = 107;
pub const C_INFO: u8 = 110;
pub const C_DECL: u8 = 140;
pub const C_AUTO: u8 = 1;
pub const C_REG: u8 = 4;
pub const C_EXTDEF: u8 = 5;
pub const C_LABEL: u8 = 6;
pub const C_ULABEL: u8 = 7;
pub const C_MOS: u8 = 8;
pub const C_ARG: u8 = 9;
pub const C_STRTAG: u8 = 10;
pub const C_MOU: u8 = 11;
pub const C_UNTAG: u8 = 12;
pub const C_TPDEF: u8 = 13;
pub const C_USTATIC: u8 = 14;
pub const C_ENTAG: u8 = 15;
pub const C_MOE: u8 = 16;
pub const C_REGPARM: u8 = 17;
pub const C_FIELD: u8 = 18;
pub const C_EOS: u8 = 102;
pub const C_ALIAS: u8 = 105;
pub const C_HIDDEN: u8 = 106;
pub const C_EFCN: u8 = 255;
pub const C_TCSYM: u8 = 134;
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct FileAux32 {
pub x_fname: [u8; 8],
pub x_fpad: [u8; 6],
pub x_ftype: u8,
pub x_freserve: [u8; 3],
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct FileAux64 {
pub x_fname: [u8; 8],
pub x_fpad: [u8; 6],
pub x_ftype: u8,
pub x_freserve: [u8; 2],
pub x_auxtype: u8,
}
pub const XFT_FN: u8 = 0;
pub const XFT_CT: u8 = 1;
pub const XFT_CV: u8 = 2;
pub const XFT_CD: u8 = 128;
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct CsectAux32 {
pub x_scnlen: U32<BE>,
pub x_parmhash: U32<BE>,
pub x_snhash: U16<BE>,
pub x_smtyp: u8,
pub x_smclas: u8,
pub x_stab: U32<BE>,
pub x_snstab: U16<BE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct CsectAux64 {
pub x_scnlen_lo: U32<BE>,
pub x_parmhash: U32<BE>,
pub x_snhash: U16<BE>,
pub x_smtyp: u8,
pub x_smclas: u8,
pub x_scnlen_hi: U32<BE>,
pub pad: u8,
pub x_auxtype: u8,
}
pub const XTY_ER: u8 = 0;
pub const XTY_SD: u8 = 1;
pub const XTY_LD: u8 = 2;
pub const XTY_CM: u8 = 3;
pub const XMC_PR: u8 = 0;
pub const XMC_RO: u8 = 1;
pub const XMC_DB: u8 = 2;
pub const XMC_GL: u8 = 6;
pub const XMC_XO: u8 = 7;
pub const XMC_SV: u8 = 8;
pub const XMC_SV64: u8 = 17;
pub const XMC_SV3264: u8 = 18;
pub const XMC_TI: u8 = 12;
pub const XMC_TB: u8 = 13;
pub const XMC_RW: u8 = 5;
pub const XMC_TC0: u8 = 15;
pub const XMC_TC: u8 = 3;
pub const XMC_TD: u8 = 16;
pub const XMC_DS: u8 = 10;
pub const XMC_UA: u8 = 4;
pub const XMC_BS: u8 = 9;
pub const XMC_UC: u8 = 11;
pub const XMC_TL: u8 = 20;
pub const XMC_UL: u8 = 21;
pub const XMC_TE: u8 = 22;
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct FunAux32 {
pub x_exptr: U32<BE>,
pub x_fsize: U32<BE>,
pub x_lnnoptr: U32<BE>,
pub x_endndx: U32<BE>,
pub pad: U16<BE>,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct FunAux64 {
pub x_lnnoptr: U64<BE>,
pub x_fsize: U32<BE>,
pub x_endndx: U32<BE>,
pub pad: u8,
pub x_auxtype: u8,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ExpAux {
pub x_exptr: U64<BE>,
pub x_fsize: U32<BE>,
pub x_endndx: U32<BE>,
pub pad: u8,
pub x_auxtype: u8,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct BlockAux32 {
pub pad: [u8; 2],
pub x_lnnohi: U16<BE>,
pub x_lnnolo: U16<BE>,
pub pad2: [u8; 12],
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct BlockAux64 {
pub x_lnno: U32<BE>,
pub pad: [u8; 13],
pub x_auxtype: u8,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct StatAux {
pub x_scnlen: U32<BE>,
pub x_nreloc: U16<BE>,
pub x_nlinno: U16<BE>,
pub pad: [u8; 10],
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct DwarfAux32 {
pub x_scnlen: U32<BE>,
pub pad: [u8; 4],
pub x_nreloc: U32<BE>,
pub pad2: [u8; 6],
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct DwarfAux64 {
pub x_scnlen: U64<BE>,
pub x_nreloc: U64<BE>,
pub pad: u8,
pub x_auxtype: u8,
}
pub const AUX_EXCEPT: u8 = 255;
pub const AUX_FCN: u8 = 254;
pub const AUX_SYM: u8 = 253;
pub const AUX_FILE: u8 = 252;
pub const AUX_CSECT: u8 = 251;
pub const AUX_SECT: u8 = 250;
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct Rel32 {
pub r_vaddr: U32<BE>,
pub r_symndx: U32<BE>,
pub r_rsize: u8,
pub r_rtype: u8,
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct Rel64 {
pub r_vaddr: U64<BE>,
pub r_symndx: U32<BE>,
pub r_rsize: u8,
pub r_rtype: u8,
}
pub const R_POS: u8 = 0x00;
pub const R_RL: u8 = 0x0c;
pub const R_RLA: u8 = 0x0d;
pub const R_NEG: u8 = 0x01;
pub const R_REL: u8 = 0x02;
pub const R_TOC: u8 = 0x03;
pub const R_TRL: u8 = 0x12;
pub const R_TRLA: u8 = 0x13;
pub const R_GL: u8 = 0x05;
pub const R_TCL: u8 = 0x06;
pub const R_REF: u8 = 0x0f;
pub const R_BA: u8 = 0x08;
pub const R_BR: u8 = 0x0a;
pub const R_RBA: u8 = 0x18;
pub const R_RBR: u8 = 0x1a;
pub const R_TLS: u8 = 0x20;
pub const R_TLS_IE: u8 = 0x21;
pub const R_TLS_LD: u8 = 0x22;
pub const R_TLS_LE: u8 = 0x23;
pub const R_TLSM: u8 = 0x24;
pub const R_TLSML: u8 = 0x25;
pub const R_TOCU: u8 = 0x30;
pub const R_TOCL: u8 = 0x31;
unsafe_impl_pod!(
FileHeader32,
FileHeader64,
AuxHeader32,
AuxHeader64,
SectionHeader32,
SectionHeader64,
SymbolBytes,
Symbol32,
Symbol64,
FileAux32,
FileAux64,
CsectAux32,
CsectAux64,
FunAux32,
FunAux64,
ExpAux,
BlockAux32,
BlockAux64,
StatAux,
DwarfAux32,
DwarfAux64,
Rel32,
Rel64,
);