diff --git a/libwild/src/output_section_id.rs b/libwild/src/output_section_id.rs index 9d73d8bba..84b71851e 100644 --- a/libwild/src/output_section_id.rs +++ b/libwild/src/output_section_id.rs @@ -375,6 +375,7 @@ pub(crate) struct BuiltInSectionDetails { pub(crate) link: &'static [OutputSectionId], pub(crate) start_symbol_name: Option<&'static str>, pub(crate) end_symbol_name: Option<&'static str>, + pub(crate) synthetic_symbol_names: Option<&'static [&'static str]>, pub(crate) min_alignment: Alignment, info_fn: Option u32>, pub(crate) keep_if_empty: bool, @@ -390,6 +391,7 @@ const DEFAULT_DEFS: BuiltInSectionDetails = BuiltInSectionDetails { link: &[], start_symbol_name: None, end_symbol_name: None, + synthetic_symbol_names: None, min_alignment: alignment::MIN, info_fn: None, keep_if_empty: false, @@ -404,7 +406,7 @@ const SECTION_DEFINITIONS: [BuiltInSectionDetails; NUM_BUILT_IN_SECTIONS] = [ BuiltInSectionDetails { kind: SectionKind::Primary(SectionName(b"")), section_flags: shf::ALLOC, - start_symbol_name: Some("__ehdr_start"), + synthetic_symbol_names: Some(&["__ehdr_start", "__executable_start"]), keep_if_empty: true, ..DEFAULT_DEFS }, diff --git a/libwild/src/parsing.rs b/libwild/src/parsing.rs index 8e0cc1f57..9088f2d93 100644 --- a/libwild/src/parsing.rs +++ b/libwild/src/parsing.rs @@ -203,6 +203,15 @@ impl<'data> Prelude<'data> { name.as_bytes(), )); } + + if let Some(names) = def.synthetic_symbol_names { + for name in names { + symbol_definitions.push(InternalSymDefInfo::notype( + SymbolPlacement::SectionStart(section_id), + name.as_bytes(), + )); + } + } } // We define _TLS_MODULE_BASE_ either at the start or end of the TLS segment, depending on