about summary refs log tree commit diff
path: root/elf/dl-reloc.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2004-01-13 08:36:54 +0000
committerUlrich Drepper <drepper@redhat.com>2004-01-13 08:36:54 +0000
commited20b3d9cc5ce78fd71f32c47b2eb7a897c7a25d (patch)
treec4ea660173f2c8cc138e8f0f1c64055a156c5036 /elf/dl-reloc.c
parent1c563add69af03557ba47a4a13790d821133478c (diff)
downloadglibc-ed20b3d9cc5ce78fd71f32c47b2eb7a897c7a25d.tar.gz
glibc-ed20b3d9cc5ce78fd71f32c47b2eb7a897c7a25d.tar.xz
glibc-ed20b3d9cc5ce78fd71f32c47b2eb7a897c7a25d.zip
Update.
2004-01-13  Ulrich Drepper  <drepper@redhat.com>

	* Makeconfig: Define relro-LDFLAGS if have-z-relro==yes.  Add it to
	LDFLAGS.so and LDFLAGS-rtld.
	(+link): Add relro-LDFLAGS.
	* Makeconfig (shlib.lds): Place __libc_subfreeres, __libc_atexit, and
	__libc_thread_subfreeres sections after .jcr section.
	* config.make.in: Add have-z-relro.
	* configure.in: Add check for -z relro option.
	* include/link.h (struct link_map): Add relro_addr and relro_size
	members.
	* elf/dl-load.c (_dl_map_object_from_fd): Recognize PT_GNU_RELRO.
	* elf/dl-reloc.c (_dl_relocate_object): At the end, make relro
	part of loaded segments read-only.
	* elf/elf.h: Define PT_GNU_RELRO.
	* elf/rtld.c (_dl_start): Recognize PT_GNU_RELRO of ld.so.
	(dl_main): Recognize PT_GNU_RELRO of the application.  Call
	_dl_debug_initialize and initialize l_info[DT_DEBUG] before
	relocations.
Diffstat (limited to 'elf/dl-reloc.c')
-rw-r--r--elf/dl-reloc.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c
index e5abba41dd..21d1871c6d 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-2002, 2003 Free Software Foundation, Inc.
+   Copyright (C) 1995-2002, 2003, 2004 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
@@ -307,6 +307,24 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
 
       textrels = textrels->next;
     }
+
+  /* In case we can protect the data now that the relocations are
+     done, do it.  */
+  if (l->l_relro_size != 0)
+    {
+      ElfW(Addr) start = ((l->l_addr + l->l_relro_addr)
+			  & ~(GL(dl_pagesize) - 1));
+      ElfW(Addr) end = ((l->l_addr + l->l_relro_addr + l->l_relro_size)
+			& ~(GL(dl_pagesize) - 1));
+
+      if (start != end
+	  && __mprotect ((void *) start, end - start, PROT_READ) < 0)
+	{
+	  errstring = N_("\
+cannot apply additional memory protection after relocation");
+	  goto call_error;
+	}
+    }
 }
 INTDEF (_dl_relocate_object)