1999-02-20 Ulrich Drepper <drepper@cygnus.com>
+ * elf/dl-load.c (_dl_map_object_from_fd): Use global
+ _dl_pf_to_proot array to convert p_flags value.
+ * elf/dl-reloc.c (_dl_relocate_object): Likewise.
+
* elf/dynamic-link.h (elf_get_dynamic_info): Use memset instead of
loop to clear `info'.
static size_t ncapstr;
static size_t max_capstrlen;
+const unsigned char _dl_pf_to_prot[8] =
+{
+ [0] = PROT_NONE,
+ [PF_R] = PROT_READ,
+ [PF_W] = PROT_WRITE,
+ [PF_R | PF_W] = PROT_READ | PROT_WRITE,
+ [PF_X] = PROT_EXEC,
+ [PF_R | PF_X] = PROT_READ | PROT_EXEC,
+ [PF_W | PF_X] = PROT_WRITE | PROT_EXEC,
+ [PF_R | PF_W | PF_X] = PROT_READ | PROT_WRITE | PROT_EXEC
+};
+
/* This function has no public prototype. */
extern ssize_t __libc_read (int, void *, size_t);
/* Optimize a common case. */
if ((PF_R | PF_W | PF_X) == 7
&& (PROT_READ | PROT_WRITE | PROT_EXEC) == 7)
- {
- static const unsigned char pf_to_prot[8] =
- {
- [0] = PROT_NONE,
- [PF_R] = PROT_READ,
- [PF_W] = PROT_WRITE,
- [PF_R | PF_W] = PROT_READ | PROT_WRITE,
- [PF_X] = PROT_EXEC,
- [PF_R | PF_X] = PROT_READ | PROT_EXEC,
- [PF_W | PF_X] = PROT_WRITE | PROT_EXEC,
- [PF_R | PF_W | PF_X] = PROT_READ | PROT_WRITE | PROT_EXEC
- };
- c->prot = pf_to_prot[ph->p_flags & (PF_R | PF_W | PF_X)];
- }
+ c->prot = _dl_pf_to_prot[ph->p_flags & (PF_R | PF_W | PF_X)];
else
{
c->prot = 0;
/* Relocate a shared object and resolve its references to other loaded objects.
- Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+ Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
caddr_t mapend = ((caddr_t) l->l_addr +
((ph->p_vaddr + ph->p_memsz + _dl_pagesize - 1)
& ~(_dl_pagesize - 1)));
- int prot = 0;
- if (ph->p_flags & PF_R)
- prot |= PROT_READ;
- if (ph->p_flags & PF_X)
- prot |= PROT_EXEC;
+ extern unsigned char _dl_pf_to_prot[8];
+ int prot;
+
+ if ((PF_R | PF_W | PF_X) == 7
+ && (PROT_READ | PROT_WRITE | PROT_EXEC) == 7)
+ prot = _dl_pf_to_prot[ph->p_flags & (PF_R | PF_X)];
+ else
+ {
+ prot = 0;
+ if (ph->p_flags & PF_R)
+ prot |= PROT_READ;
+ if (ph->p_flags & PF_X)
+ prot |= PROT_EXEC;
+ }
+
if (__mprotect (mapstart, mapend - mapstart, prot) < 0)
_dl_signal_error (errno, l->l_name,
"can't restore segment prot after reloc");