summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2013-12-31 06:52:33 -0700
committerTom Tromey <tromey@redhat.com>2014-01-15 11:02:23 -0700
commit53eddfa6069cc556a22d388fbde0cc83beb91bfb (patch)
tree86c4d38a4e0d7370216b90cb711471d1ce45ce7b
parentd56e56aaa79d7d65e9d969a7bf6795f2612d34ca (diff)
relocate the entry point address when used
This changes the entry point to be unrelocated in the objfile, and instead applies the relocation when it is used. 2014-01-15 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.
-rw-r--r--gdb/ChangeLog10
-rw-r--r--gdb/objfiles.c20
-rw-r--r--gdb/objfiles.h5
-rw-r--r--gdb/symfile.c21
4 files changed, 38 insertions, 18 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index f1b12771e6..4259030d92 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,15 @@
2014-01-15 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.
+
+2014-01-15 Tom Tromey <tromey@redhat.com>
+
* solib-frv.c (enable_break): Use entry_point_address_query.
2014-01-15 Omair Javaid <omair.javaid@linaro.org>
diff --git a/gdb/objfiles.c b/gdb/objfiles.c
index 9cc0054557..a80d4c729c 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 c2b617754e..620d7e8eb9 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 d863282c71..bd125524a7 100644
--- a/gdb/symfile.c
+++ b/gdb/symfile.c
@@ -894,7 +894,9 @@ 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;
+ int found;
/* Make certain that the address points at real code, and not a
function descriptor. */
@@ -907,6 +909,25 @@ init_entry_point_info (struct objfile *objfile)
symbol table. */
objfile->ei.entry_point
= gdbarch_addr_bits_remove (get_objfile_arch (objfile), entry_point);
+
+ found = 0;
+ 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);
+ found = 1;
+ break;
+ }
+ }
+
+ if (!found)
+ objfile->ei.the_bfd_section_index = SECT_OFF_TEXT (objfile);
}
}