about summary refs log tree commit diff
path: root/elf
diff options
context:
space:
mode:
Diffstat (limited to 'elf')
-rw-r--r--elf/dl-load.c27
-rw-r--r--elf/dl-reloc.c22
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");