gdb/gdbserver/
authorJan Kratochvil <jan.kratochvil@redhat.com>
Sun, 9 Jun 2013 17:08:47 +0000 (17:08 +0000)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Sun, 9 Jun 2013 17:08:47 +0000 (17:08 +0000)
Fix compatibility with Android Bionic.
* linux-low.c (linux_qxfer_libraries_svr4): Ignore first entry even if
it is not empty.

gdb/gdbserver/ChangeLog
gdb/gdbserver/linux-low.c

index 6564961..604a414 100644 (file)
@@ -1,3 +1,9 @@
+2013-06-09  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       Fix compatibility with Android Bionic.
+       * linux-low.c (linux_qxfer_libraries_svr4): Ignore first entry even if
+       it is not empty.
+
 2013-06-07  Pedro Alves  <palves@redhat.com>
 
        PR server/14823
index 4247b11..f7e510e 100644 (file)
@@ -5851,45 +5851,54 @@ linux_qxfer_libraries_svr4 (const char *annex, unsigned char *readbuf,
          break;
        }
 
-      /* Not checking for error because reading may stop before
-        we've got PATH_MAX worth of characters.  */
-      libname[0] = '\0';
-      linux_read_memory (l_name, libname, sizeof (libname) - 1);
-      libname[sizeof (libname) - 1] = '\0';
-      if (libname[0] != '\0')
+      /* Ignore the first entry even if it has valid name as the first entry
+        corresponds to the main executable.  The first entry should not be
+        skipped if the dynamic loader was loaded late by a static executable
+        (see solib-svr4.c parameter ignore_first).  But in such case the main
+        executable does not have PT_DYNAMIC present and this function already
+        exited above due to failed get_r_debug.  */
+      if (lm_prev == 0)
        {
-         /* 6x the size for xml_escape_text below.  */
-         size_t len = 6 * strlen ((char *) libname);
-         char *name;
-
-         if (!header_done)
+         sprintf (p, " main-lm=\"0x%lx\"", (unsigned long) lm_addr);
+         p = p + strlen (p);
+       }
+      else
+       {
+         /* Not checking for error because reading may stop before
+            we've got PATH_MAX worth of characters.  */
+         libname[0] = '\0';
+         linux_read_memory (l_name, libname, sizeof (libname) - 1);
+         libname[sizeof (libname) - 1] = '\0';
+         if (libname[0] != '\0')
            {
-             /* Terminate `<library-list-svr4'.  */
-             *p++ = '>';
-             header_done = 1;
-           }
+             /* 6x the size for xml_escape_text below.  */
+             size_t len = 6 * strlen ((char *) libname);
+             char *name;
 
-         while (allocated < p - document + len + 200)
-           {
-             /* Expand to guarantee sufficient storage.  */
-             uintptr_t document_len = p - document;
+             if (!header_done)
+               {
+                 /* Terminate `<library-list-svr4'.  */
+                 *p++ = '>';
+                 header_done = 1;
+               }
 
-             document = xrealloc (document, 2 * allocated);
-             allocated *= 2;
-             p = document + document_len;
-           }
+             while (allocated < p - document + len + 200)
+               {
+                 /* Expand to guarantee sufficient storage.  */
+                 uintptr_t document_len = p - document;
 
-         name = xml_escape_text ((char *) libname);
-         p += sprintf (p, "<library name=\"%s\" lm=\"0x%lx\" "
-                       "l_addr=\"0x%lx\" l_ld=\"0x%lx\"/>",
-                       name, (unsigned long) lm_addr,
-                       (unsigned long) l_addr, (unsigned long) l_ld);
-         free (name);
-       }
-      else if (lm_prev == 0)
-       {
-         sprintf (p, " main-lm=\"0x%lx\"", (unsigned long) lm_addr);
-         p = p + strlen (p);
+                 document = xrealloc (document, 2 * allocated);
+                 allocated *= 2;
+                 p = document + document_len;
+               }
+
+             name = xml_escape_text ((char *) libname);
+             p += sprintf (p, "<library name=\"%s\" lm=\"0x%lx\" "
+                           "l_addr=\"0x%lx\" l_ld=\"0x%lx\"/>",
+                           name, (unsigned long) lm_addr,
+                           (unsigned long) l_addr, (unsigned long) l_ld);
+             free (name);
+           }
        }
 
       lm_prev = lm_addr;