aboutsummaryrefslogtreecommitdiff
path: root/elf
diff options
context:
space:
mode:
Diffstat (limited to 'elf')
-rw-r--r--elf/dl-reloc.c28
1 files changed, 15 insertions, 13 deletions
diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c
index 21d1871c6d..0fda3de3a7 100644
--- a/elf/dl-reloc.c
+++ b/elf/dl-reloc.c
@@ -311,23 +311,25 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
/* 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));
+ _dl_protect_relro (l);
+}
+INTDEF (_dl_relocate_object)
- if (start != end
- && __mprotect ((void *) start, end - start, PROT_READ) < 0)
- {
- errstring = N_("\
+void internal_function
+_dl_protect_relro (struct link_map *l)
+{
+ 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)
+ {
+ const char *errstring = N_("\
cannot apply additional memory protection after relocation");
- goto call_error;
- }
+ INTUSE(_dl_signal_error) (errno, l->l_name, NULL, errstring);
}
}
-INTDEF (_dl_relocate_object)
-
void
internal_function __attribute_noinline__