Update.
authorUlrich Drepper <drepper@redhat.com>
Sat, 20 Feb 1999 09:52:46 +0000 (09:52 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sat, 20 Feb 1999 09:52:46 +0000 (09:52 +0000)
* 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.

ChangeLog
elf/dl-load.c
elf/dl-reloc.c

index fe60d73595afacdb1fe2ed82056ba0e3df114a21..cc94e947cf6cced4de31a3507f884880d6f98109 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 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'.
 
index 2bc9af40c9f2f3b8ce6d83caa67c16faaeddbe6f..3de1dca57333eb3f85cfad62e33ddfea4ed124af 100644 (file)
@@ -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;
index 35ef88ab710251e3c86e3f3150d9c4b21dd8c91c..be860af940320c88d3d6bd4269a37931e43e6b8f 100644 (file)
@@ -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");