summaryrefslogtreecommitdiff
path: root/Userland
diff options
context:
space:
mode:
Diffstat (limited to 'Userland')
-rw-r--r--Userland/Libraries/LibELF/DynamicLinker.cpp18
1 files changed, 13 insertions, 5 deletions
diff --git a/Userland/Libraries/LibELF/DynamicLinker.cpp b/Userland/Libraries/LibELF/DynamicLinker.cpp
index 141d283254..b0752fc0f7 100644
--- a/Userland/Libraries/LibELF/DynamicLinker.cpp
+++ b/Userland/Libraries/LibELF/DynamicLinker.cpp
@@ -394,17 +394,25 @@ static Result<void, DlErrorMessage> link_main_library(DeprecatedString const& pa
VERIFY(!result.is_error());
auto& object = result.value();
+ if (loader.filepath().ends_with("/libc.so"sv)) {
+ initialize_libc(*object);
+ }
+
if (loader.filepath().ends_with("/libsystem.so"sv)) {
VERIFY(!loader.text_segments().is_empty());
for (auto const& segment : loader.text_segments()) {
- if (syscall(SC_annotate_mapping, segment.address().get(), static_cast<int>(VirtualMemoryRangeFlags::SyscallCode))) {
+ auto flags = static_cast<int>(VirtualMemoryRangeFlags::SyscallCode) | static_cast<int>(VirtualMemoryRangeFlags::Immutable);
+ if (syscall(SC_annotate_mapping, segment.address().get(), flags)) {
+ VERIFY_NOT_REACHED();
+ }
+ }
+ } else {
+ for (auto const& segment : loader.text_segments()) {
+ auto flags = static_cast<int>(VirtualMemoryRangeFlags::Immutable);
+ if (syscall(SC_annotate_mapping, segment.address().get(), flags)) {
VERIFY_NOT_REACHED();
}
}
- }
-
- if (loader.filepath().ends_with("/libc.so"sv)) {
- initialize_libc(*object);
}
}