Skip to content

Commit

Permalink
gdb/
Browse files Browse the repository at this point in the history
	Fix displacement of separate debug info files.
	* objfiles.c (objfile_relocate): Rename to ...
	(objfile_relocate1): ... here and make it static.  Extend the comment.
	(objfile_relocate): New function.
	* solib-spu.c (spu_relocate_main_executable): Explicitly check if
	SYMFILE_OBJFILE is NULL.  Remove variables objfile and old_chain.
	Remove following of SEPARATE_DEBUG_OBJFILE.  new_offsets is now
	allocated using alloca.
	* symfile.c (copy_section_addr_info): Remove.
	(build_section_addr_info_from_objfile): Make it global.  New variables
	addr_bit and mask, use them.
	* symfile.h (build_section_addr_info_from_objfile): New prototype.
	(copy_section_addr_info): Remove.
  • Loading branch information
jankratochvil committed Jan 9, 2010
1 parent a2beed3 commit 567995e
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 50 deletions.
16 changes: 16 additions & 0 deletions gdb/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,19 @@
2010-01-09 Jan Kratochvil <[email protected]>

Fix displacement of separate debug info files.
* objfiles.c (objfile_relocate): Rename to ...
(objfile_relocate1): ... here and make it static. Extend the comment.
(objfile_relocate): New function.
* solib-spu.c (spu_relocate_main_executable): Explicitly check if
SYMFILE_OBJFILE is NULL. Remove variables objfile and old_chain.
Remove following of SEPARATE_DEBUG_OBJFILE. new_offsets is now
allocated using alloca.
* symfile.c (copy_section_addr_info): Remove.
(build_section_addr_info_from_objfile): Make it global. New variables
addr_bit and mask, use them.
* symfile.h (build_section_addr_info_from_objfile): New prototype.
(copy_section_addr_info): Remove.

2010-01-09 Joel Brobecker <[email protected]>

Signal unwinder for mips-irix N32.
Expand Down
55 changes: 52 additions & 3 deletions gdb/objfiles.c
Original file line number Diff line number Diff line change
Expand Up @@ -693,9 +693,10 @@ free_all_objfiles (void)
}

/* Relocate OBJFILE to NEW_OFFSETS. There should be OBJFILE->NUM_SECTIONS
entries in new_offsets. */
void
objfile_relocate (struct objfile *objfile, struct section_offsets *new_offsets)
entries in new_offsets. SEPARATE_DEBUG_OBJFILE is not touched here. */

static void
objfile_relocate1 (struct objfile *objfile, struct section_offsets *new_offsets)
{
struct obj_section *s;
struct section_offsets *delta =
Expand Down Expand Up @@ -849,6 +850,54 @@ objfile_relocate (struct objfile *objfile, struct section_offsets *new_offsets)
exec_set_section_address (bfd_get_filename (objfile->obfd), idx,
obj_section_addr (s));
}
}

/* Relocate OBJFILE to NEW_OFFSETS. There should be OBJFILE->NUM_SECTIONS
entries in new_offsets. Process also OBJFILE's SEPARATE_DEBUG_OBJFILEs.
The number and ordering of sections does differ between the two objfiles.
Only their names match. Also the file offsets will differ (objfile being
possibly prelinked but separate_debug_objfile is probably not prelinked) but
the in-memory absolute address as specified by NEW_OFFSETS must match both
files. */

void
objfile_relocate (struct objfile *objfile, struct section_offsets *new_offsets)
{
struct objfile *debug_objfile;

objfile_relocate1 (objfile, new_offsets);

for (debug_objfile = objfile->separate_debug_objfile;
debug_objfile;
debug_objfile = objfile_separate_debug_iterate (objfile, debug_objfile))
{
struct section_addr_info *objfile_addrs;
struct section_offsets *new_debug_offsets;
int new_debug_num_sections;
struct cleanup *my_cleanups;

objfile_addrs = build_section_addr_info_from_objfile (objfile);
my_cleanups = make_cleanup (xfree, objfile_addrs);

/* Here OBJFILE_ADDRS contain the correct absolute addresses, the
relative ones must be already created according to debug_objfile. */

addr_info_make_relative (objfile_addrs, debug_objfile->obfd);

gdb_assert (debug_objfile->num_sections
== bfd_count_sections (debug_objfile->obfd));
new_debug_offsets = xmalloc (SIZEOF_N_SECTION_OFFSETS
(debug_objfile->num_sections));
make_cleanup (xfree, new_debug_offsets);
relative_addr_info_to_section_offsets (new_debug_offsets,
debug_objfile->num_sections,
objfile_addrs);

objfile_relocate1 (debug_objfile, new_debug_offsets);

do_cleanups (my_cleanups);
}

/* Relocate breakpoints as necessary, after things are relocated. */
breakpoint_re_set ();
Expand Down
22 changes: 8 additions & 14 deletions gdb/solib-spu.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,25 +50,19 @@
static void
spu_relocate_main_executable (int spufs_fd)
{
struct objfile *objfile;
struct cleanup *old_chain;
struct section_offsets *new_offsets;
int i;

for (objfile = symfile_objfile;
objfile;
objfile = objfile->separate_debug_objfile)
{
new_offsets = xcalloc (objfile->num_sections,
sizeof (struct section_offsets));
old_chain = make_cleanup (xfree, new_offsets);
if (symfile_objfile == NULL)
return;

for (i = 0; i < objfile->num_sections; i++)
new_offsets->offsets[i] = SPUADDR (spufs_fd, 0);
new_offsets = alloca (symfile_objfile->num_sections
* sizeof (struct section_offsets));

objfile_relocate (objfile, new_offsets);
do_cleanups (old_chain);
}
for (i = 0; i < symfile_objfile->num_sections; i++)
new_offsets->offsets[i] = SPUADDR (spufs_fd, 0);

objfile_relocate (symfile_objfile, new_offsets);
}

/* When running a stand-alone SPE executable, we may need to skip one more
Expand Down
35 changes: 7 additions & 28 deletions gdb/symfile.c
Original file line number Diff line number Diff line change
Expand Up @@ -328,32 +328,6 @@ alloc_section_addr_info (size_t num_sections)
return sap;
}


/* Return a freshly allocated copy of ADDRS. The section names, if
any, are also freshly allocated copies of those in ADDRS. */
struct section_addr_info *
copy_section_addr_info (struct section_addr_info *addrs)
{
struct section_addr_info *copy
= alloc_section_addr_info (addrs->num_sections);
int i;

copy->num_sections = addrs->num_sections;
for (i = 0; i < addrs->num_sections; i++)
{
copy->other[i].addr = addrs->other[i].addr;
if (addrs->other[i].name)
copy->other[i].name = xstrdup (addrs->other[i].name);
else
copy->other[i].name = NULL;
copy->other[i].sectindex = addrs->other[i].sectindex;
}

return copy;
}



/* Build (allocate and populate) a section_addr_info struct from
an existing section table. */

Expand Down Expand Up @@ -386,12 +360,17 @@ build_section_addr_info_from_section_table (const struct target_section *start,

/* Create a section_addr_info from section offsets in OBJFILE. */

static struct section_addr_info *
struct section_addr_info *
build_section_addr_info_from_objfile (const struct objfile *objfile)
{
struct section_addr_info *sap;
int i;
struct bfd_section *sec;
int addr_bit = gdbarch_addr_bit (objfile->gdbarch);
CORE_ADDR mask = CORE_ADDR_MAX;

if (addr_bit < (sizeof (CORE_ADDR) * HOST_CHAR_BIT))
mask = ((CORE_ADDR) 1 << addr_bit) - 1;

sap = alloc_section_addr_info (objfile->num_sections);
for (i = 0, sec = objfile->obfd->sections;
Expand All @@ -400,7 +379,7 @@ build_section_addr_info_from_objfile (const struct objfile *objfile)
{
gdb_assert (sec != NULL);
sap->other[i].addr = (bfd_get_section_vma (objfile->obfd, sec)
+ objfile->section_offsets->offsets[i]);
+ objfile->section_offsets->offsets[i]) & mask;
sap->other[i].name = xstrdup (bfd_get_section_name (objfile->obfd, sec));
sap->other[i].sectindex = sec->index;
}
Expand Down
8 changes: 3 additions & 5 deletions gdb/symfile.h
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,9 @@ struct sym_fns

};

extern struct section_addr_info *
build_section_addr_info_from_objfile (const struct objfile *objfile);

extern void relative_addr_info_to_section_offsets
(struct section_offsets *section_offsets, int num_sections,
struct section_addr_info *addrs);
Expand Down Expand Up @@ -254,11 +257,6 @@ extern char *find_separate_debug_file_by_debuglink (struct objfile *);
extern struct section_addr_info *alloc_section_addr_info (size_t
num_sections);

/* Return a freshly allocated copy of ADDRS. The section names, if
any, are also freshly allocated copies of those in ADDRS. */
extern struct section_addr_info *(copy_section_addr_info
(struct section_addr_info *addrs));

/* Build (allocate and populate) a section_addr_info struct from an
existing section table. */

Expand Down

0 comments on commit 567995e

Please sign in to comment.