summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorCupertino Miranda <cupertino.miranda@oracle.com>2025-08-22 11:37:00 +0100
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>2025-08-27 10:45:45 -0300
commit3b2b88cceeb79f73a72367800d91599e2af4bb39 (patch)
treea4f7c0efe8d6c2a49ac448c977a639e609c3f45c /include
parent921e251e8f364d00fc753274095007275381ae65 (diff)
elf: early conversion of elf p_flags to mprotect flags
This patch replaces _dl_stack_flags global variable by _dl_stack_prot_flags. The advantage is that any convertion from p_flags to final used mprotect flags occurs at loading of p_flags. It avoids repeated spurious convertions of _dl_stack_flags, for example in allocate_thread_stack. This modification was suggested in: https://sourceware.org/pipermail/libc-alpha/2025-March/165537.html Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Diffstat (limited to 'include')
-rw-r--r--include/alloca.h2
-rw-r--r--include/stackinfo.h34
2 files changed, 35 insertions, 1 deletions
diff --git a/include/alloca.h b/include/alloca.h
index c0b8395443..5f2df32b46 100644
--- a/include/alloca.h
+++ b/include/alloca.h
@@ -4,7 +4,7 @@
# ifndef _ISOMAC
-#include <stackinfo.h>
+#include <elf.h>
#undef __alloca
diff --git a/include/stackinfo.h b/include/stackinfo.h
index 3c1541b42d..3cf36c9b1d 100644
--- a/include/stackinfo.h
+++ b/include/stackinfo.h
@@ -39,4 +39,38 @@
# error "stackinfo.h must define _STACK_GROWS_UP or _STACK_GROWS_DOWN!"
#endif
+#include <sys/mman.h>
+#include <link.h>
+
+/* ELF uses the PF_x macros to specify the segment permissions, mmap
+ uses PROT_xxx. In most cases the three macros have the values 1, 2,
+ and 4 but not in a matching order. The following macros allows
+ converting from the PF_x values to PROT_xxx values. */
+#define PF_TO_PROT \
+ ((PROT_READ << (PF_R * 4)) \
+ | (PROT_WRITE << (PF_W * 4)) \
+ | (PROT_EXEC << (PF_X * 4)) \
+ | ((PROT_READ | PROT_WRITE) << ((PF_R | PF_W) * 4)) \
+ | ((PROT_READ | PROT_EXEC) << ((PF_R | PF_X) * 4)) \
+ | ((PROT_WRITE | PROT_EXEC) << (PF_W | PF_X) * 4) \
+ | ((PROT_READ | PROT_WRITE | PROT_EXEC) << ((PF_R | PF_W | PF_X) * 4)))
+
+static inline int
+pf_to_prot (ElfW(Word) value)
+{
+#if (PF_R | PF_W | PF_X) == 7 && (PROT_READ | PROT_WRITE | PROT_EXEC) == 7
+ return (PF_TO_PROT >> ((value & (PF_R | PF_W | PF_X)) * 4)) & 0xf;
+#else
+ ElfW(Word) ret = 0;
+ if (value & PF_R)
+ ret |= PROT_READ;
+ if (value & PF_W)
+ ret |= PROT_WRITE;
+ if (value & PF_X)
+ ret |= PROT_EXEC;
+ return ret;
+#endif
+
+}
+
#endif /* include/stackinfo.h */