use goblin::elf::Elf;
use goblin::elf32::header::{
EM_386, EM_AARCH64, EM_ARM, EM_MIPS, EM_PPC, EM_X86_64, ET_DYN, ET_EXEC,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ElfArch {
Elf32,
Elf64,
Unknown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ElfMachine {
X86,
X86_64,
Arm32,
Arm64,
Mips,
PowerPC,
Unknown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ElfType {
Static,
Dynamic,
Pie,
Invalid,
}
#[derive(Debug)]
pub struct RlddRexInfo {
pub arch: ElfArch,
pub elf_type: ElfType,
pub deps: Vec<(String, String)>,
}
#[cfg(feature = "enable_ld_library_path")]
pub fn is_same_arch(arch: ElfArch, sub_elf: &Elf) -> bool {
match arch {
ElfArch::Elf32 => !sub_elf.is_64,
ElfArch::Elf64 => sub_elf.is_64,
ElfArch::Unknown => true, }
}
impl ElfType {
pub fn is_static(&self) -> bool {
*self == ElfType::Static
}
pub fn is_dynamic(&self) -> bool {
*self == ElfType::Dynamic
}
pub fn is_pie(&self) -> bool {
*self == ElfType::Pie
}
pub fn is_valid(&self) -> bool {
*self != ElfType::Invalid
}
}
pub fn get_elf_type(elf: &Elf) -> ElfType {
match elf.header.e_type {
ET_EXEC => {
if elf.dynamic.is_some() {
ElfType::Dynamic
} else {
ElfType::Static
}
}
ET_DYN => {
if elf.interpreter.is_some() {
ElfType::Pie
} else {
ElfType::Dynamic
}
}
_ => ElfType::Invalid, }
}
pub fn machine_from_e_machine(e_machine: u16) -> ElfMachine {
match e_machine {
EM_386 => ElfMachine::X86,
EM_X86_64 => ElfMachine::X86_64,
EM_ARM => ElfMachine::Arm32,
EM_AARCH64 => ElfMachine::Arm64,
EM_MIPS => ElfMachine::Mips,
EM_PPC => ElfMachine::PowerPC,
_ => ElfMachine::Unknown,
}
}