* remote.c (get_offsets): Handle a single segment.
authorDaniel Jacobowitz <drow@false.org>
Thu, 5 Jun 2008 16:17:54 +0000 (16:17 +0000)
committerDaniel Jacobowitz <drow@false.org>
Thu, 5 Jun 2008 16:17:54 +0000 (16:17 +0000)
* symfile.c (symfile_map_offsets_to_segments): Allow more bases
than segments.

gdb/ChangeLog
gdb/remote.c
gdb/symfile.c

index c21daf0..2845468 100644 (file)
@@ -1,3 +1,9 @@
+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.
index 429f30b..7e15873 100644 (file)
@@ -2134,6 +2134,16 @@ get_offsets (void)
       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;
index b641220..99bebc8 100644 (file)
@@ -3999,10 +3999,9 @@ free_symfile_segment_data (struct symfile_segment_data *data)
    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,
@@ -4021,12 +4020,6 @@ symfile_map_offsets_to_segments (bfd *abfd, struct symfile_segment_data *data,
   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];