This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[patch v9 4/5] 'add-symbol-file' should update the current target sections.
- From: Nicolas Blanc <nicolas dot blanc at intel dot com>
- To: gdb-patches at sourceware dot org, Hafiz_Abid at mentor dot com, palves at redhat dot com, tromey at redhat dot com, eliz at gnu dot org, yao at codesourcery dot com, lgustavo at codesourcery dot com, dje at google dot com
- Cc: nicolas dot blanc at intel dot com
- Date: Tue, 18 Jun 2013 16:47:12 +0200
- Subject: [patch v9 4/5] 'add-symbol-file' should update the current target sections.
- References: <1371566833-4713-1-git-send-email-nicolas dot blanc at intel dot com>
2013-17-06 Nicolas Blanc <nicolas.blanc@intel.com>
* symfile.c (add_target_sections_of_objfile): New function.
(add_symbol_file_command): Update the current target sections.
(symfile_free_objfile): New function.
(_initialize_symfile): Attach observer for free_objfile.
Signed-off-by: Nicolas Blanc <nicolas.blanc@intel.com>
---
gdb/symfile.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 67 insertions(+), 2 deletions(-)
diff --git a/gdb/symfile.c b/gdb/symfile.c
index f7ad268..33d0eda 100644
--- a/gdb/symfile.c
+++ b/gdb/symfile.c
@@ -57,6 +57,7 @@
#include "stack.h"
#include "gdb_bfd.h"
#include "cli/cli-utils.h"
+#include "target.h"
#include <sys/types.h>
#include <fcntl.h>
@@ -2162,6 +2163,52 @@ print_transfer_performance (struct ui_file *stream,
ui_out_text (uiout, ".\n");
}
+/* Add the sections of OBJFILE to the current set of target sections. */
+
+static void
+add_target_sections_of_objfile (struct objfile* objfile)
+{
+ struct target_section_table *table = current_target_sections;
+ struct obj_section *osect;
+ int space;
+ unsigned count = 0;
+ struct target_section* ts;
+
+ if (objfile == NULL)
+ return;
+
+ /* Compute the number of sections to add. */
+ ALL_OBJFILE_OSECTIONS (objfile, osect)
+ {
+ if (bfd_get_section_size (osect->the_bfd_section) == 0)
+ continue;
+ count++;
+ }
+
+ if (count == 0)
+ return;
+
+ space = resize_section_table (table, count);
+
+ ts = table->sections + space;
+
+ ALL_OBJFILE_OSECTIONS (objfile, osect)
+ {
+ if (bfd_get_section_size (osect->the_bfd_section) == 0)
+ continue;
+
+ gdb_assert (ts < table->sections + space + count);
+
+ ts->addr = obj_section_addr (osect);
+ ts->endaddr = obj_section_endaddr (osect);
+ ts->the_bfd_section = osect->the_bfd_section;
+ ts->key = (void*) objfile;
+ ts->bfd = objfile->obfd;
+
+ ts++;
+ }
+}
+
/* This function allows the addition of incrementally linked object files.
It does not modify any state in the target, only in the debugger. */
/* Note: ezannoni 2000-04-13 This function/command used to have a
@@ -2185,6 +2232,7 @@ add_symbol_file_command (char *args, int from_tty)
int expecting_sec_name = 0;
int expecting_sec_addr = 0;
char **argv;
+ struct objfile *objf;
struct sect_opt
{
@@ -2320,8 +2368,10 @@ add_symbol_file_command (char *args, int from_tty)
if (from_tty && (!query ("%s", "")))
error (_("Not confirmed."));
- symbol_file_add (filename, from_tty ? SYMFILE_VERBOSE : 0,
- section_addrs, flags);
+ objf = symbol_file_add (filename, from_tty ? SYMFILE_VERBOSE : 0,
+ section_addrs, flags);
+
+ add_target_sections_of_objfile (objf);
/* Getting new symbols may change our opinion about what is
frameless. */
@@ -3798,11 +3848,26 @@ symfile_find_segment_sections (struct objfile *objfile)
free_symfile_segment_data (data);
}
+/* Listen for free_objfile events. */
+
+static void
+symfile_free_objfile (struct objfile *objfile)
+{
+ if (objfile == NULL)
+ return;
+
+ /* Remove the target sections of user-added objfiles. */
+ if (objfile->flags & OBJF_USERLOADED && objfile->obfd)
+ remove_target_sections ((void*)objfile, objfile->obfd);
+}
+
void
_initialize_symfile (void)
{
struct cmd_list_element *c;
+ observer_attach_free_objfile (symfile_free_objfile);
+
c = add_cmd ("symbol-file", class_files, symbol_file_command, _("\
Load symbol table from executable file FILE.\n\
The `file' command can also load symbol tables, as well as setting the file\n\
--
1.7.6.5