This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[PATCH 2/3] relocate the entry point addess when used
- From: Tom Tromey <tromey at redhat dot com>
- To: gdb-patches at sourceware dot org
- Cc: Tom Tromey <tromey at redhat dot com>
- Date: Mon, 6 Jan 2014 13:30:46 -0700
- Subject: [PATCH 2/3] relocate the entry point addess when used
- Authentication-results: sourceware.org; auth=none
- References: <1389040247-2620-1-git-send-email-tromey at redhat dot com>
This changes the entry point to be unrelocated in the objfile, and
instead applies the relocation when it is used.
I think the existing code here is wrong. It computes the entry point
address directly from the BFD, not applying any runtime offsets.
However, then objfile_relocate1 passes this address to find_pc_section
-- which does use the offsets . So, it seems to me that the current
code can only find the correct address by luck.
2014-01-06 Tom Tromey <tromey@redhat.com>
* objfiles.c (entry_point_address_query): Relocate entry point
address.
(objfile_relocate1): Do not relocate entry point address.
* objfiles.h (struct entry_info) <entry_point>: Update comment.
<the_bfd_section_index>: New field.
* symfile.c (init_entry_point_info): Find the entry point's
section.
---
gdb/ChangeLog | 10 ++++++++++
gdb/objfiles.c | 20 +++-----------------
gdb/objfiles.h | 5 ++++-
gdb/symfile.c | 18 ++++++++++++++++++
4 files changed, 35 insertions(+), 18 deletions(-)
diff --git a/gdb/objfiles.c b/gdb/objfiles.c
index 73847bd..2604ae4 100644
--- a/gdb/objfiles.c
+++ b/gdb/objfiles.c
@@ -367,7 +367,9 @@ entry_point_address_query (CORE_ADDR *entry_p)
if (symfile_objfile == NULL || !symfile_objfile->ei.entry_point_p)
return 0;
- *entry_p = symfile_objfile->ei.entry_point;
+ *entry_p = (symfile_objfile->ei.entry_point
+ + ANOFFSET (symfile_objfile->section_offsets,
+ symfile_objfile->ei.the_bfd_section_index));
return 1;
}
@@ -794,22 +796,6 @@ objfile_relocate1 (struct objfile *objfile,
to be out of order. */
msymbols_sort (objfile);
- if (objfile->ei.entry_point_p)
- {
- /* Relocate ei.entry_point with its section offset, use SECT_OFF_TEXT
- only as a fallback. */
- struct obj_section *s;
- s = find_pc_section (objfile->ei.entry_point);
- if (s)
- {
- int idx = gdb_bfd_section_index (objfile->obfd, s->the_bfd_section);
-
- objfile->ei.entry_point += ANOFFSET (delta, idx);
- }
- else
- objfile->ei.entry_point += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
- }
-
{
int i;
diff --git a/gdb/objfiles.h b/gdb/objfiles.h
index c2b6177..620d7e8 100644
--- a/gdb/objfiles.h
+++ b/gdb/objfiles.h
@@ -101,9 +101,12 @@ struct objfile_data;
struct entry_info
{
- /* The relocated value we should use for this objfile entry point. */
+ /* The unrelocated value we should use for this objfile entry point. */
CORE_ADDR entry_point;
+ /* The index of the section in which the entry point appears. */
+ int the_bfd_section_index;
+
/* Set to 1 iff ENTRY_POINT contains a valid value. */
unsigned entry_point_p : 1;
};
diff --git a/gdb/symfile.c b/gdb/symfile.c
index 4f0fea8..a0ff9db 100644
--- a/gdb/symfile.c
+++ b/gdb/symfile.c
@@ -895,6 +895,7 @@ init_entry_point_info (struct objfile *objfile)
if (objfile->ei.entry_point_p)
{
+ struct obj_section *osect;
CORE_ADDR entry_point = objfile->ei.entry_point;
/* Make certain that the address points at real code, and not a
@@ -908,6 +909,23 @@ init_entry_point_info (struct objfile *objfile)
symbol table. */
objfile->ei.entry_point
= gdbarch_addr_bits_remove (get_objfile_arch (objfile), entry_point);
+
+ ALL_OBJFILE_OSECTIONS (objfile, osect)
+ {
+ struct bfd_section *sect = osect->the_bfd_section;
+
+ if (entry_point >= bfd_get_section_vma (objfile->obfd, sect)
+ && entry_point < (bfd_get_section_vma (objfile->obfd, sect)
+ + bfd_get_section_size (sect)))
+ {
+ objfile->ei.the_bfd_section_index
+ = gdb_bfd_section_index (objfile->obfd, sect);
+ break;
+ }
+ }
+
+ if (osect == NULL)
+ objfile->ei.the_bfd_section_index = SECT_OFF_TEXT (objfile);
}
}
--
1.8.1.4