From 83f681e6c81e6e657f312793d95db6ca810682f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Miku=C5=82a?= Date: Sat, 1 Nov 2025 13:28:38 +0100 Subject: [PATCH 1/3] feat: add `__executable_start` --- libwild/src/elf_writer.rs | 4 ++++ libwild/src/output_section_id.rs | 2 ++ 2 files changed, 6 insertions(+) diff --git a/libwild/src/elf_writer.rs b/libwild/src/elf_writer.rs index 5f592b83..9b061459 100644 --- a/libwild/src/elf_writer.rs +++ b/libwild/src/elf_writer.rs @@ -58,6 +58,7 @@ use crate::layout::SymbolCopyInfo; use crate::layout::VersionDef; use crate::layout::compute_allocations; use crate::output_section_id; +use crate::output_section_id::EXECUTABLE_START; use crate::output_section_id::OrderEvent; use crate::output_section_id::OutputOrder; use crate::output_section_id::OutputSectionId; @@ -3124,6 +3125,9 @@ fn write_internal_symbols( // __global_pointer$ = MIN(__SDATA_BEGIN__ + 0x800, MAX(__DATA_BEGIN__ + 0x800, __BSS_END__ - 0x800)); if symbol_name.bytes() == GLOBAL_POINTER_SYMBOL_NAME.as_bytes() { address += RISCV_TLS_DTV_OFFSET; + } else if symbol_name.bytes() == EXECUTABLE_START.as_bytes() { + let text_layout = layout.section_layouts.get(output_section_id::TEXT); + address = text_layout.mem_offset; } let entry = symbol_writer diff --git a/libwild/src/output_section_id.rs b/libwild/src/output_section_id.rs index 9d73d8bb..44fbb251 100644 --- a/libwild/src/output_section_id.rs +++ b/libwild/src/output_section_id.rs @@ -399,6 +399,7 @@ const DEFAULT_DEFS: BuiltInSectionDetails = BuiltInSectionDetails { target_segment_type: None, }; +pub(crate) const EXECUTABLE_START: &str = "__executable_start"; const SECTION_DEFINITIONS: [BuiltInSectionDetails; NUM_BUILT_IN_SECTIONS] = [ // A section into which we write headers. BuiltInSectionDetails { @@ -636,6 +637,7 @@ const SECTION_DEFINITIONS: [BuiltInSectionDetails; NUM_BUILT_IN_SECTIONS] = [ kind: SectionKind::Primary(SectionName(TEXT_SECTION_NAME)), ty: sht::PROGBITS, section_flags: shf::ALLOC.with(shf::EXECINSTR), + start_symbol_name: Some(EXECUTABLE_START), ..DEFAULT_DEFS }, BuiltInSectionDetails { From e3b33e07c105200e6422bffced720b2a879c8b4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Miku=C5=82a?= Date: Mon, 3 Nov 2025 12:23:39 +0100 Subject: [PATCH 2/3] move it to the right section --- libwild/src/output_section_id.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libwild/src/output_section_id.rs b/libwild/src/output_section_id.rs index 44fbb251..df341973 100644 --- a/libwild/src/output_section_id.rs +++ b/libwild/src/output_section_id.rs @@ -521,6 +521,7 @@ const SECTION_DEFINITIONS: [BuiltInSectionDetails; NUM_BUILT_IN_SECTIONS] = [ ty: sht::PROGBITS, section_flags: shf::ALLOC, target_segment_type: Some(pt::INTERP), + start_symbol_name: Some(EXECUTABLE_START), ..DEFAULT_DEFS }, BuiltInSectionDetails { @@ -637,7 +638,6 @@ const SECTION_DEFINITIONS: [BuiltInSectionDetails; NUM_BUILT_IN_SECTIONS] = [ kind: SectionKind::Primary(SectionName(TEXT_SECTION_NAME)), ty: sht::PROGBITS, section_flags: shf::ALLOC.with(shf::EXECINSTR), - start_symbol_name: Some(EXECUTABLE_START), ..DEFAULT_DEFS }, BuiltInSectionDetails { From ea7eeb66feb520366453f4cf92294141fe413167 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Miku=C5=82a?= Date: Mon, 3 Nov 2025 12:23:39 +0100 Subject: [PATCH 3/3] create more symbols --- libwild/src/elf_writer.rs | 4 ---- libwild/src/output_section_id.rs | 6 +++--- libwild/src/parsing.rs | 9 +++++++++ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/libwild/src/elf_writer.rs b/libwild/src/elf_writer.rs index 9b061459..5f592b83 100644 --- a/libwild/src/elf_writer.rs +++ b/libwild/src/elf_writer.rs @@ -58,7 +58,6 @@ use crate::layout::SymbolCopyInfo; use crate::layout::VersionDef; use crate::layout::compute_allocations; use crate::output_section_id; -use crate::output_section_id::EXECUTABLE_START; use crate::output_section_id::OrderEvent; use crate::output_section_id::OutputOrder; use crate::output_section_id::OutputSectionId; @@ -3125,9 +3124,6 @@ fn write_internal_symbols( // __global_pointer$ = MIN(__SDATA_BEGIN__ + 0x800, MAX(__DATA_BEGIN__ + 0x800, __BSS_END__ - 0x800)); if symbol_name.bytes() == GLOBAL_POINTER_SYMBOL_NAME.as_bytes() { address += RISCV_TLS_DTV_OFFSET; - } else if symbol_name.bytes() == EXECUTABLE_START.as_bytes() { - let text_layout = layout.section_layouts.get(output_section_id::TEXT); - address = text_layout.mem_offset; } let entry = symbol_writer diff --git a/libwild/src/output_section_id.rs b/libwild/src/output_section_id.rs index df341973..84b71851 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, @@ -399,13 +401,12 @@ const DEFAULT_DEFS: BuiltInSectionDetails = BuiltInSectionDetails { target_segment_type: None, }; -pub(crate) const EXECUTABLE_START: &str = "__executable_start"; const SECTION_DEFINITIONS: [BuiltInSectionDetails; NUM_BUILT_IN_SECTIONS] = [ // A section into which we write headers. 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 }, @@ -521,7 +522,6 @@ const SECTION_DEFINITIONS: [BuiltInSectionDetails; NUM_BUILT_IN_SECTIONS] = [ ty: sht::PROGBITS, section_flags: shf::ALLOC, target_segment_type: Some(pt::INTERP), - start_symbol_name: Some(EXECUTABLE_START), ..DEFAULT_DEFS }, BuiltInSectionDetails { diff --git a/libwild/src/parsing.rs b/libwild/src/parsing.rs index 8e0cc1f5..9088f2d9 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