From 806469a22f10d2a480b3bcbe81c3e7a3d2f1679e Mon Sep 17 00:00:00 2001 From: Luke Street Date: Sun, 29 Jun 2025 17:57:16 -0600 Subject: [PATCH] Support big-endian PowerPC COFF Also adds PPC COFF magic to File::parse --- crates/examples/src/readobj/pe.rs | 12 ++++++------ src/pe.rs | 2 ++ src/read/coff/file.rs | 8 +++++++- src/read/mod.rs | 4 ++++ 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/crates/examples/src/readobj/pe.rs b/crates/examples/src/readobj/pe.rs index 825d53a..5e07dff 100644 --- a/crates/examples/src/readobj/pe.rs +++ b/crates/examples/src/readobj/pe.rs @@ -654,9 +654,9 @@ fn print_relocations<'data, Coff: CoffHeader>( | IMAGE_FILE_MACHINE_MIPSFPU | IMAGE_FILE_MACHINE_MIPSFPU16 => FLAGS_IMAGE_REL_MIPS, IMAGE_FILE_MACHINE_ALPHA | IMAGE_FILE_MACHINE_ALPHA64 => FLAGS_IMAGE_REL_ALPHA, - IMAGE_FILE_MACHINE_POWERPC | IMAGE_FILE_MACHINE_POWERPCFP => { - FLAGS_IMAGE_REL_PPC - } + IMAGE_FILE_MACHINE_POWERPC + | IMAGE_FILE_MACHINE_POWERPCFP + | IMAGE_FILE_MACHINE_POWERPCBE => FLAGS_IMAGE_REL_PPC, IMAGE_FILE_MACHINE_SH3 | IMAGE_FILE_MACHINE_SH3DSP | IMAGE_FILE_MACHINE_SH3E @@ -676,9 +676,9 @@ fn print_relocations<'data, Coff: CoffHeader>( let typ = relocation.typ.get(LE); p.field_enum("Type", typ, proc); match machine { - IMAGE_FILE_MACHINE_POWERPC | IMAGE_FILE_MACHINE_POWERPCFP => { - p.flags(typ, 0, FLAGS_IMAGE_REL_PPC_BITS) - } + IMAGE_FILE_MACHINE_POWERPC + | IMAGE_FILE_MACHINE_POWERPCFP + | IMAGE_FILE_MACHINE_POWERPCBE => p.flags(typ, 0, FLAGS_IMAGE_REL_PPC_BITS), IMAGE_FILE_MACHINE_SH3 | IMAGE_FILE_MACHINE_SH3DSP | IMAGE_FILE_MACHINE_SH3E diff --git a/src/pe.rs b/src/pe.rs index 325bf23..28c4b2c 100644 --- a/src/pe.rs +++ b/src/pe.rs @@ -337,6 +337,8 @@ pub const IMAGE_FILE_MACHINE_AM33: u16 = 0x01d3; /// IBM PowerPC Little-Endian pub const IMAGE_FILE_MACHINE_POWERPC: u16 = 0x01F0; pub const IMAGE_FILE_MACHINE_POWERPCFP: u16 = 0x01f1; +/// IBM PowerPC Big-Endian +pub const IMAGE_FILE_MACHINE_POWERPCBE: u16 = 0x01f2; /// Intel 64 pub const IMAGE_FILE_MACHINE_IA64: u16 = 0x0200; /// MIPS diff --git a/src/read/coff/file.rs b/src/read/coff/file.rs index 7a1681a..3d766f9 100644 --- a/src/read/coff/file.rs +++ b/src/read/coff/file.rs @@ -147,6 +147,9 @@ where pe::IMAGE_FILE_MACHINE_ARM64 | pe::IMAGE_FILE_MACHINE_ARM64EC => Architecture::Aarch64, pe::IMAGE_FILE_MACHINE_I386 => Architecture::I386, pe::IMAGE_FILE_MACHINE_AMD64 => Architecture::X86_64, + pe::IMAGE_FILE_MACHINE_POWERPC + | pe::IMAGE_FILE_MACHINE_POWERPCFP + | pe::IMAGE_FILE_MACHINE_POWERPCBE => Architecture::PowerPc, _ => Architecture::Unknown, } } @@ -160,7 +163,10 @@ where #[inline] fn is_little_endian(&self) -> bool { - true + match self.header.machine() { + pe::IMAGE_FILE_MACHINE_POWERPCBE => false, + _ => true, + } } #[inline] diff --git a/src/read/mod.rs b/src/read/mod.rs index 1705b49..11d2e73 100644 --- a/src/read/mod.rs +++ b/src/read/mod.rs @@ -338,6 +338,10 @@ impl FileKind { | [0x64, 0xaa, ..] // COFF arm64ec | [0x41, 0xa6, ..] + // COFF ppc + | [0xf0, 0x01, ..] + | [0xf1, 0x01, ..] + | [0xf2, 0x01, ..] // COFF x86 | [0x4c, 0x01, ..] // COFF x86-64