#[allow(missing_docs)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum Architecture {
Unknown,
Aarch64,
#[allow(non_camel_case_types)]
Aarch64_Ilp32,
Arm,
Avr,
Bpf,
Csky,
E2K32,
E2K64,
I386,
X86_64,
#[allow(non_camel_case_types)]
X86_64_X32,
Hexagon,
LoongArch64,
M68k,
Mips,
Mips64,
#[allow(non_camel_case_types)]
Mips64_N32,
Msp430,
PowerPc,
PowerPc64,
Riscv32,
Riscv64,
S390x,
Sbf,
Sharc,
Sparc,
Sparc32Plus,
Sparc64,
Wasm32,
Wasm64,
Xtensa,
}
#[allow(missing_docs)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum SubArchitecture {
Arm64E,
Arm64EC,
}
impl Architecture {
pub fn address_size(self) -> Option<AddressSize> {
match self {
Architecture::Unknown => None,
Architecture::Aarch64 => Some(AddressSize::U64),
Architecture::Aarch64_Ilp32 => Some(AddressSize::U32),
Architecture::Arm => Some(AddressSize::U32),
Architecture::Avr => Some(AddressSize::U8),
Architecture::Bpf => Some(AddressSize::U64),
Architecture::Csky => Some(AddressSize::U32),
Architecture::E2K32 => Some(AddressSize::U32),
Architecture::E2K64 => Some(AddressSize::U64),
Architecture::I386 => Some(AddressSize::U32),
Architecture::X86_64 => Some(AddressSize::U64),
Architecture::X86_64_X32 => Some(AddressSize::U32),
Architecture::Hexagon => Some(AddressSize::U32),
Architecture::LoongArch64 => Some(AddressSize::U64),
Architecture::M68k => Some(AddressSize::U32),
Architecture::Mips => Some(AddressSize::U32),
Architecture::Mips64 => Some(AddressSize::U64),
Architecture::Mips64_N32 => Some(AddressSize::U32),
Architecture::Msp430 => Some(AddressSize::U16),
Architecture::PowerPc => Some(AddressSize::U32),
Architecture::PowerPc64 => Some(AddressSize::U64),
Architecture::Riscv32 => Some(AddressSize::U32),
Architecture::Riscv64 => Some(AddressSize::U64),
Architecture::S390x => Some(AddressSize::U64),
Architecture::Sbf => Some(AddressSize::U64),
Architecture::Sharc => Some(AddressSize::U32),
Architecture::Sparc => Some(AddressSize::U32),
Architecture::Sparc32Plus => Some(AddressSize::U32),
Architecture::Sparc64 => Some(AddressSize::U64),
Architecture::Wasm32 => Some(AddressSize::U32),
Architecture::Wasm64 => Some(AddressSize::U64),
Architecture::Xtensa => Some(AddressSize::U32),
}
}
}
#[allow(missing_docs)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
#[repr(u8)]
pub enum AddressSize {
U8 = 1,
U16 = 2,
U32 = 4,
U64 = 8,
}
impl AddressSize {
#[inline]
pub fn bytes(self) -> u8 {
self as u8
}
}
#[allow(missing_docs)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum BinaryFormat {
Coff,
Elf,
MachO,
Pe,
Wasm,
Xcoff,
}
impl BinaryFormat {
pub fn native_object() -> BinaryFormat {
if cfg!(target_os = "windows") {
BinaryFormat::Coff
} else if cfg!(target_os = "macos") {
BinaryFormat::MachO
} else {
BinaryFormat::Elf
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum SectionKind {
Unknown,
Text,
Data,
ReadOnlyData,
ReadOnlyDataWithRel,
ReadOnlyString,
UninitializedData,
Common,
Tls,
UninitializedTls,
TlsVariables,
OtherString,
Other,
Debug,
DebugString,
Linker,
Note,
Metadata,
Elf(u32),
}
impl SectionKind {
pub fn is_bss(self) -> bool {
self == SectionKind::UninitializedData
|| self == SectionKind::UninitializedTls
|| self == SectionKind::Common
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum ComdatKind {
Unknown,
Any,
NoDuplicates,
SameSize,
ExactMatch,
Largest,
Newest,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum SymbolKind {
Unknown,
Text,
Data,
Section,
File,
Label,
Tls,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum SymbolScope {
Unknown,
Compilation,
Linkage,
Dynamic,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum RelocationKind {
Unknown,
Absolute,
Relative,
Got,
GotRelative,
GotBaseRelative,
GotBaseOffset,
PltRelative,
ImageOffset,
SectionOffset,
SectionIndex,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum RelocationEncoding {
Unknown,
Generic,
X86Signed,
X86RipRelative,
X86RipRelativeMovq,
X86Branch,
S390xDbl,
AArch64Call,
LoongArchBranch,
SharcTypeA,
SharcTypeB,
E2KLit,
E2KDisp,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum FileFlags {
None,
Elf {
os_abi: u8,
abi_version: u8,
e_flags: u32,
},
MachO {
flags: u32,
},
Coff {
characteristics: u16,
},
Xcoff {
f_flags: u16,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum SegmentFlags {
None,
Elf {
p_flags: u32,
},
MachO {
flags: u32,
maxprot: u32,
initprot: u32,
},
Coff {
characteristics: u32,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum SectionFlags {
None,
Elf {
sh_flags: u64,
},
MachO {
flags: u32,
},
Coff {
characteristics: u32,
},
Xcoff {
s_flags: u32,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum SymbolFlags<Section, Symbol> {
None,
Elf {
st_info: u8,
st_other: u8,
},
MachO {
n_desc: u16,
},
CoffSection {
selection: u8,
associative_section: Option<Section>,
},
Xcoff {
n_sclass: u8,
x_smtyp: u8,
x_smclas: u8,
containing_csect: Option<Symbol>,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum RelocationFlags {
Generic {
kind: RelocationKind,
encoding: RelocationEncoding,
size: u8,
},
Elf {
r_type: u32,
},
MachO {
r_type: u8,
r_pcrel: bool,
r_length: u8,
},
Coff {
typ: u16,
},
Xcoff {
r_rtype: u8,
r_rsize: u8,
},
}