From 9919cbf66ed2da67865e6b411b1f5798de5f35d7 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Fri, 26 Jun 2026 01:51:21 +0300 Subject: [PATCH] Kernel: Pass interpreter base address in auxiliary vector --- kernel/include/kernel/ELF.h | 2 +- kernel/kernel/ELF.cpp | 4 +++- kernel/kernel/Process.cpp | 16 ++++++++++++---- .../LibELF/include/LibELF/AuxiliaryVector.h | 2 ++ 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/kernel/include/kernel/ELF.h b/kernel/include/kernel/ELF.h index 854226cc..5cbd5bbf 100644 --- a/kernel/include/kernel/ELF.h +++ b/kernel/include/kernel/ELF.h @@ -14,8 +14,8 @@ namespace Kernel::ELF size_t size; }; - bool open_execfd; vaddr_t entry_point; + BAN::Optional interp_base; BAN::Optional master_tls; BAN::Vector> regions; }; diff --git a/kernel/kernel/ELF.cpp b/kernel/kernel/ELF.cpp index c2ccecd2..252866c6 100644 --- a/kernel/kernel/ELF.cpp +++ b/kernel/kernel/ELF.cpp @@ -291,7 +291,9 @@ namespace Kernel::ELF TRY(memory_regions.emplace_back(BAN::move(region))); } - result.open_execfd = !interpreter.empty(); + if (!interpreter.empty()) + result.interp_base = load_base_vaddr; + result.entry_point = load_base_vaddr + file_header.e_entry; result.regions = BAN::move(memory_regions); return BAN::move(result); diff --git a/kernel/kernel/Process.cpp b/kernel/kernel/Process.cpp index 43d19763..0c6ba667 100644 --- a/kernel/kernel/Process.cpp +++ b/kernel/kernel/Process.cpp @@ -144,15 +144,19 @@ namespace Kernel process->m_credentials.set_egid(executable_inode->gid()); BAN::Vector auxiliary_vector; - TRY(auxiliary_vector.reserve(1 + executable.open_execfd)); + TRY(auxiliary_vector.reserve(2 + 2 * executable.interp_base.has_value())); - if (executable.open_execfd) + if (executable.interp_base.has_value()) { const int execfd = TRY(process->m_open_file_descriptors.open(BAN::move(executable_file), O_RDONLY)); TRY(auxiliary_vector.push_back({ .a_type = LibELF::AT_EXECFD, .a_un = { .a_val = static_cast(execfd) }, })); + TRY(auxiliary_vector.push_back({ + .a_type = LibELF::AT_BASE, + .a_un = { .a_ptr = reinterpret_cast(executable.interp_base.value()) }, + })); } process->m_shared_page_vaddr = process->page_table().reserve_free_page(process->m_mapped_regions.back()->vaddr(), USERSPACE_END); @@ -821,7 +825,7 @@ namespace Kernel TRY(executable_path.append(executable_file.canonical_path)); BAN::Vector auxiliary_vector; - TRY(auxiliary_vector.reserve(1 + executable.open_execfd)); + TRY(auxiliary_vector.reserve(2 + 2 * executable.interp_base.has_value())); BAN::ScopeGuard execfd_guard([this, &auxiliary_vector] { if (auxiliary_vector.empty()) @@ -831,13 +835,17 @@ namespace Kernel MUST(m_open_file_descriptors.close(auxiliary_vector.front().a_un.a_val)); }); - if (executable.open_execfd) + if (executable.interp_base.has_value()) { const int execfd = TRY(m_open_file_descriptors.open(BAN::move(executable_file), O_RDONLY)); TRY(auxiliary_vector.push_back({ .a_type = LibELF::AT_EXECFD, .a_un = { .a_val = static_cast(execfd) }, })); + TRY(auxiliary_vector.push_back({ + .a_type = LibELF::AT_BASE, + .a_un = { .a_ptr = reinterpret_cast(executable.interp_base.value()) }, + })); } const vaddr_t shared_page_vaddr = new_page_table->reserve_free_page(new_mapped_regions.back()->vaddr(), USERSPACE_END); diff --git a/userspace/libraries/LibELF/include/LibELF/AuxiliaryVector.h b/userspace/libraries/LibELF/include/LibELF/AuxiliaryVector.h index 0694fe8b..810f2b05 100644 --- a/userspace/libraries/LibELF/include/LibELF/AuxiliaryVector.h +++ b/userspace/libraries/LibELF/include/LibELF/AuxiliaryVector.h @@ -23,6 +23,8 @@ namespace LibELF AT_PHDR = 3, AT_PHENT = 4, AT_PHNUM = 5, + AT_PAGESZ = 6, + AT_BASE = 7, AT_SHARED_PAGE = 0xFFFF0001, };