From 8b36fa4fc657d9edf767797af9d394bb32898711 Mon Sep 17 00:00:00 2001 From: cadmic Date: Thu, 16 May 2024 17:29:24 -0700 Subject: [PATCH] Fix size of .note.split section (#61) * Fix size of .note.split section * clippy fix --------- Co-authored-by: Luke Street --- objdiff-core/src/obj/split_meta.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/objdiff-core/src/obj/split_meta.rs b/objdiff-core/src/obj/split_meta.rs index 5a8b3c7..be056b5 100644 --- a/objdiff-core/src/obj/split_meta.rs +++ b/objdiff-core/src/obj/split_meta.rs @@ -87,12 +87,12 @@ impl SplitMeta { if let Some(generator) = &self.generator { write_note_header(writer, e, NT_SPLIT_GENERATOR, generator.len())?; writer.write_all(generator.as_bytes())?; - align_to_4(writer, generator.len())?; + align_data_to_4(writer, generator.len())?; } if let Some(module_name) = &self.module_name { write_note_header(writer, e, NT_SPLIT_MODULE_NAME, module_name.len())?; writer.write_all(module_name.as_bytes())?; - align_to_4(writer, module_name.len())?; + align_data_to_4(writer, module_name.len())?; } if let Some(module_id) = self.module_id { write_note_header(writer, e, NT_SPLIT_MODULE_ID, 4)?; @@ -119,15 +119,19 @@ impl SplitMeta { let mut size = 0; if let Some(generator) = self.generator.as_deref() { size += NOTE_HEADER_SIZE + generator.len(); + size = align_size_to_4(size); } if let Some(module_name) = self.module_name.as_deref() { size += NOTE_HEADER_SIZE + module_name.len(); + size = align_size_to_4(size); } if self.module_id.is_some() { size += NOTE_HEADER_SIZE + 4; + size = align_size_to_4(size); } if let Some(virtual_addresses) = self.virtual_addresses.as_deref() { size += NOTE_HEADER_SIZE + if is_64 { 8 } else { 4 } * virtual_addresses.len(); + size = align_size_to_4(size); } size } @@ -186,7 +190,9 @@ where E: Endian } } -fn align_to_4(writer: &mut W, len: usize) -> io::Result<()> { +fn align_size_to_4(size: usize) -> usize { (size + 3) & !3 } + +fn align_data_to_4(writer: &mut W, len: usize) -> io::Result<()> { const ALIGN_BYTES: &[u8] = &[0; 4]; if len % 4 != 0 { writer.write_all(&ALIGN_BYTES[..4 - len % 4])?; @@ -212,6 +218,6 @@ where writer.write_all(&e.write_u32_bytes(kind))?; // Type writer.write_all(ELF_NOTE_SPLIT)?; // Name writer.write_all(&[0; 1])?; // Null terminator - align_to_4(writer, ELF_NOTE_SPLIT.len() + 1)?; + align_data_to_4(writer, ELF_NOTE_SPLIT.len() + 1)?; Ok(()) }