mirror of
https://github.com/Momoko-Ayase/Senbei.git
synced 2026-09-20 06:18:01 -04:00
fix(elf): relocate crowded program header tables
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user