Fix for IA-64 gdb backtrace of threads in syscalls, reported by Jeff Johnson.
authorJim Wilson <wilson@tuliptree.org>
Tue, 31 May 2005 19:32:29 +0000 (19:32 +0000)
committerJim Wilson <wilson@tuliptree.org>
Tue, 31 May 2005 19:32:29 +0000 (19:32 +0000)
* elfcode.h (NAME(bfd_elf,bfd_from_remote_memory)): Check for program
header PF_R flag on PT_LOAD segments.

bfd/ChangeLog
bfd/elfcode.h

index 3830be8..0069e64 100644 (file)
@@ -1,3 +1,8 @@
+2005-05-31  James E Wilson  <wilson@specifixinc.com>
+
+       * elfcode.h (NAME(bfd_elf,bfd_from_remote_memory)): Check for program
+       header PF_R flag on PT_LOAD segments.
+
 2005-05-30  Richard Henderson  <rth@redhat.com>
 
        * elf64-alpha.c (elf64_alpha_relocate_section): Use dtp_base for
index 102b215..6cb3ca2 100644 (file)
@@ -1656,7 +1656,10 @@ NAME(_bfd_elf,bfd_from_remote_memory)
   for (i = 0; i < i_ehdr.e_phnum; ++i)
     {
       elf_swap_phdr_in (templ, &x_phdrs[i], &i_phdrs[i]);
-      if (i_phdrs[i].p_type == PT_LOAD)
+      /* IA-64 vDSO may have two mappings for one segment, where one mapping
+        is executable only, and one is read only.  We must not use the
+        executable one.  */
+      if (i_phdrs[i].p_type == PT_LOAD && (i_phdrs[i].p_flags & PF_R))
        {
          bfd_vma segment_end;
          segment_end = (i_phdrs[i].p_offset + i_phdrs[i].p_filesz
@@ -1703,7 +1706,10 @@ NAME(_bfd_elf,bfd_from_remote_memory)
     }
 
   for (i = 0; i < i_ehdr.e_phnum; ++i)
-    if (i_phdrs[i].p_type == PT_LOAD)
+    /* IA-64 vDSO may have two mappings for one segment, where one mapping
+       is executable only, and one is read only.  We must not use the
+       executable one.  */
+    if (i_phdrs[i].p_type == PT_LOAD && (i_phdrs[i].p_flags & PF_R))
       {
        bfd_vma start = i_phdrs[i].p_offset & -i_phdrs[i].p_align;
        bfd_vma end = (i_phdrs[i].p_offset + i_phdrs[i].p_filesz