Add new target_read_raw_memory function, and consolidate comments.
[deliverable/binutils-gdb.git] / gdb / solib-svr4.c
index 6f8d0efa8530af61d82967a898514dc936cb8b86..9538af602e213dc8d93c33f5bd49b8602a92f781 100644 (file)
@@ -407,11 +407,7 @@ free_solib_list (struct svr4_info *info)
 static void
 svr4_pspace_data_cleanup (struct program_space *pspace, void *arg)
 {
-  struct svr4_info *info;
-
-  info = program_space_data (pspace, solib_svr4_pspace_data);
-  if (info == NULL)
-    return;
+  struct svr4_info *info = arg;
 
   free_probes_table (info);
   free_solib_list (info);
@@ -1310,6 +1306,7 @@ static int
 svr4_read_so_list (CORE_ADDR lm, CORE_ADDR prev_lm,
                   struct so_list ***link_ptr_ptr, int ignore_first)
 {
+  struct so_list *first = NULL;
   CORE_ADDR next_lm;
 
   for (; lm != 0; prev_lm = lm, lm = next_lm)
@@ -1349,6 +1346,7 @@ svr4_read_so_list (CORE_ADDR lm, CORE_ADDR prev_lm,
        {
          struct svr4_info *info = get_svr4_info ();
 
+         first = new;
          info->main_lm_addr = new->lm_info->lm_addr;
          do_cleanups (old_chain);
          continue;
@@ -1359,8 +1357,14 @@ svr4_read_so_list (CORE_ADDR lm, CORE_ADDR prev_lm,
                          SO_NAME_MAX_PATH_SIZE - 1, &errcode);
       if (errcode != 0)
        {
-         warning (_("Can't read pathname for load map: %s."),
-                  safe_strerror (errcode));
+         /* If this entry's l_name address matches that of the
+            inferior executable, then this is not a normal shared
+            object, but (most likely) a vDSO.  In this case, silently
+            skip it; otherwise emit a warning. */
+         if (first == NULL
+             || new->lm_info->l_name != first->lm_info->l_name)
+           warning (_("Can't read pathname for load map: %s."),
+                    safe_strerror (errcode));
          do_cleanups (old_chain);
          continue;
        }
@@ -1978,12 +1982,14 @@ svr4_create_solib_event_breakpoints (struct gdbarch *gdbarch,
        {
          VEC (probe_p) *probes[NUM_PROBES];
          int all_probes_found = 1;
+         int checked_can_use_probe_arguments = 0;
          int i;
 
          memset (probes, 0, sizeof (probes));
          for (i = 0; i < NUM_PROBES; i++)
            {
              const char *name = probe_info[i].name;
+             struct probe *p;
              char buf[32];
 
              /* Fedora 17 and Red Hat Enterprise Linux 6.2-6.4
@@ -2012,6 +2018,18 @@ svr4_create_solib_event_breakpoints (struct gdbarch *gdbarch,
                  all_probes_found = 0;
                  break;
                }
+
+             /* Ensure probe arguments can be evaluated.  */
+             if (!checked_can_use_probe_arguments)
+               {
+                 p = VEC_index (probe_p, probes[i], 0);
+                 if (!can_evaluate_probe_arguments (p))
+                   {
+                     all_probes_found = 0;
+                     break;
+                   }
+                 checked_can_use_probe_arguments = 1;
+               }
            }
 
          if (all_probes_found)
@@ -2586,6 +2604,28 @@ svr4_exec_displacement (CORE_ADDR *displacementp)
                  if (memcmp (phdrp, phdr2p, sizeof (*phdrp)) == 0)
                    continue;
 
+                 /* Strip modifies the flags and alignment of PT_GNU_RELRO.
+                    CentOS-5 has problems with filesz, memsz as well.
+                    See PR 11786.  */
+                 if (phdr2[i].p_type == PT_GNU_RELRO)
+                   {
+                     Elf32_External_Phdr tmp_phdr = *phdrp;
+                     Elf32_External_Phdr tmp_phdr2 = *phdr2p;
+
+                     memset (tmp_phdr.p_filesz, 0, 4);
+                     memset (tmp_phdr.p_memsz, 0, 4);
+                     memset (tmp_phdr.p_flags, 0, 4);
+                     memset (tmp_phdr.p_align, 0, 4);
+                     memset (tmp_phdr2.p_filesz, 0, 4);
+                     memset (tmp_phdr2.p_memsz, 0, 4);
+                     memset (tmp_phdr2.p_flags, 0, 4);
+                     memset (tmp_phdr2.p_align, 0, 4);
+
+                     if (memcmp (&tmp_phdr, &tmp_phdr2, sizeof (tmp_phdr))
+                         == 0)
+                       continue;
+                   }
+
                  /* prelink can convert .plt SHT_NOBITS to SHT_PROGBITS.  */
                  plt2_asect = bfd_get_section_by_name (exec_bfd, ".plt");
                  if (plt2_asect)
@@ -2695,6 +2735,28 @@ svr4_exec_displacement (CORE_ADDR *displacementp)
                  if (memcmp (phdrp, phdr2p, sizeof (*phdrp)) == 0)
                    continue;
 
+                 /* Strip modifies the flags and alignment of PT_GNU_RELRO.
+                    CentOS-5 has problems with filesz, memsz as well.
+                    See PR 11786.  */
+                 if (phdr2[i].p_type == PT_GNU_RELRO)
+                   {
+                     Elf64_External_Phdr tmp_phdr = *phdrp;
+                     Elf64_External_Phdr tmp_phdr2 = *phdr2p;
+
+                     memset (tmp_phdr.p_filesz, 0, 8);
+                     memset (tmp_phdr.p_memsz, 0, 8);
+                     memset (tmp_phdr.p_flags, 0, 4);
+                     memset (tmp_phdr.p_align, 0, 8);
+                     memset (tmp_phdr2.p_filesz, 0, 8);
+                     memset (tmp_phdr2.p_memsz, 0, 8);
+                     memset (tmp_phdr2.p_flags, 0, 4);
+                     memset (tmp_phdr2.p_align, 0, 8);
+
+                     if (memcmp (&tmp_phdr, &tmp_phdr2, sizeof (tmp_phdr))
+                         == 0)
+                       continue;
+                   }
+
                  /* prelink can convert .plt SHT_NOBITS to SHT_PROGBITS.  */
                  plt2_asect = bfd_get_section_by_name (exec_bfd, ".plt");
                  if (plt2_asect)
@@ -2907,10 +2969,10 @@ static void
 svr4_relocate_section_addresses (struct so_list *so,
                                  struct target_section *sec)
 {
-  sec->addr    = svr4_truncate_ptr (sec->addr    + lm_addr_check (so,
-                                                                 sec->bfd));
-  sec->endaddr = svr4_truncate_ptr (sec->endaddr + lm_addr_check (so,
-                                                                 sec->bfd));
+  bfd *abfd = sec->the_bfd_section->owner;
+
+  sec->addr = svr4_truncate_ptr (sec->addr + lm_addr_check (so, abfd));
+  sec->endaddr = svr4_truncate_ptr (sec->endaddr + lm_addr_check (so, abfd));
 }
 \f
 
This page took 0.02638 seconds and 4 git commands to generate.