Match original "exec" for REL sections

mwld writes empty code sections as
NULL type in the PLF, but sometimes
the original REL has the exec flag
set for these sections. Match the
original value.
This commit is contained in:
Luke Street 2024-06-10 17:39:40 -06:00
parent 3841004947
commit 761a940f9e
2 changed files with 15 additions and 7 deletions

View File

@ -346,8 +346,11 @@ fn make(args: MakeArgs) -> Result<()> {
section_count: None,
quiet: args.no_warn,
section_align: None,
section_exec: None,
};
if let Some((header, _, section_defs)) = existing_headers.get(&(module_id as u32)) {
if let Some((header, section_headers, section_defs)) =
existing_headers.get(&(module_id as u32))
{
info.version = header.version;
info.name_offset = Some(header.name_offset);
info.name_size = Some(header.name_size);
@ -358,6 +361,7 @@ fn make(args: MakeArgs) -> Result<()> {
.as_ref()
.map(|defs| defs.iter().map(|def| def.align).collect())
.unwrap_or_default();
info.section_exec = Some(section_headers.iter().map(|s| s.exec()).collect());
}
let rel_path = path.with_extension("rel");
let mut w = buf_writer(&rel_path)?;

View File

@ -688,6 +688,10 @@ pub struct RelWriteInfo {
pub quiet: bool,
/// Override individual section alignment in the file.
pub section_align: Option<Vec<u32>>,
/// Override individual section executable status in the file.
/// This is used to match empty sections: mwld will emit them with
/// NULL type, but the original REL may have them marked executable.
pub section_exec: Option<Vec<bool>>,
}
pub const PERMITTED_SECTIONS: [&str; 7] =
@ -1006,12 +1010,12 @@ where
offset = current_data_offset;
current_data_offset += section.size() as u32;
}
RelSectionHeader::new(
offset,
section.size() as u32,
section.kind() == object::SectionKind::Text,
)
.to_writer(w, Endian::Big)?;
let exec = info
.section_exec
.as_ref()
.and_then(|m| m.get(section_index as usize).copied())
.unwrap_or(section.kind() == object::SectionKind::Text);
RelSectionHeader::new(offset, section.size() as u32, exec).to_writer(w, Endian::Big)?;
permitted_section_idx += 1;
} else {
RelSectionHeader::new(0, 0, false).to_writer(w, Endian::Big)?;