Skip to content

Commit

Permalink
macho: add SubArchitecture::Arm64E (#614)
Browse files Browse the repository at this point in the history
  • Loading branch information
philipc authored Dec 23, 2023
1 parent f86a630 commit 0aa432b
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 9 deletions.
1 change: 1 addition & 0 deletions src/common.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ pub enum Architecture {
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum SubArchitecture {
Arm64E,
Arm64EC,
}

Expand Down
12 changes: 11 additions & 1 deletion src/read/macho/file.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use core::{mem, str};
use crate::read::{
self, Architecture, ComdatKind, Error, Export, FileFlags, Import, NoDynamicRelocationIterator,
Object, ObjectComdat, ObjectKind, ObjectMap, ObjectSection, ReadError, ReadRef, Result,
SectionIndex, SymbolIndex,
SectionIndex, SubArchitecture, SymbolIndex,
};
use crate::{endian, macho, BigEndian, ByteString, Endian, Endianness, Pod};

Expand Down Expand Up @@ -236,6 +236,16 @@ where
}
}

fn sub_architecture(&self) -> Option<SubArchitecture> {
match (
self.header.cputype(self.endian),
self.header.cpusubtype(self.endian),
) {
(macho::CPU_TYPE_ARM64, macho::CPU_SUBTYPE_ARM64E) => Some(SubArchitecture::Arm64E),
_ => None,
}
}

#[inline]
fn is_little_endian(&self) -> bool {
self.header.is_little_endian()
Expand Down
3 changes: 3 additions & 0 deletions src/write/macho.rs
Original file line number Diff line number Diff line change
Expand Up @@ -473,6 +473,9 @@ impl<'a> Object<'a> {
let (cputype, mut cpusubtype) = match (self.architecture, self.sub_architecture) {
(Architecture::Arm, None) => (macho::CPU_TYPE_ARM, macho::CPU_SUBTYPE_ARM_ALL),
(Architecture::Aarch64, None) => (macho::CPU_TYPE_ARM64, macho::CPU_SUBTYPE_ARM64_ALL),
(Architecture::Aarch64, Some(SubArchitecture::Arm64E)) => {
(macho::CPU_TYPE_ARM64, macho::CPU_SUBTYPE_ARM64E)
}
(Architecture::Aarch64_Ilp32, None) => {
(macho::CPU_TYPE_ARM64_32, macho::CPU_SUBTYPE_ARM64_32_V8)
}
Expand Down
23 changes: 15 additions & 8 deletions tests/round_trip/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -495,23 +495,29 @@ fn macho_x86_64() {

#[test]
fn macho_any() {
for (arch, endian) in [
(Architecture::Aarch64, Endianness::Little),
(Architecture::Aarch64_Ilp32, Endianness::Little),
for (arch, subarch, endian) in [
(Architecture::Aarch64, None, Endianness::Little),
(
Architecture::Aarch64,
Some(SubArchitecture::Arm64E),
Endianness::Little,
),
(Architecture::Aarch64_Ilp32, None, Endianness::Little),
/* TODO:
(Architecture::Arm, Endianness::Little),
(Architecture::Arm, None, Endianness::Little),
*/
(Architecture::I386, Endianness::Little),
(Architecture::X86_64, Endianness::Little),
(Architecture::I386, None, Endianness::Little),
(Architecture::X86_64, None, Endianness::Little),
/* TODO:
(Architecture::PowerPc, Endianness::Big),
(Architecture::PowerPc64, Endianness::Big),
(Architecture::PowerPc, None, Endianness::Big),
(Architecture::PowerPc64, None, Endianness::Big),
*/
]
.iter()
.copied()
{
let mut object = write::Object::new(BinaryFormat::MachO, arch, endian);
object.set_sub_architecture(subarch);

let section = object.section_id(write::StandardSection::Data);
object.append_section_data(section, &[1; 30], 4);
Expand Down Expand Up @@ -551,6 +557,7 @@ fn macho_any() {
println!("{:?}", object.architecture());
assert_eq!(object.format(), BinaryFormat::MachO);
assert_eq!(object.architecture(), arch);
assert_eq!(object.sub_architecture(), subarch);
assert_eq!(object.endianness(), endian);

let mut sections = object.sections();
Expand Down

0 comments on commit 0aa432b

Please sign in to comment.