This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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;
 	    }
 	}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]