summaryrefslogtreecommitdiff
path: root/libexec
diff options
context:
space:
mode:
authorjoerg <joerg@NetBSD.org>2017-06-23 15:29:21 +0000
committerjoerg <joerg@NetBSD.org>2017-06-23 15:29:21 +0000
commitb9587c234f33d3c44fd6840b4f42e5014fa56899 (patch)
tree365bd0aec93ec5f5e6c2a5760b186fbba570ad1e /libexec
parent081823fa6bfcd261853deec2f15baf458bd21ff9 (diff)
Remove old assert that only two segments exist. The rest of the code has
been changed to cope with more and at least Go actively creates them. Adjust the mapping size computation to use the maximum and not depend on PT_LOAD segments to be in order.
Diffstat (limited to 'libexec')
-rw-r--r--libexec/ld.elf_so/headers.c23
1 files changed, 11 insertions, 12 deletions
diff --git a/libexec/ld.elf_so/headers.c b/libexec/ld.elf_so/headers.c
index 6e026127efe..015119a0c0a 100644
--- a/libexec/ld.elf_so/headers.c
+++ b/libexec/ld.elf_so/headers.c
@@ -1,4 +1,4 @@
-/* $NetBSD: headers.c,v 1.61 2016/06/14 13:06:41 christos Exp $ */
+/* $NetBSD: headers.c,v 1.62 2017/06/23 15:29:21 joerg Exp $ */
/*
* Copyright 1996 John D. Polstra.
@@ -40,7 +40,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: headers.c,v 1.61 2016/06/14 13:06:41 christos Exp $");
+__RCSID("$NetBSD: headers.c,v 1.62 2017/06/23 15:29:21 joerg Exp $");
#endif /* not lint */
#include <err.h>
@@ -380,8 +380,9 @@ _rtld_digest_phdr(const Elf_Phdr *phdr, int phnum, caddr_t entry)
Obj_Entry *obj;
const Elf_Phdr *phlimit = phdr + phnum;
const Elf_Phdr *ph;
- int nsegs = 0;
- Elf_Addr vaddr;
+ bool first_seg = true;
+ Elf_Addr vaddr;
+ size_t size;
obj = _rtld_obj_new();
@@ -409,17 +410,16 @@ _rtld_digest_phdr(const Elf_Phdr *phdr, int phnum, caddr_t entry)
break;
case PT_LOAD:
- assert(nsegs < 2);
- if (nsegs == 0) { /* First load segment */
+ size = round_up(vaddr + ph->p_memsz) - obj->vaddrbase;
+ if (first_seg) { /* First load segment */
obj->vaddrbase = round_down(vaddr);
obj->mapbase = (caddr_t)(uintptr_t)obj->vaddrbase;
- obj->textsize = round_up(vaddr + ph->p_memsz) -
- obj->vaddrbase;
+ obj->textsize = size;
+ obj->mapsize = size;
+ first_seg = false;
} else { /* Last load segment */
- obj->mapsize = round_up(vaddr + ph->p_memsz) -
- obj->vaddrbase;
+ obj->mapsize = MAX(obj->mapsize, size);
}
- ++nsegs;
dbg(("headers: %s %p phsize %" PRImemsz,
"PT_LOAD", (void *)(uintptr_t)vaddr,
ph->p_memsz));
@@ -466,7 +466,6 @@ _rtld_digest_phdr(const Elf_Phdr *phdr, int phnum, caddr_t entry)
#endif
}
}
- assert(nsegs == 2);
obj->entry = entry;
return obj;