aboutsummaryrefslogtreecommitdiff
path: root/gdb/symfile.c
diff options
context:
space:
mode:
authorJim Blandy <jimb@codesourcery.com>2007-09-24 21:48:29 +0000
committerJim Blandy <jimb@codesourcery.com>2007-09-24 21:48:29 +0000
commit28c32713ac37a0123d8397527e5fe9cc2d108f1a (patch)
tree770106fda5f1fb4c9ae15786fc82610724c8479f /gdb/symfile.c
parent322766326763e8d4765940a4c332a9f012f1e5a2 (diff)
downloadgdb-28c32713ac37a0123d8397527e5fe9cc2d108f1a.zip
gdb-28c32713ac37a0123d8397527e5fe9cc2d108f1a.tar.gz
gdb-28c32713ac37a0123d8397527e5fe9cc2d108f1a.tar.bz2
* symfile.h (struct symfile_segment_data): Doc fixes.
* symfile.c (symfile_map_offsets_to_segments): Doc fixes. Assert that we were passed some loaded segment addresses, and that sections' segment numbers are valid. Simplify offset calculation. * remote.c (get_offsets): Clarify selection of relocate-by-segment strategy, and set num_segments correctly. Delete redundant assignments to do_sections.
Diffstat (limited to 'gdb/symfile.c')
-rw-r--r--gdb/symfile.c44
1 files changed, 33 insertions, 11 deletions
diff --git a/gdb/symfile.c b/gdb/symfile.c
index a73f936..10617a1 100644
--- a/gdb/symfile.c
+++ b/gdb/symfile.c
@@ -3987,6 +3987,22 @@ free_symfile_segment_data (struct symfile_segment_data *data)
xfree (data);
}
+
+/* Given:
+ - DATA, containing segment addresses from the object file ABFD, and
+ the mapping from ABFD's sections onto the segments that own them,
+ and
+ - SEGMENT_BASES[0 .. NUM_SEGMENT_BASES - 1], holding the actual
+ segment addresses reported by the target,
+ store the appropriate offsets for each section in OFFSETS.
+
+ If there are fewer entries in SEGMENT_BASES than there are segments
+ in DATA, then apply SEGMENT_BASES' last entry to all the segments.
+
+ If there are more, then verify that all the excess addresses are
+ the same as the last legitimate one, and then ignore them. This
+ allows "TextSeg=X;DataSeg=X" qOffset replies for files which have
+ only a single segment. */
int
symfile_map_offsets_to_segments (bfd *abfd, struct symfile_segment_data *data,
struct section_offsets *offsets,
@@ -3996,15 +4012,16 @@ symfile_map_offsets_to_segments (bfd *abfd, struct symfile_segment_data *data,
int i;
asection *sect;
+ /* It doesn't make sense to call this function unless you have some
+ segment base addresses. */
+ gdb_assert (segment_bases > 0);
+
/* If we do not have segment mappings for the object file, we
can not relocate it by segments. */
gdb_assert (data != NULL);
gdb_assert (data->num_segments > 0);
- /* If more offsets are provided than we have segments, make sure the
- excess offsets are all the same as the last segment's offset.
- This allows "Text=X;Data=X" for files which have only a single
- segment. */
+ /* Check any extra SEGMENT_BASES entries. */
if (num_segment_bases > data->num_segments)
for (i = data->num_segments; i < num_segment_bases; i++)
if (segment_bases[i] != segment_bases[data->num_segments - 1])
@@ -4012,17 +4029,22 @@ symfile_map_offsets_to_segments (bfd *abfd, struct symfile_segment_data *data,
for (i = 0, sect = abfd->sections; sect != NULL; i++, sect = sect->next)
{
- CORE_ADDR vma;
int which = data->segment_info[i];
+ gdb_assert (0 <= which && which <= data->num_segments);
+
+ /* Don't bother computing offsets for sections that aren't
+ loaded as part of any segment. */
+ if (! which)
+ continue;
+
+ /* Use the last SEGMENT_BASES entry as the address of any extra
+ segments mentioned in DATA->segment_info. */
if (which > num_segment_bases)
- offsets->offsets[i] = segment_bases[num_segment_bases - 1];
- else if (which > 0)
- offsets->offsets[i] = segment_bases[which - 1];
- else
- continue;
+ which = num_segment_bases;
- offsets->offsets[i] -= data->segment_bases[which - 1];
+ offsets->offsets[i] = (segment_bases[which - 1]
+ - data->segment_bases[which - 1]);
}
return 1;