diff --git a/src/obj/splits.rs b/src/obj/splits.rs index 147255a..89c2be5 100644 --- a/src/obj/splits.rs +++ b/src/obj/splits.rs @@ -5,7 +5,7 @@ use itertools::Itertools; use crate::{ obj::{ObjInfo, ObjSection, SectionIndex}, - util::{nested::NestedVec, split::default_section_align}, + util::split::default_section_align, }; /// Marks a split point within a section. @@ -107,7 +107,9 @@ impl ObjSplits { } pub fn push(&mut self, address: u32, split: ObjSplit) { - self.splits.nested_push(address, split); + let out = self.splits.entry(address).or_default(); + out.push(split); + out.sort_by_key(|s| s.end); } pub fn remove(&mut self, address: u32) -> Option> { self.splits.remove(&address) } diff --git a/src/util/split.rs b/src/util/split.rs index b6d9cfd..b34cc12 100644 --- a/src/util/split.rs +++ b/src/util/split.rs @@ -530,8 +530,9 @@ fn validate_splits(obj: &ObjInfo) -> Result<()> { /// Add padding symbols to fill in gaps between splits and symbols. fn add_padding_symbols(obj: &mut ObjInfo) -> Result<()> { - for (section_index, section, addr, _split) in obj.sections.all_splits() { - if section.name == ".ctors" || section.name == ".dtors" { + let mut splits = obj.sections.all_splits().peekable(); + while let Some((section_index, section, addr, split)) = splits.next() { + if section.name == ".ctors" || section.name == ".dtors" || addr == split.end { continue; } @@ -545,19 +546,31 @@ fn add_padding_symbols(obj: &mut ObjInfo) -> Result<()> { })? .is_none() { + let next_split_address = splits + .peek() + .map(|(_, _, addr, _)| *addr as u64) + .unwrap_or(section.address + section.size); let next_symbol_address = obj .symbols - .for_section_range(section_index, addr + 1..) + .for_section_range(section_index, addr + 1..next_split_address as u32) .find(|&(_, s)| s.size_known && s.size > 0) .map(|(_, s)| s.address) - .unwrap_or(section.address + section.size); + .unwrap_or(next_split_address); + if next_symbol_address <= addr as u64 { + continue; + } let symbol_name = format!( "pad_{:02}_{:08X}_{}", section_index, addr, section.name.trim_start_matches('.') ); - log::debug!("Adding padding symbol {} at {:#010X}", symbol_name, addr); + log::debug!( + "Adding padding symbol {} at {:#010X}-{:#010X}", + symbol_name, + addr, + next_symbol_address + ); obj.symbols.add_direct(ObjSymbol { name: symbol_name, address: addr as u64,