gas: avoid spurious failures in non-ELF targets in the SPARC testsuite.
[deliverable/binutils-gdb.git] / bfd / elf32-hppa.c
index 41bf5c57c59d27c4a9fcaf184f1c746ef1dd3706..be10c9b4a848eecea886948f912e7f3a9c8c60a8 100644 (file)
@@ -1,5 +1,5 @@
 /* BFD back-end for HP PA-RISC ELF files.
-   Copyright (C) 1990-2015 Free Software Foundation, Inc.
+   Copyright (C) 1990-2016 Free Software Foundation, Inc.
 
    Original code by
        Center for Software Science
@@ -270,7 +270,7 @@ struct elf32_hppa_link_hash_table
 
   /* Assorted information used by elf32_hppa_size_stubs.  */
   unsigned int bfd_count;
-  int top_index;
+  unsigned int top_index;
   asection **input_list;
   Elf_Internal_Sym **all_local_syms;
 
@@ -455,6 +455,18 @@ elf32_hppa_link_hash_table_create (bfd *abfd)
   return &htab->etab.root;
 }
 
+/* Initialize the linker stubs BFD so that we can use it for linker
+   created dynamic sections.  */
+
+void
+elf32_hppa_init_stub_bfd (bfd *abfd, struct bfd_link_info *info)
+{
+  struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
+
+  elf_elfheader (abfd)->e_ident[EI_CLASS] = ELFCLASS32;
+  htab->etab.dynobj = abfd;
+}
+
 /* Build a name for an entry in the stub hash table.  */
 
 static char *
@@ -1347,8 +1359,6 @@ elf32_hppa_check_relocs (bfd *abfd,
             relocation for this entry.  */
          if (htab->sgot == NULL)
            {
-             if (htab->etab.dynobj == NULL)
-               htab->etab.dynobj = abfd;
              if (!elf32_hppa_create_dynamic_sections (htab->etab.dynobj, info))
                return FALSE;
            }
@@ -1484,9 +1494,6 @@ elf32_hppa_check_relocs (bfd *abfd,
                 this reloc.  */
              if (sreloc == NULL)
                {
-                 if (htab->etab.dynobj == NULL)
-                   htab->etab.dynobj = abfd;
-
                  sreloc = _bfd_elf_make_dynamic_reloc_section
                    (sec, htab->etab.dynobj, 2, abfd, /*rela?*/ TRUE);
 
@@ -2215,7 +2222,7 @@ elf32_hppa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
   if (htab->etab.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)
        {
          sec = bfd_get_linker_section (dynobj, ".interp");
          if (sec == NULL)
@@ -2495,7 +2502,7 @@ elf32_hppa_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info)
 {
   bfd *input_bfd;
   unsigned int bfd_count;
-  int top_id, top_index;
+  unsigned int top_id, top_index;
   asection *section;
   asection **input_list, **list;
   bfd_size_type amt;
@@ -3071,7 +3078,8 @@ elf32_hppa_size_stubs
       for (stub_sec = htab->stub_bfd->sections;
           stub_sec != NULL;
           stub_sec = stub_sec->next)
-       stub_sec->size = 0;
+       if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
+         stub_sec->size = 0;
 
       bfd_hash_traverse (&htab->bstab, hppa_size_one_stub, htab);
 
@@ -3193,16 +3201,15 @@ elf32_hppa_build_stubs (struct bfd_link_info *info)
   for (stub_sec = htab->stub_bfd->sections;
        stub_sec != NULL;
        stub_sec = stub_sec->next)
-    {
-      bfd_size_type size;
-
-      /* Allocate memory to hold the linker stubs.  */
-      size = stub_sec->size;
-      stub_sec->contents = bfd_zalloc (htab->stub_bfd, size);
-      if (stub_sec->contents == NULL && size != 0)
-       return FALSE;
-      stub_sec->size = 0;
-    }
+    if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
+       && stub_sec->size != 0)
+      {
+       /* Allocate memory to hold the linker stubs.  */
+       stub_sec->contents = bfd_zalloc (htab->stub_bfd, stub_sec->size);
+       if (stub_sec->contents == NULL)
+         return FALSE;
+       stub_sec->size = 0;
+      }
 
   /* Build the stubs as directed by the stub hash table.  */
   table = &htab->bstab;
@@ -3245,6 +3252,8 @@ tpoff (struct bfd_link_info *info, bfd_vma address)
 static bfd_boolean
 elf32_hppa_final_link (bfd *abfd, struct bfd_link_info *info)
 {
+  struct stat buf;
+
   /* Invoke the regular ELF linker to do all the work.  */
   if (!bfd_elf_final_link (abfd, info))
     return FALSE;
@@ -3254,6 +3263,13 @@ elf32_hppa_final_link (bfd *abfd, struct bfd_link_info *info)
   if (bfd_link_relocatable (info))
     return TRUE;
 
+  /* Do not attempt to sort non-regular files.  This is here
+     especially for configure scripts and kernel builds which run
+     tests with "ld [...] -o /dev/null".  */
+  if (stat (abfd->filename, &buf) != 0
+      || !S_ISREG(buf.st_mode))
+    return TRUE;
+
   return elf_hppa_sort_unwind (abfd);
 }
 
@@ -3717,10 +3733,9 @@ elf32_hppa_relocate_section (bfd *output_bfd,
                  && ELF_ST_VISIBILITY (eh->other) == STV_DEFAULT
                  && eh->type == STT_PARISC_MILLI)
                {
-                 if (! info->callbacks->undefined_symbol
-                     (info, eh_name (eh), input_bfd,
-                      input_section, rela->r_offset, FALSE))
-                   return FALSE;
+                 (*info->callbacks->undefined_symbol)
+                   (info, eh_name (eh), input_bfd,
+                    input_section, rela->r_offset, FALSE);
                  warned_undef = TRUE;
                }
            }
@@ -4295,12 +4310,9 @@ elf32_hppa_relocate_section (bfd *output_bfd,
            }
        }
       else
-       {
-         if (!((*info->callbacks->reloc_overflow)
-               (info, (hh ? &hh->eh.root : NULL), sym_name, howto->name,
-                (bfd_vma) 0, input_bfd, input_section, rela->r_offset)))
-           return FALSE;
-       }
+       (*info->callbacks->reloc_overflow)
+         (info, (hh ? &hh->eh.root : NULL), sym_name, howto->name,
+          (bfd_vma) 0, input_bfd, input_section, rela->r_offset);
     }
 
   return TRUE;
@@ -4585,9 +4597,10 @@ elf32_hppa_finish_dynamic_sections (bfd *output_bfd,
 
   if (htab->splt != NULL && htab->splt->size != 0)
     {
-      /* Set plt entry size.  */
-      elf_section_data (htab->splt->output_section)
-       ->this_hdr.sh_entsize = PLT_ENTRY_SIZE;
+      /* Set plt entry size to 0 instead of PLT_ENTRY_SIZE, since we add the
+        plt stubs and as such the section does not hold a table of fixed-size
+        entries.  */
+      elf_section_data (htab->splt->output_section)->this_hdr.sh_entsize = 0;
 
       if (htab->need_plt_stub)
        {
This page took 0.027422 seconds and 4 git commands to generate.