Add "volatile" keyword to "struct gdb_exception" declaration
[deliverable/binutils-gdb.git] / gdb / solib-svr4.c
index a497c6c546d2a11e6b360d24b312107511dd88f8..55572d4e93f55fb3836e46678fe80f9becbb7502 100644 (file)
@@ -1,6 +1,6 @@
 /* Handle SVR4 shared libraries for GDB, the GNU Debugger.
 
-   Copyright (C) 1990-2013 Free Software Foundation, Inc.
+   Copyright (C) 1990-2014 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -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);
@@ -431,7 +427,7 @@ get_svr4_info (void)
   if (info != NULL)
     return info;
 
-  info = XZALLOC (struct svr4_info);
+  info = XCNEW (struct svr4_info);
   set_program_space_data (current_program_space, solib_svr4_pspace_data, info);
   return info;
 }
@@ -953,7 +949,7 @@ svr4_keep_data_in_core (CORE_ADDR vaddr, unsigned long size)
   if (!ldsomap)
     return 0;
 
-  new = XZALLOC (struct so_list);
+  new = XCNEW (struct so_list);
   old_chain = make_cleanup (xfree, new);
   new->lm_info = lm_info_read (ldsomap);
   make_cleanup (xfree, new->lm_info);
@@ -1130,8 +1126,8 @@ library_list_start_library (struct gdb_xml_parser *parser,
   ULONGEST *l_ldp = xml_find_attribute (attributes, "l_ld")->value;
   struct so_list *new_elem;
 
-  new_elem = XZALLOC (struct so_list);
-  new_elem->lm_info = XZALLOC (struct lm_info);
+  new_elem = XCNEW (struct so_list);
+  new_elem->lm_info = XCNEW (struct lm_info);
   new_elem->lm_info->lm_addr = *lmp;
   new_elem->lm_info->l_addr_inferior = *l_addrp;
   new_elem->lm_info->l_ld = *l_ldp;
@@ -1283,7 +1279,7 @@ svr4_default_sos (void)
   if (!info->debug_loader_offset_p)
     return NULL;
 
-  new = XZALLOC (struct so_list);
+  new = XCNEW (struct so_list);
 
   new->lm_info = xzalloc (sizeof (struct lm_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)
@@ -1319,7 +1316,7 @@ svr4_read_so_list (CORE_ADDR lm, CORE_ADDR prev_lm,
       int errcode;
       char *buffer;
 
-      new = XZALLOC (struct so_list);
+      new = XCNEW (struct so_list);
       old_chain = make_cleanup_free_so (new);
 
       new->lm_info = lm_info_read (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;
        }
@@ -1647,6 +1651,7 @@ solib_event_probe_action (struct probe_and_action *pa)
 {
   enum probe_action action;
   unsigned probe_argc;
+  struct frame_info *frame = get_current_frame ();
 
   action = pa->action;
   if (action == DO_NOTHING || action == PROBES_INTERFACE_FAILED)
@@ -1659,7 +1664,7 @@ solib_event_probe_action (struct probe_and_action *pa)
        arg0: Lmid_t lmid (mandatory)
        arg1: struct r_debug *debug_base (mandatory)
        arg2: struct link_map *new (optional, for incremental updates)  */
-  probe_argc = get_probe_argument_count (pa->probe);
+  probe_argc = get_probe_argument_count (pa->probe, frame);
   if (probe_argc == 2)
     action = FULL_RELOAD;
   else if (probe_argc < 2)
@@ -1768,6 +1773,7 @@ svr4_handle_solib_event (void)
   struct value *val;
   CORE_ADDR pc, debug_base, lm = 0;
   int is_initial_ns;
+  struct frame_info *frame = get_current_frame ();
 
   /* Do nothing if not using the probes interface.  */
   if (info->probes_table == NULL)
@@ -1812,7 +1818,7 @@ svr4_handle_solib_event (void)
   usm_chain = make_cleanup (resume_section_map_updates_cleanup,
                            current_program_space);
 
-  val = evaluate_probe_argument (pa->probe, 1);
+  val = evaluate_probe_argument (pa->probe, 1, frame);
   if (val == NULL)
     {
       do_cleanups (old_chain);
@@ -1843,7 +1849,7 @@ svr4_handle_solib_event (void)
 
   if (action == UPDATE_OR_RELOAD)
     {
-      val = evaluate_probe_argument (pa->probe, 2);
+      val = evaluate_probe_argument (pa->probe, 2, frame);
       if (val != NULL)
        lm = value_as_address (val);
 
@@ -2600,6 +2606,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)
@@ -2709,6 +2737,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)
This page took 0.025929 seconds and 4 git commands to generate.