PERFORCE change 170537 for review

View: New views
1 Messages — Rating Filter:   Alert me  

PERFORCE change 170537 for review

by Robert Watson :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

http://p4web.freebsd.org/chv.cgi?CH=170537

Change 170537 by rwatson@rwatson_vimage_client on 2009/11/12 11:54:45

        Integrate capabilities rtld from 9-current to pick up relocation
        fixes.

Affected files ...

.. //depot/projects/trustedbsd/capabilities/src/libexec/rtld-elf/rtld.c#30 integrate

Differences ...

==== //depot/projects/trustedbsd/capabilities/src/libexec/rtld-elf/rtld.c#30 (text+ko) ====

@@ -23,7 +23,7 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/libexec/rtld-elf/rtld.c,v 1.139 2009/07/17 19:45:42 kib Exp $
+ * $FreeBSD: src/libexec/rtld-elf/rtld.c,v 1.140 2009/10/10 15:27:10 kib Exp $
  */
 
 /*
@@ -556,6 +556,7 @@
     /* Initialize a fake symbol for resolving undefined weak references. */
     sym_zero.st_info = ELF_ST_INFO(STB_GLOBAL, STT_NOTYPE);
     sym_zero.st_shndx = SHN_UNDEF;
+    sym_zero.st_value = -(uintptr_t)obj_main->relocbase;
 
 #ifdef IN_RTLD_CAP
     if (ld_libcache != NULL)
@@ -1115,26 +1116,26 @@
 
     obj = obj_new();
     for (ph = phdr;  ph < phlimit;  ph++) {
+ if (ph->p_type != PT_PHDR)
+    continue;
+
+ obj->phdr = phdr;
+ obj->phsize = ph->p_memsz;
+ obj->relocbase = (caddr_t)phdr - ph->p_vaddr;
+ break;
+    }
+
+    for (ph = phdr;  ph < phlimit;  ph++) {
  switch (ph->p_type) {
 
- case PT_PHDR:
-    if ((const Elf_Phdr *)ph->p_vaddr != phdr) {
- _rtld_error("%s: invalid PT_PHDR", path);
- return NULL;
-    }
-    obj->phdr = (const Elf_Phdr *) ph->p_vaddr;
-    obj->phsize = ph->p_memsz;
-    break;
-
  case PT_INTERP:
-    obj->interp = (const char *) ph->p_vaddr;
+    obj->interp = (const char *)(ph->p_vaddr + obj->relocbase);
     break;
 
  case PT_LOAD:
     if (nsegs == 0) { /* First load segment */
  obj->vaddrbase = trunc_page(ph->p_vaddr);
- obj->mapbase = (caddr_t) obj->vaddrbase;
- obj->relocbase = obj->mapbase - obj->vaddrbase;
+ obj->mapbase = obj->vaddrbase + obj->relocbase;
  obj->textsize = round_page(ph->p_vaddr + ph->p_memsz) -
   obj->vaddrbase;
     } else { /* Last load segment */
@@ -1145,7 +1146,7 @@
     break;
 
  case PT_DYNAMIC:
-    obj->dynamic = (const Elf_Dyn *) ph->p_vaddr;
+    obj->dynamic = (const Elf_Dyn *)(ph->p_vaddr + obj->relocbase);
     break;
 
  case PT_TLS:
@@ -1153,7 +1154,7 @@
     obj->tlssize = ph->p_memsz;
     obj->tlsalign = ph->p_align;
     obj->tlsinitsize = ph->p_filesz;
-    obj->tlsinit = (void*) ph->p_vaddr;
+    obj->tlsinit = (void*)(ph->p_vaddr + obj->relocbase);
     break;
  }
     }
_______________________________________________
p4-projects@... mailing list
http://lists.freebsd.org/mailman/listinfo/p4-projects
To unsubscribe, send any mail to "p4-projects-unsubscribe@..."