gdb/gdb-6.6-vdso-i386-on-amd64-...

108 lines
4.0 KiB
Diff

Fix i386-on-x86_64 debugging giving the warning:
warning: Lowest section in system-supplied DSO at 0xffffe000 is .hash at ffffe0b4
[ Backport for RH GDB-6.6. ]
--- gdb-6.6/gdb/symfile.c 2007-10-08 19:52:06.000000000 +0200
+++ gdb-6.6/gdb/symfile.c 2007-10-08 19:49:27.000000000 +0200
@@ -597,6 +597,37 @@ default_symfile_offsets (struct objfile
init_objfile_sect_indices (objfile);
}
+/* Find lowest loadable section to be used as starting point for continguous
+ sections. FIXME!! won't work without call to find .text first, but this
+ assumes text is lowest section. vDSO was seen for i386-on-amd64 processes
+ to have no `.text' as it has `.text.vsyscall', `.text.sigreturn' etc.
+ instead. Execution of this function has been delayed till it is really
+ needed as it is broken for vDSOs, fortunately it is never needed on
+ GNU/Linux. */
+
+static CORE_ADDR
+find_lower_offset (struct objfile *objfile)
+{
+ asection *lower_sect;
+
+ lower_sect = bfd_get_section_by_name (objfile->obfd, ".text");
+ if (lower_sect == NULL)
+ bfd_map_over_sections (objfile->obfd, find_lowest_section,
+ &lower_sect);
+ if (lower_sect == NULL)
+ warning (_("no loadable sections found in added symbol-file %s"),
+ objfile->name);
+ else
+ if ((bfd_get_section_flags (objfile->obfd, lower_sect) & SEC_CODE) == 0)
+ warning (_("Lowest section in %s is %s at %s"),
+ objfile->name,
+ bfd_section_name (objfile->obfd, lower_sect),
+ paddr (bfd_section_vma (objfile->obfd, lower_sect)));
+ if (lower_sect != NULL)
+ return bfd_section_vma (objfile->obfd, lower_sect);
+ else
+ return 0;
+}
/* Process a symbol file, as either the main file or as a dynamically
loaded file.
@@ -696,32 +727,11 @@ syms_from_objfile (struct objfile *objfi
happens for the PA64 port. */
if (/*!mainline &&*/ addrs && addrs->other[0].name)
{
- asection *lower_sect;
asection *sect;
- CORE_ADDR lower_offset;
+ CORE_ADDR lower_offset = 0; /* Shut up the GCC warning. */
+ int lower_offset_set = 0;
int i;
- /* Find lowest loadable section to be used as starting point for
- continguous sections. FIXME!! won't work without call to find
- .text first, but this assumes text is lowest section. */
- lower_sect = bfd_get_section_by_name (objfile->obfd, ".text");
- if (lower_sect == NULL)
- bfd_map_over_sections (objfile->obfd, find_lowest_section,
- &lower_sect);
- if (lower_sect == NULL)
- warning (_("no loadable sections found in added symbol-file %s"),
- objfile->name);
- else
- if ((bfd_get_section_flags (objfile->obfd, lower_sect) & SEC_CODE) == 0)
- warning (_("Lowest section in %s is %s at %s"),
- objfile->name,
- bfd_section_name (objfile->obfd, lower_sect),
- paddr (bfd_section_vma (objfile->obfd, lower_sect)));
- if (lower_sect != NULL)
- lower_offset = bfd_section_vma (objfile->obfd, lower_sect);
- else
- lower_offset = 0;
-
/* Calculate offsets for the loadable sections.
FIXME! Sections must be in order of increasing loadable section
so that contiguous sections can use the lower-offset!!!
@@ -743,6 +753,7 @@ syms_from_objfile (struct objfile *objfi
addrs->other[i].addr
-= bfd_section_vma (objfile->obfd, sect);
lower_offset = addrs->other[i].addr;
+ lower_offset_set = 1;
/* This is the index used by BFD. */
addrs->other[i].sectindex = sect->index ;
}
@@ -755,7 +766,17 @@ syms_from_objfile (struct objfile *objfi
}
}
else
- addrs->other[i].addr = lower_offset;
+ {
+ /* Delay finding LOWER_OFFSET only if it is needed. Otherwise
+ we would print a warning to detect a values never used. */
+ if (!lower_offset_set)
+ {
+ lower_offset = find_lower_offset (objfile);
+ lower_offset_set = 1;
+ }
+
+ addrs->other[i].addr = lower_offset;
+ }
}
}