Automatic date update in version.in
[deliverable/binutils-gdb.git] / bfd / elf32-bfin.c
index 49ef360bcdfd88709b15f5507d44a1eabf44241c..d7d096af1c8146690434abac0a80a3c5b3eea1a2 100644 (file)
@@ -1,5 +1,5 @@
 /* ADI Blackfin BFD support for 32-bit ELF.
-   Copyright (C) 2005-2015 Free Software Foundation, Inc.
+   Copyright (C) 2005-2016 Free Software Foundation, Inc.
 
    This file is part of BFD, the Binary File Descriptor library.
 
@@ -1623,12 +1623,9 @@ bfin_relocate_section (bfd * output_bfd,
            }
 
          if (r == bfd_reloc_overflow)
-           {
-             if (!(info->callbacks->reloc_overflow
-                   (info, (h ? &h->root : NULL), name, howto->name,
-                    (bfd_vma) 0, input_bfd, input_section, rel->r_offset)))
-               return FALSE;
-           }
+           (*info->callbacks->reloc_overflow)
+             (info, (h ? &h->root : NULL), name, howto->name,
+              (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
          else
            {
              (*_bfd_error_handler)
@@ -2215,7 +2212,7 @@ _bfinfdpic_emit_got_relocs_plt_entries (struct bfinfdpic_relocs_info *entry,
       /* If we're linking an executable at a fixed address, we can
         omit the dynamic relocation as long as the symbol is local to
         this module.  */
-      if (bfd_link_executable (info) && !bfd_link_pic (info)
+      if (bfd_link_pde (info)
          && (entry->symndx != -1
              || BFINFDPIC_SYM_LOCAL (info, entry->d.h)))
        {
@@ -2270,7 +2267,7 @@ _bfinfdpic_emit_got_relocs_plt_entries (struct bfinfdpic_relocs_info *entry,
          if (entry->symndx == -1
              && ! BFINFDPIC_FUNCDESC_LOCAL (info, entry->d.h)
              && BFINFDPIC_SYM_LOCAL (info, entry->d.h)
-             && !(bfd_link_executable (info) && !bfd_link_pic (info)))
+             && !bfd_link_pde (info))
            {
              reloc = R_BFIN_FUNCDESC;
              idx = elf_section_data (entry->d.h->root.u.def.section
@@ -2306,7 +2303,7 @@ _bfinfdpic_emit_got_relocs_plt_entries (struct bfinfdpic_relocs_info *entry,
             dynamic symbol entry for the got section, so idx will be
             zero, which means we can and should compute the address
             of the private descriptor ourselves.  */
-         if (bfd_link_executable (info) && !bfd_link_pic (info)
+         if (bfd_link_pde (info)
              && (entry->symndx != -1
                  || BFINFDPIC_FUNCDESC_LOCAL (info, entry->d.h)))
            {
@@ -2369,7 +2366,7 @@ _bfinfdpic_emit_got_relocs_plt_entries (struct bfinfdpic_relocs_info *entry,
       /* If we're linking an executable at a fixed address, we can
         omit the dynamic relocation as long as the symbol is local to
         this module.  */
-      if (bfd_link_executable (info) && !bfd_link_pic (info)
+      if (bfd_link_pde (info)
          && (entry->symndx != -1 || BFINFDPIC_SYM_LOCAL (info, entry->d.h)))
        {
          if (sec)
@@ -2417,8 +2414,7 @@ _bfinfdpic_emit_got_relocs_plt_entries (struct bfinfdpic_relocs_info *entry,
 
       /* If we've omitted the dynamic relocation, just emit the fixed
         addresses of the symbol and of the local GOT base offset.  */
-      if (bfd_link_executable (info)
-         && !bfd_link_pic (info)
+      if (bfd_link_pde (info)
          && sec
          && sec->output_section)
        {
@@ -2834,8 +2830,7 @@ bfinfdpic_relocate_section (bfd * output_bfd,
                   section+offset.  */
                if (h && ! BFINFDPIC_FUNCDESC_LOCAL (info, h)
                    && BFINFDPIC_SYM_LOCAL (info, h)
-                   && !(bfd_link_executable (info)
-                        && !bfd_link_pic (info)))
+                   && !bfd_link_pde (info))
                  {
                    dynindx = elf_section_data (h->root.u.def.section
                                                ->output_section)->dynindx;
@@ -2872,7 +2867,7 @@ bfinfdpic_relocate_section (bfd * output_bfd,
                   dynamic symbol entry for the got section, so idx will
                   be zero, which means we can and should compute the
                   address of the private descriptor ourselves.  */
-               if (bfd_link_executable (info) && !bfd_link_pic (info)
+               if (bfd_link_pde (info)
                    && (!h || BFINFDPIC_FUNCDESC_LOCAL (info, h)))
                  {
                    bfd_vma offset;
@@ -2995,7 +2990,7 @@ bfinfdpic_relocate_section (bfd * output_bfd,
               can omit the dynamic relocation as long as the symbol
               is defined in the current link unit (which is implied
               by its output section not being NULL).  */
-           if (bfd_link_executable (info) && !bfd_link_pic (info)
+           if (bfd_link_pde (info)
                && (!h || BFINFDPIC_SYM_LOCAL (info, h)))
              {
                if (osec)
@@ -3075,7 +3070,7 @@ bfinfdpic_relocate_section (bfd * output_bfd,
                /* If we've omitted the dynamic relocation, just emit
                   the fixed addresses of the symbol and of the local
                   GOT base offset.  */
-               if (bfd_link_executable (info) && !bfd_link_pic (info)
+               if (bfd_link_pde (info)
                    && (!h || BFINFDPIC_SYM_LOCAL (info, h)))
                  bfd_put_32 (output_bfd,
                              bfinfdpic_got_section (info)->output_section->vma
@@ -3211,13 +3206,13 @@ bfinfdpic_relocate_section (bfd * output_bfd,
          switch (r)
            {
            case bfd_reloc_overflow:
-             r = info->callbacks->reloc_overflow
+             (*info->callbacks->reloc_overflow)
                (info, (h ? &h->root : NULL), name, howto->name,
                 (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
              break;
 
            case bfd_reloc_undefined:
-             r = info->callbacks->undefined_symbol
+             (*info->callbacks->undefined_symbol)
                (info, name, input_bfd, input_section, rel->r_offset, TRUE);
              break;
 
@@ -3239,11 +3234,8 @@ bfinfdpic_relocate_section (bfd * output_bfd,
            }
 
          if (msg)
-           r = info->callbacks->warning
-             (info, msg, name, input_bfd, input_section, rel->r_offset);
-
-         if (! r)
-           return FALSE;
+           (*info->callbacks->warning) (info, msg, name, input_bfd,
+                                        input_section, rel->r_offset);
        }
     }
 
@@ -3655,7 +3647,7 @@ _bfinfdpic_count_relocs_fixups (struct bfinfdpic_relocs_info *entry,
 {
   bfd_vma relocs = 0, fixups = 0;
 
-  if (!bfd_link_executable (dinfo->info) || bfd_link_pie (dinfo->info))
+  if (!bfd_link_pde (dinfo->info))
     relocs = entry->relocs32 + entry->relocsfd + entry->relocsfdv;
   else
     {
@@ -4257,7 +4249,7 @@ elf32_bfinfdpic_size_dynamic_sections (bfd *output_bfd,
   if (htab->dynamic_sections_created)
     {
       /* Set the contents of the .interp section to the interpreter.  */
-      if (bfd_link_executable (info))
+      if (bfd_link_executable (info) && !info->nointerp)
        {
          s = bfd_get_linker_section (dynobj, ".interp");
          BFD_ASSERT (s != NULL);
@@ -4459,7 +4451,13 @@ elf32_bfinfdpic_finish_dynamic_sections (bfd *output_bfd,
   if (bfinfdpic_got_section (info))
     {
       BFD_ASSERT (bfinfdpic_gotrel_section (info)->size
-                 == (bfinfdpic_gotrel_section (info)->reloc_count
+                 /* PR 17334: It appears that the GOT section can end up
+                    being bigger than the number of relocs.  Presumably
+                    because some relocs have been deleted.  A test case has
+                    yet to be generated for verify this, but in the meantime
+                    the test below has been changed from == to >= so that
+                    applications can continue to be built.  */
+                 >= (bfinfdpic_gotrel_section (info)->reloc_count
                      * sizeof (Elf32_External_Rel)));
 
       if (bfinfdpic_gotfixup_section (info))
This page took 0.025756 seconds and 4 git commands to generate.