Module Name: src
Committed By: joerg
Date: Fri Jun 23 15:29:22 UTC 2017
Modified Files:
src/libexec/ld.elf_so: headers.c
Log Message:
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.
To generate a diff of this commit:
cvs rdiff -u -r1.61 -r1.62 src/libexec/ld.elf_so/headers.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/libexec/ld.elf_so/headers.c
diff -u src/libexec/ld.elf_so/headers.c:1.61 src/libexec/ld.elf_so/headers.c:1.62
--- src/libexec/ld.elf_so/headers.c:1.61 Tue Jun 14 13:06:41 2016
+++ src/libexec/ld.elf_so/headers.c Fri Jun 23 15:29:21 2017
@@ -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,
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,
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,
#endif
}
}
- assert(nsegs == 2);
obj->entry = entry;
return obj;