[PATCH]: add ia64 vDSO support to bfd_from_remote_memory

Jeff Johnston jjohnstn@redhat.com
Thu May 19 16:58:00 GMT 2005


The following patch is required to get ia64 vsyscall support working in gdb.  It 
was created by Roland McGrath.

The problem is that the ia64 vDSO has two pages in the address space that map to 
the same single page of contents.  This is because the vsyscall entry point 
requires a special kind of mapping which must be executable, but not readable. 
There is a 2nd mapping required which is readable and non-executable that allows 
reading of the ELF info.  This means that the program headers in the ia64 vDSO 
are non-standard with two PT_LOAD segments, both with p_offset of 0, but 
different p_vaddr values.

The bfd_from_remote_memory code in bfd/elfcode.h doesn't handle this scenario 
correctly.  It needs to use the segment with the lowest p_vaddr whose p_offset 
is zero modulo p_align.  The following patch adds an additional test which 
causes the loadbase to be correctly calculated.  With the patch, gdb can support 
ia64 vsyscall backtracing.

This change has been present in Red Hat gdb sources for some time and has been 
tested on i686, ia64, s390, s390x, ppc, ppc64, and x86_64.

Ok to commit to general sources?

2005-05-19  Roland McGrath  <roland@redhat.com>

	* elfcode.h (NAME (_bfd_elf, bfd_from_remote_memory): Adjust to support
	ia64 vDSO ideosyncracies.

Index: elfcode.h
===================================================================
RCS file: /cvs/src/src/bfd/elfcode.h,v
retrieving revision 1.68
diff -u -p -r1.68 elfcode.h
--- elfcode.h	9 May 2005 03:35:38 -0000	1.68
+++ elfcode.h	19 May 2005 16:39:08 -0000
@@ -1641,7 +1641,8 @@ NAME(_bfd_elf,bfd_from_remote_memory)
  	  if (segment_end > (bfd_vma) contents_size)
  	    contents_size = segment_end;

-	  if ((i_phdrs[i].p_offset & -i_phdrs[i].p_align) == 0)
+	  if ((i_phdrs[i].p_offset & -i_phdrs[i].p_align) == 0
+	      && loadbase == ehdr_vma)
  	    loadbase = ehdr_vma - (i_phdrs[i].p_vaddr & -i_phdrs[i].p_align);

  	  last_phdr = &i_phdrs[i];



More information about the Binutils mailing list