fix(elf): relocate crowded program header tables

This commit is contained in:
y52
2026-09-18 19:36:03 +00:00
parent ba380a5774
commit 539861acbd
2 changed files with 372 additions and 36 deletions
+10 -3
View File
@@ -884,7 +884,9 @@ fn metadata_mapping_length(
Some(size) => size?,
None => 0,
};
let mut cursor = 0_u64;
let program_header_reservation = u64::try_from(layout.additional_program_header_reservation()?)
.map_err(|_| Error::Invalid("program-header reservation exceeds u64".to_owned()))?;
let mut cursor = program_header_reservation;
for (size, alignment) in [
(
new_symbol_count
@@ -1152,8 +1154,12 @@ fn materialize_static_elf_tables(
let mut capacity_end = metadata_capacity_end(layout, &indices, metadata_start)?;
if cursor > capacity_end {
let alignment = layout.load_alignment()?;
let program_header_reservation = layout.additional_program_header_reservation()?;
let extension_start = align_up(layout.private_section()?.offset, alignment)?;
let extension_end = table_end(&tables, extension_start)?;
let extension_metadata_start = extension_start
.checked_add(program_header_reservation as u64)
.ok_or_else(|| Error::Invalid("dynamic-table extension start overflow".to_owned()))?;
let extension_end = table_end(&tables, extension_metadata_start)?;
let extension_size = extension_end
.checked_sub(extension_start)
.ok_or_else(|| Error::Invalid("dynamic-table extension underflow".to_owned()))?;
@@ -1168,8 +1174,9 @@ fn materialize_static_elf_tables(
flags: PF_R,
alignment,
},
program_header_reservation,
)?;
metadata_start = extension_start;
metadata_start = extension_metadata_start;
(placements, cursor) = table_placements(&tables, metadata_start)?;
capacity_end = cursor;
}