diff options
Diffstat (limited to 'elf')
-rw-r--r-- | elf/dl-load.c | 27 | ||||
-rw-r--r-- | elf/dl-reloc.c | 22 |
2 files changed, 29 insertions, 20 deletions
diff --git a/elf/dl-load.c b/elf/dl-load.c index 2bc9af40c9..3de1dca573 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -107,6 +107,18 @@ static const struct r_strlenpair *capstr; 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); @@ -782,20 +794,7 @@ _dl_map_object_from_fd (const char *name, int fd, char *realname, /* 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; diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c index 35ef88ab71..be860af940 100644 --- a/elf/dl-reloc.c +++ b/elf/dl-reloc.c @@ -1,5 +1,5 @@ /* 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 @@ -108,11 +108,21 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[], 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"); |