From 64b1740913743bd61f2c01bece3809614e628df4 Mon Sep 17 00:00:00 2001 From: Daniel Bertalan Date: Wed, 7 Jul 2021 20:46:09 +0200 Subject: [PATCH] LibELF: Fix syscall regions for .text segments with a non-zero offset Previously, we assumed that the `.text` segment was loaded at vaddr 0 in all dynamic libraries, so we used the dynamic object's base address with `msyscall`. This did not work with the LLVM toolchain, as it likes to shuffle these segments around. This now also handles the case when there are multiple text segments for some reason correctly. --- Userland/Libraries/LibELF/DynamicLinker.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Userland/Libraries/LibELF/DynamicLinker.cpp b/Userland/Libraries/LibELF/DynamicLinker.cpp index 06eb3425be..cc93fea4ed 100644 --- a/Userland/Libraries/LibELF/DynamicLinker.cpp +++ b/Userland/Libraries/LibELF/DynamicLinker.cpp @@ -301,8 +301,11 @@ static Result, DlErrorMessage> load_main_library(co auto& object = result.value(); if (loader.filename() == "libsystem.so"sv) { - if (syscall(SC_msyscall, object->base_address().as_ptr())) { - VERIFY_NOT_REACHED(); + VERIFY(!loader.text_segments().is_empty()); + for (const auto& segment : loader.text_segments()) { + if (syscall(SC_msyscall, segment.address().get())) { + VERIFY_NOT_REACHED(); + } } }