Prevent overflowing the selected_cpu_name buffer in the ARM assembler.
[deliverable/binutils-gdb.git] / bfd / elf32-sparc.c
index 033378ecc674c2af9ff5f2b0e6bfc15223fea2fa..8b8b601f35381b302fe6e23fb6cf3cdadf7e1bcf 100644 (file)
@@ -1,12 +1,11 @@
 /* SPARC-specific support for 32-bit ELF
 /* SPARC-specific support for 32-bit ELF
-   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-   2003, 2004, 2005 Free Software Foundation, Inc.
+   Copyright (C) 1993-2015 Free Software Foundation, Inc.
 
    This file is part of BFD, the Binary File Descriptor library.
 
    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
 
    This file is part of BFD, the Binary File Descriptor library.
 
    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,
    (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
 
    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., 59 Temple Place - Suite 330, Boston, MA 02110-1301, USA.  */
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
 
 
-#include "bfd.h"
 #include "sysdep.h"
 #include "sysdep.h"
+#include "bfd.h"
 #include "bfdlink.h"
 #include "libbfd.h"
 #include "elf-bfd.h"
 #include "elf/sparc.h"
 #include "opcode/sparc.h"
 #include "elfxx-sparc.h"
 #include "bfdlink.h"
 #include "libbfd.h"
 #include "elf-bfd.h"
 #include "elf/sparc.h"
 #include "opcode/sparc.h"
 #include "elfxx-sparc.h"
+#include "elf-vxworks.h"
 
 /* Support for core dump NOTE sections.  */
 
 
 /* Support for core dump NOTE sections.  */
 
@@ -38,16 +39,16 @@ elf32_sparc_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
       return FALSE;
 
     case 260:                  /* Solaris prpsinfo_t.  */
       return FALSE;
 
     case 260:                  /* Solaris prpsinfo_t.  */
-      elf_tdata (abfd)->core_program
+      elf_tdata (abfd)->core->program
        = _bfd_elfcore_strndup (abfd, note->descdata + 84, 16);
        = _bfd_elfcore_strndup (abfd, note->descdata + 84, 16);
-      elf_tdata (abfd)->core_command
+      elf_tdata (abfd)->core->command
        = _bfd_elfcore_strndup (abfd, note->descdata + 100, 80);
       break;
 
     case 336:                  /* Solaris psinfo_t.  */
        = _bfd_elfcore_strndup (abfd, note->descdata + 100, 80);
       break;
 
     case 336:                  /* Solaris psinfo_t.  */
-      elf_tdata (abfd)->core_program
+      elf_tdata (abfd)->core->program
        = _bfd_elfcore_strndup (abfd, note->descdata + 88, 16);
        = _bfd_elfcore_strndup (abfd, note->descdata + 88, 16);
-      elf_tdata (abfd)->core_command
+      elf_tdata (abfd)->core->command
        = _bfd_elfcore_strndup (abfd, note->descdata + 104, 80);
       break;
     }
        = _bfd_elfcore_strndup (abfd, note->descdata + 104, 80);
       break;
     }
@@ -108,7 +109,7 @@ elf32_sparc_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
       return FALSE;
     }
 
       return FALSE;
     }
 
-  return TRUE;
+  return _bfd_sparc_elf_merge_private_bfd_data (ibfd, obfd);
 }
 
 /* The final processing done just before writing out the object file.
 }
 
 /* The final processing done just before writing out the object file.
@@ -150,7 +151,9 @@ elf32_sparc_final_write_processing (bfd *abfd,
 }
 
 static enum elf_reloc_type_class
 }
 
 static enum elf_reloc_type_class
-elf32_sparc_reloc_type_class (const Elf_Internal_Rela *rela)
+elf32_sparc_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
+                             const asection *rel_sec ATTRIBUTE_UNUSED,
+                             const Elf_Internal_Rela *rela)
 {
   switch ((int) ELF32_R_TYPE (rela->r_info))
     {
 {
   switch ((int) ELF32_R_TYPE (rela->r_info))
     {
@@ -165,12 +168,34 @@ elf32_sparc_reloc_type_class (const Elf_Internal_Rela *rela)
     }
 }
 
     }
 }
 
-#define TARGET_BIG_SYM bfd_elf32_sparc_vec
+/* Hook called by the linker routine which adds symbols from an object
+   file.  */
+
+static bfd_boolean
+elf32_sparc_add_symbol_hook (bfd * abfd,
+                            struct bfd_link_info * info,
+                            Elf_Internal_Sym * sym,
+                            const char ** namep ATTRIBUTE_UNUSED,
+                            flagword * flagsp ATTRIBUTE_UNUSED,
+                            asection ** secp ATTRIBUTE_UNUSED,
+                            bfd_vma * valp ATTRIBUTE_UNUSED)
+{
+  if ((ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC
+       || ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE)
+      && (abfd->flags & DYNAMIC) == 0
+      && bfd_get_flavour (info->output_bfd) == bfd_target_elf_flavour)
+    elf_tdata (info->output_bfd)->has_gnu_symbols = elf_gnu_symbol_any;
+  return TRUE;
+}
+
+#define TARGET_BIG_SYM sparc_elf32_vec
 #define TARGET_BIG_NAME        "elf32-sparc"
 #define ELF_ARCH       bfd_arch_sparc
 #define TARGET_BIG_NAME        "elf32-sparc"
 #define ELF_ARCH       bfd_arch_sparc
+#define ELF_TARGET_ID  SPARC_ELF_DATA
 #define ELF_MACHINE_CODE EM_SPARC
 #define ELF_MACHINE_ALT1 EM_SPARC32PLUS
 #define ELF_MAXPAGESIZE 0x10000
 #define ELF_MACHINE_CODE EM_SPARC
 #define ELF_MACHINE_ALT1 EM_SPARC32PLUS
 #define ELF_MAXPAGESIZE 0x10000
+#define ELF_COMMONPAGESIZE 0x2000
 
 #define bfd_elf32_bfd_merge_private_bfd_data \
                                        elf32_sparc_merge_private_bfd_data
 
 #define bfd_elf32_bfd_merge_private_bfd_data \
                                        elf32_sparc_merge_private_bfd_data
@@ -181,6 +206,8 @@ elf32_sparc_reloc_type_class (const Elf_Internal_Rela *rela)
 
 #define elf_info_to_howto              _bfd_sparc_elf_info_to_howto
 #define bfd_elf32_bfd_reloc_type_lookup        _bfd_sparc_elf_reloc_type_lookup
 
 #define elf_info_to_howto              _bfd_sparc_elf_info_to_howto
 #define bfd_elf32_bfd_reloc_type_lookup        _bfd_sparc_elf_reloc_type_lookup
+#define bfd_elf32_bfd_reloc_name_lookup \
+  _bfd_sparc_elf_reloc_name_lookup
 #define bfd_elf32_bfd_link_hash_table_create \
                                        _bfd_sparc_elf_link_hash_table_create
 #define bfd_elf32_bfd_relax_section    _bfd_sparc_elf_relax_section
 #define bfd_elf32_bfd_link_hash_table_create \
                                        _bfd_sparc_elf_link_hash_table_create
 #define bfd_elf32_bfd_relax_section    _bfd_sparc_elf_relax_section
@@ -205,6 +232,7 @@ elf32_sparc_reloc_type_class (const Elf_Internal_Rela *rela)
 #define elf_backend_gc_mark_hook       _bfd_sparc_elf_gc_mark_hook
 #define elf_backend_gc_sweep_hook       _bfd_sparc_elf_gc_sweep_hook
 #define elf_backend_plt_sym_val                _bfd_sparc_elf_plt_sym_val
 #define elf_backend_gc_mark_hook       _bfd_sparc_elf_gc_mark_hook
 #define elf_backend_gc_sweep_hook       _bfd_sparc_elf_gc_sweep_hook
 #define elf_backend_plt_sym_val                _bfd_sparc_elf_plt_sym_val
+#define elf_backend_init_index_section _bfd_elf_init_1_index_section
 
 #define elf_backend_can_gc_sections 1
 #define elf_backend_can_refcount 1
 
 #define elf_backend_can_gc_sections 1
 #define elf_backend_can_refcount 1
@@ -214,4 +242,89 @@ elf32_sparc_reloc_type_class (const Elf_Internal_Rela *rela)
 #define elf_backend_got_header_size 4
 #define elf_backend_rela_normal 1
 
 #define elf_backend_got_header_size 4
 #define elf_backend_rela_normal 1
 
+#define elf_backend_add_symbol_hook            elf32_sparc_add_symbol_hook
+
+#include "elf32-target.h"
+
+/* Solaris 2.  */
+
+#undef TARGET_BIG_SYM
+#define        TARGET_BIG_SYM                          sparc_elf32_sol2_vec
+#undef TARGET_BIG_NAME
+#define        TARGET_BIG_NAME                         "elf32-sparc-sol2"
+
+#undef elf32_bed
+#define elf32_bed                              elf32_sparc_sol2_bed
+
+/* The 32-bit static TLS arena size is rounded to the nearest 8-byte
+   boundary.  */
+#undef elf_backend_static_tls_alignment
+#define elf_backend_static_tls_alignment       8
+
+#include "elf32-target.h"
+
+/* A wrapper around _bfd_sparc_elf_link_hash_table_create that identifies
+   the target system as VxWorks.  */
+
+static struct bfd_link_hash_table *
+elf32_sparc_vxworks_link_hash_table_create (bfd *abfd)
+{
+  struct bfd_link_hash_table *ret;
+
+  ret = _bfd_sparc_elf_link_hash_table_create (abfd);
+  if (ret)
+    {
+      struct _bfd_sparc_elf_link_hash_table *htab;
+
+      htab = (struct _bfd_sparc_elf_link_hash_table *) ret;
+      htab->is_vxworks = 1;
+    }
+  return ret;
+}
+
+/* A final_write_processing hook that does both the SPARC- and VxWorks-
+   specific handling.  */
+
+static void
+elf32_sparc_vxworks_final_write_processing (bfd *abfd, bfd_boolean linker)
+{
+  elf32_sparc_final_write_processing (abfd, linker);
+  elf_vxworks_final_write_processing (abfd, linker);
+}
+
+#undef TARGET_BIG_SYM
+#define TARGET_BIG_SYM sparc_elf32_vxworks_vec
+#undef TARGET_BIG_NAME
+#define TARGET_BIG_NAME        "elf32-sparc-vxworks"
+
+#undef ELF_MINPAGESIZE
+#define ELF_MINPAGESIZE        0x1000
+
+#undef bfd_elf32_bfd_link_hash_table_create
+#define bfd_elf32_bfd_link_hash_table_create \
+  elf32_sparc_vxworks_link_hash_table_create
+
+#undef elf_backend_want_got_plt
+#define elf_backend_want_got_plt               1
+#undef elf_backend_plt_readonly
+#define elf_backend_plt_readonly               1
+#undef elf_backend_got_header_size
+#define elf_backend_got_header_size            12
+#undef elf_backend_add_symbol_hook
+#define elf_backend_add_symbol_hook \
+  elf_vxworks_add_symbol_hook
+#undef elf_backend_link_output_symbol_hook
+#define elf_backend_link_output_symbol_hook \
+  elf_vxworks_link_output_symbol_hook
+#undef elf_backend_emit_relocs
+#define elf_backend_emit_relocs \
+  elf_vxworks_emit_relocs
+#undef elf_backend_final_write_processing
+#define elf_backend_final_write_processing \
+  elf32_sparc_vxworks_final_write_processing
+#undef elf_backend_static_tls_alignment
+
+#undef elf32_bed
+#define elf32_bed                              sparc_elf_vxworks_bed
+
 #include "elf32-target.h"
 #include "elf32-target.h"
This page took 0.025593 seconds and 4 git commands to generate.