diff options
| author | joerg <joerg@NetBSD.org> | 2017-06-23 15:29:21 +0000 |
|---|---|---|
| committer | joerg <joerg@NetBSD.org> | 2017-06-23 15:29:21 +0000 |
| commit | b9587c234f33d3c44fd6840b4f42e5014fa56899 (patch) | |
| tree | 365bd0aec93ec5f5e6c2a5760b186fbba570ad1e /libexec | |
| parent | 081823fa6bfcd261853deec2f15baf458bd21ff9 (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.c | 23 |
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; |
