This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[commit] Support offsetting text section contents
- From: Daniel Jacobowitz <drow at false dot org>
- To: gdb-patches at sourceware dot org
- Date: Sat, 3 May 2008 14:06:19 -0400
- Subject: [commit] Support offsetting text section contents
This patch lets qOffsets (or anything else that calls
objfile_relocate) update the exec_ops section table. It was already
relocating the symbol table, but with e.g. set trust-readonly-sections
we would not read from the correct section if the offsets changed.
Tested on arm-symbianelf and x86_64-linux, checked in.
--
Daniel Jacobowitz
CodeSourcery
2008-05-03 Daniel Jacobowitz <dan@codesourcery.com>
* Makefile.in (objfiles.o): Update.
* exec.c (exec_set_section_address): Support p->addr != 0.
* objfiles.c (objfile_relocate): Update exec_ops section
addresses.
* symfile.c (place_section): Move exec_set_section_address call...
(default_symfile_offsets): ...to here.
---
gdb/Makefile.in | 3 ++-
gdb/exec.c | 10 ++++------
gdb/objfiles.c | 11 +++++++++++
gdb/symfile.c | 4 ++--
4 files changed, 19 insertions(+), 9 deletions(-)
Index: symbian-fsf/gdb/Makefile.in
===================================================================
--- symbian-fsf.orig/gdb/Makefile.in 2008-05-02 16:01:38.000000000 -0400
+++ symbian-fsf/gdb/Makefile.in 2008-05-02 16:01:50.000000000 -0400
@@ -2566,7 +2566,8 @@ objfiles.o: objfiles.c $(defs_h) $(bfd_h
$(objfiles_h) $(gdb_stabs_h) $(target_h) $(bcache_h) $(mdebugread_h) \
$(gdb_assert_h) $(gdb_stat_h) $(gdb_obstack_h) $(gdb_string_h) \
$(hashtab_h) $(breakpoint_h) $(block_h) $(dictionary_h) $(source_h) \
- $(parser_defs_h) $(expression_h) $(addrmap_h) $(arch_utils_h)
+ $(parser_defs_h) $(expression_h) $(addrmap_h) $(arch_utils_h) \
+ $(exec_h)
observer.o: observer.c $(defs_h) $(observer_h) $(command_h) $(gdbcmd_h) \
$(observer_inc)
obsd-tdep.o: obsd-tdep.c $(defs_h) $(frame_h) $(symtab_h) $(obsd_tdep_h)
Index: symbian-fsf/gdb/exec.c
===================================================================
--- symbian-fsf.orig/gdb/exec.c 2008-05-02 16:01:38.000000000 -0400
+++ symbian-fsf/gdb/exec.c 2008-05-02 16:01:50.000000000 -0400
@@ -638,9 +638,8 @@ set_section_command (char *args, int fro
error (_("Section %s not found"), secprint);
}
-/* If we can find a section in FILENAME with BFD index INDEX, and the
- user has not assigned an address to it yet (via "set section"), adjust it
- to ADDRESS. */
+/* If we can find a section in FILENAME with BFD index INDEX, adjust
+ it to ADDRESS. */
void
exec_set_section_address (const char *filename, int index, CORE_ADDR address)
@@ -650,11 +649,10 @@ exec_set_section_address (const char *fi
for (p = exec_ops.to_sections; p < exec_ops.to_sections_end; p++)
{
if (strcmp (filename, p->bfd->filename) == 0
- && index == p->the_bfd_section->index
- && p->addr == 0)
+ && index == p->the_bfd_section->index)
{
+ p->endaddr += address - p->addr;
p->addr = address;
- p->endaddr += address;
}
}
}
Index: symbian-fsf/gdb/objfiles.c
===================================================================
--- symbian-fsf.orig/gdb/objfiles.c 2008-05-02 16:01:38.000000000 -0400
+++ symbian-fsf/gdb/objfiles.c 2008-05-02 16:09:09.000000000 -0400
@@ -49,6 +49,7 @@
#include "source.h"
#include "addrmap.h"
#include "arch-utils.h"
+#include "exec.h"
/* Prototypes for local functions */
@@ -532,6 +533,7 @@ free_all_objfiles (void)
void
objfile_relocate (struct objfile *objfile, struct section_offsets *new_offsets)
{
+ struct obj_section *s;
struct section_offsets *delta =
((struct section_offsets *)
alloca (SIZEOF_N_SECTION_OFFSETS (objfile->num_sections)));
@@ -683,6 +685,15 @@ objfile_relocate (struct objfile *objfil
}
}
+ /* Update the table in exec_ops, used to read memory. */
+ ALL_OBJFILE_OSECTIONS (objfile, s)
+ {
+ int idx = s->the_bfd_section->index;
+
+ exec_set_section_address (bfd_get_filename (objfile->obfd), idx,
+ s->addr);
+ }
+
/* Relocate breakpoints as necessary, after things are relocated. */
breakpoint_re_set ();
}
Index: symbian-fsf/gdb/symfile.c
===================================================================
--- symbian-fsf.orig/gdb/symfile.c 2008-05-02 16:01:38.000000000 -0400
+++ symbian-fsf/gdb/symfile.c 2008-05-02 16:06:43.000000000 -0400
@@ -535,8 +535,6 @@ place_section (bfd *abfd, asection *sect
offsets[sect->index] = start_addr;
arg->lowest = start_addr + bfd_get_section_size (sect);
-
- exec_set_section_address (bfd_get_filename (abfd), sect->index, start_addr);
}
/* Parse the user's idea of an offset for dynamic linking, into our idea
@@ -635,6 +633,8 @@ default_symfile_offsets (struct objfile
continue;
bfd_set_section_vma (abfd, cur_sec, offsets[cur_sec->index]);
+ exec_set_section_address (bfd_get_filename (abfd), cur_sec->index,
+ offsets[cur_sec->index]);
offsets[cur_sec->index] = 0;
}
}