Create gap symbols at the end of sections

Before, the end of the section
was not considered, so missing
symbols at the end of a section
would omit that data entirely.
This commit is contained in:
Luke Street 2024-06-10 17:40:39 -06:00
parent 761a940f9e
commit af3bcf5f9e
1 changed files with 24 additions and 9 deletions

View File

@ -591,16 +591,31 @@ fn add_padding_symbols(obj: &mut ObjInfo) -> Result<()> {
.for_section(section_index) .for_section(section_index)
.filter(|(_, s)| s.size_known && s.size > 0) .filter(|(_, s)| s.size_known && s.size > 0)
.peekable(); .peekable();
while let (Some((_, symbol)), Some(&(_, next_symbol))) = (iter.next(), iter.peek()) { while let Some((_, symbol)) = iter.next() {
// Common BSS is allowed to have gaps and overlaps to accurately match the common BSS inflation bug // Common BSS is allowed to have gaps and overlaps to accurately match the common BSS inflation bug
if matches!(common_bss, Some((idx, addr)) if if matches!(common_bss, Some((idx, addr)) if
section_index == idx && symbol.address as u32 >= addr) section_index == idx && symbol.address as u32 >= addr)
{ {
continue; continue;
} }
let aligned_end = let (next_name, next_address, next_end, next_align) =
align_up((symbol.address + symbol.size) as u32, next_symbol.align.unwrap_or(1)); if let Some(&(_, next_symbol)) = iter.peek() {
match aligned_end.cmp(&(next_symbol.address as u32)) { (
next_symbol.name.as_str(),
next_symbol.address,
next_symbol.address + next_symbol.size,
next_symbol.align.unwrap_or(1),
)
} else {
(
section.name.as_str(),
section.address + section.size,
section.address + section.size,
1,
)
};
let aligned_end = align_up((symbol.address + symbol.size) as u32, next_align);
match aligned_end.cmp(&(next_address as u32)) {
Ordering::Less => { Ordering::Less => {
let symbol_name = format!( let symbol_name = format!(
"gap_{:02}_{:08X}_{}", "gap_{:02}_{:08X}_{}",
@ -613,7 +628,7 @@ fn add_padding_symbols(obj: &mut ObjInfo) -> Result<()> {
name: symbol_name, name: symbol_name,
address: aligned_end as u64, address: aligned_end as u64,
section: Some(section_index), section: Some(section_index),
size: next_symbol.address - aligned_end as u64, size: next_address - aligned_end as u64,
size_known: true, size_known: true,
flags: ObjSymbolFlagSet( flags: ObjSymbolFlagSet(
ObjSymbolFlags::Global ObjSymbolFlags::Global
@ -637,10 +652,10 @@ fn add_padding_symbols(obj: &mut ObjInfo) -> Result<()> {
symbol.name, symbol.name,
symbol.address, symbol.address,
symbol.address + symbol.size, symbol.address + symbol.size,
next_symbol.name, next_name,
next_symbol.address, next_address,
next_symbol.address + next_symbol.size, next_end,
next_symbol.align.unwrap_or(1) next_align
); );
} }
} }