+2008-06-05 Daniel Jacobowitz <dan@codesourcery.com>
+
+ * remote.c (get_offsets): Handle a single segment.
+ * symfile.c (symfile_map_offsets_to_segments): Allow more bases
+ than segments.
+
2008-06-03 Daniel Jacobowitz <dan@codesourcery.com>
* solib-svr4.c (struct lm_info): Add lm_addr.
segments[1] = data->segment_bases[1] + data_addr;
num_segments = 2;
}
+ /* If the object file has only one segment, assume that it is text
+ rather than data; main programs with no writable data are rare,
+ but programs with no code are useless. Of course the code might
+ have ended up in the data segment... to detect that we would need
+ the permissions here. */
+ else if (data && data->num_segments == 1)
+ {
+ segments[0] = data->segment_bases[0] + text_addr;
+ num_segments = 1;
+ }
/* There's no way to relocate by segment. */
else
do_segments = 0;
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. */
+ If there are more entries, then ignore the extra. The target may
+ not be able to distinguish between an empty data segment and a
+ missing data segment; a missing text segment is less plausible. */
int
symfile_map_offsets_to_segments (bfd *abfd, struct symfile_segment_data *data,
struct section_offsets *offsets,
gdb_assert (data != NULL);
gdb_assert (data->num_segments > 0);
- /* 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])
- return 0;
-
for (i = 0, sect = abfd->sections; sect != NULL; i++, sect = sect->next)
{
int which = data->segment_info[i];