From 5b12e398b5b0779a04dc6aa45f911cf545ccc91c Mon Sep 17 00:00:00 2001 From: Schrodinger ZHU Yifan Date: Wed, 8 Oct 2025 10:18:26 -0400 Subject: [PATCH 1/2] [libc] cleanup entrypoint dependency on getauxval --- libc/src/__support/OSUtil/linux/CMakeLists.txt | 4 ++-- libc/src/__support/OSUtil/linux/vdso.cpp | 5 +++-- libc/src/unistd/linux/CMakeLists.txt | 4 ++-- libc/src/unistd/linux/sysconf.cpp | 11 +++++++---- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/libc/src/__support/OSUtil/linux/CMakeLists.txt b/libc/src/__support/OSUtil/linux/CMakeLists.txt index f6377ca9ff5a2..dd06854eb65f3 100644 --- a/libc/src/__support/OSUtil/linux/CMakeLists.txt +++ b/libc/src/__support/OSUtil/linux/CMakeLists.txt @@ -70,11 +70,11 @@ add_object_library( libc.src.__support.CPP.string_view libc.src.__support.threads.callonce libc.src.__support.threads.linux.futex_word_type + libc.src.__support.libc_errno + libc.src.__support.OSUtil.linux.auxv libc.hdr.types.struct_timeval libc.hdr.types.struct_timespec libc.hdr.types.clockid_t libc.hdr.types.time_t libc.hdr.link_macros - libc.src.errno.errno - libc.src.sys.auxv.getauxval ) diff --git a/libc/src/__support/OSUtil/linux/vdso.cpp b/libc/src/__support/OSUtil/linux/vdso.cpp index e4e53c3c2a0f2..3a6369579ce5f 100644 --- a/libc/src/__support/OSUtil/linux/vdso.cpp +++ b/libc/src/__support/OSUtil/linux/vdso.cpp @@ -11,10 +11,10 @@ #include "src/__support/CPP/array.h" #include "src/__support/CPP/optional.h" #include "src/__support/CPP/string_view.h" +#include "src/__support/OSUtil/linux/auxv.h" #include "src/__support/libc_errno.h" #include "src/__support/threads/callonce.h" #include "src/__support/threads/linux/futex_word.h" -#include "src/sys/auxv/getauxval.h" #include // TODO: This is a temporary workaround to avoid including elf.h @@ -192,7 +192,8 @@ void Symbol::initialize_vdso_global_cache() { // get the address of the VDSO, protect errno since getauxval may change // it int errno_backup = libc_errno; - uintptr_t vdso_ehdr_addr = getauxval(AT_SYSINFO_EHDR); + cpp::optional auxv_res = auxv::get(AT_SYSINFO_EHDR); + uintptr_t vdso_ehdr_addr = auxv_res ? static_cast(*auxv_res) : 0; // Get the memory address of the vDSO ELF header. auto vdso_ehdr = reinterpret_cast(vdso_ehdr_addr); // leave the table unpopulated if we don't have vDSO diff --git a/libc/src/unistd/linux/CMakeLists.txt b/libc/src/unistd/linux/CMakeLists.txt index dff6ba2db8a38..4eb3c7d3d7fae 100644 --- a/libc/src/unistd/linux/CMakeLists.txt +++ b/libc/src/unistd/linux/CMakeLists.txt @@ -563,8 +563,8 @@ add_entrypoint_object( DEPENDS libc.include.unistd libc.include.sys_auxv - libc.src.errno.errno - libc.src.sys.auxv.getauxval + libc.src.__support.libc_errno + libc.src.__support.OSUtil.linux.auxv ) add_entrypoint_object( diff --git a/libc/src/unistd/linux/sysconf.cpp b/libc/src/unistd/linux/sysconf.cpp index 03f224b150273..979e178cb45ee 100644 --- a/libc/src/unistd/linux/sysconf.cpp +++ b/libc/src/unistd/linux/sysconf.cpp @@ -11,17 +11,20 @@ #include "src/__support/common.h" #include "hdr/unistd_macros.h" +#include "src/__support/OSUtil/linux/auxv.h" #include "src/__support/libc_errno.h" #include "src/__support/macros/config.h" -#include "src/sys/auxv/getauxval.h" -#include namespace LIBC_NAMESPACE_DECL { LLVM_LIBC_FUNCTION(long, sysconf, (int name)) { long ret = 0; - if (name == _SC_PAGESIZE) - return static_cast(getauxval(AT_PAGESZ)); + if (name == _SC_PAGESIZE) { + cpp::optional page_size = auxv::get(AT_PAGESZ); + if (page_size) + return static_cast(*page_size); + ret = -1; + } // TODO: Complete the rest of the sysconf options. if (ret < 0) { From 70ec742f3ac657b12d9e6e5a6a4f97786d0a3ad9 Mon Sep 17 00:00:00 2001 From: Schrodinger ZHU Yifan Date: Wed, 8 Oct 2025 10:30:40 -0400 Subject: [PATCH 2/2] [libc] remove errno logic entirely from vDSO --- libc/src/__support/OSUtil/linux/CMakeLists.txt | 1 - libc/src/__support/OSUtil/linux/vdso.cpp | 8 +------- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/libc/src/__support/OSUtil/linux/CMakeLists.txt b/libc/src/__support/OSUtil/linux/CMakeLists.txt index dd06854eb65f3..0a6037757f5a4 100644 --- a/libc/src/__support/OSUtil/linux/CMakeLists.txt +++ b/libc/src/__support/OSUtil/linux/CMakeLists.txt @@ -70,7 +70,6 @@ add_object_library( libc.src.__support.CPP.string_view libc.src.__support.threads.callonce libc.src.__support.threads.linux.futex_word_type - libc.src.__support.libc_errno libc.src.__support.OSUtil.linux.auxv libc.hdr.types.struct_timeval libc.hdr.types.struct_timespec diff --git a/libc/src/__support/OSUtil/linux/vdso.cpp b/libc/src/__support/OSUtil/linux/vdso.cpp index 3a6369579ce5f..d6fd3f3312594 100644 --- a/libc/src/__support/OSUtil/linux/vdso.cpp +++ b/libc/src/__support/OSUtil/linux/vdso.cpp @@ -12,7 +12,6 @@ #include "src/__support/CPP/optional.h" #include "src/__support/CPP/string_view.h" #include "src/__support/OSUtil/linux/auxv.h" -#include "src/__support/libc_errno.h" #include "src/__support/threads/callonce.h" #include "src/__support/threads/linux/futex_word.h" #include @@ -189,18 +188,13 @@ void Symbol::initialize_vdso_global_cache() { for (auto &i : global_cache) i = nullptr; - // get the address of the VDSO, protect errno since getauxval may change - // it - int errno_backup = libc_errno; cpp::optional auxv_res = auxv::get(AT_SYSINFO_EHDR); uintptr_t vdso_ehdr_addr = auxv_res ? static_cast(*auxv_res) : 0; // Get the memory address of the vDSO ELF header. auto vdso_ehdr = reinterpret_cast(vdso_ehdr_addr); // leave the table unpopulated if we don't have vDSO - if (vdso_ehdr == nullptr) { - libc_errno = errno_backup; + if (vdso_ehdr == nullptr) return; - } // locate the section header inside the elf using the section header // offset