mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-18 12:24:38 +08:00
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.
This commit is contained in:
parent
d56e56aaa7
commit
53eddfa606
@ -1,3 +1,13 @@
|
||||
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.
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user