(c_variable_editable, cplus_variable_editable)
[deliverable/binutils-gdb.git] / bfd / elf32-hppa.c
index 07a448c6f40b67ccbe749c9e731b19a5fc5a4f0e..0da7e6d06d1c9ae6a1f34dc316ee916e90475200 100644 (file)
@@ -1,6 +1,6 @@
 /* BFD back-end for HP PA-RISC ELF files.
    Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1999, 2000, 2001,
-   2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+   2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
 
    Original code by
        Center for Software Science
@@ -14,7 +14,7 @@
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
 
-#include "bfd.h"
 #include "sysdep.h"
+#include "bfd.h"
 #include "libbfd.h"
 #include "elf-bfd.h"
 #include "elf/hppa.h"
@@ -1277,7 +1278,9 @@ elf32_hppa_check_relocs (bfd *abfd,
          /* This relocation describes which C++ vtable entries are actually
             used.  Record for later use during GC.  */
        case R_PARISC_GNU_VTENTRY:
-         if (!bfd_elf_gc_record_vtentry (abfd, sec, &hh->eh, rela->r_addend))
+         BFD_ASSERT (hh != NULL);
+         if (hh != NULL
+             && !bfd_elf_gc_record_vtentry (abfd, sec, &hh->eh, rela->r_addend))
            return FALSE;
          continue;
 
@@ -1588,38 +1591,20 @@ elf32_hppa_check_relocs (bfd *abfd,
 
 static asection *
 elf32_hppa_gc_mark_hook (asection *sec,
-                        struct bfd_link_info *info ATTRIBUTE_UNUSED,
+                        struct bfd_link_info *info,
                         Elf_Internal_Rela *rela,
                         struct elf_link_hash_entry *hh,
                         Elf_Internal_Sym *sym)
 {
   if (hh != NULL)
-    {
-      switch ((unsigned int) ELF32_R_TYPE (rela->r_info))
-       {
-       case R_PARISC_GNU_VTINHERIT:
-       case R_PARISC_GNU_VTENTRY:
-         break;
-
-       default:
-         switch (hh->root.type)
-           {
-           case bfd_link_hash_defined:
-           case bfd_link_hash_defweak:
-             return hh->root.u.def.section;
-
-           case bfd_link_hash_common:
-             return hh->root.u.c.p->section;
-
-           default:
-             break;
-           }
-       }
-    }
-  else
-    return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
+    switch ((unsigned int) ELF32_R_TYPE (rela->r_info))
+      {
+      case R_PARISC_GNU_VTINHERIT:
+      case R_PARISC_GNU_VTENTRY:
+       return NULL;
+      }
 
-  return NULL;
+  return _bfd_elf_gc_mark_hook (sec, info, rela, hh, sym);
 }
 
 /* Update the got and plt entry reference counts for the section being
@@ -1837,7 +1822,6 @@ elf32_hppa_adjust_dynamic_symbol (struct bfd_link_info *info,
 {
   struct elf32_hppa_link_hash_table *htab;
   asection *sec;
-  unsigned int power_of_two;
 
   /* If this is a function, put it in the procedure linkage table.  We
      will fill in the contents of the procedure linkage table later.  */
@@ -1947,30 +1931,9 @@ elf32_hppa_adjust_dynamic_symbol (struct bfd_link_info *info,
       eh->needs_copy = 1;
     }
 
-  /* We need to figure out the alignment required for this symbol.  I
-     have no idea how other ELF linkers handle this.  */
-
-  power_of_two = bfd_log2 (eh->size);
-  if (power_of_two > 3)
-    power_of_two = 3;
-
-  /* Apply the required alignment.  */
   sec = htab->sdynbss;
-  sec->size = BFD_ALIGN (sec->size, (bfd_size_type) (1 << power_of_two));
-  if (power_of_two > bfd_get_section_alignment (htab->etab.dynobj, sec))
-    {
-      if (! bfd_set_section_alignment (htab->etab.dynobj, sec, power_of_two))
-       return FALSE;
-    }
-
-  /* Define the symbol as being at this point in the section.  */
-  eh->root.u.def.section = sec;
-  eh->root.u.def.value = sec->size;
 
-  /* Increment the section size to make room for the symbol.  */
-  sec->size += eh->size;
-
-  return TRUE;
+  return _bfd_elf_adjust_dynamic_copy (eh, sec);
 }
 
 /* Allocate space in the .plt for entries that won't have relocations.
@@ -3669,9 +3632,6 @@ elf32_hppa_relocate_section (bfd *output_bfd,
   Elf_Internal_Rela *rela;
   Elf_Internal_Rela *relend;
 
-  if (info->relocatable)
-    return TRUE;
-
   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
 
   htab = hppa_link_hash_table (info);
@@ -3703,7 +3663,6 @@ elf32_hppa_relocate_section (bfd *output_bfd,
          || r_type == (unsigned int) R_PARISC_GNU_VTINHERIT)
        continue;
 
-      /* This is a final link.  */
       r_symndx = ELF32_R_SYM (rela->r_info);
       hh = NULL;
       sym = NULL;
@@ -3727,7 +3686,8 @@ elf32_hppa_relocate_section (bfd *output_bfd,
                                   eh, sym_sec, relocation,
                                   unresolved_reloc, warned_undef);
 
-         if (relocation == 0
+         if (!info->relocatable
+             && relocation == 0
              && eh->root.type != bfd_link_hash_defined
              && eh->root.type != bfd_link_hash_defweak
              && eh->root.type != bfd_link_hash_undefweak)
@@ -3746,6 +3706,22 @@ elf32_hppa_relocate_section (bfd *output_bfd,
          hh = hppa_elf_hash_entry (eh);
        }
 
+      if (sym_sec != NULL && elf_discarded_section (sym_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 (elf_hppa_howto_table + r_type, input_bfd,
+                              contents + rela->r_offset);
+         rela->r_info = 0;
+         rela->r_addend = 0;
+         continue;
+       }
+
+      if (info->relocatable)
+       continue;
+
       /* Do any required modifications to the relocation value, and
         determine what types of dynamic info we need to output, if
         any.  */
@@ -3957,11 +3933,7 @@ elf32_hppa_relocate_section (bfd *output_bfd,
        case R_PARISC_DPREL14R:
        case R_PARISC_DPREL21L:
        case R_PARISC_DIR32:
-         /* r_symndx will be zero only for relocs against symbols
-            from removed linkonce sections, or sections discarded by
-            a linker script.  */
-         if (r_symndx == 0
-             || (input_section->flags & SEC_ALLOC) == 0)
+         if ((input_section->flags & SEC_ALLOC) == 0)
            break;
 
          /* The reloc types handled here and this conditional
@@ -4042,17 +4014,22 @@ elf32_hppa_relocate_section (bfd *output_bfd,
                      && sym_sec->output_section != NULL
                      && ! bfd_is_abs_section (sym_sec))
                    {
-                     /* Skip this relocation if the output section has
-                        been discarded.  */
-                     if (bfd_is_abs_section (sym_sec->output_section))
-                       break;
+                     asection *osec;
+
+                     osec = sym_sec->output_section;
+                     indx = elf_section_data (osec)->dynindx;
+                     if (indx == 0)
+                       {
+                         osec = htab->etab.text_index_section;
+                         indx = elf_section_data (osec)->dynindx;
+                       }
+                     BFD_ASSERT (indx != 0);
 
-                     indx = elf_section_data (sym_sec->output_section)->dynindx;
                      /* We are turning this relocation into one
                         against a section symbol, so subtract out the
                         output section's address but not the offset
                         of the input section in the output section.  */
-                     outrel.r_addend -= sym_sec->output_section->vma;
+                     outrel.r_addend -= osec->vma;
                    }
 
                  outrel.r_info = ELF32_R_INFO (indx, r_type);
@@ -4605,30 +4582,6 @@ elf32_hppa_finish_dynamic_sections (bfd *output_bfd,
   return TRUE;
 }
 
-/* Tweak the OSABI field of the elf header.  */
-
-static void
-elf32_hppa_post_process_headers (bfd *abfd,
-                                struct bfd_link_info *info ATTRIBUTE_UNUSED)
-{
-  Elf_Internal_Ehdr * i_ehdrp;
-
-  i_ehdrp = elf_elfheader (abfd);
-
-  if (strcmp (bfd_get_target (abfd), "elf32-hppa-linux") == 0)
-    {
-      i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_LINUX;
-    }
-  else if (strcmp (bfd_get_target (abfd), "elf32-hppa-netbsd") == 0)
-    {
-      i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_NETBSD;
-    }
-  else
-    {
-      i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_HPUX;
-    }
-}
-
 /* Called when writing out an object file to decide the type of a
    symbol.  */
 static int
@@ -4643,6 +4596,7 @@ elf32_hppa_elf_get_symbol_type (Elf_Internal_Sym *elf_sym, int type)
 /* Misc BFD support code.  */
 #define bfd_elf32_bfd_is_local_label_name    elf_hppa_is_local_label_name
 #define bfd_elf32_bfd_reloc_type_lookup             elf_hppa_reloc_type_lookup
+#define bfd_elf32_bfd_reloc_name_lookup elf_hppa_reloc_name_lookup
 #define elf_info_to_howto                   elf_hppa_info_to_howto
 #define elf_info_to_howto_rel               elf_hppa_info_to_howto_rel
 
@@ -4660,13 +4614,14 @@ elf32_hppa_elf_get_symbol_type (Elf_Internal_Sym *elf_sym, int type)
 #define elf_backend_finish_dynamic_symbol    elf32_hppa_finish_dynamic_symbol
 #define elf_backend_finish_dynamic_sections  elf32_hppa_finish_dynamic_sections
 #define elf_backend_size_dynamic_sections    elf32_hppa_size_dynamic_sections
+#define elf_backend_init_index_section      _bfd_elf_init_1_index_section
 #define elf_backend_gc_mark_hook            elf32_hppa_gc_mark_hook
 #define elf_backend_gc_sweep_hook           elf32_hppa_gc_sweep_hook
 #define elf_backend_grok_prstatus           elf32_hppa_grok_prstatus
 #define elf_backend_grok_psinfo                     elf32_hppa_grok_psinfo
 #define elf_backend_object_p                elf32_hppa_object_p
 #define elf_backend_final_write_processing   elf_hppa_final_write_processing
-#define elf_backend_post_process_headers     elf32_hppa_post_process_headers
+#define elf_backend_post_process_headers     _bfd_elf_set_osabi
 #define elf_backend_get_symbol_type         elf32_hppa_elf_get_symbol_type
 #define elf_backend_reloc_type_class        elf32_hppa_reloc_type_class
 #define elf_backend_action_discarded        elf_hppa_action_discarded
@@ -4685,20 +4640,29 @@ elf32_hppa_elf_get_symbol_type (Elf_Internal_Sym *elf_sym, int type)
 #define ELF_ARCH               bfd_arch_hppa
 #define ELF_MACHINE_CODE       EM_PARISC
 #define ELF_MAXPAGESIZE                0x1000
+#define ELF_OSABI              ELFOSABI_HPUX
+#define elf32_bed              elf32_hppa_hpux_bed
 
 #include "elf32-target.h"
 
 #undef TARGET_BIG_SYM
-#define TARGET_BIG_SYM                 bfd_elf32_hppa_linux_vec
+#define TARGET_BIG_SYM         bfd_elf32_hppa_linux_vec
 #undef TARGET_BIG_NAME
-#define TARGET_BIG_NAME                        "elf32-hppa-linux"
+#define TARGET_BIG_NAME                "elf32-hppa-linux"
+#undef ELF_OSABI
+#define ELF_OSABI              ELFOSABI_LINUX
+#undef elf32_bed
+#define elf32_bed              elf32_hppa_linux_bed
 
-#define INCLUDED_TARGET_FILE 1
 #include "elf32-target.h"
 
 #undef TARGET_BIG_SYM
-#define TARGET_BIG_SYM                 bfd_elf32_hppa_nbsd_vec
+#define TARGET_BIG_SYM         bfd_elf32_hppa_nbsd_vec
 #undef TARGET_BIG_NAME
-#define TARGET_BIG_NAME                        "elf32-hppa-netbsd"
+#define TARGET_BIG_NAME                "elf32-hppa-netbsd"
+#undef ELF_OSABI
+#define ELF_OSABI              ELFOSABI_NETBSD
+#undef elf32_bed
+#define elf32_bed              elf32_hppa_netbsd_bed
 
 #include "elf32-target.h"
This page took 0.028443 seconds and 4 git commands to generate.