From 4001fd5552849908dffd26c0da9c3a8ea8f41fed Mon Sep 17 00:00:00 2001 From: Jez Ng Date: Fri, 24 Oct 2025 22:45:41 -0400 Subject: [PATCH] readobj: print mach-o integer fields as version strings as appropriate (#813) --- crates/examples/src/readobj/macho.rs | 25 ++++++++++++++----- .../macho/base-aarch64-debug.o.readobj | 4 +-- .../testfiles/macho/base-aarch64.o.objcopy | 4 +-- .../testfiles/macho/base-aarch64.o.readobj | 4 +-- .../testfiles/macho/base-aarch64.readobj | 8 +++--- .../macho/base-x86_64-debug.o.readobj | 4 +-- .../testfiles/macho/base-x86_64.o.objcopy | 4 +-- .../testfiles/macho/base-x86_64.o.readobj | 4 +-- .../testfiles/macho/base-x86_64.readobj | 8 +++--- 9 files changed, 39 insertions(+), 26 deletions(-) diff --git a/crates/examples/src/readobj/macho.rs b/crates/examples/src/readobj/macho.rs index c5c3eca..116f996 100644 --- a/crates/examples/src/readobj/macho.rs +++ b/crates/examples/src/readobj/macho.rs @@ -3,6 +3,19 @@ use object::macho::*; use object::read::macho::*; use object::BigEndian; +trait PrinterMachoExt { + fn field_version(&mut self, name: &str, value: u32); +} + +impl<'a> PrinterMachoExt for Printer<'a> { + fn field_version(&mut self, name: &str, value: u32) { + let major = (value >> 16) & 0xFFFF; + let minor = (value >> 8) & 0xFF; + let update = value & 0xFF; + self.field(name, format!("{}.{}.{}", major, minor, update)); + } +} + pub(super) fn print_dyld_cache(p: &mut Printer<'_>, data: &[u8], subcache_data: &[&[u8]]) { print_dyld_subcache(p, data); for subcache in subcache_data { @@ -417,8 +430,8 @@ fn print_load_command( command.string(endian, x.dylib.name), ); p.field("Timestamp", x.dylib.timestamp.get(endian)); - p.field_hex("CurrentVersion", x.dylib.current_version.get(endian)); - p.field_hex( + p.field_version("CurrentVersion", x.dylib.current_version.get(endian)); + p.field_version( "CompatibilityVersion", x.dylib.compatibility_version.get(endian), ); @@ -606,8 +619,8 @@ fn print_load_command( p.group("VersionMinCommand", |p| { p.field_enum("Cmd", x.cmd.get(endian), FLAGS_LC); p.field_hex("CmdSize", x.cmdsize.get(endian)); - p.field_hex("Version", x.version.get(endian)); - p.field_hex("Sdk", x.sdk.get(endian)); + p.field_version("Version", x.version.get(endian)); + p.field_version("Sdk", x.sdk.get(endian)); }); } LoadCommandVariant::EntryPoint(x) => { @@ -648,8 +661,8 @@ fn print_load_command( p.field_enum("Cmd", x.cmd.get(endian), FLAGS_LC); p.field_hex("CmdSize", x.cmdsize.get(endian)); p.field_enum("Platform", x.platform.get(endian), FLAGS_PLATFORM); - p.field_hex("MinOs", x.minos.get(endian)); - p.field_hex("Sdk", x.sdk.get(endian)); + p.field_version("MinOs", x.minos.get(endian)); + p.field_version("Sdk", x.sdk.get(endian)); p.field_hex("NumberOfTools", x.ntools.get(endian)); // TODO: dump tools }); diff --git a/crates/examples/testfiles/macho/base-aarch64-debug.o.readobj b/crates/examples/testfiles/macho/base-aarch64-debug.o.readobj index 6c37941..6b8059d 100644 --- a/crates/examples/testfiles/macho/base-aarch64-debug.o.readobj +++ b/crates/examples/testfiles/macho/base-aarch64-debug.o.readobj @@ -241,8 +241,8 @@ BuildVersionCommand { Cmd: LC_BUILD_VERSION (0x32) CmdSize: 0x18 Platform: PLATFORM_MACOS (0x1) - MinOs: 0xD0000 - Sdk: 0xD0300 + MinOs: 13.0.0 + Sdk: 13.3.0 NumberOfTools: 0x0 } SymtabCommand { diff --git a/crates/examples/testfiles/macho/base-aarch64.o.objcopy b/crates/examples/testfiles/macho/base-aarch64.o.objcopy index ad82dbf..fbec1d4 100644 --- a/crates/examples/testfiles/macho/base-aarch64.o.objcopy +++ b/crates/examples/testfiles/macho/base-aarch64.o.objcopy @@ -105,8 +105,8 @@ BuildVersionCommand { Cmd: LC_BUILD_VERSION (0x32) CmdSize: 0x18 Platform: PLATFORM_MACOS (0x1) - MinOs: 0xD0000 - Sdk: 0xD0300 + MinOs: 13.0.0 + Sdk: 13.3.0 NumberOfTools: 0x0 } SymtabCommand { diff --git a/crates/examples/testfiles/macho/base-aarch64.o.readobj b/crates/examples/testfiles/macho/base-aarch64.o.readobj index ad82dbf..fbec1d4 100644 --- a/crates/examples/testfiles/macho/base-aarch64.o.readobj +++ b/crates/examples/testfiles/macho/base-aarch64.o.readobj @@ -105,8 +105,8 @@ BuildVersionCommand { Cmd: LC_BUILD_VERSION (0x32) CmdSize: 0x18 Platform: PLATFORM_MACOS (0x1) - MinOs: 0xD0000 - Sdk: 0xD0300 + MinOs: 13.0.0 + Sdk: 13.3.0 NumberOfTools: 0x0 } SymtabCommand { diff --git a/crates/examples/testfiles/macho/base-aarch64.readobj b/crates/examples/testfiles/macho/base-aarch64.readobj index d26931d..420d182 100644 --- a/crates/examples/testfiles/macho/base-aarch64.readobj +++ b/crates/examples/testfiles/macho/base-aarch64.readobj @@ -227,8 +227,8 @@ BuildVersionCommand { Cmd: LC_BUILD_VERSION (0x32) CmdSize: 0x20 Platform: PLATFORM_MACOS (0x1) - MinOs: 0xD0000 - Sdk: 0xD0300 + MinOs: 13.0.0 + Sdk: 13.3.0 NumberOfTools: 0x1 } SourceVersionCommand { @@ -248,8 +248,8 @@ DylibCommand { Dylib { Name: "/usr/lib/libSystem.B.dylib" (0x18) Timestamp: 2 - CurrentVersion: 0x5276403 - CompatibilityVersion: 0x10000 + CurrentVersion: 1319.100.3 + CompatibilityVersion: 1.0.0 } } LinkeditDataCommand { diff --git a/crates/examples/testfiles/macho/base-x86_64-debug.o.readobj b/crates/examples/testfiles/macho/base-x86_64-debug.o.readobj index ecae9f1..6df8530 100644 --- a/crates/examples/testfiles/macho/base-x86_64-debug.o.readobj +++ b/crates/examples/testfiles/macho/base-x86_64-debug.o.readobj @@ -249,8 +249,8 @@ BuildVersionCommand { Cmd: LC_BUILD_VERSION (0x32) CmdSize: 0x18 Platform: PLATFORM_MACOS (0x1) - MinOs: 0xC0000 - Sdk: 0xD0100 + MinOs: 12.0.0 + Sdk: 13.1.0 NumberOfTools: 0x0 } SymtabCommand { diff --git a/crates/examples/testfiles/macho/base-x86_64.o.objcopy b/crates/examples/testfiles/macho/base-x86_64.o.objcopy index 71c78cf..1254b5c 100644 --- a/crates/examples/testfiles/macho/base-x86_64.o.objcopy +++ b/crates/examples/testfiles/macho/base-x86_64.o.objcopy @@ -113,8 +113,8 @@ BuildVersionCommand { Cmd: LC_BUILD_VERSION (0x32) CmdSize: 0x18 Platform: PLATFORM_MACOS (0x1) - MinOs: 0xC0000 - Sdk: 0xD0100 + MinOs: 12.0.0 + Sdk: 13.1.0 NumberOfTools: 0x0 } SymtabCommand { diff --git a/crates/examples/testfiles/macho/base-x86_64.o.readobj b/crates/examples/testfiles/macho/base-x86_64.o.readobj index 71c78cf..1254b5c 100644 --- a/crates/examples/testfiles/macho/base-x86_64.o.readobj +++ b/crates/examples/testfiles/macho/base-x86_64.o.readobj @@ -113,8 +113,8 @@ BuildVersionCommand { Cmd: LC_BUILD_VERSION (0x32) CmdSize: 0x18 Platform: PLATFORM_MACOS (0x1) - MinOs: 0xC0000 - Sdk: 0xD0100 + MinOs: 12.0.0 + Sdk: 13.1.0 NumberOfTools: 0x0 } SymtabCommand { diff --git a/crates/examples/testfiles/macho/base-x86_64.readobj b/crates/examples/testfiles/macho/base-x86_64.readobj index eb06e47..f7a6e5e 100644 --- a/crates/examples/testfiles/macho/base-x86_64.readobj +++ b/crates/examples/testfiles/macho/base-x86_64.readobj @@ -305,8 +305,8 @@ BuildVersionCommand { Cmd: LC_BUILD_VERSION (0x32) CmdSize: 0x20 Platform: PLATFORM_MACOS (0x1) - MinOs: 0xC0000 - Sdk: 0xD0100 + MinOs: 12.0.0 + Sdk: 13.1.0 NumberOfTools: 0x1 } SourceVersionCommand { @@ -326,8 +326,8 @@ DylibCommand { Dylib { Name: "/usr/lib/libSystem.B.dylib" (0x18) Timestamp: 2 - CurrentVersion: 0x5270000 - CompatibilityVersion: 0x10000 + CurrentVersion: 1319.0.0 + CompatibilityVersion: 1.0.0 } } LinkeditDataCommand {