Skip to content

Commit

Permalink
Match original "exec" for REL sections
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
encounter committed Jun 10, 2024
1 parent 3841004 commit 761a940
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 7 deletions.
6 changes: 5 additions & 1 deletion src/cmd/rel.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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)?;
Expand Down
16 changes: 10 additions & 6 deletions src/util/rel.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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] =
Expand Down Expand Up @@ -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)?;
Expand Down

0 comments on commit 761a940

Please sign in to comment.