diff --git a/src/common.rs b/src/common.rs index 5247cce..d0a4cdb 100644 --- a/src/common.rs +++ b/src/common.rs @@ -19,6 +19,7 @@ pub enum Architecture { #[allow(non_camel_case_types)] X86_64_X32, Hexagon, + Hppa, LoongArch32, LoongArch64, M68k, @@ -72,6 +73,7 @@ impl Architecture { Architecture::X86_64 => Some(AddressSize::U64), Architecture::X86_64_X32 => Some(AddressSize::U32), Architecture::Hexagon => Some(AddressSize::U32), + Architecture::Hppa => Some(AddressSize::U32), Architecture::LoongArch32 => Some(AddressSize::U32), Architecture::LoongArch64 => Some(AddressSize::U64), Architecture::M68k => Some(AddressSize::U32), diff --git a/src/read/elf/file.rs b/src/read/elf/file.rs index c074c47..b464b10 100644 --- a/src/read/elf/file.rs +++ b/src/read/elf/file.rs @@ -268,6 +268,7 @@ where } (elf::EM_MIPS, true) => Architecture::Mips64, (elf::EM_MSP430, _) => Architecture::Msp430, + (elf::EM_PARISC, _) => Architecture::Hppa, (elf::EM_PPC, _) => Architecture::PowerPc, (elf::EM_PPC64, _) => Architecture::PowerPc64, (elf::EM_RISCV, false) => Architecture::Riscv32, diff --git a/src/read/elf/relocation.rs b/src/read/elf/relocation.rs index f01fc0b..f0c8c4a 100644 --- a/src/read/elf/relocation.rs +++ b/src/read/elf/relocation.rs @@ -415,6 +415,11 @@ fn parse_relocation( elf::R_MSP430_16_BYTE => (K::Absolute, g, 16), _ => unknown, }, + elf::EM_PARISC => match r_type { + elf::R_PARISC_DIR32 => (K::Absolute, g, 32), + elf::R_PARISC_PCREL32 => (K::Relative, g, 32), + _ => unknown, + }, elf::EM_PPC => match r_type { elf::R_PPC_ADDR32 => (K::Absolute, g, 32), _ => unknown, diff --git a/src/write/elf/object.rs b/src/write/elf/object.rs index 9bdd42b..fbe9986 100644 --- a/src/write/elf/object.rs +++ b/src/write/elf/object.rs @@ -208,6 +208,7 @@ impl<'a> Object<'a> { Architecture::I386 => false, Architecture::X86_64 => true, Architecture::X86_64_X32 => true, + Architecture::Hppa => false, Architecture::Hexagon => true, Architecture::LoongArch32 => true, Architecture::LoongArch64 => true, @@ -334,6 +335,11 @@ impl<'a> Object<'a> { (K::Relative, _, 8) => elf::R_X86_64_PC8, _ => return unsupported_reloc(), }, + Architecture::Hppa => match (kind, encoding, size) { + (K::Absolute, _, 32) => elf::R_PARISC_DIR32, + (K::Relative, _, 32) => elf::R_PARISC_PCREL32, + _ => return unsupported_reloc(), + }, Architecture::Hexagon => match (kind, encoding, size) { (K::Absolute, _, 32) => elf::R_HEX_32, _ => return unsupported_reloc(), @@ -658,6 +664,7 @@ impl<'a> Object<'a> { (Architecture::I386, None) => elf::EM_386, (Architecture::X86_64, None) => elf::EM_X86_64, (Architecture::X86_64_X32, None) => elf::EM_X86_64, + (Architecture::Hppa, None) => elf::EM_PARISC, (Architecture::Hexagon, None) => elf::EM_HEXAGON, (Architecture::LoongArch32, None) => elf::EM_LOONGARCH, (Architecture::LoongArch64, None) => elf::EM_LOONGARCH, diff --git a/tests/round_trip/mod.rs b/tests/round_trip/mod.rs index 698dc39..1e45b82 100644 --- a/tests/round_trip/mod.rs +++ b/tests/round_trip/mod.rs @@ -271,6 +271,7 @@ fn elf_any() { (Architecture::I386, Endianness::Little), (Architecture::X86_64, Endianness::Little), (Architecture::X86_64_X32, Endianness::Little), + (Architecture::Hppa, Endianness::Big), (Architecture::Hexagon, Endianness::Little), (Architecture::LoongArch32, Endianness::Little), (Architecture::LoongArch64, Endianness::Little),