From e26dae893e45848cd55781a420787fc719f51a98 Mon Sep 17 00:00:00 2001 From: LagoLunatic Date: Sat, 26 Apr 2025 14:21:43 -0400 Subject: [PATCH 1/4] Combine data/text sections: Pad all sections to 4-byte minimum alignment --- objdiff-core/src/obj/read.rs | 5 ++++- objdiff-core/src/obj/split_meta.rs | 15 ++++----------- objdiff-core/src/util.rs | 23 ++++++++++++++++++++++- 3 files changed, 30 insertions(+), 13 deletions(-) diff --git a/objdiff-core/src/obj/read.rs b/objdiff-core/src/obj/read.rs index 21b6984b..8a4079ac 100644 --- a/objdiff-core/src/obj/read.rs +++ b/objdiff-core/src/obj/read.rs @@ -17,7 +17,7 @@ use crate::{ Symbol, SymbolFlag, SymbolKind, split_meta::{SPLITMETA_SECTION, SplitMeta}, }, - util::{read_u16, read_u32}, + util::{align_data_slice_to_4, align_size_to_4, align_u64_to_4, read_u16, read_u32}, }; fn map_section_kind(section: &object::Section) -> SectionKind { @@ -739,7 +739,9 @@ fn do_combine_sections( } offsets.push(current_offset); current_offset += section.size; + current_offset = align_u64_to_4(current_offset); data_size += section.data.len(); + data_size = align_size_to_4(data_size); num_relocations += section.relocations.len(); } if data_size > 0 { @@ -754,6 +756,7 @@ fn do_combine_sections( let section = &mut sections[i]; section.size = 0; data.append(&mut section.data.0); + align_data_slice_to_4(&mut data); section.relocations.iter_mut().for_each(|r| r.address += offset); relocations.append(&mut section.relocations); line_info.append(&mut section.line_info.iter().map(|(&a, &l)| (a + offset, l)).collect()); diff --git a/objdiff-core/src/obj/split_meta.rs b/objdiff-core/src/obj/split_meta.rs index 8e407dfb..e4599fcf 100644 --- a/objdiff-core/src/obj/split_meta.rs +++ b/objdiff-core/src/obj/split_meta.rs @@ -3,6 +3,10 @@ use alloc::{string::String, vec, vec::Vec}; use anyhow::{Result, anyhow}; use object::{Endian, ObjectSection, elf::SHT_NOTE}; +#[cfg(feature = "std")] +use crate::util::align_data_to_4; +use crate::util::align_size_to_4; + pub const SPLITMETA_SECTION: &str = ".note.split"; pub const SHT_SPLITMETA: u32 = SHT_NOTE; pub const ELF_NOTE_SPLIT: &[u8] = b"Split"; @@ -190,17 +194,6 @@ where E: Endian } } -fn align_size_to_4(size: usize) -> usize { (size + 3) & !3 } - -#[cfg(feature = "std")] -fn align_data_to_4(writer: &mut W, len: usize) -> std::io::Result<()> { - const ALIGN_BYTES: &[u8] = &[0; 4]; - if len % 4 != 0 { - writer.write_all(&ALIGN_BYTES[..4 - len % 4])?; - } - Ok(()) -} - // ELF note format: // Name Size | 4 bytes (integer) // Desc Size | 4 bytes (integer) diff --git a/objdiff-core/src/util.rs b/objdiff-core/src/util.rs index ddea4ed6..dfce380f 100644 --- a/objdiff-core/src/util.rs +++ b/objdiff-core/src/util.rs @@ -1,4 +1,4 @@ -use alloc::format; +use alloc::{format, vec::Vec}; use core::fmt; use anyhow::{Result, ensure}; @@ -39,3 +39,24 @@ pub fn read_u16(obj_file: &object::File, reader: &mut &[u8]) -> Result { *reader = &reader[2..]; Ok(obj_file.endianness().read_u16(value)) } + +pub fn align_size_to_4(size: usize) -> usize { (size + 3) & !3 } + +pub fn align_u64_to_4(size: u64) -> u64 { (size + 3) & !3 } + +#[cfg(feature = "std")] +pub fn align_data_to_4( + writer: &mut W, + len: usize, +) -> std::io::Result<()> { + const ALIGN_BYTES: &[u8] = &[0; 4]; + if len % 4 != 0 { + writer.write_all(&ALIGN_BYTES[..4 - len % 4])?; + } + Ok(()) +} + +pub fn align_data_slice_to_4(data: &mut Vec) { + const ALIGN_BYTE: u8 = 0; + data.resize(align_size_to_4(data.len()), ALIGN_BYTE); +} From 303680384fcc3544e2b69fa995d75dc2a27c83c8 Mon Sep 17 00:00:00 2001 From: LagoLunatic Date: Sat, 26 Apr 2025 14:21:56 -0400 Subject: [PATCH 2/4] Update x86 test snapshot --- .../arch_x86__read_x86_combine_sections.snap | 99 ++++++++++--------- 1 file changed, 50 insertions(+), 49 deletions(-) diff --git a/objdiff-core/tests/snapshots/arch_x86__read_x86_combine_sections.snap b/objdiff-core/tests/snapshots/arch_x86__read_x86_combine_sections.snap index c0f95d29..5ad22232 100644 --- a/objdiff-core/tests/snapshots/arch_x86__read_x86_combine_sections.snap +++ b/objdiff-core/tests/snapshots/arch_x86__read_x86_combine_sections.snap @@ -1,5 +1,6 @@ --- source: objdiff-core/tests/arch_x86.rs +assertion_line: 27 expression: obj.sections --- [ @@ -132,10 +133,10 @@ expression: obj.sections id: ".rdata-combined", name: ".rdata", address: 0, - size: 295, + size: 304, kind: Data, data: SectionData( - 295, + 304, ), flags: FlagSet(Combined), relocations: [ @@ -159,7 +160,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 21, + address: 24, target_symbol: 13, addend: 0, }, @@ -167,7 +168,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 45, + address: 48, target_symbol: 15, addend: 0, }, @@ -175,7 +176,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 61, + address: 64, target_symbol: 25, addend: 0, }, @@ -183,7 +184,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 65, + address: 68, target_symbol: 27, addend: 0, }, @@ -191,7 +192,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 70, + address: 76, target_symbol: 21, addend: 0, }, @@ -199,7 +200,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 94, + address: 100, target_symbol: 23, addend: 0, }, @@ -207,7 +208,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 110, + address: 116, target_symbol: 31, addend: 0, }, @@ -215,7 +216,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 114, + address: 120, target_symbol: 33, addend: 0, }, @@ -223,7 +224,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 130, + address: 136, target_symbol: 35, addend: 0, }, @@ -231,7 +232,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 134, + address: 140, target_symbol: 37, addend: 0, }, @@ -239,7 +240,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 138, + address: 144, target_symbol: 19, addend: 0, }, @@ -247,7 +248,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 142, + address: 148, target_symbol: 39, addend: 0, }, @@ -255,7 +256,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 147, + address: 156, target_symbol: 31, addend: 0, }, @@ -263,7 +264,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 171, + address: 180, target_symbol: 33, addend: 0, }, @@ -271,7 +272,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 175, + address: 184, target_symbol: 21, addend: 0, }, @@ -279,7 +280,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 199, + address: 208, target_symbol: 23, addend: 0, }, @@ -287,7 +288,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 215, + address: 224, target_symbol: 31, addend: 0, }, @@ -295,7 +296,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 219, + address: 228, target_symbol: 33, addend: 0, }, @@ -303,7 +304,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 235, + address: 244, target_symbol: 13, addend: 0, }, @@ -311,7 +312,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 239, + address: 248, target_symbol: 15, addend: 0, }, @@ -319,7 +320,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 255, + address: 264, target_symbol: 21, addend: 0, }, @@ -327,7 +328,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 259, + address: 268, target_symbol: 23, addend: 0, }, @@ -335,7 +336,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 263, + address: 272, target_symbol: 29, addend: 0, }, @@ -343,7 +344,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 267, + address: 276, target_symbol: 11, addend: 0, }, @@ -351,7 +352,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 271, + address: 280, target_symbol: 43, addend: 0, }, @@ -359,7 +360,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 275, + address: 284, target_symbol: 41, addend: 0, }, @@ -367,7 +368,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 279, + address: 288, target_symbol: 70, addend: 0, }, @@ -375,7 +376,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 283, + address: 292, target_symbol: 56, addend: 0, }, @@ -383,7 +384,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 287, + address: 296, target_symbol: 72, addend: 0, }, @@ -391,7 +392,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 291, + address: 300, target_symbol: 59, addend: 0, }, @@ -669,10 +670,10 @@ expression: obj.sections id: ".text-combined", name: ".text", address: 0, - size: 268, + size: 280, kind: Code, data: SectionData( - 268, + 280, ), flags: FlagSet(Combined), relocations: [ @@ -696,7 +697,7 @@ expression: obj.sections flags: Coff( 20, ), - address: 29, + address: 31, target_symbol: 60, addend: 0, }, @@ -704,7 +705,7 @@ expression: obj.sections flags: Coff( 20, ), - address: 48, + address: 50, target_symbol: 52, addend: 0, }, @@ -712,7 +713,7 @@ expression: obj.sections flags: Coff( 20, ), - address: 68, + address: 72, target_symbol: 11, addend: 0, }, @@ -720,7 +721,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 84, + address: 88, target_symbol: 64, addend: 0, }, @@ -728,7 +729,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 104, + address: 108, target_symbol: 66, addend: 0, }, @@ -736,7 +737,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 124, + address: 128, target_symbol: 6, addend: 0, }, @@ -744,7 +745,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 134, + address: 138, target_symbol: 8, addend: 0, }, @@ -752,7 +753,7 @@ expression: obj.sections flags: Coff( 20, ), - address: 145, + address: 149, target_symbol: 57, addend: 0, }, @@ -760,7 +761,7 @@ expression: obj.sections flags: Coff( 20, ), - address: 153, + address: 157, target_symbol: 54, addend: 0, }, @@ -768,7 +769,7 @@ expression: obj.sections flags: Coff( 20, ), - address: 172, + address: 179, target_symbol: 54, addend: 0, }, @@ -776,7 +777,7 @@ expression: obj.sections flags: Coff( 20, ), - address: 191, + address: 198, target_symbol: 52, addend: 0, }, @@ -784,7 +785,7 @@ expression: obj.sections flags: Coff( 20, ), - address: 218, + address: 227, target_symbol: 57, addend: 0, }, @@ -792,7 +793,7 @@ expression: obj.sections flags: Coff( 20, ), - address: 237, + address: 246, target_symbol: 52, addend: 0, }, @@ -800,7 +801,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 257, + address: 268, target_symbol: 68, addend: 0, }, @@ -808,7 +809,7 @@ expression: obj.sections flags: Coff( 20, ), - address: 262, + address: 273, target_symbol: 60, addend: 0, }, From 6ca500753b340ff1fb3b16f6415408fd4784bf8a Mon Sep 17 00:00:00 2001 From: LagoLunatic Date: Sat, 26 Apr 2025 15:56:55 -0400 Subject: [PATCH 3/4] Read and store object section alignment --- objdiff-core/src/obj/mod.rs | 7 +- objdiff-core/src/obj/read.rs | 3 +- ...re__obj__read__test__combine_sections.snap | 4 + .../tests/snapshots/arch_arm__read_arm.snap | 21 ++++ .../tests/snapshots/arch_arm__read_thumb.snap | 21 ++++ .../tests/snapshots/arch_mips__read_mips.snap | 36 ++++++ .../tests/snapshots/arch_ppc__read_extab.snap | 30 +++++ .../tests/snapshots/arch_ppc__read_ppc.snap | 31 ++++- .../tests/snapshots/arch_x86__read_x86.snap | 9 ++ .../snapshots/arch_x86__read_x86_64.snap | 72 ++++++++++++ .../arch_x86__read_x86_combine_sections.snap | 106 +++++++++++++++++- .../arch_x86__read_x86_jumptable.snap | 9 ++ 12 files changed, 345 insertions(+), 4 deletions(-) diff --git a/objdiff-core/src/obj/mod.rs b/objdiff-core/src/obj/mod.rs index f3f18a20..743ea634 100644 --- a/objdiff-core/src/obj/mod.rs +++ b/objdiff-core/src/obj/mod.rs @@ -9,7 +9,10 @@ use alloc::{ vec, vec::Vec, }; -use core::{fmt, num::NonZeroU32}; +use core::{ + fmt, + num::{NonZeroU32, NonZeroU64}, +}; use flagset::{FlagSet, flags}; @@ -70,6 +73,7 @@ pub struct Section { pub kind: SectionKind, pub data: SectionData, pub flags: SectionFlagSet, + pub align: Option, pub relocations: Vec, /// Line number info (.line or .debug_line section) pub line_info: BTreeMap, @@ -363,6 +367,7 @@ static DUMMY_SECTION: Section = Section { kind: SectionKind::Unknown, data: SectionData(Vec::new()), flags: SectionFlagSet::empty(), + align: None, relocations: Vec::new(), line_info: BTreeMap::new(), virtual_address: None, diff --git a/objdiff-core/src/obj/read.rs b/objdiff-core/src/obj/read.rs index 8a4079ac..951b7bc9 100644 --- a/objdiff-core/src/obj/read.rs +++ b/objdiff-core/src/obj/read.rs @@ -4,7 +4,7 @@ use alloc::{ string::{String, ToString}, vec::Vec, }; -use core::cmp::Ordering; +use core::{cmp::Ordering, num::NonZeroU64}; use anyhow::{Context, Result, anyhow, bail, ensure}; use object::{Object as _, ObjectSection as _, ObjectSymbol as _}; @@ -257,6 +257,7 @@ fn map_sections( kind, data: SectionData(data), flags: Default::default(), + align: NonZeroU64::new(section.align()), relocations: Default::default(), virtual_address, line_info: Default::default(), diff --git a/objdiff-core/src/obj/snapshots/objdiff_core__obj__read__test__combine_sections.snap b/objdiff-core/src/obj/snapshots/objdiff_core__obj__read__test__combine_sections.snap index 5a8bfae9..383823de 100644 --- a/objdiff-core/src/obj/snapshots/objdiff_core__obj__read__test__combine_sections.snap +++ b/objdiff-core/src/obj/snapshots/objdiff_core__obj__read__test__combine_sections.snap @@ -14,6 +14,7 @@ expression: "(sections, symbols)" 8, ), flags: FlagSet(), + align: None, relocations: [ Relocation { flags: Elf( @@ -53,6 +54,7 @@ expression: "(sections, symbols)" 12, ), flags: FlagSet(Combined), + align: None, relocations: [ Relocation { flags: Elf( @@ -87,6 +89,7 @@ expression: "(sections, symbols)" 0, ), flags: FlagSet(Hidden), + align: None, relocations: [], line_info: {}, virtual_address: None, @@ -101,6 +104,7 @@ expression: "(sections, symbols)" 0, ), flags: FlagSet(Hidden), + align: None, relocations: [], line_info: {}, virtual_address: None, diff --git a/objdiff-core/tests/snapshots/arch_arm__read_arm.snap b/objdiff-core/tests/snapshots/arch_arm__read_arm.snap index b733dc73..ec9917a0 100644 --- a/objdiff-core/tests/snapshots/arch_arm__read_arm.snap +++ b/objdiff-core/tests/snapshots/arch_arm__read_arm.snap @@ -1519,6 +1519,9 @@ Object { 556, ), flags: FlagSet(), + align: Some( + 1, + ), relocations: [ Relocation { flags: Elf( @@ -1718,6 +1721,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -1732,6 +1738,9 @@ Object { 76, ), flags: FlagSet(), + align: Some( + 1, + ), relocations: [ Relocation { flags: Elf( @@ -1883,6 +1892,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -1897,6 +1909,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -1911,6 +1926,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 1, + ), relocations: [], line_info: {}, virtual_address: None, @@ -1925,6 +1943,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 1, + ), relocations: [], line_info: {}, virtual_address: None, diff --git a/objdiff-core/tests/snapshots/arch_arm__read_thumb.snap b/objdiff-core/tests/snapshots/arch_arm__read_thumb.snap index f68b3ff5..94eb2105 100644 --- a/objdiff-core/tests/snapshots/arch_arm__read_thumb.snap +++ b/objdiff-core/tests/snapshots/arch_arm__read_thumb.snap @@ -3449,6 +3449,7 @@ Object { 0, ), flags: FlagSet(), + align: None, relocations: [], line_info: {}, virtual_address: None, @@ -3463,6 +3464,7 @@ Object { 0, ), flags: FlagSet(), + align: None, relocations: [], line_info: {}, virtual_address: None, @@ -3477,6 +3479,7 @@ Object { 0, ), flags: FlagSet(), + align: None, relocations: [], line_info: {}, virtual_address: None, @@ -3491,6 +3494,7 @@ Object { 0, ), flags: FlagSet(), + align: None, relocations: [], line_info: {}, virtual_address: None, @@ -3505,6 +3509,7 @@ Object { 0, ), flags: FlagSet(), + align: None, relocations: [], line_info: {}, virtual_address: None, @@ -3519,6 +3524,7 @@ Object { 0, ), flags: FlagSet(), + align: None, relocations: [], line_info: {}, virtual_address: None, @@ -3533,6 +3539,7 @@ Object { 0, ), flags: FlagSet(), + align: None, relocations: [], line_info: {}, virtual_address: None, @@ -3547,6 +3554,7 @@ Object { 0, ), flags: FlagSet(), + align: None, relocations: [], line_info: {}, virtual_address: None, @@ -3561,6 +3569,7 @@ Object { 0, ), flags: FlagSet(), + align: None, relocations: [], line_info: {}, virtual_address: None, @@ -3575,6 +3584,7 @@ Object { 0, ), flags: FlagSet(), + align: None, relocations: [], line_info: {}, virtual_address: None, @@ -3589,6 +3599,7 @@ Object { 0, ), flags: FlagSet(), + align: None, relocations: [], line_info: {}, virtual_address: None, @@ -3603,6 +3614,7 @@ Object { 0, ), flags: FlagSet(), + align: None, relocations: [], line_info: {}, virtual_address: None, @@ -3617,6 +3629,7 @@ Object { 0, ), flags: FlagSet(), + align: None, relocations: [], line_info: {}, virtual_address: None, @@ -3631,6 +3644,7 @@ Object { 0, ), flags: FlagSet(), + align: None, relocations: [], line_info: {}, virtual_address: None, @@ -3645,6 +3659,7 @@ Object { 0, ), flags: FlagSet(), + align: None, relocations: [], line_info: {}, virtual_address: None, @@ -3659,6 +3674,7 @@ Object { 0, ), flags: FlagSet(), + align: None, relocations: [], line_info: {}, virtual_address: None, @@ -3673,6 +3689,7 @@ Object { 0, ), flags: FlagSet(), + align: None, relocations: [], line_info: {}, virtual_address: None, @@ -3687,6 +3704,9 @@ Object { 244, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [ Relocation { flags: Elf( @@ -3797,6 +3817,7 @@ Object { 0, ), flags: FlagSet(), + align: None, relocations: [], line_info: {}, virtual_address: None, diff --git a/objdiff-core/tests/snapshots/arch_mips__read_mips.snap b/objdiff-core/tests/snapshots/arch_mips__read_mips.snap index dd2b6818..b24dd19f 100644 --- a/objdiff-core/tests/snapshots/arch_mips__read_mips.snap +++ b/objdiff-core/tests/snapshots/arch_mips__read_mips.snap @@ -683,6 +683,9 @@ Object { 632, ), flags: FlagSet(), + align: Some( + 8, + ), relocations: [ Relocation { flags: Elf( @@ -1306,6 +1309,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -1320,6 +1326,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 1, + ), relocations: [], line_info: {}, virtual_address: None, @@ -1334,6 +1343,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 1, + ), relocations: [], line_info: {}, virtual_address: None, @@ -1348,6 +1360,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -1362,6 +1377,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -1376,6 +1394,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 1, + ), relocations: [], line_info: {}, virtual_address: None, @@ -1390,6 +1411,9 @@ Object { 43, ), flags: FlagSet(), + align: Some( + 8, + ), relocations: [], line_info: {}, virtual_address: None, @@ -1404,6 +1428,9 @@ Object { 76, ), flags: FlagSet(), + align: Some( + 8, + ), relocations: [], line_info: {}, virtual_address: None, @@ -1418,6 +1445,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -1432,6 +1462,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 1, + ), relocations: [], line_info: {}, virtual_address: None, @@ -1446,6 +1479,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 1, + ), relocations: [], line_info: {}, virtual_address: None, diff --git a/objdiff-core/tests/snapshots/arch_ppc__read_extab.snap b/objdiff-core/tests/snapshots/arch_ppc__read_extab.snap index 24c119b4..0753fd77 100644 --- a/objdiff-core/tests/snapshots/arch_ppc__read_extab.snap +++ b/objdiff-core/tests/snapshots/arch_ppc__read_extab.snap @@ -317,6 +317,9 @@ Object { 552, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [ Relocation { flags: Elf( @@ -340,6 +343,9 @@ Object { 40, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [ Relocation { flags: Elf( @@ -363,6 +369,9 @@ Object { 36, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [ Relocation { flags: Elf( @@ -426,6 +435,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -440,6 +452,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -454,6 +469,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -468,6 +486,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -482,6 +503,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 1, + ), relocations: [], line_info: {}, virtual_address: None, @@ -496,6 +520,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 1, + ), relocations: [], line_info: {}, virtual_address: None, @@ -510,6 +537,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 1, + ), relocations: [], line_info: {}, virtual_address: None, diff --git a/objdiff-core/tests/snapshots/arch_ppc__read_ppc.snap b/objdiff-core/tests/snapshots/arch_ppc__read_ppc.snap index 93672876..6c73593d 100644 --- a/objdiff-core/tests/snapshots/arch_ppc__read_ppc.snap +++ b/objdiff-core/tests/snapshots/arch_ppc__read_ppc.snap @@ -1,6 +1,5 @@ --- source: objdiff-core/tests/arch_ppc.rs -assertion_line: 14 expression: obj --- Object { @@ -167,6 +166,9 @@ Object { 284, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [ Relocation { flags: Elf( @@ -392,6 +394,9 @@ Object { 4, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [ Relocation { flags: Elf( @@ -417,6 +422,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 8, + ), relocations: [], line_info: {}, virtual_address: Some( @@ -433,6 +441,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -447,6 +458,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -461,6 +475,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -475,6 +492,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 1, + ), relocations: [], line_info: {}, virtual_address: None, @@ -489,6 +509,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 1, + ), relocations: [], line_info: {}, virtual_address: None, @@ -503,6 +526,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 1, + ), relocations: [], line_info: {}, virtual_address: None, @@ -517,6 +543,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, diff --git a/objdiff-core/tests/snapshots/arch_x86__read_x86.snap b/objdiff-core/tests/snapshots/arch_x86__read_x86.snap index 74c6f360..dfba4557 100644 --- a/objdiff-core/tests/snapshots/arch_x86__read_x86.snap +++ b/objdiff-core/tests/snapshots/arch_x86__read_x86.snap @@ -136,6 +136,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 1, + ), relocations: [], line_info: {}, virtual_address: None, @@ -150,6 +153,9 @@ Object { 10, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [ Relocation { flags: Coff( @@ -173,6 +179,9 @@ Object { 18, ), flags: FlagSet(), + align: Some( + 16, + ), relocations: [ Relocation { flags: Coff( diff --git a/objdiff-core/tests/snapshots/arch_x86__read_x86_64.snap b/objdiff-core/tests/snapshots/arch_x86__read_x86_64.snap index b3bdf8b5..3c684df5 100644 --- a/objdiff-core/tests/snapshots/arch_x86__read_x86_64.snap +++ b/objdiff-core/tests/snapshots/arch_x86__read_x86_64.snap @@ -866,6 +866,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 1, + ), relocations: [], line_info: {}, virtual_address: None, @@ -880,6 +883,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 1, + ), relocations: [], line_info: {}, virtual_address: None, @@ -894,6 +900,9 @@ Object { 429, ), flags: FlagSet(), + align: Some( + 16, + ), relocations: [ Relocation { flags: Coff( @@ -1029,6 +1038,9 @@ Object { 141, ), flags: FlagSet(), + align: Some( + 16, + ), relocations: [], line_info: {}, virtual_address: None, @@ -1043,6 +1055,9 @@ Object { 87, ), flags: FlagSet(), + align: Some( + 16, + ), relocations: [], line_info: {}, virtual_address: None, @@ -1057,6 +1072,9 @@ Object { 105, ), flags: FlagSet(), + align: Some( + 16, + ), relocations: [], line_info: {}, virtual_address: None, @@ -1071,6 +1089,9 @@ Object { 82, ), flags: FlagSet(), + align: Some( + 16, + ), relocations: [], line_info: {}, virtual_address: None, @@ -1085,6 +1106,9 @@ Object { 8, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -1099,6 +1123,9 @@ Object { 12, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [ Relocation { flags: Coff( @@ -1138,6 +1165,9 @@ Object { 8, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -1152,6 +1182,9 @@ Object { 12, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [ Relocation { flags: Coff( @@ -1191,6 +1224,9 @@ Object { 8, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -1205,6 +1241,9 @@ Object { 12, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [ Relocation { flags: Coff( @@ -1244,6 +1283,9 @@ Object { 8, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -1258,6 +1300,9 @@ Object { 12, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [ Relocation { flags: Coff( @@ -1297,6 +1342,9 @@ Object { 256, ), flags: FlagSet(), + align: Some( + 16, + ), relocations: [ Relocation { flags: Coff( @@ -1344,6 +1392,9 @@ Object { 20, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [ Relocation { flags: Coff( @@ -1367,6 +1418,9 @@ Object { 12, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [ Relocation { flags: Coff( @@ -1406,6 +1460,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -1420,6 +1477,9 @@ Object { 8, ), flags: FlagSet(), + align: Some( + 8, + ), relocations: [ Relocation { flags: Coff( @@ -1443,6 +1503,9 @@ Object { 8, ), flags: FlagSet(), + align: Some( + 8, + ), relocations: [ Relocation { flags: Coff( @@ -1466,6 +1529,9 @@ Object { 4, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -1480,6 +1546,9 @@ Object { 4, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -1494,6 +1563,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 16, + ), relocations: [], line_info: {}, virtual_address: None, diff --git a/objdiff-core/tests/snapshots/arch_x86__read_x86_combine_sections.snap b/objdiff-core/tests/snapshots/arch_x86__read_x86_combine_sections.snap index 5ad22232..63ef57a9 100644 --- a/objdiff-core/tests/snapshots/arch_x86__read_x86_combine_sections.snap +++ b/objdiff-core/tests/snapshots/arch_x86__read_x86_combine_sections.snap @@ -1,6 +1,5 @@ --- source: objdiff-core/tests/arch_x86.rs -assertion_line: 27 expression: obj.sections --- [ @@ -14,6 +13,9 @@ expression: obj.sections 0, ), flags: FlagSet(), + align: Some( + 1, + ), relocations: [], line_info: {}, virtual_address: None, @@ -28,6 +30,9 @@ expression: obj.sections 0, ), flags: FlagSet(), + align: Some( + 1, + ), relocations: [], line_info: {}, virtual_address: None, @@ -42,6 +47,9 @@ expression: obj.sections 0, ), flags: FlagSet(Hidden), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -56,6 +64,9 @@ expression: obj.sections 0, ), flags: FlagSet(Hidden), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -70,6 +81,9 @@ expression: obj.sections 0, ), flags: FlagSet(Hidden), + align: Some( + 16, + ), relocations: [], line_info: {}, virtual_address: None, @@ -84,6 +98,9 @@ expression: obj.sections 56, ), flags: FlagSet(Combined), + align: Some( + 4, + ), relocations: [ Relocation { flags: Coff( @@ -139,6 +156,9 @@ expression: obj.sections 304, ), flags: FlagSet(Combined), + align: Some( + 4, + ), relocations: [ Relocation { flags: Coff( @@ -410,6 +430,9 @@ expression: obj.sections 0, ), flags: FlagSet(Hidden), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -424,6 +447,9 @@ expression: obj.sections 0, ), flags: FlagSet(Hidden), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -438,6 +464,9 @@ expression: obj.sections 0, ), flags: FlagSet(Hidden), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -452,6 +481,9 @@ expression: obj.sections 0, ), flags: FlagSet(Hidden), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -466,6 +498,9 @@ expression: obj.sections 0, ), flags: FlagSet(Hidden), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -480,6 +515,9 @@ expression: obj.sections 0, ), flags: FlagSet(Hidden), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -494,6 +532,9 @@ expression: obj.sections 0, ), flags: FlagSet(Hidden), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -508,6 +549,9 @@ expression: obj.sections 0, ), flags: FlagSet(Hidden), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -522,6 +566,9 @@ expression: obj.sections 0, ), flags: FlagSet(Hidden), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -536,6 +583,9 @@ expression: obj.sections 0, ), flags: FlagSet(Hidden), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -550,6 +600,9 @@ expression: obj.sections 0, ), flags: FlagSet(Hidden), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -564,6 +617,9 @@ expression: obj.sections 0, ), flags: FlagSet(Hidden), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -578,6 +634,9 @@ expression: obj.sections 0, ), flags: FlagSet(Hidden), + align: Some( + 1, + ), relocations: [], line_info: {}, virtual_address: None, @@ -592,6 +651,9 @@ expression: obj.sections 0, ), flags: FlagSet(Hidden), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -606,6 +668,9 @@ expression: obj.sections 0, ), flags: FlagSet(Hidden), + align: Some( + 16, + ), relocations: [], line_info: {}, virtual_address: None, @@ -620,6 +685,9 @@ expression: obj.sections 0, ), flags: FlagSet(Hidden), + align: Some( + 16, + ), relocations: [], line_info: {}, virtual_address: None, @@ -634,6 +702,9 @@ expression: obj.sections 0, ), flags: FlagSet(Hidden), + align: Some( + 16, + ), relocations: [], line_info: {}, virtual_address: None, @@ -648,6 +719,9 @@ expression: obj.sections 0, ), flags: FlagSet(Hidden), + align: Some( + 16, + ), relocations: [], line_info: {}, virtual_address: None, @@ -662,6 +736,9 @@ expression: obj.sections 0, ), flags: FlagSet(Hidden), + align: Some( + 16, + ), relocations: [], line_info: {}, virtual_address: None, @@ -676,6 +753,9 @@ expression: obj.sections 280, ), flags: FlagSet(Combined), + align: Some( + 16, + ), relocations: [ Relocation { flags: Coff( @@ -827,6 +907,9 @@ expression: obj.sections 0, ), flags: FlagSet(Hidden), + align: Some( + 16, + ), relocations: [], line_info: {}, virtual_address: None, @@ -841,6 +924,9 @@ expression: obj.sections 0, ), flags: FlagSet(Hidden), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -855,6 +941,9 @@ expression: obj.sections 0, ), flags: FlagSet(Hidden), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -869,6 +958,9 @@ expression: obj.sections 0, ), flags: FlagSet(Hidden), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -883,6 +975,9 @@ expression: obj.sections 0, ), flags: FlagSet(Hidden), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -897,6 +992,9 @@ expression: obj.sections 0, ), flags: FlagSet(Hidden), + align: Some( + 4, + ), relocations: [], line_info: {}, virtual_address: None, @@ -911,6 +1009,9 @@ expression: obj.sections 4, ), flags: FlagSet(), + align: Some( + 4, + ), relocations: [ Relocation { flags: Coff( @@ -934,6 +1035,9 @@ expression: obj.sections 0, ), flags: FlagSet(), + align: Some( + 16, + ), relocations: [], line_info: {}, virtual_address: None, diff --git a/objdiff-core/tests/snapshots/arch_x86__read_x86_jumptable.snap b/objdiff-core/tests/snapshots/arch_x86__read_x86_jumptable.snap index 7ca527bd..c77cc991 100644 --- a/objdiff-core/tests/snapshots/arch_x86__read_x86_jumptable.snap +++ b/objdiff-core/tests/snapshots/arch_x86__read_x86_jumptable.snap @@ -201,6 +201,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 1, + ), relocations: [], line_info: {}, virtual_address: None, @@ -215,6 +218,9 @@ Object { 96, ), flags: FlagSet(), + align: Some( + 16, + ), relocations: [ Relocation { flags: Coff( @@ -294,6 +300,9 @@ Object { 0, ), flags: FlagSet(), + align: Some( + 1, + ), relocations: [], line_info: {}, virtual_address: None, From 1007e24aea6eb009ca434d3d005e41eb5292b6a3 Mon Sep 17 00:00:00 2001 From: LagoLunatic Date: Sat, 26 Apr 2025 15:59:31 -0400 Subject: [PATCH 4/4] Combine data/text sections: Pad sections to more than 4-byte alignment if they have alignment specified --- objdiff-core/src/obj/mod.rs | 6 ++++ objdiff-core/src/obj/read.rs | 9 ++--- objdiff-core/src/util.rs | 8 ++--- .../arch_x86__read_x86_combine_sections.snap | 34 +++++++++---------- 4 files changed, 32 insertions(+), 25 deletions(-) diff --git a/objdiff-core/src/obj/mod.rs b/objdiff-core/src/obj/mod.rs index 743ea634..02a9e022 100644 --- a/objdiff-core/src/obj/mod.rs +++ b/objdiff-core/src/obj/mod.rs @@ -109,6 +109,12 @@ impl Section { } } + // The alignment to use when "Combine data/text sections" is enabled. + pub fn combined_alignment(&self) -> u64 { + const MIN_ALIGNMENT: u64 = 4; + self.align.map(|align| align.get().max(MIN_ALIGNMENT)).unwrap_or(MIN_ALIGNMENT) + } + pub fn relocation_at<'obj>( &'obj self, obj: &'obj Object, diff --git a/objdiff-core/src/obj/read.rs b/objdiff-core/src/obj/read.rs index 951b7bc9..5f748c4e 100644 --- a/objdiff-core/src/obj/read.rs +++ b/objdiff-core/src/obj/read.rs @@ -17,7 +17,7 @@ use crate::{ Symbol, SymbolFlag, SymbolKind, split_meta::{SPLITMETA_SECTION, SplitMeta}, }, - util::{align_data_slice_to_4, align_size_to_4, align_u64_to_4, read_u16, read_u32}, + util::{align_data_slice_to, align_u64_to, read_u16, read_u32}, }; fn map_section_kind(section: &object::Section) -> SectionKind { @@ -740,9 +740,10 @@ fn do_combine_sections( } offsets.push(current_offset); current_offset += section.size; - current_offset = align_u64_to_4(current_offset); + let align = section.combined_alignment(); + current_offset = align_u64_to(current_offset, align); data_size += section.data.len(); - data_size = align_size_to_4(data_size); + data_size = align_u64_to(data_size as u64, align) as usize; num_relocations += section.relocations.len(); } if data_size > 0 { @@ -757,7 +758,7 @@ fn do_combine_sections( let section = &mut sections[i]; section.size = 0; data.append(&mut section.data.0); - align_data_slice_to_4(&mut data); + align_data_slice_to(&mut data, section.combined_alignment()); section.relocations.iter_mut().for_each(|r| r.address += offset); relocations.append(&mut section.relocations); line_info.append(&mut section.line_info.iter().map(|(&a, &l)| (a + offset, l)).collect()); diff --git a/objdiff-core/src/util.rs b/objdiff-core/src/util.rs index dfce380f..f3dc6b79 100644 --- a/objdiff-core/src/util.rs +++ b/objdiff-core/src/util.rs @@ -42,8 +42,6 @@ pub fn read_u16(obj_file: &object::File, reader: &mut &[u8]) -> Result { pub fn align_size_to_4(size: usize) -> usize { (size + 3) & !3 } -pub fn align_u64_to_4(size: u64) -> u64 { (size + 3) & !3 } - #[cfg(feature = "std")] pub fn align_data_to_4( writer: &mut W, @@ -56,7 +54,9 @@ pub fn align_data_to_4( Ok(()) } -pub fn align_data_slice_to_4(data: &mut Vec) { +pub fn align_u64_to(len: u64, align: u64) -> u64 { len + ((align - (len % align)) % align) } + +pub fn align_data_slice_to(data: &mut Vec, align: u64) { const ALIGN_BYTE: u8 = 0; - data.resize(align_size_to_4(data.len()), ALIGN_BYTE); + data.resize(align_u64_to(data.len() as u64, align) as usize, ALIGN_BYTE); } diff --git a/objdiff-core/tests/snapshots/arch_x86__read_x86_combine_sections.snap b/objdiff-core/tests/snapshots/arch_x86__read_x86_combine_sections.snap index 63ef57a9..2b094340 100644 --- a/objdiff-core/tests/snapshots/arch_x86__read_x86_combine_sections.snap +++ b/objdiff-core/tests/snapshots/arch_x86__read_x86_combine_sections.snap @@ -747,10 +747,10 @@ expression: obj.sections id: ".text-combined", name: ".text", address: 0, - size: 280, + size: 320, kind: Code, data: SectionData( - 280, + 320, ), flags: FlagSet(Combined), align: Some( @@ -777,7 +777,7 @@ expression: obj.sections flags: Coff( 20, ), - address: 31, + address: 43, target_symbol: 60, addend: 0, }, @@ -785,7 +785,7 @@ expression: obj.sections flags: Coff( 20, ), - address: 50, + address: 62, target_symbol: 52, addend: 0, }, @@ -793,7 +793,7 @@ expression: obj.sections flags: Coff( 20, ), - address: 72, + address: 84, target_symbol: 11, addend: 0, }, @@ -801,7 +801,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 88, + address: 100, target_symbol: 64, addend: 0, }, @@ -809,7 +809,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 108, + address: 124, target_symbol: 66, addend: 0, }, @@ -817,7 +817,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 128, + address: 156, target_symbol: 6, addend: 0, }, @@ -825,7 +825,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 138, + address: 166, target_symbol: 8, addend: 0, }, @@ -833,7 +833,7 @@ expression: obj.sections flags: Coff( 20, ), - address: 149, + address: 177, target_symbol: 57, addend: 0, }, @@ -841,7 +841,7 @@ expression: obj.sections flags: Coff( 20, ), - address: 157, + address: 185, target_symbol: 54, addend: 0, }, @@ -849,7 +849,7 @@ expression: obj.sections flags: Coff( 20, ), - address: 179, + address: 219, target_symbol: 54, addend: 0, }, @@ -857,7 +857,7 @@ expression: obj.sections flags: Coff( 20, ), - address: 198, + address: 238, target_symbol: 52, addend: 0, }, @@ -865,7 +865,7 @@ expression: obj.sections flags: Coff( 20, ), - address: 227, + address: 267, target_symbol: 57, addend: 0, }, @@ -873,7 +873,7 @@ expression: obj.sections flags: Coff( 20, ), - address: 246, + address: 286, target_symbol: 52, addend: 0, }, @@ -881,7 +881,7 @@ expression: obj.sections flags: Coff( 6, ), - address: 268, + address: 308, target_symbol: 68, addend: 0, }, @@ -889,7 +889,7 @@ expression: obj.sections flags: Coff( 20, ), - address: 273, + address: 313, target_symbol: 60, addend: 0, },