diff options
author | Jim Blandy <jimb@codesourcery.com> | 2007-09-24 21:48:29 +0000 |
---|---|---|
committer | Jim Blandy <jimb@codesourcery.com> | 2007-09-24 21:48:29 +0000 |
commit | 28c32713ac37a0123d8397527e5fe9cc2d108f1a (patch) | |
tree | 770106fda5f1fb4c9ae15786fc82610724c8479f /gdb/symfile.c | |
parent | 322766326763e8d4765940a4c332a9f012f1e5a2 (diff) | |
download | gdb-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.c | 44 |
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; |