cafa2ff0c1
- Fix a TUI visual corruption due to the build-id warnings (BZ 320061). - Fixed the kernel i386-on-x86_64 VDSO loading (producing `Lowest section in').
108 lines
4.0 KiB
Diff
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;
|
|
+ }
|
|
}
|
|
}
|
|
|