From: Tom Tromey Date: Tue, 31 Dec 2013 13:52:33 +0000 (-0700) Subject: relocate the entry point address when used X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=53eddfa6069cc556a22d388fbde0cc83beb91bfb;p=binutils-gdb.git 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 * objfiles.c (entry_point_address_query): Relocate entry point address. (objfile_relocate1): Do not relocate entry point address. * objfiles.h (struct entry_info) : Update comment. : New field. * symfile.c (init_entry_point_info): Find the entry point's section. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f1b12771e69..4259030d929 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2014-01-15 Tom Tromey + + * objfiles.c (entry_point_address_query): Relocate entry point + address. + (objfile_relocate1): Do not relocate entry point address. + * objfiles.h (struct entry_info) : Update comment. + : New field. + * symfile.c (init_entry_point_info): Find the entry point's + section. + 2014-01-15 Tom Tromey * solib-frv.c (enable_break): Use entry_point_address_query. diff --git a/gdb/objfiles.c b/gdb/objfiles.c index 9cc0054557e..a80d4c729c4 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 c2b617754e8..620d7e8eb9e 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 d863282c711..bd125524a79 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); } }