public inbox for archer-commits@sourceware.org
help / color / mirror / Atom feed
* [SCM] archer-tromey-remove-obj_section: extend section-searching to cover data and bss sections as well
@ 2013-01-22 16:44 tromey
0 siblings, 0 replies; only message in thread
From: tromey @ 2013-01-22 16:44 UTC (permalink / raw)
To: archer-commits
The branch, archer-tromey-remove-obj_section has been updated
via db6a28f95f3c29c838e2454d7e03f61b837649a7 (commit)
from 36b2db08d02bd45935a021c3f1446da432b7b94b (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email.
- Log -----------------------------------------------------------------
commit db6a28f95f3c29c838e2454d7e03f61b837649a7
Author: Tom Tromey <tromey@redhat.com>
Date: Tue Jan 22 09:43:47 2013 -0700
extend section-searching to cover data and bss sections as well
the test suite tripped across a .sl without a $DATA$ section
-----------------------------------------------------------------------
Summary of changes:
gdb/solib-som.c | 10 +++++--
gdb/somread.c | 71 ++++++++++++++++++++++++++++++++++++------------------
2 files changed, 54 insertions(+), 27 deletions(-)
First 500 lines of diff:
diff --git a/gdb/solib-som.c b/gdb/solib-som.c
index 6c64f64..2678a22 100644
--- a/gdb/solib-som.c
+++ b/gdb/solib-som.c
@@ -869,11 +869,15 @@ som_solib_section_offsets (struct objfile *objfile,
ALL_OBJFILE_OSECTIONS (objfile, sect)
{
- if (sect->the_bfd_section->index != objfile->sect_index_text
- && sect->the_bfd_section->index != objfile->sect_index_bss
- && sect->the_bfd_section->index != objfile->sect_index_data)
+ flagword flags = bfd_get_section_flags (objfile->obfd,
+ sect->the_bfd_section);
+
+ if ((flags & SEC_CODE) != 0)
offsets->offsets[sect->the_bfd_section->index]
= offsets->offsets[SECT_OFF_TEXT (objfile)];
+ else
+ offsets->offsets[sect->the_bfd_section->index]
+ = offsets->offsets[SECT_OFF_DATA (objfile)];
}
return 1;
diff --git a/gdb/somread.c b/gdb/somread.c
index 967a9f7..4dfecbb 100644
--- a/gdb/somread.c
+++ b/gdb/somread.c
@@ -391,14 +391,22 @@ som_symfile_init (struct objfile *objfile)
objfile->flags |= OBJF_REORDERED;
}
-/* An object of this type is passed to set_text_section_offset. */
+/* An object of this type is passed to find_section_offset. */
-struct text_section_offset_arg
+struct find_section_offset_arg
{
/* The objfile. */
struct objfile *objfile;
+ /* Flags to invert. */
+
+ flagword invert;
+
+ /* Flags to look for. */
+
+ flagword flags;
+
/* A text section with non-zero size, if any. */
asection *best_section;
@@ -408,17 +416,20 @@ struct text_section_offset_arg
asection *empty_section;
};
-/* A callback for bfd_map_over_sections that may set the objfile's
- text section offset. */
+/* A callback for bfd_map_over_sections that tries to find a section
+ with particular flags in an objfile. */
static void
-set_text_section_offset (bfd *abfd, asection *sect, void *arg)
+find_section_offset (bfd *abfd, asection *sect, void *arg)
{
- struct text_section_offset_arg *info = arg;
+ struct find_section_offset_arg *info = arg;
flagword aflag;
aflag = bfd_get_section_flags (abfd, sect);
- if ((aflag & SEC_ALLOC) != 0 && (aflag & SEC_CODE) != 0)
+
+ aflag ^= info->invert;
+
+ if ((aflag & info->flags) == info->flags)
{
if (bfd_section_size (abfd, sect) > 0)
{
@@ -433,6 +444,27 @@ set_text_section_offset (bfd *abfd, asection *sect, void *arg)
}
}
+/* Set a section index from a BFD. */
+
+static void
+set_section_index (struct objfile *objfile, flagword invert, flagword flags,
+ int *index_ptr)
+{
+ struct find_section_offset_arg info;
+
+ info.objfile = objfile;
+ info.best_section = NULL;
+ info.empty_section = NULL;
+ info.invert = invert;
+ info.flags = flags;
+ bfd_map_over_sections (objfile->obfd, find_section_offset, &info);
+
+ if (info.best_section)
+ *index_ptr = info.best_section->index;
+ else if (info.empty_section)
+ *index_ptr = info.empty_section->index;
+}
+
/* SOM specific parsing routine for section offsets.
Plain and simple for now. */
@@ -443,29 +475,20 @@ som_symfile_offsets (struct objfile *objfile, struct section_addr_info *addrs)
int i;
CORE_ADDR text_addr;
asection *sect;
- struct text_section_offset_arg info;
objfile->num_sections = bfd_count_sections (objfile->obfd);
objfile->section_offsets = (struct section_offsets *)
obstack_alloc (&objfile->objfile_obstack,
SIZEOF_N_SECTION_OFFSETS (objfile->num_sections));
- info.objfile = objfile;
- info.best_section = NULL;
- info.empty_section = NULL;
- bfd_map_over_sections (objfile->obfd, set_text_section_offset, &info);
-
- if (info.best_section)
- objfile->sect_index_text = info.best_section->index;
- else if (info.empty_section)
- objfile->sect_index_text = info.empty_section->index;
-
- sect = bfd_get_section_by_name (objfile->obfd, "$DATA$");
- if (sect != NULL)
- objfile->sect_index_data = sect->index;
- sect = bfd_get_section_by_name (objfile->obfd, "$BSS$");
- if (sect != NULL)
- objfile->sect_index_bss = sect->index;
+ set_section_index (objfile, 0, SEC_ALLOC | SEC_CODE,
+ &objfile->sect_index_text);
+ set_section_index (objfile, 0, SEC_ALLOC | SEC_DATA,
+ &objfile->sect_index_data);
+ set_section_index (objfile, SEC_LOAD, SEC_ALLOC | SEC_DATA | SEC_LOAD,
+ &objfile->sect_index_bss);
+ set_section_index (objfile, 0, SEC_ALLOC | SEC_READONLY,
+ &objfile->sect_index_rodata);
/* First see if we're a shared library. If so, get the section
offsets from the library, else get them from addrs. */
hooks/post-receive
--
Repository for Project Archer.
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2013-01-22 16:44 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-01-22 16:44 [SCM] archer-tromey-remove-obj_section: extend section-searching to cover data and bss sections as well tromey
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).