diff --git a/libc/src/__support/OSUtil/linux/CMakeLists.txt b/libc/src/__support/OSUtil/linux/CMakeLists.txt index f6377ca9ff5a2..0a6037757f5a4 100644 --- a/libc/src/__support/OSUtil/linux/CMakeLists.txt +++ b/libc/src/__support/OSUtil/linux/CMakeLists.txt @@ -70,11 +70,10 @@ 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.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..d6fd3f3312594 100644 --- a/libc/src/__support/OSUtil/linux/vdso.cpp +++ b/libc/src/__support/OSUtil/linux/vdso.cpp @@ -11,10 +11,9 @@ #include "src/__support/CPP/array.h" #include "src/__support/CPP/optional.h" #include "src/__support/CPP/string_view.h" -#include "src/__support/libc_errno.h" +#include "src/__support/OSUtil/linux/auxv.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 @@ -189,17 +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; - 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 - 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 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) {