Module Name: src
Committed By: skrll
Date: Fri Oct 15 15:08:06 UTC 2010
Modified Files:
src/libexec/ld.elf_so: headers.c
Log Message:
Revert previous for now. It's part of a larger commit which will arrive
soon.
To generate a diff of this commit:
cvs rdiff -u -r1.34 -r1.35 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.34 src/libexec/ld.elf_so/headers.c:1.35
--- src/libexec/ld.elf_so/headers.c:1.34 Fri Oct 15 07:22:44 2010
+++ src/libexec/ld.elf_so/headers.c Fri Oct 15 15:08:05 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: headers.c,v 1.34 2010/10/15 07:22:44 skrll Exp $ */
+/* $NetBSD: headers.c,v 1.35 2010/10/15 15:08:05 skrll Exp $ */
/*
* Copyright 1996 John D. Polstra.
@@ -40,7 +40,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: headers.c,v 1.34 2010/10/15 07:22:44 skrll Exp $");
+__RCSID("$NetBSD: headers.c,v 1.35 2010/10/15 15:08:05 skrll Exp $");
#endif /* not lint */
#include <err.h>
@@ -307,27 +307,20 @@
const Elf_Phdr *phlimit = phdr + phnum;
const Elf_Phdr *ph;
int nsegs = 0;
+ ptrdiff_t relocoffs = 0;
Elf_Addr vaddr;
obj = _rtld_obj_new();
-
- for (ph = phdr; ph < phlimit; ++ph) {
- if (ph->p_type != PT_PHDR)
- continue;
-
- obj->phdr = (void *)(uintptr_t)phdr->p_vaddr;
- obj->phsize = phdr->p_memsz;
- obj->relocbase = (caddr_t)((uintptr_t)phdr - (uintptr_t)ph->p_vaddr);
- dbg(("headers: phdr %p phsize %zu relocbase %lx", obj->phdr,
- obj->phsize, (long)obj->relocbase));
- break;
- }
- assert(obj->phdr == phdr);
-
for (ph = phdr; ph < phlimit; ++ph) {
- vaddr = (Elf_Addr)obj->relocbase + ph->p_vaddr;
+ vaddr = ph->p_vaddr + relocoffs;
switch (ph->p_type) {
+ case PT_PHDR:
+ relocoffs = (uintptr_t)phdr - (uintptr_t)ph->p_vaddr;
+ dbg(("headers: phdr %p phsize %zu relocoffs %lx", obj->phdr,
+ obj->phsize, (long)relocoffs));
+ break;
+
case PT_INTERP:
obj->interp = (const char *)(uintptr_t)vaddr;
break;
@@ -337,6 +330,7 @@
if (nsegs == 0) { /* First load segment */
obj->vaddrbase = round_down(vaddr);
obj->mapbase = (caddr_t)(uintptr_t)obj->vaddrbase;
+ obj->relocbase = (void *)relocoffs;
obj->textsize = round_up(vaddr + ph->p_memsz) -
obj->vaddrbase;
} else { /* Last load segment */