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;