2011-05-20 Pedro Alves <pedro@codesourcery.com>
[deliverable/binutils-gdb.git] / bfd / elf32-cris.c
index 5fbaff6c8854c24ff1dee02ed476e6de617c145b..9644e9b902d38bd83d6faf7467ad18a8374d34b2 100644 (file)
@@ -580,7 +580,7 @@ cris_elf_grok_prstatus (abfd, note)
        elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
 
        /* pr_pid */
-       elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 22);
+       elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 22);
 
        /* pr_reg */
        offset = 70;
@@ -599,7 +599,7 @@ cris_elf_grok_prstatus (abfd, note)
        elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
 
        /* pr_pid */
-       elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 22);
+       elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 22);
 
        /* pr_reg */
        offset = 70;
@@ -1181,15 +1181,8 @@ cris_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
        }
 
       if (sec != NULL && elf_discarded_section (sec))
-       {
-         /* For relocs against symbols from removed linkonce sections,
-            or sections discarded by a linker script, we just want the
-            section contents zeroed.  Avoid any special processing.  */
-         _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-         rel->r_info = 0;
-         rel->r_addend = 0;
-         continue;
-       }
+       RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+                                        rel, relend, howto, contents);
 
       if (info->relocatable)
        continue;
@@ -1493,7 +1486,7 @@ cris_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
        case R_CRIS_16:
        case R_CRIS_32:
          if (info->shared
-             && r_symndx != 0
+             && r_symndx != STN_UNDEF
              && (input_section->flags & SEC_ALLOC) != 0
              && ((r_type != R_CRIS_8_PCREL
                   && r_type != R_CRIS_16_PCREL
@@ -1512,7 +1505,7 @@ cris_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
              if (sreloc == NULL)
                {
                  sreloc = _bfd_elf_get_dynamic_reloc_section
-                   (input_bfd, input_section, /*rela?*/ TRUE);
+                   (dynobj, input_section, /*rela?*/ TRUE);
                  /* The section should have been created in cris_elf_check_relocs,
                     but that function will not be called for objects which fail in
                     cris_elf_merge_private_bfd_data.  */
@@ -2157,7 +2150,6 @@ elf_cris_finish_dynamic_symbol (bfd *output_bfd,
     {
       asection *splt;
       asection *sgotplt;
-      asection *sgot;
       asection *srela;
       bfd_vma got_base;
 
@@ -2197,7 +2189,6 @@ elf_cris_finish_dynamic_symbol (bfd *output_bfd,
       BFD_ASSERT (h->dynindx != -1);
 
       splt = bfd_get_section_by_name (dynobj, ".plt");
-      sgot = bfd_get_section_by_name (dynobj, ".got");
       sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
       srela = bfd_get_section_by_name (dynobj, ".rela.plt");
       BFD_ASSERT (splt != NULL && sgotplt != NULL
@@ -3106,12 +3097,37 @@ elf_cris_copy_indirect_symbol (struct bfd_link_info *info,
       return;
     }
 
-  BFD_ASSERT (edir->pcrel_relocs_copied == NULL);
   BFD_ASSERT (edir->gotplt_offset == 0 || eind->gotplt_offset == 0);
 
 #define XMOVOPZ(F, OP, Z) edir->F OP eind->F; eind->F = Z
 #define XMOVE(F) XMOVOPZ (F, +=, 0)
-  XMOVOPZ (pcrel_relocs_copied, =, NULL);
+  if (eind->pcrel_relocs_copied != NULL)
+    {
+      if (edir->pcrel_relocs_copied != NULL)
+       {
+         struct elf_cris_pcrel_relocs_copied **pp;
+         struct elf_cris_pcrel_relocs_copied *p;
+
+         /* Add reloc counts against the indirect sym to the direct sym
+            list.  Merge any entries against the same section.  */
+         for (pp = &eind->pcrel_relocs_copied; *pp != NULL;)
+           {
+             struct elf_cris_pcrel_relocs_copied *q;
+             p = *pp;
+             for (q = edir->pcrel_relocs_copied; q != NULL; q = q->next)
+               if (q->section == p->section)
+                 {
+                   q->count += p->count;
+                   *pp = p->next;
+                   break;
+                 }
+             if (q == NULL)
+               pp = &p->next;
+           }
+         *pp = edir->pcrel_relocs_copied;
+       }
+      XMOVOPZ (pcrel_relocs_copied, =, NULL);
+    }
   XMOVE (gotplt_refcount);
   XMOVE (gotplt_offset);
   XMOVE (reg_got_refcount);
@@ -3682,7 +3698,7 @@ cris_elf_check_relocs (bfd *abfd,
            eh = elf_cris_hash_entry (h);
 
            for (p = eh->pcrel_relocs_copied; p != NULL; p = p->next)
-             if (p->section == sreloc)
+             if (p->section == sec)
                break;
 
            if (p == NULL)
@@ -3693,7 +3709,7 @@ cris_elf_check_relocs (bfd *abfd,
                  return FALSE;
                p->next = eh->pcrel_relocs_copied;
                eh->pcrel_relocs_copied = p;
-               p->section = sreloc;
+               p->section = sec;
                p->count = 0;
                p->r_type = r_type;
              }
@@ -3951,8 +3967,14 @@ elf_cris_discard_excess_dso_dynamics (h, inf)
          || info->symbolic))
     {
       for (s = h->pcrel_relocs_copied; s != NULL; s = s->next)
-       s->section->size -= s->count * sizeof (Elf32_External_Rela);
-
+       {
+         asection *sreloc
+           = _bfd_elf_get_dynamic_reloc_section (elf_hash_table (info)
+                                                 ->dynobj,
+                                                 s->section,
+                                                 /*rela?*/ TRUE);
+         sreloc->size -= s->count * sizeof (Elf32_External_Rela);
+       }
       return TRUE;
     }
 
@@ -3963,21 +3985,20 @@ elf_cris_discard_excess_dso_dynamics (h, inf)
      late).  */
 
   for (s = h->pcrel_relocs_copied; s != NULL; s = s->next)
-    {
-      BFD_ASSERT ((s->section->flags & SEC_READONLY) != 0);
-
-      /* FIXME: How do we make this optionally a warning only?  */
-      (*_bfd_error_handler)
-       (_("%B, section `%A', to symbol `%s':\n"
-          "  relocation %s should not be used"
-          " in a shared object; recompile with -fPIC"),
-        s->section->owner,
-        s->section,
-        h->root.root.root.string,
-        cris_elf_howto_table[s->r_type].name);
-
-      info->flags |= DF_TEXTREL;
-    }
+    if ((s->section->flags & SEC_READONLY) != 0)
+      {
+       /* FIXME: How do we make this optionally a warning only?  */
+       (*_bfd_error_handler)
+         (_("%B, section `%A', to symbol `%s':\n"
+            "  relocation %s should not be used"
+            " in a shared object; recompile with -fPIC"),
+          s->section->owner,
+          s->section,
+          h->root.root.root.string,
+          cris_elf_howto_table[s->r_type].name);
+
+       info->flags |= DF_TEXTREL;
+      }
 
   return TRUE;
 }
@@ -4336,6 +4357,7 @@ elf_cris_got_elt_size (bfd *abfd ATTRIBUTE_UNUSED,
 }
 \f
 #define ELF_ARCH               bfd_arch_cris
+#define ELF_TARGET_ID          CRIS_ELF_DATA
 #define ELF_MACHINE_CODE       EM_CRIS
 #define ELF_MAXPAGESIZE                0x2000
 
This page took 0.026062 seconds and 4 git commands to generate.