mirror of
https://sourceware.org/git/glibc.git
synced 2025-11-05 08:10:46 +03:00
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>
This commit is contained in:
committed by
Adhemerval Zanella
parent
921e251e8f
commit
3b2b88ccee
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user