Home | History | Annotate | Line # | Download | only in bfd
      1   1.1  christos /* SPARC-specific support for ELF
      2  1.10  christos    Copyright (C) 2005-2025 Free Software Foundation, Inc.
      3   1.1  christos 
      4   1.1  christos    This file is part of BFD, the Binary File Descriptor library.
      5   1.1  christos 
      6   1.1  christos    This program is free software; you can redistribute it and/or modify
      7   1.1  christos    it under the terms of the GNU General Public License as published by
      8   1.1  christos    the Free Software Foundation; either version 3 of the License, or
      9   1.1  christos    (at your option) any later version.
     10   1.1  christos 
     11   1.1  christos    This program is distributed in the hope that it will be useful,
     12   1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13   1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14   1.1  christos    GNU General Public License for more details.
     15   1.1  christos 
     16   1.1  christos    You should have received a copy of the GNU General Public License
     17   1.1  christos    along with this program; if not, write to the Free Software
     18   1.1  christos    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     19   1.1  christos    MA 02110-1301, USA.  */
     20   1.1  christos 
     21   1.1  christos 
     22   1.1  christos /* This file handles functionality common to the different SPARC ABI's.  */
     23   1.1  christos 
     24   1.1  christos #include "sysdep.h"
     25   1.1  christos #include "bfd.h"
     26   1.1  christos #include "bfdlink.h"
     27   1.1  christos #include "libbfd.h"
     28   1.1  christos #include "libiberty.h"
     29   1.1  christos #include "elf-bfd.h"
     30   1.1  christos #include "elf/sparc.h"
     31   1.1  christos #include "opcode/sparc.h"
     32   1.1  christos #include "elfxx-sparc.h"
     33   1.1  christos #include "elf-vxworks.h"
     34   1.1  christos #include "objalloc.h"
     35   1.1  christos #include "hashtab.h"
     36   1.1  christos 
     37   1.1  christos /* In case we're on a 32-bit machine, construct a 64-bit "-1" value.  */
     38   1.1  christos #define MINUS_ONE (~ (bfd_vma) 0)
     39   1.1  christos 
     40   1.1  christos #define ABI_64_P(abfd) \
     41   1.1  christos   (get_elf_backend_data (abfd)->s->elfclass == ELFCLASS64)
     42   1.1  christos 
     43   1.1  christos /* The relocation "howto" table.  */
     44   1.1  christos 
     45   1.1  christos /* Utility for performing the standard initial work of an instruction
     46   1.1  christos    relocation.
     47   1.1  christos    *PRELOCATION will contain the relocated item.
     48   1.1  christos    *PINSN will contain the instruction from the input stream.
     49   1.1  christos    If the result is `bfd_reloc_other' the caller can continue with
     50   1.1  christos    performing the relocation.  Otherwise it must stop and return the
     51   1.1  christos    value to its caller.  */
     52   1.1  christos 
     53   1.1  christos static bfd_reloc_status_type
     54   1.1  christos init_insn_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
     55   1.1  christos 		 void * data, asection *input_section, bfd *output_bfd,
     56   1.1  christos 		 bfd_vma *prelocation, bfd_vma *pinsn)
     57   1.1  christos {
     58   1.1  christos   bfd_vma relocation;
     59   1.1  christos   reloc_howto_type *howto = reloc_entry->howto;
     60   1.1  christos 
     61   1.1  christos   if (output_bfd != (bfd *) NULL
     62   1.1  christos       && (symbol->flags & BSF_SECTION_SYM) == 0
     63   1.1  christos       && (! howto->partial_inplace
     64   1.1  christos 	  || reloc_entry->addend == 0))
     65   1.1  christos     {
     66   1.1  christos       reloc_entry->address += input_section->output_offset;
     67   1.1  christos       return bfd_reloc_ok;
     68   1.1  christos     }
     69   1.1  christos 
     70   1.1  christos   /* This works because partial_inplace is FALSE.  */
     71   1.1  christos   if (output_bfd != NULL)
     72   1.1  christos     return bfd_reloc_continue;
     73   1.1  christos 
     74   1.1  christos   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
     75   1.1  christos     return bfd_reloc_outofrange;
     76   1.1  christos 
     77   1.1  christos   relocation = (symbol->value
     78   1.1  christos 		+ symbol->section->output_section->vma
     79   1.1  christos 		+ symbol->section->output_offset);
     80   1.1  christos   relocation += reloc_entry->addend;
     81   1.1  christos   if (howto->pc_relative)
     82   1.1  christos     {
     83   1.1  christos       relocation -= (input_section->output_section->vma
     84   1.1  christos 		     + input_section->output_offset);
     85   1.1  christos       relocation -= reloc_entry->address;
     86   1.1  christos     }
     87   1.1  christos 
     88   1.1  christos   *prelocation = relocation;
     89   1.1  christos   *pinsn = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
     90   1.1  christos   return bfd_reloc_other;
     91   1.1  christos }
     92   1.1  christos 
     93   1.1  christos /* For unsupported relocs.  */
     94   1.1  christos 
     95   1.1  christos static bfd_reloc_status_type
     96   1.1  christos sparc_elf_notsup_reloc (bfd *abfd ATTRIBUTE_UNUSED,
     97   1.1  christos 			arelent *reloc_entry ATTRIBUTE_UNUSED,
     98   1.1  christos 			asymbol *symbol ATTRIBUTE_UNUSED,
     99   1.1  christos 			void * data ATTRIBUTE_UNUSED,
    100   1.1  christos 			asection *input_section ATTRIBUTE_UNUSED,
    101   1.1  christos 			bfd *output_bfd ATTRIBUTE_UNUSED,
    102   1.1  christos 			char **error_message ATTRIBUTE_UNUSED)
    103   1.1  christos {
    104   1.1  christos   return bfd_reloc_notsupported;
    105   1.1  christos }
    106   1.1  christos 
    107   1.1  christos /* Handle the WDISP16 reloc.  */
    108   1.1  christos 
    109   1.1  christos static bfd_reloc_status_type
    110   1.1  christos sparc_elf_wdisp16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
    111   1.1  christos 			 void * data, asection *input_section, bfd *output_bfd,
    112   1.1  christos 			 char **error_message ATTRIBUTE_UNUSED)
    113   1.1  christos {
    114   1.1  christos   bfd_vma relocation;
    115   1.1  christos   bfd_vma insn;
    116   1.1  christos   bfd_reloc_status_type status;
    117   1.1  christos 
    118   1.1  christos   status = init_insn_reloc (abfd, reloc_entry, symbol, data,
    119   1.1  christos 			    input_section, output_bfd, &relocation, &insn);
    120   1.1  christos   if (status != bfd_reloc_other)
    121   1.1  christos     return status;
    122   1.1  christos 
    123   1.1  christos   insn &= ~ (bfd_vma) 0x303fff;
    124   1.1  christos   insn |= (((relocation >> 2) & 0xc000) << 6) | ((relocation >> 2) & 0x3fff);
    125   1.1  christos   bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
    126   1.1  christos 
    127   1.1  christos   if ((bfd_signed_vma) relocation < - 0x40000
    128   1.1  christos       || (bfd_signed_vma) relocation > 0x3ffff)
    129   1.1  christos     return bfd_reloc_overflow;
    130   1.1  christos   else
    131   1.1  christos     return bfd_reloc_ok;
    132   1.1  christos }
    133   1.1  christos 
    134   1.1  christos /* Handle the WDISP10 reloc.  */
    135   1.1  christos 
    136   1.1  christos static bfd_reloc_status_type
    137   1.1  christos sparc_elf_wdisp10_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
    138   1.1  christos 			 void * data, asection *input_section, bfd *output_bfd,
    139   1.1  christos 			 char **error_message ATTRIBUTE_UNUSED)
    140   1.1  christos {
    141   1.1  christos   bfd_vma relocation;
    142   1.1  christos   bfd_vma insn;
    143   1.1  christos   bfd_reloc_status_type status;
    144   1.1  christos 
    145   1.1  christos   status = init_insn_reloc (abfd, reloc_entry, symbol, data,
    146   1.1  christos 			    input_section, output_bfd, &relocation, &insn);
    147   1.1  christos   if (status != bfd_reloc_other)
    148   1.1  christos     return status;
    149   1.1  christos 
    150   1.1  christos   insn &= ~ (bfd_vma) 0x181fe0;
    151   1.1  christos   insn |= (((relocation >> 2) & 0x300) << 11)
    152   1.1  christos 	  | (((relocation >> 2) & 0xff) << 5);
    153   1.1  christos   bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
    154   1.1  christos 
    155   1.1  christos   if ((bfd_signed_vma) relocation < - 0x1000
    156   1.1  christos       || (bfd_signed_vma) relocation > 0xfff)
    157   1.1  christos     return bfd_reloc_overflow;
    158   1.1  christos   else
    159   1.1  christos     return bfd_reloc_ok;
    160   1.1  christos }
    161   1.1  christos 
    162   1.1  christos /* Handle the HIX22 reloc.  */
    163   1.1  christos 
    164   1.1  christos static bfd_reloc_status_type
    165   1.1  christos sparc_elf_hix22_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
    166   1.1  christos 		       void * data, asection *input_section, bfd *output_bfd,
    167   1.1  christos 		       char **error_message ATTRIBUTE_UNUSED)
    168   1.1  christos {
    169   1.1  christos   bfd_vma relocation;
    170   1.1  christos   bfd_vma insn;
    171   1.1  christos   bfd_reloc_status_type status;
    172   1.1  christos 
    173   1.1  christos   status = init_insn_reloc (abfd, reloc_entry, symbol, data,
    174   1.1  christos 			    input_section, output_bfd, &relocation, &insn);
    175   1.1  christos   if (status != bfd_reloc_other)
    176   1.1  christos     return status;
    177   1.1  christos 
    178   1.1  christos   relocation ^= MINUS_ONE;
    179   1.1  christos   insn = (insn &~ (bfd_vma) 0x3fffff) | ((relocation >> 10) & 0x3fffff);
    180   1.1  christos   bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
    181   1.1  christos 
    182   1.1  christos   if ((relocation & ~ (bfd_vma) 0xffffffff) != 0)
    183   1.1  christos     return bfd_reloc_overflow;
    184   1.1  christos   else
    185   1.1  christos     return bfd_reloc_ok;
    186   1.1  christos }
    187   1.1  christos 
    188   1.1  christos /* Handle the LOX10 reloc.  */
    189   1.1  christos 
    190   1.1  christos static bfd_reloc_status_type
    191   1.1  christos sparc_elf_lox10_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
    192   1.1  christos 		       void * data, asection *input_section, bfd *output_bfd,
    193   1.1  christos 		       char **error_message ATTRIBUTE_UNUSED)
    194   1.1  christos {
    195   1.1  christos   bfd_vma relocation;
    196   1.1  christos   bfd_vma insn;
    197   1.1  christos   bfd_reloc_status_type status;
    198   1.1  christos 
    199   1.1  christos   status = init_insn_reloc (abfd, reloc_entry, symbol, data,
    200   1.1  christos 			    input_section, output_bfd, &relocation, &insn);
    201   1.1  christos   if (status != bfd_reloc_other)
    202   1.1  christos     return status;
    203   1.1  christos 
    204   1.1  christos   insn = (insn &~ (bfd_vma) 0x1fff) | 0x1c00 | (relocation & 0x3ff);
    205   1.1  christos   bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
    206   1.1  christos 
    207   1.1  christos   return bfd_reloc_ok;
    208   1.1  christos }
    209   1.1  christos 
    210   1.1  christos static reloc_howto_type _bfd_sparc_elf_howto_table[] =
    211   1.1  christos {
    212   1.8  christos   HOWTO(R_SPARC_NONE,	   0,0, 0,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_NONE",	false,0,0x00000000,true),
    213   1.8  christos   HOWTO(R_SPARC_8,	   0,1, 8,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_8",	false,0,0x000000ff,true),
    214   1.8  christos   HOWTO(R_SPARC_16,	   0,2,16,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_16",	false,0,0x0000ffff,true),
    215   1.8  christos   HOWTO(R_SPARC_32,	   0,4,32,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_32",	false,0,0xffffffff,true),
    216   1.8  christos   HOWTO(R_SPARC_DISP8,	   0,1, 8,true, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_DISP8",	false,0,0x000000ff,true),
    217   1.8  christos   HOWTO(R_SPARC_DISP16,	   0,2,16,true, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_DISP16",	false,0,0x0000ffff,true),
    218   1.8  christos   HOWTO(R_SPARC_DISP32,	   0,4,32,true, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_DISP32",	false,0,0xffffffff,true),
    219   1.8  christos   HOWTO(R_SPARC_WDISP30,   2,4,30,true, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_WDISP30", false,0,0x3fffffff,true),
    220   1.8  christos   HOWTO(R_SPARC_WDISP22,   2,4,22,true, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_WDISP22", false,0,0x003fffff,true),
    221   1.8  christos   HOWTO(R_SPARC_HI22,	  10,4,22,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_HI22",	false,0,0x003fffff,true),
    222   1.8  christos   HOWTO(R_SPARC_22,	   0,4,22,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_22",	false,0,0x003fffff,true),
    223   1.8  christos   HOWTO(R_SPARC_13,	   0,4,13,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_13",	false,0,0x00001fff,true),
    224   1.8  christos   HOWTO(R_SPARC_LO10,	   0,4,10,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_LO10",	false,0,0x000003ff,true),
    225   1.8  christos   HOWTO(R_SPARC_GOT10,	   0,4,10,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_GOT10",	false,0,0x000003ff,true),
    226   1.8  christos   HOWTO(R_SPARC_GOT13,	   0,4,13,false,0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_GOT13",	false,0,0x00001fff,true),
    227   1.8  christos   HOWTO(R_SPARC_GOT22,	  10,4,22,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_GOT22",	false,0,0x003fffff,true),
    228   1.8  christos   HOWTO(R_SPARC_PC10,	   0,4,10,true, 0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_PC10",	false,0,0x000003ff,true),
    229   1.8  christos   HOWTO(R_SPARC_PC22,	  10,4,22,true, 0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_PC22",	false,0,0x003fffff,true),
    230   1.8  christos   HOWTO(R_SPARC_WPLT30,	   2,4,30,true, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_WPLT30",	false,0,0x3fffffff,true),
    231   1.8  christos   HOWTO(R_SPARC_COPY,	   0,0,00,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_COPY",	false,0,0x00000000,true),
    232   1.8  christos   HOWTO(R_SPARC_GLOB_DAT,  0,0,00,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_GLOB_DAT",false,0,0x00000000,true),
    233   1.8  christos   HOWTO(R_SPARC_JMP_SLOT,  0,0,00,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_JMP_SLOT",false,0,0x00000000,true),
    234   1.8  christos   HOWTO(R_SPARC_RELATIVE,  0,0,00,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_RELATIVE",false,0,0x00000000,true),
    235   1.8  christos   HOWTO(R_SPARC_UA32,	   0,4,32,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_UA32",	false,0,0xffffffff,true),
    236   1.8  christos   HOWTO(R_SPARC_PLT32,	   0,4,32,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_PLT32",	false,0,0xffffffff,true),
    237   1.8  christos   HOWTO(R_SPARC_HIPLT22,   0,0,00,false,0,complain_overflow_dont,    sparc_elf_notsup_reloc, "R_SPARC_HIPLT22",	 false,0,0x00000000,true),
    238   1.8  christos   HOWTO(R_SPARC_LOPLT10,   0,0,00,false,0,complain_overflow_dont,    sparc_elf_notsup_reloc, "R_SPARC_LOPLT10",	 false,0,0x00000000,true),
    239   1.8  christos   HOWTO(R_SPARC_PCPLT32,   0,0,00,false,0,complain_overflow_dont,    sparc_elf_notsup_reloc, "R_SPARC_PCPLT32",	 false,0,0x00000000,true),
    240   1.8  christos   HOWTO(R_SPARC_PCPLT22,   0,0,00,false,0,complain_overflow_dont,    sparc_elf_notsup_reloc, "R_SPARC_PCPLT22",	 false,0,0x00000000,true),
    241   1.8  christos   HOWTO(R_SPARC_PCPLT10,   0,0,00,false,0,complain_overflow_dont,    sparc_elf_notsup_reloc, "R_SPARC_PCPLT10",	 false,0,0x00000000,true),
    242   1.8  christos   HOWTO(R_SPARC_10,	   0,4,10,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_10",	false,0,0x000003ff,true),
    243   1.8  christos   HOWTO(R_SPARC_11,	   0,4,11,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_11",	false,0,0x000007ff,true),
    244   1.8  christos   HOWTO(R_SPARC_64,	   0,8,64,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_64",	false,0,MINUS_ONE, true),
    245   1.8  christos   HOWTO(R_SPARC_OLO10,	   0,4,13,false,0,complain_overflow_signed,  sparc_elf_notsup_reloc, "R_SPARC_OLO10",	false,0,0x00001fff,true),
    246   1.8  christos   HOWTO(R_SPARC_HH22,	  42,4,22,false,0,complain_overflow_unsigned,bfd_elf_generic_reloc,  "R_SPARC_HH22",	false,0,0x003fffff,true),
    247   1.8  christos   HOWTO(R_SPARC_HM10,	  32,4,10,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_HM10",	false,0,0x000003ff,true),
    248   1.8  christos   HOWTO(R_SPARC_LM22,	  10,4,22,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_LM22",	false,0,0x003fffff,true),
    249   1.8  christos   HOWTO(R_SPARC_PC_HH22,  42,4,22,true, 0,complain_overflow_unsigned,bfd_elf_generic_reloc,  "R_SPARC_PC_HH22",	   false,0,0x003fffff,true),
    250   1.8  christos   HOWTO(R_SPARC_PC_HM10,  32,4,10,true, 0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_PC_HM10",	   false,0,0x000003ff,true),
    251   1.8  christos   HOWTO(R_SPARC_PC_LM22,  10,4,22,true, 0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_PC_LM22",	   false,0,0x003fffff,true),
    252   1.8  christos   HOWTO(R_SPARC_WDISP16,   2,4,16,true, 0,complain_overflow_signed,  sparc_elf_wdisp16_reloc,"R_SPARC_WDISP16", false,0,0x00000000,true),
    253   1.8  christos   HOWTO(R_SPARC_WDISP19,   2,4,19,true, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_WDISP19", false,0,0x0007ffff,true),
    254   1.8  christos   HOWTO(R_SPARC_UNUSED_42, 0,0, 0,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_UNUSED_42",false,0,0x00000000,true),
    255   1.8  christos   HOWTO(R_SPARC_7,	   0,4, 7,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_7",	false,0,0x0000007f,true),
    256   1.8  christos   HOWTO(R_SPARC_5,	   0,4, 5,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_5",	false,0,0x0000001f,true),
    257   1.8  christos   HOWTO(R_SPARC_6,	   0,4, 6,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_6",	false,0,0x0000003f,true),
    258   1.8  christos   HOWTO(R_SPARC_DISP64,	   0,8,64,true, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_DISP64",	false,0,MINUS_ONE, true),
    259   1.8  christos   HOWTO(R_SPARC_PLT64,	   0,8,64,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_PLT64",	false,0,MINUS_ONE, true),
    260   1.8  christos   HOWTO(R_SPARC_HIX22,	   0,8, 0,false,0,complain_overflow_bitfield,sparc_elf_hix22_reloc,  "R_SPARC_HIX22",	false,0,MINUS_ONE, false),
    261   1.8  christos   HOWTO(R_SPARC_LOX10,	   0,8, 0,false,0,complain_overflow_dont,    sparc_elf_lox10_reloc,  "R_SPARC_LOX10",	false,0,MINUS_ONE, false),
    262   1.8  christos   HOWTO(R_SPARC_H44,	  22,4,22,false,0,complain_overflow_unsigned,bfd_elf_generic_reloc,  "R_SPARC_H44",	false,0,0x003fffff,false),
    263   1.8  christos   HOWTO(R_SPARC_M44,	  12,4,10,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_M44",	false,0,0x000003ff,false),
    264   1.8  christos   HOWTO(R_SPARC_L44,	   0,4,13,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_L44",	false,0,0x00000fff,false),
    265   1.8  christos   HOWTO(R_SPARC_REGISTER,  0,8, 0,false,0,complain_overflow_bitfield,sparc_elf_notsup_reloc, "R_SPARC_REGISTER",false,0,MINUS_ONE, false),
    266   1.8  christos   HOWTO(R_SPARC_UA64,	   0,8,64,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_UA64",	    false,0,MINUS_ONE, true),
    267   1.8  christos   HOWTO(R_SPARC_UA16,	   0,2,16,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_UA16",	    false,0,0x0000ffff,true),
    268   1.8  christos   HOWTO(R_SPARC_TLS_GD_HI22,10,4,22,false,0,complain_overflow_dont,  bfd_elf_generic_reloc,  "R_SPARC_TLS_GD_HI22",false,0,0x003fffff,true),
    269   1.8  christos   HOWTO(R_SPARC_TLS_GD_LO10,0,4,10,false,0,complain_overflow_dont,   bfd_elf_generic_reloc,  "R_SPARC_TLS_GD_LO10",false,0,0x000003ff,true),
    270   1.8  christos   HOWTO(R_SPARC_TLS_GD_ADD,0,0, 0,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_TLS_GD_ADD",false,0,0x00000000,true),
    271   1.8  christos   HOWTO(R_SPARC_TLS_GD_CALL,2,4,30,true,0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_TLS_GD_CALL",false,0,0x3fffffff,true),
    272   1.8  christos   HOWTO(R_SPARC_TLS_LDM_HI22,10,4,22,false,0,complain_overflow_dont, bfd_elf_generic_reloc,  "R_SPARC_TLS_LDM_HI22",false,0,0x003fffff,true),
    273   1.8  christos   HOWTO(R_SPARC_TLS_LDM_LO10,0,4,10,false,0,complain_overflow_dont,  bfd_elf_generic_reloc,  "R_SPARC_TLS_LDM_LO10",false,0,0x000003ff,true),
    274   1.8  christos   HOWTO(R_SPARC_TLS_LDM_ADD,0,0, 0,false,0,complain_overflow_dont,   bfd_elf_generic_reloc,  "R_SPARC_TLS_LDM_ADD",false,0,0x00000000,true),
    275   1.8  christos   HOWTO(R_SPARC_TLS_LDM_CALL,2,4,30,true,0,complain_overflow_signed, bfd_elf_generic_reloc,  "R_SPARC_TLS_LDM_CALL",false,0,0x3fffffff,true),
    276   1.8  christos   HOWTO(R_SPARC_TLS_LDO_HIX22,0,4,0,false,0,complain_overflow_bitfield,sparc_elf_hix22_reloc,"R_SPARC_TLS_LDO_HIX22",false,0,0x003fffff, false),
    277   1.8  christos   HOWTO(R_SPARC_TLS_LDO_LOX10,0,4,0,false,0,complain_overflow_dont,  sparc_elf_lox10_reloc,  "R_SPARC_TLS_LDO_LOX10",false,0,0x000003ff, false),
    278   1.8  christos   HOWTO(R_SPARC_TLS_LDO_ADD,0,0, 0,false,0,complain_overflow_dont,   bfd_elf_generic_reloc,  "R_SPARC_TLS_LDO_ADD",false,0,0x00000000,true),
    279   1.8  christos   HOWTO(R_SPARC_TLS_IE_HI22,10,4,22,false,0,complain_overflow_dont,  bfd_elf_generic_reloc,  "R_SPARC_TLS_IE_HI22",false,0,0x003fffff,true),
    280   1.8  christos   HOWTO(R_SPARC_TLS_IE_LO10,0,4,10,false,0,complain_overflow_dont,   bfd_elf_generic_reloc,  "R_SPARC_TLS_IE_LO10",false,0,0x000003ff,true),
    281   1.8  christos   HOWTO(R_SPARC_TLS_IE_LD,0,0, 0,false,0,complain_overflow_dont,     bfd_elf_generic_reloc,  "R_SPARC_TLS_IE_LD",false,0,0x00000000,true),
    282   1.8  christos   HOWTO(R_SPARC_TLS_IE_LDX,0,0, 0,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_TLS_IE_LDX",false,0,0x00000000,true),
    283   1.8  christos   HOWTO(R_SPARC_TLS_IE_ADD,0,0, 0,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_TLS_IE_ADD",false,0,0x00000000,true),
    284   1.8  christos   HOWTO(R_SPARC_TLS_LE_HIX22,0,4,0,false,0,complain_overflow_bitfield,sparc_elf_hix22_reloc, "R_SPARC_TLS_LE_HIX22",false,0,0x003fffff, false),
    285   1.8  christos   HOWTO(R_SPARC_TLS_LE_LOX10,0,4,0,false,0,complain_overflow_dont,   sparc_elf_lox10_reloc,  "R_SPARC_TLS_LE_LOX10",false,0,0x000003ff, false),
    286   1.8  christos   HOWTO(R_SPARC_TLS_DTPMOD32,0,0, 0,false,0,complain_overflow_dont,  bfd_elf_generic_reloc,  "R_SPARC_TLS_DTPMOD32",false,0,0x00000000,true),
    287   1.8  christos   HOWTO(R_SPARC_TLS_DTPMOD64,0,0, 0,false,0,complain_overflow_dont,  bfd_elf_generic_reloc,  "R_SPARC_TLS_DTPMOD64",false,0,0x00000000,true),
    288   1.8  christos   HOWTO(R_SPARC_TLS_DTPOFF32,0,4,32,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,"R_SPARC_TLS_DTPOFF32",false,0,0xffffffff,true),
    289   1.8  christos   HOWTO(R_SPARC_TLS_DTPOFF64,0,8,64,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,"R_SPARC_TLS_DTPOFF64",false,0,MINUS_ONE,true),
    290   1.8  christos   HOWTO(R_SPARC_TLS_TPOFF32,0,0, 0,false,0,complain_overflow_dont,   bfd_elf_generic_reloc,  "R_SPARC_TLS_TPOFF32",false,0,0x00000000,true),
    291   1.8  christos   HOWTO(R_SPARC_TLS_TPOFF64,0,0, 0,false,0,complain_overflow_dont,   bfd_elf_generic_reloc,  "R_SPARC_TLS_TPOFF64",false,0,0x00000000,true),
    292   1.8  christos   HOWTO(R_SPARC_GOTDATA_HIX22,0,4,0,false,0,complain_overflow_bitfield,sparc_elf_hix22_reloc,"R_SPARC_GOTDATA_HIX22",false,0,0x003fffff, false),
    293   1.8  christos   HOWTO(R_SPARC_GOTDATA_LOX10,0,4,0,false,0,complain_overflow_dont,  sparc_elf_lox10_reloc,  "R_SPARC_GOTDATA_LOX10",false,0,0x000003ff, false),
    294   1.8  christos   HOWTO(R_SPARC_GOTDATA_OP_HIX22,0,4,0,false,0,complain_overflow_bitfield,sparc_elf_hix22_reloc,"R_SPARC_GOTDATA_OP_HIX22",false,0,0x003fffff, false),
    295   1.8  christos   HOWTO(R_SPARC_GOTDATA_OP_LOX10,0,4,0,false,0,complain_overflow_dont,	sparc_elf_lox10_reloc,	"R_SPARC_GOTDATA_OP_LOX10",false,0,0x000003ff, false),
    296   1.8  christos   HOWTO(R_SPARC_GOTDATA_OP,0,0, 0,false,0,complain_overflow_dont,   bfd_elf_generic_reloc,  "R_SPARC_GOTDATA_OP",false,0,0x00000000,true),
    297   1.8  christos   HOWTO(R_SPARC_H34,12,4,22,false,0,complain_overflow_unsigned,bfd_elf_generic_reloc,"R_SPARC_H34",false,0,0x003fffff,false),
    298   1.8  christos   HOWTO(R_SPARC_SIZE32,0,4,32,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,"R_SPARC_SIZE32",false,0,0xffffffff,true),
    299   1.8  christos   HOWTO(R_SPARC_SIZE64,0,8,64,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,"R_SPARC_SIZE64",false,0,MINUS_ONE, true),
    300   1.8  christos   HOWTO(R_SPARC_WDISP10,2,4,10,true, 0,complain_overflow_signed,sparc_elf_wdisp10_reloc,"R_SPARC_WDISP10",false,0,0x00000000,true),
    301   1.1  christos };
    302   1.1  christos static reloc_howto_type sparc_jmp_irel_howto =
    303   1.8  christos   HOWTO(R_SPARC_JMP_IREL,  0,0,00,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_JMP_IREL",false,0,0x00000000,true);
    304   1.1  christos static reloc_howto_type sparc_irelative_howto =
    305   1.8  christos   HOWTO(R_SPARC_IRELATIVE,  0,0,00,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_IRELATIVE",false,0,0x00000000,true);
    306   1.1  christos static reloc_howto_type sparc_vtinherit_howto =
    307   1.8  christos   HOWTO (R_SPARC_GNU_VTINHERIT, 0,4,0,false,0,complain_overflow_dont, NULL, "R_SPARC_GNU_VTINHERIT", false,0, 0, false);
    308   1.1  christos static reloc_howto_type sparc_vtentry_howto =
    309   1.8  christos   HOWTO (R_SPARC_GNU_VTENTRY, 0,4,0,false,0,complain_overflow_dont, _bfd_elf_rel_vtable_reloc_fn,"R_SPARC_GNU_VTENTRY", false,0,0, false);
    310   1.1  christos static reloc_howto_type sparc_rev32_howto =
    311   1.8  christos   HOWTO(R_SPARC_REV32, 0,4,32,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_REV32", false,0,0xffffffff,true);
    312   1.1  christos 
    313   1.1  christos reloc_howto_type *
    314   1.6  christos _bfd_sparc_elf_reloc_type_lookup (bfd *abfd,
    315   1.1  christos 				  bfd_reloc_code_real_type code)
    316   1.1  christos {
    317   1.1  christos   /* We explicitly handle each relocation type in the switch
    318   1.1  christos      instead of using a lookup table for efficiency.  */
    319   1.1  christos   switch (code)
    320   1.1  christos     {
    321   1.1  christos     case BFD_RELOC_NONE:
    322   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_NONE];
    323   1.1  christos 
    324   1.1  christos     case BFD_RELOC_8:
    325   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_8];
    326   1.1  christos 
    327   1.1  christos     case BFD_RELOC_16:
    328   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_16];
    329   1.1  christos 
    330   1.1  christos     case BFD_RELOC_32:
    331   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_32];
    332   1.1  christos 
    333   1.1  christos     case BFD_RELOC_8_PCREL:
    334   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_DISP8];
    335   1.1  christos 
    336   1.1  christos     case BFD_RELOC_16_PCREL:
    337   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_DISP16];
    338   1.1  christos 
    339   1.1  christos     case BFD_RELOC_32_PCREL:
    340   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_DISP32];
    341   1.1  christos 
    342   1.1  christos     case BFD_RELOC_32_PCREL_S2:
    343   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_WDISP30];
    344   1.1  christos 
    345   1.1  christos     case BFD_RELOC_SPARC_WDISP22:
    346   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_WDISP22];
    347   1.1  christos 
    348   1.1  christos     case BFD_RELOC_HI22:
    349   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_HI22];
    350   1.1  christos 
    351   1.1  christos     case BFD_RELOC_SPARC22:
    352   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_22];
    353   1.1  christos 
    354   1.1  christos     case BFD_RELOC_SPARC13:
    355   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_13];
    356   1.1  christos 
    357   1.1  christos     case BFD_RELOC_LO10:
    358   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_LO10];
    359   1.1  christos 
    360   1.1  christos     case BFD_RELOC_SPARC_GOT10:
    361   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_GOT10];
    362   1.1  christos 
    363   1.1  christos     case BFD_RELOC_SPARC_GOT13:
    364   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_GOT13];
    365   1.1  christos 
    366   1.1  christos     case BFD_RELOC_SPARC_GOT22:
    367   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_GOT22];
    368   1.1  christos 
    369   1.1  christos     case BFD_RELOC_SPARC_PC10:
    370   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_PC10];
    371   1.1  christos 
    372   1.1  christos     case BFD_RELOC_SPARC_PC22:
    373   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_PC22];
    374   1.1  christos 
    375   1.1  christos     case BFD_RELOC_SPARC_WPLT30:
    376   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_WPLT30];
    377   1.1  christos 
    378   1.1  christos     case BFD_RELOC_SPARC_COPY:
    379   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_COPY];
    380   1.1  christos 
    381   1.1  christos     case BFD_RELOC_SPARC_GLOB_DAT:
    382   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_GLOB_DAT];
    383   1.1  christos 
    384   1.1  christos     case BFD_RELOC_SPARC_JMP_SLOT:
    385   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_JMP_SLOT];
    386   1.1  christos 
    387   1.1  christos     case BFD_RELOC_SPARC_RELATIVE:
    388   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_RELATIVE];
    389   1.1  christos 
    390   1.1  christos     case BFD_RELOC_SPARC_UA32:
    391   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_UA32];
    392   1.1  christos 
    393   1.1  christos     case BFD_RELOC_SPARC_PLT32:
    394   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_PLT32];
    395   1.1  christos 
    396   1.1  christos     case BFD_RELOC_SPARC_10:
    397   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_10];
    398   1.1  christos 
    399   1.1  christos     case BFD_RELOC_SPARC_11:
    400   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_11];
    401   1.1  christos 
    402   1.1  christos     case BFD_RELOC_SPARC_64:
    403   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_64];
    404   1.1  christos 
    405   1.1  christos     case BFD_RELOC_SPARC_OLO10:
    406   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_OLO10];
    407   1.1  christos 
    408   1.1  christos     case BFD_RELOC_SPARC_HH22:
    409   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_HH22];
    410   1.1  christos 
    411   1.1  christos     case BFD_RELOC_SPARC_HM10:
    412   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_HM10];
    413   1.1  christos 
    414   1.1  christos     case BFD_RELOC_SPARC_LM22:
    415   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_LM22];
    416   1.1  christos 
    417   1.1  christos     case BFD_RELOC_SPARC_PC_HH22:
    418   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_PC_HH22];
    419   1.1  christos 
    420   1.1  christos     case BFD_RELOC_SPARC_PC_HM10:
    421   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_PC_HM10];
    422   1.1  christos 
    423   1.1  christos     case BFD_RELOC_SPARC_PC_LM22:
    424   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_PC_LM22];
    425   1.1  christos 
    426   1.1  christos     case BFD_RELOC_SPARC_WDISP16:
    427   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_WDISP16];
    428   1.1  christos 
    429   1.1  christos     case BFD_RELOC_SPARC_WDISP19:
    430   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_WDISP19];
    431   1.1  christos 
    432   1.1  christos     case BFD_RELOC_SPARC_7:
    433   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_7];
    434   1.1  christos 
    435   1.1  christos     case BFD_RELOC_SPARC_5:
    436   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_5];
    437   1.1  christos 
    438   1.1  christos     case BFD_RELOC_SPARC_6:
    439   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_6];
    440   1.1  christos 
    441   1.1  christos     case BFD_RELOC_SPARC_DISP64:
    442   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_DISP64];
    443   1.1  christos 
    444   1.1  christos     case BFD_RELOC_SPARC_PLT64:
    445   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_PLT64];
    446   1.1  christos 
    447   1.1  christos     case BFD_RELOC_SPARC_HIX22:
    448   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_HIX22];
    449   1.1  christos 
    450   1.1  christos     case BFD_RELOC_SPARC_LOX10:
    451   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_LOX10];
    452   1.1  christos 
    453   1.1  christos     case BFD_RELOC_SPARC_H44:
    454   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_H44];
    455   1.1  christos 
    456   1.1  christos     case BFD_RELOC_SPARC_M44:
    457   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_M44];
    458   1.1  christos 
    459   1.1  christos     case BFD_RELOC_SPARC_L44:
    460   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_L44];
    461   1.1  christos 
    462   1.1  christos     case BFD_RELOC_SPARC_REGISTER:
    463   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_REGISTER];
    464   1.1  christos 
    465   1.1  christos     case BFD_RELOC_SPARC_UA64:
    466   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_UA64];
    467   1.1  christos 
    468   1.1  christos     case BFD_RELOC_SPARC_UA16:
    469   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_UA16];
    470   1.1  christos 
    471   1.1  christos     case BFD_RELOC_SPARC_TLS_GD_HI22:
    472   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_GD_HI22];
    473   1.1  christos 
    474   1.1  christos     case BFD_RELOC_SPARC_TLS_GD_LO10:
    475   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_GD_LO10];
    476   1.1  christos 
    477   1.1  christos     case BFD_RELOC_SPARC_TLS_GD_ADD:
    478   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_GD_ADD];
    479   1.1  christos 
    480   1.1  christos     case BFD_RELOC_SPARC_TLS_GD_CALL:
    481   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_GD_CALL];
    482   1.1  christos 
    483   1.1  christos     case BFD_RELOC_SPARC_TLS_LDM_HI22:
    484   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LDM_HI22];
    485   1.1  christos 
    486   1.1  christos     case BFD_RELOC_SPARC_TLS_LDM_LO10:
    487   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LDM_LO10];
    488   1.1  christos 
    489   1.1  christos     case BFD_RELOC_SPARC_TLS_LDM_ADD:
    490   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LDM_ADD];
    491   1.1  christos 
    492   1.1  christos     case BFD_RELOC_SPARC_TLS_LDM_CALL:
    493   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LDM_CALL];
    494   1.1  christos 
    495   1.1  christos     case BFD_RELOC_SPARC_TLS_LDO_HIX22:
    496   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LDO_HIX22];
    497   1.1  christos 
    498   1.1  christos     case BFD_RELOC_SPARC_TLS_LDO_LOX10:
    499   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LDO_LOX10];
    500   1.1  christos 
    501   1.1  christos     case BFD_RELOC_SPARC_TLS_LDO_ADD:
    502   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LDO_ADD];
    503   1.1  christos 
    504   1.1  christos     case BFD_RELOC_SPARC_TLS_IE_HI22:
    505   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_IE_HI22];
    506   1.1  christos 
    507   1.1  christos     case BFD_RELOC_SPARC_TLS_IE_LO10:
    508   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_IE_LO10];
    509   1.1  christos 
    510   1.1  christos     case BFD_RELOC_SPARC_TLS_IE_LD:
    511   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_IE_LD];
    512   1.1  christos 
    513   1.1  christos     case BFD_RELOC_SPARC_TLS_IE_LDX:
    514   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_IE_LDX];
    515   1.1  christos 
    516   1.1  christos     case BFD_RELOC_SPARC_TLS_IE_ADD:
    517   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_IE_ADD];
    518   1.1  christos 
    519   1.1  christos     case BFD_RELOC_SPARC_TLS_LE_HIX22:
    520   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LE_HIX22];
    521   1.1  christos 
    522   1.1  christos     case BFD_RELOC_SPARC_TLS_LE_LOX10:
    523   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LE_LOX10];
    524   1.1  christos 
    525   1.1  christos     case BFD_RELOC_SPARC_TLS_DTPMOD32:
    526   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_DTPMOD32];
    527   1.1  christos 
    528   1.1  christos     case BFD_RELOC_SPARC_TLS_DTPMOD64:
    529   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_DTPMOD64];
    530   1.1  christos 
    531   1.1  christos     case BFD_RELOC_SPARC_TLS_DTPOFF32:
    532   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_DTPOFF32];
    533   1.1  christos 
    534   1.1  christos     case BFD_RELOC_SPARC_TLS_DTPOFF64:
    535   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_DTPOFF64];
    536   1.1  christos 
    537   1.1  christos     case BFD_RELOC_SPARC_TLS_TPOFF32:
    538   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_TPOFF32];
    539   1.1  christos 
    540   1.1  christos     case BFD_RELOC_SPARC_TLS_TPOFF64:
    541   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_TPOFF64];
    542   1.1  christos 
    543   1.1  christos     case BFD_RELOC_SPARC_GOTDATA_HIX22:
    544   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_GOTDATA_HIX22];
    545   1.1  christos 
    546   1.1  christos     case BFD_RELOC_SPARC_GOTDATA_LOX10:
    547   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_GOTDATA_LOX10];
    548   1.1  christos 
    549   1.1  christos     case BFD_RELOC_SPARC_GOTDATA_OP_HIX22:
    550   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_GOTDATA_OP_HIX22];
    551   1.1  christos 
    552   1.1  christos     case BFD_RELOC_SPARC_GOTDATA_OP_LOX10:
    553   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_GOTDATA_OP_LOX10];
    554   1.1  christos 
    555   1.1  christos     case BFD_RELOC_SPARC_GOTDATA_OP:
    556   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_GOTDATA_OP];
    557   1.1  christos 
    558   1.1  christos     case BFD_RELOC_SPARC_H34:
    559   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_H34];
    560   1.1  christos 
    561   1.1  christos     case BFD_RELOC_SPARC_SIZE32:
    562   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_SIZE32];
    563   1.1  christos 
    564   1.1  christos     case BFD_RELOC_SPARC_SIZE64:
    565   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_SIZE64];
    566   1.1  christos 
    567   1.1  christos     case BFD_RELOC_SPARC_WDISP10:
    568   1.1  christos       return &_bfd_sparc_elf_howto_table[R_SPARC_WDISP10];
    569   1.1  christos 
    570   1.1  christos     case BFD_RELOC_SPARC_JMP_IREL:
    571   1.1  christos       return &sparc_jmp_irel_howto;
    572   1.1  christos 
    573   1.1  christos     case BFD_RELOC_SPARC_IRELATIVE:
    574   1.1  christos       return &sparc_irelative_howto;
    575   1.1  christos 
    576   1.1  christos     case BFD_RELOC_VTABLE_INHERIT:
    577   1.1  christos       return &sparc_vtinherit_howto;
    578   1.1  christos 
    579   1.1  christos     case BFD_RELOC_VTABLE_ENTRY:
    580   1.1  christos       return &sparc_vtentry_howto;
    581   1.1  christos 
    582   1.1  christos     case BFD_RELOC_SPARC_REV32:
    583   1.1  christos       return &sparc_rev32_howto;
    584   1.1  christos 
    585   1.1  christos     default:
    586   1.1  christos       break;
    587   1.1  christos     }
    588   1.6  christos   /* xgettext:c-format */
    589   1.6  christos   _bfd_error_handler (_("%pB: unsupported relocation type %#x"), abfd, (int) code);
    590   1.6  christos   bfd_set_error (bfd_error_bad_value);
    591   1.6  christos   return NULL;
    592   1.1  christos }
    593   1.1  christos 
    594   1.1  christos reloc_howto_type *
    595   1.1  christos _bfd_sparc_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
    596   1.1  christos 				  const char *r_name)
    597   1.1  christos {
    598   1.1  christos   unsigned int i;
    599   1.1  christos 
    600   1.6  christos   for (i = 0; i < ARRAY_SIZE (_bfd_sparc_elf_howto_table); i++)
    601   1.1  christos     if (_bfd_sparc_elf_howto_table[i].name != NULL
    602   1.1  christos 	&& strcasecmp (_bfd_sparc_elf_howto_table[i].name, r_name) == 0)
    603   1.1  christos       return &_bfd_sparc_elf_howto_table[i];
    604   1.1  christos 
    605   1.1  christos   if (strcasecmp (sparc_vtinherit_howto.name, r_name) == 0)
    606   1.1  christos     return &sparc_vtinherit_howto;
    607   1.1  christos   if (strcasecmp (sparc_vtentry_howto.name, r_name) == 0)
    608   1.1  christos     return &sparc_vtentry_howto;
    609   1.1  christos   if (strcasecmp (sparc_rev32_howto.name, r_name) == 0)
    610   1.1  christos     return &sparc_rev32_howto;
    611   1.1  christos 
    612   1.1  christos   return NULL;
    613   1.1  christos }
    614   1.1  christos 
    615   1.1  christos reloc_howto_type *
    616   1.6  christos _bfd_sparc_elf_info_to_howto_ptr (bfd *abfd ATTRIBUTE_UNUSED,
    617   1.6  christos 				  unsigned int r_type)
    618   1.1  christos {
    619   1.1  christos   switch (r_type)
    620   1.1  christos     {
    621   1.1  christos     case R_SPARC_JMP_IREL:
    622   1.1  christos       return &sparc_jmp_irel_howto;
    623   1.1  christos 
    624   1.1  christos     case R_SPARC_IRELATIVE:
    625   1.1  christos       return &sparc_irelative_howto;
    626   1.1  christos 
    627   1.1  christos     case R_SPARC_GNU_VTINHERIT:
    628   1.1  christos       return &sparc_vtinherit_howto;
    629   1.1  christos 
    630   1.1  christos     case R_SPARC_GNU_VTENTRY:
    631   1.1  christos       return &sparc_vtentry_howto;
    632   1.1  christos 
    633   1.1  christos     case R_SPARC_REV32:
    634   1.1  christos       return &sparc_rev32_howto;
    635   1.1  christos 
    636   1.1  christos     default:
    637   1.1  christos       if (r_type >= (unsigned int) R_SPARC_max_std)
    638   1.1  christos 	{
    639   1.6  christos 	  _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
    640   1.6  christos 			      abfd, r_type);
    641   1.6  christos 	  bfd_set_error (bfd_error_bad_value);
    642   1.6  christos 	  return NULL;
    643   1.1  christos 	}
    644   1.1  christos       return &_bfd_sparc_elf_howto_table[r_type];
    645   1.1  christos     }
    646   1.1  christos }
    647   1.1  christos 
    648   1.1  christos /* Both 32-bit and 64-bit sparc encode this in an identical manner,
    649   1.1  christos    so just take advantage of that.  */
    650   1.1  christos #define SPARC_ELF_R_TYPE(r_info)	\
    651   1.1  christos 	((r_info) & 0xff)
    652   1.1  christos 
    653   1.8  christos bool
    654   1.6  christos _bfd_sparc_elf_info_to_howto (bfd *abfd, arelent *cache_ptr,
    655   1.1  christos 			      Elf_Internal_Rela *dst)
    656   1.1  christos {
    657   1.1  christos   unsigned int r_type = SPARC_ELF_R_TYPE (dst->r_info);
    658   1.1  christos 
    659   1.6  christos   if ((cache_ptr->howto = _bfd_sparc_elf_info_to_howto_ptr (abfd, r_type)) == NULL)
    660   1.6  christos     {
    661   1.6  christos       bfd_set_error (bfd_error_bad_value);
    662   1.8  christos       return false;
    663   1.6  christos     }
    664   1.8  christos   return true;
    665   1.1  christos }
    666   1.1  christos 
    667   1.1  christos 
    669   1.1  christos /* The nop opcode we use.  */
    670   1.1  christos #define SPARC_NOP 0x01000000
    671   1.1  christos 
    672   1.1  christos #define SPARC_INSN_BYTES	4
    673   1.6  christos 
    674   1.6  christos /* Is an undefined weak symbol resolved to 0 ?
    675   1.6  christos    Reference to an undefined weak symbol is resolved to 0 when
    676   1.6  christos    building an executable if it isn't dynamic and
    677   1.6  christos    1. Has non-GOT/non-PLT relocations in text section.
    678   1.6  christos    Or
    679   1.6  christos    2. Has no GOT/PLT relocation.  */
    680   1.6  christos #define UNDEFINED_WEAK_RESOLVED_TO_ZERO(INFO, EH)		\
    681   1.6  christos   ((EH)->elf.root.type == bfd_link_hash_undefweak		\
    682   1.6  christos    && bfd_link_executable (INFO)				\
    683   1.6  christos    && (_bfd_sparc_elf_hash_table (INFO)->interp == NULL		\
    684   1.6  christos        || !(INFO)->dynamic_undefined_weak			\
    685   1.6  christos        || (EH)->has_non_got_reloc				\
    686   1.1  christos        || !(EH)->has_got_reloc))
    687   1.1  christos 
    688   1.1  christos /* SPARC ELF linker hash entry.  */
    689   1.1  christos 
    690   1.1  christos struct _bfd_sparc_elf_link_hash_entry
    691   1.1  christos {
    692   1.1  christos   struct elf_link_hash_entry elf;
    693   1.1  christos 
    694   1.1  christos #define GOT_UNKNOWN     0
    695   1.1  christos #define GOT_NORMAL      1
    696   1.1  christos #define GOT_TLS_GD      2
    697   1.1  christos #define GOT_TLS_IE      3
    698   1.6  christos   unsigned char tls_type;
    699   1.6  christos 
    700   1.6  christos   /* Symbol has GOT or PLT relocations.  */
    701   1.6  christos   unsigned int has_got_reloc : 1;
    702   1.6  christos 
    703   1.6  christos   /* Symbol has old-style, non-relaxable GOT relocations.  */
    704   1.6  christos   unsigned int has_old_style_got_reloc : 1;
    705   1.6  christos 
    706   1.6  christos   /* Symbol has non-GOT/non-PLT relocations in text sections.  */
    707   1.6  christos   unsigned int has_non_got_reloc : 1;
    708   1.1  christos 
    709   1.1  christos };
    710   1.1  christos 
    711   1.1  christos #define _bfd_sparc_elf_hash_entry(ent) ((struct _bfd_sparc_elf_link_hash_entry *)(ent))
    712   1.1  christos 
    713   1.1  christos struct _bfd_sparc_elf_obj_tdata
    714   1.1  christos {
    715   1.1  christos   struct elf_obj_tdata root;
    716   1.1  christos 
    717   1.1  christos   /* tls_type for each local got entry.  */
    718   1.1  christos   char *local_got_tls_type;
    719   1.1  christos 
    720   1.8  christos   /* TRUE if TLS GD relocs has been seen for this object.  */
    721   1.1  christos   bool has_tlsgd;
    722   1.1  christos };
    723   1.1  christos 
    724   1.1  christos #define _bfd_sparc_elf_tdata(abfd) \
    725   1.1  christos   ((struct _bfd_sparc_elf_obj_tdata *) (abfd)->tdata.any)
    726   1.1  christos 
    727   1.1  christos #define _bfd_sparc_elf_local_got_tls_type(abfd) \
    728   1.1  christos   (_bfd_sparc_elf_tdata (abfd)->local_got_tls_type)
    729   1.1  christos 
    730   1.1  christos #define is_sparc_elf(bfd)				\
    731   1.1  christos   (bfd_get_flavour (bfd) == bfd_target_elf_flavour	\
    732   1.1  christos    && elf_tdata (bfd) != NULL				\
    733   1.1  christos    && elf_object_id (bfd) == SPARC_ELF_DATA)
    734   1.8  christos 
    735   1.1  christos bool
    736   1.1  christos _bfd_sparc_elf_mkobject (bfd *abfd)
    737  1.10  christos {
    738  1.10  christos   return bfd_elf_allocate_object (abfd,
    739   1.1  christos 				  sizeof (struct _bfd_sparc_elf_obj_tdata));
    740   1.1  christos }
    741   1.1  christos 
    742   1.1  christos static void
    743   1.1  christos sparc_put_word_32 (bfd *abfd, bfd_vma val, void *ptr)
    744   1.1  christos {
    745   1.1  christos   bfd_put_32 (abfd, val, ptr);
    746   1.1  christos }
    747   1.1  christos 
    748   1.1  christos static void
    749   1.1  christos sparc_put_word_64 (bfd *abfd, bfd_vma val, void *ptr)
    750   1.1  christos {
    751   1.1  christos   bfd_put_64 (abfd, val, ptr);
    752   1.1  christos }
    753   1.1  christos 
    754   1.1  christos static void
    755   1.1  christos sparc_elf_append_rela (bfd *abfd, asection *s, Elf_Internal_Rela *rel)
    756   1.1  christos {
    757   1.1  christos   const struct elf_backend_data *bed;
    758   1.1  christos   bfd_byte *loc;
    759   1.1  christos 
    760   1.6  christos   bed = get_elf_backend_data (abfd);
    761   1.1  christos   BFD_ASSERT (s->reloc_count * bed->s->sizeof_rela < s->size);
    762   1.1  christos   loc = s->contents + (s->reloc_count++ * bed->s->sizeof_rela);
    763   1.1  christos   bed->s->swap_reloca_out (abfd, rel, loc);
    764   1.1  christos }
    765   1.1  christos 
    766   1.1  christos static bfd_vma
    767   1.1  christos sparc_elf_r_info_64 (Elf_Internal_Rela *in_rel ATTRIBUTE_UNUSED,
    768   1.1  christos 		     bfd_vma rel_index ATTRIBUTE_UNUSED,
    769   1.1  christos 		     bfd_vma type ATTRIBUTE_UNUSED)
    770   1.1  christos {
    771   1.1  christos   return ELF64_R_INFO (rel_index,
    772   1.1  christos 		       (in_rel ?
    773   1.1  christos 			ELF64_R_TYPE_INFO (ELF64_R_TYPE_DATA (in_rel->r_info),
    774   1.1  christos 					   type) : type));
    775   1.1  christos }
    776   1.1  christos 
    777   1.1  christos static bfd_vma
    778   1.1  christos sparc_elf_r_info_32 (Elf_Internal_Rela *in_rel ATTRIBUTE_UNUSED,
    779   1.1  christos 		     bfd_vma rel_index, bfd_vma type)
    780   1.1  christos {
    781   1.1  christos   return ELF32_R_INFO (rel_index, type);
    782   1.1  christos }
    783   1.1  christos 
    784   1.1  christos static bfd_vma
    785   1.1  christos sparc_elf_r_symndx_64 (bfd_vma r_info)
    786   1.1  christos {
    787   1.1  christos   bfd_vma r_symndx = ELF32_R_SYM (r_info);
    788   1.1  christos   return (r_symndx >> 24);
    789   1.1  christos }
    790   1.1  christos 
    791   1.1  christos static bfd_vma
    792   1.1  christos sparc_elf_r_symndx_32 (bfd_vma r_info)
    793   1.1  christos {
    794   1.1  christos   return ELF32_R_SYM (r_info);
    795   1.1  christos }
    796   1.1  christos 
    797   1.1  christos /* PLT/GOT stuff */
    798   1.1  christos 
    799   1.1  christos #define PLT32_ENTRY_SIZE 12
    800   1.1  christos #define PLT32_HEADER_SIZE	(4 * PLT32_ENTRY_SIZE)
    801   1.1  christos 
    802   1.1  christos /* The first four entries in a 32-bit procedure linkage table are reserved,
    803   1.1  christos    and the initial contents are unimportant (we zero them out).
    804   1.1  christos    Subsequent entries look like this.  See the SVR4 ABI SPARC
    805   1.1  christos    supplement to see how this works.  */
    806   1.1  christos 
    807   1.1  christos /* sethi %hi(.-.plt0),%g1.  We fill in the address later.  */
    808   1.1  christos #define PLT32_ENTRY_WORD0 0x03000000
    809   1.1  christos /* b,a .plt0.  We fill in the offset later.  */
    810   1.1  christos #define PLT32_ENTRY_WORD1 0x30800000
    811   1.1  christos /* nop.  */
    812   1.1  christos #define PLT32_ENTRY_WORD2 SPARC_NOP
    813   1.1  christos 
    814   1.1  christos static int
    815   1.1  christos sparc32_plt_entry_build (bfd *output_bfd, asection *splt, bfd_vma offset,
    816   1.1  christos 			 bfd_vma max ATTRIBUTE_UNUSED,
    817   1.1  christos 			 bfd_vma *r_offset)
    818   1.1  christos {
    819   1.1  christos       bfd_put_32 (output_bfd,
    820   1.1  christos 		  PLT32_ENTRY_WORD0 + offset,
    821   1.1  christos 		  splt->contents + offset);
    822   1.1  christos       bfd_put_32 (output_bfd,
    823   1.1  christos 		  (PLT32_ENTRY_WORD1
    824   1.1  christos 		   + (((- (offset + 4)) >> 2) & 0x3fffff)),
    825   1.1  christos 		  splt->contents + offset + 4);
    826   1.1  christos       bfd_put_32 (output_bfd, (bfd_vma) PLT32_ENTRY_WORD2,
    827   1.1  christos 		  splt->contents + offset + 8);
    828   1.1  christos 
    829   1.1  christos       *r_offset = offset;
    830   1.1  christos 
    831   1.1  christos       return offset / PLT32_ENTRY_SIZE - 4;
    832   1.1  christos }
    833   1.1  christos 
    834   1.1  christos /* Both the headers and the entries are icache aligned.  */
    835   1.1  christos #define PLT64_ENTRY_SIZE	32
    836   1.1  christos #define PLT64_HEADER_SIZE	(4 * PLT64_ENTRY_SIZE)
    837   1.1  christos #define PLT64_LARGE_THRESHOLD	32768
    838   1.1  christos 
    839   1.1  christos static int
    840   1.1  christos sparc64_plt_entry_build (bfd *output_bfd, asection *splt, bfd_vma offset,
    841   1.1  christos 			 bfd_vma max, bfd_vma *r_offset)
    842   1.1  christos {
    843   1.1  christos   unsigned char *entry = splt->contents + offset;
    844   1.1  christos   const unsigned int nop = SPARC_NOP;
    845   1.1  christos   int plt_index;
    846   1.1  christos 
    847   1.1  christos   if (offset < (PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE))
    848   1.1  christos     {
    849   1.1  christos       unsigned int sethi, ba;
    850   1.1  christos 
    851   1.1  christos       *r_offset = offset;
    852   1.1  christos 
    853   1.1  christos       plt_index = (offset / PLT64_ENTRY_SIZE);
    854   1.1  christos 
    855   1.1  christos       sethi = 0x03000000 | (plt_index * PLT64_ENTRY_SIZE);
    856   1.1  christos       ba = 0x30680000
    857   1.1  christos 	| (((splt->contents + PLT64_ENTRY_SIZE) - (entry + 4)) / 4 & 0x7ffff);
    858   1.1  christos 
    859   1.1  christos       bfd_put_32 (output_bfd, (bfd_vma) sethi, entry);
    860   1.1  christos       bfd_put_32 (output_bfd, (bfd_vma) ba,    entry + 4);
    861   1.1  christos       bfd_put_32 (output_bfd, (bfd_vma) nop,   entry + 8);
    862   1.1  christos       bfd_put_32 (output_bfd, (bfd_vma) nop,   entry + 12);
    863   1.1  christos       bfd_put_32 (output_bfd, (bfd_vma) nop,   entry + 16);
    864   1.1  christos       bfd_put_32 (output_bfd, (bfd_vma) nop,   entry + 20);
    865   1.1  christos       bfd_put_32 (output_bfd, (bfd_vma) nop,   entry + 24);
    866   1.1  christos       bfd_put_32 (output_bfd, (bfd_vma) nop,   entry + 28);
    867   1.1  christos     }
    868   1.1  christos   else
    869   1.1  christos     {
    870   1.1  christos       unsigned char *ptr;
    871   1.1  christos       unsigned int ldx;
    872   1.1  christos       int block, last_block, ofs, last_ofs, chunks_this_block;
    873   1.1  christos       const int insn_chunk_size = (6 * 4);
    874   1.1  christos       const int ptr_chunk_size = (1 * 8);
    875   1.1  christos       const int entries_per_block = 160;
    876   1.1  christos       const int block_size = entries_per_block * (insn_chunk_size
    877   1.1  christos 						  + ptr_chunk_size);
    878   1.1  christos 
    879   1.1  christos       /* Entries 32768 and higher are grouped into blocks of 160.
    880   1.1  christos 	 The blocks are further subdivided into 160 sequences of
    881   1.1  christos 	 6 instructions and 160 pointers.  If a block does not require
    882   1.1  christos 	 the full 160 entries, let's say it requires N, then there
    883   1.1  christos 	 will be N sequences of 6 instructions and N pointers.  */
    884   1.1  christos 
    885   1.1  christos       offset -= (PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE);
    886   1.1  christos       max -= (PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE);
    887   1.1  christos 
    888   1.1  christos       block = offset / block_size;
    889   1.1  christos       last_block = max / block_size;
    890   1.1  christos       if (block != last_block)
    891   1.1  christos 	{
    892   1.1  christos 	  chunks_this_block = 160;
    893   1.1  christos 	}
    894   1.1  christos       else
    895   1.1  christos 	{
    896   1.1  christos 	  last_ofs = max % block_size;
    897   1.1  christos 	  chunks_this_block = last_ofs / (insn_chunk_size + ptr_chunk_size);
    898   1.1  christos 	}
    899   1.1  christos 
    900   1.1  christos       ofs = offset % block_size;
    901   1.1  christos 
    902   1.1  christos       plt_index = (PLT64_LARGE_THRESHOLD +
    903   1.1  christos 	       (block * 160) +
    904   1.1  christos 	       (ofs / insn_chunk_size));
    905   1.1  christos 
    906   1.1  christos       ptr = splt->contents
    907   1.1  christos 	+ (PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE)
    908   1.1  christos 	+ (block * block_size)
    909   1.1  christos 	+ (chunks_this_block * insn_chunk_size)
    910   1.1  christos 	+ (ofs / insn_chunk_size) * ptr_chunk_size;
    911   1.1  christos 
    912   1.1  christos       *r_offset = (bfd_vma) (ptr - splt->contents);
    913   1.1  christos 
    914   1.1  christos       ldx = 0xc25be000 | ((ptr - (entry+4)) & 0x1fff);
    915   1.1  christos 
    916   1.1  christos       /* mov %o7,%g5
    917   1.1  christos 	 call .+8
    918   1.1  christos 	 nop
    919   1.1  christos 	 ldx [%o7+P],%g1
    920   1.1  christos 	 jmpl %o7+%g1,%g1
    921   1.1  christos 	 mov %g5,%o7  */
    922   1.1  christos       bfd_put_32 (output_bfd, (bfd_vma) 0x8a10000f, entry);
    923   1.1  christos       bfd_put_32 (output_bfd, (bfd_vma) 0x40000002, entry + 4);
    924   1.6  christos       bfd_put_32 (output_bfd, (bfd_vma) SPARC_NOP,  entry + 8);
    925   1.1  christos       bfd_put_32 (output_bfd, (bfd_vma) ldx,	    entry + 12);
    926   1.1  christos       bfd_put_32 (output_bfd, (bfd_vma) 0x83c3c001, entry + 16);
    927   1.1  christos       bfd_put_32 (output_bfd, (bfd_vma) 0x9e100005, entry + 20);
    928   1.1  christos 
    929   1.1  christos       bfd_put_64 (output_bfd, (bfd_vma) (splt->contents - (entry + 4)), ptr);
    930   1.1  christos     }
    931   1.1  christos 
    932   1.1  christos   return plt_index - 4;
    933   1.1  christos }
    934   1.1  christos 
    935   1.1  christos /* The format of the first PLT entry in a VxWorks executable.  */
    936   1.1  christos static const bfd_vma sparc_vxworks_exec_plt0_entry[] =
    937   1.1  christos   {
    938   1.1  christos     0x05000000,	/* sethi  %hi(_GLOBAL_OFFSET_TABLE_+8), %g2 */
    939   1.1  christos     0x8410a000,	/* or     %g2, %lo(_GLOBAL_OFFSET_TABLE_+8), %g2 */
    940   1.1  christos     0xc4008000,	/* ld     [ %g2 ], %g2 */
    941   1.1  christos     0x81c08000,	/* jmp    %g2 */
    942   1.1  christos     0x01000000	/* nop */
    943   1.1  christos   };
    944   1.1  christos 
    945   1.1  christos /* The format of subsequent PLT entries.  */
    946   1.1  christos static const bfd_vma sparc_vxworks_exec_plt_entry[] =
    947   1.1  christos   {
    948   1.1  christos     0x03000000,	/* sethi  %hi(_GLOBAL_OFFSET_TABLE_+f@got), %g1 */
    949   1.1  christos     0x82106000,	/* or     %g1, %lo(_GLOBAL_OFFSET_TABLE_+f@got), %g1 */
    950   1.1  christos     0xc2004000,	/* ld     [ %g1 ], %g1 */
    951   1.1  christos     0x81c04000,	/* jmp    %g1 */
    952   1.1  christos     0x01000000,	/* nop */
    953   1.1  christos     0x03000000,	/* sethi  %hi(f@pltindex), %g1 */
    954   1.1  christos     0x10800000,	/* b      _PLT_resolve */
    955   1.1  christos     0x82106000	/* or     %g1, %lo(f@pltindex), %g1 */
    956   1.1  christos   };
    957   1.1  christos 
    958   1.1  christos /* The format of the first PLT entry in a VxWorks shared object.  */
    959   1.1  christos static const bfd_vma sparc_vxworks_shared_plt0_entry[] =
    960   1.1  christos   {
    961   1.1  christos     0xc405e008,	/* ld     [ %l7 + 8 ], %g2 */
    962   1.1  christos     0x81c08000,	/* jmp    %g2 */
    963   1.1  christos     0x01000000	/* nop */
    964   1.1  christos   };
    965   1.1  christos 
    966   1.1  christos /* The format of subsequent PLT entries.  */
    967   1.1  christos static const bfd_vma sparc_vxworks_shared_plt_entry[] =
    968   1.1  christos   {
    969   1.1  christos     0x03000000,	/* sethi  %hi(f@got), %g1 */
    970   1.1  christos     0x82106000,	/* or     %g1, %lo(f@got), %g1 */
    971   1.1  christos     0xc205c001,	/* ld     [ %l7 + %g1 ], %g1 */
    972   1.1  christos     0x81c04000,	/* jmp    %g1 */
    973   1.1  christos     0x01000000,	/* nop */
    974   1.1  christos     0x03000000,	/* sethi  %hi(f@pltindex), %g1 */
    975   1.1  christos     0x10800000,	/* b      _PLT_resolve */
    976   1.1  christos     0x82106000	/* or     %g1, %lo(f@pltindex), %g1 */
    977   1.1  christos   };
    978   1.1  christos 
    979   1.1  christos #define SPARC_ELF_PUT_WORD(htab, bfd, val, ptr)	\
    980   1.1  christos 	htab->put_word(bfd, val, ptr)
    981   1.1  christos 
    982   1.1  christos #define SPARC_ELF_R_INFO(htab, in_rel, index, type)	\
    983   1.1  christos 	htab->r_info(in_rel, index, type)
    984   1.1  christos 
    985   1.1  christos #define SPARC_ELF_R_SYMNDX(htab, r_info)	\
    986   1.1  christos 	htab->r_symndx(r_info)
    987   1.1  christos 
    988   1.1  christos #define SPARC_ELF_WORD_BYTES(htab)	\
    989   1.1  christos 	htab->bytes_per_word
    990   1.1  christos 
    991   1.1  christos #define SPARC_ELF_RELA_BYTES(htab)	\
    992   1.1  christos 	htab->bytes_per_rela
    993   1.1  christos 
    994   1.1  christos #define SPARC_ELF_DTPOFF_RELOC(htab)	\
    995   1.1  christos 	htab->dtpoff_reloc
    996   1.1  christos 
    997   1.1  christos #define SPARC_ELF_DTPMOD_RELOC(htab)	\
    998   1.1  christos 	htab->dtpmod_reloc
    999   1.1  christos 
   1000   1.1  christos #define SPARC_ELF_TPOFF_RELOC(htab)	\
   1001   1.1  christos 	htab->tpoff_reloc
   1002   1.1  christos 
   1003   1.1  christos #define SPARC_ELF_BUILD_PLT_ENTRY(htab, obfd, splt, off, max, r_off) \
   1004   1.1  christos 	htab->build_plt_entry (obfd, splt, off, max, r_off)
   1005   1.1  christos 
   1006   1.1  christos /* Create an entry in an SPARC ELF linker hash table.  */
   1007   1.1  christos 
   1008   1.1  christos static struct bfd_hash_entry *
   1009   1.1  christos link_hash_newfunc (struct bfd_hash_entry *entry,
   1010   1.1  christos 		   struct bfd_hash_table *table, const char *string)
   1011   1.1  christos {
   1012   1.1  christos   /* Allocate the structure if it has not already been allocated by a
   1013   1.1  christos      subclass.  */
   1014   1.1  christos   if (entry == NULL)
   1015   1.1  christos     {
   1016   1.1  christos       entry = bfd_hash_allocate (table,
   1017   1.1  christos 				 sizeof (struct _bfd_sparc_elf_link_hash_entry));
   1018   1.1  christos       if (entry == NULL)
   1019   1.1  christos 	return entry;
   1020   1.1  christos     }
   1021   1.1  christos 
   1022   1.1  christos   /* Call the allocation method of the superclass.  */
   1023   1.1  christos   entry = _bfd_elf_link_hash_newfunc (entry, table, string);
   1024   1.1  christos   if (entry != NULL)
   1025   1.1  christos     {
   1026   1.1  christos       struct _bfd_sparc_elf_link_hash_entry *eh;
   1027   1.1  christos 
   1028   1.1  christos       eh = (struct _bfd_sparc_elf_link_hash_entry *) entry;
   1029   1.6  christos       eh->tls_type = GOT_UNKNOWN;
   1030   1.6  christos       eh->has_got_reloc = 0;
   1031   1.1  christos       eh->has_non_got_reloc = 0;
   1032   1.1  christos     }
   1033   1.1  christos 
   1034   1.1  christos   return entry;
   1035   1.1  christos }
   1036   1.1  christos 
   1037   1.1  christos /* The name of the dynamic interpreter.  This is put in the .interp
   1038   1.1  christos    section.  */
   1039   1.1  christos 
   1040   1.1  christos #define ELF32_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
   1041   1.1  christos #define ELF64_DYNAMIC_INTERPRETER "/usr/lib/sparcv9/ld.so.1"
   1042   1.1  christos 
   1043   1.1  christos /* Compute a hash of a local hash entry.  We use elf_link_hash_entry
   1044   1.1  christos    for local symbol so that we can handle local STT_GNU_IFUNC symbols
   1045   1.1  christos    as global symbol.  We reuse indx and dynstr_index for local symbol
   1046   1.1  christos    hash since they aren't used by global symbols in this backend.  */
   1047   1.1  christos 
   1048   1.1  christos static hashval_t
   1049   1.1  christos elf_sparc_local_htab_hash (const void *ptr)
   1050   1.1  christos {
   1051   1.1  christos   struct elf_link_hash_entry *h
   1052   1.1  christos     = (struct elf_link_hash_entry *) ptr;
   1053   1.1  christos   return ELF_LOCAL_SYMBOL_HASH (h->indx, h->dynstr_index);
   1054   1.1  christos }
   1055   1.1  christos 
   1056   1.1  christos /* Compare local hash entries.  */
   1057   1.1  christos 
   1058   1.1  christos static int
   1059   1.1  christos elf_sparc_local_htab_eq (const void *ptr1, const void *ptr2)
   1060   1.1  christos {
   1061   1.1  christos   struct elf_link_hash_entry *h1
   1062   1.1  christos      = (struct elf_link_hash_entry *) ptr1;
   1063   1.1  christos   struct elf_link_hash_entry *h2
   1064   1.1  christos     = (struct elf_link_hash_entry *) ptr2;
   1065   1.1  christos 
   1066   1.1  christos   return h1->indx == h2->indx && h1->dynstr_index == h2->dynstr_index;
   1067   1.1  christos }
   1068   1.1  christos 
   1069   1.1  christos /* Find and/or create a hash entry for local symbol.  */
   1070   1.1  christos 
   1071   1.1  christos static struct elf_link_hash_entry *
   1072   1.1  christos elf_sparc_get_local_sym_hash (struct _bfd_sparc_elf_link_hash_table *htab,
   1073   1.8  christos 			      bfd *abfd, const Elf_Internal_Rela *rel,
   1074   1.1  christos 			      bool create)
   1075   1.1  christos {
   1076   1.1  christos   struct _bfd_sparc_elf_link_hash_entry e, *ret;
   1077   1.1  christos   asection *sec = abfd->sections;
   1078   1.1  christos   unsigned long r_symndx;
   1079   1.1  christos   hashval_t h;
   1080   1.1  christos   void **slot;
   1081   1.1  christos 
   1082   1.1  christos   r_symndx = SPARC_ELF_R_SYMNDX (htab, rel->r_info);
   1083   1.1  christos   h = ELF_LOCAL_SYMBOL_HASH (sec->id, r_symndx);
   1084   1.1  christos 
   1085   1.1  christos   e.elf.indx = sec->id;
   1086   1.1  christos   e.elf.dynstr_index = r_symndx;
   1087   1.1  christos   slot = htab_find_slot_with_hash (htab->loc_hash_table, &e, h,
   1088   1.1  christos 				   create ? INSERT : NO_INSERT);
   1089   1.1  christos 
   1090   1.1  christos   if (!slot)
   1091   1.1  christos     return NULL;
   1092   1.1  christos 
   1093   1.1  christos   if (*slot)
   1094   1.1  christos     {
   1095   1.1  christos       ret = (struct _bfd_sparc_elf_link_hash_entry *) *slot;
   1096   1.1  christos       return &ret->elf;
   1097   1.1  christos     }
   1098   1.1  christos 
   1099   1.1  christos   ret = (struct _bfd_sparc_elf_link_hash_entry *)
   1100   1.1  christos 	objalloc_alloc ((struct objalloc *) htab->loc_hash_memory,
   1101   1.1  christos 			sizeof (struct _bfd_sparc_elf_link_hash_entry));
   1102   1.1  christos   if (ret)
   1103   1.1  christos     {
   1104   1.1  christos       memset (ret, 0, sizeof (*ret));
   1105   1.1  christos       ret->elf.indx = sec->id;
   1106   1.1  christos       ret->elf.dynstr_index = r_symndx;
   1107   1.1  christos       ret->elf.dynindx = -1;
   1108   1.1  christos       ret->elf.plt.offset = (bfd_vma) -1;
   1109   1.1  christos       ret->elf.got.offset = (bfd_vma) -1;
   1110   1.1  christos       *slot = ret;
   1111   1.1  christos     }
   1112   1.1  christos   return &ret->elf;
   1113   1.1  christos }
   1114   1.3  christos 
   1115   1.3  christos /* Destroy a SPARC ELF linker hash table.  */
   1116   1.3  christos 
   1117   1.3  christos static void
   1118   1.3  christos _bfd_sparc_elf_link_hash_table_free (bfd *obfd)
   1119   1.3  christos {
   1120   1.3  christos   struct _bfd_sparc_elf_link_hash_table *htab
   1121   1.3  christos     = (struct _bfd_sparc_elf_link_hash_table *) obfd->link.hash;
   1122   1.3  christos 
   1123   1.3  christos   if (htab->loc_hash_table)
   1124   1.3  christos     htab_delete (htab->loc_hash_table);
   1125   1.3  christos   if (htab->loc_hash_memory)
   1126   1.3  christos     objalloc_free ((struct objalloc *) htab->loc_hash_memory);
   1127   1.3  christos   _bfd_elf_link_hash_table_free (obfd);
   1128   1.3  christos }
   1129   1.1  christos 
   1130   1.1  christos /* Create a SPARC ELF linker hash table.  */
   1131   1.1  christos 
   1132   1.1  christos struct bfd_link_hash_table *
   1133   1.1  christos _bfd_sparc_elf_link_hash_table_create (bfd *abfd)
   1134   1.1  christos {
   1135   1.8  christos   struct _bfd_sparc_elf_link_hash_table *ret;
   1136   1.1  christos   size_t amt = sizeof (struct _bfd_sparc_elf_link_hash_table);
   1137   1.1  christos 
   1138   1.1  christos   ret = (struct _bfd_sparc_elf_link_hash_table *) bfd_zmalloc (amt);
   1139   1.1  christos   if (ret == NULL)
   1140   1.1  christos     return NULL;
   1141   1.1  christos 
   1142   1.1  christos   if (ABI_64_P (abfd))
   1143   1.1  christos     {
   1144   1.1  christos       ret->put_word = sparc_put_word_64;
   1145   1.1  christos       ret->r_info = sparc_elf_r_info_64;
   1146   1.1  christos       ret->r_symndx = sparc_elf_r_symndx_64;
   1147   1.1  christos       ret->dtpoff_reloc = R_SPARC_TLS_DTPOFF64;
   1148   1.1  christos       ret->dtpmod_reloc = R_SPARC_TLS_DTPMOD64;
   1149   1.1  christos       ret->tpoff_reloc = R_SPARC_TLS_TPOFF64;
   1150   1.1  christos       ret->word_align_power = 3;
   1151   1.1  christos       ret->align_power_max = 4;
   1152   1.1  christos       ret->bytes_per_word = 8;
   1153   1.1  christos       ret->bytes_per_rela = sizeof (Elf64_External_Rela);
   1154   1.1  christos       ret->dynamic_interpreter = ELF64_DYNAMIC_INTERPRETER;
   1155   1.1  christos       ret->dynamic_interpreter_size = sizeof ELF64_DYNAMIC_INTERPRETER;
   1156   1.1  christos 
   1157   1.1  christos       ret->build_plt_entry = sparc64_plt_entry_build;
   1158   1.1  christos       ret->plt_header_size = PLT64_HEADER_SIZE;
   1159   1.1  christos       ret->plt_entry_size = PLT64_ENTRY_SIZE;
   1160   1.1  christos     }
   1161   1.1  christos   else
   1162   1.1  christos     {
   1163   1.1  christos       ret->put_word = sparc_put_word_32;
   1164   1.1  christos       ret->r_info = sparc_elf_r_info_32;
   1165   1.1  christos       ret->r_symndx = sparc_elf_r_symndx_32;
   1166   1.1  christos       ret->dtpoff_reloc = R_SPARC_TLS_DTPOFF32;
   1167   1.1  christos       ret->dtpmod_reloc = R_SPARC_TLS_DTPMOD32;
   1168   1.1  christos       ret->tpoff_reloc = R_SPARC_TLS_TPOFF32;
   1169   1.1  christos       ret->word_align_power = 2;
   1170   1.1  christos       ret->align_power_max = 3;
   1171   1.1  christos       ret->bytes_per_word = 4;
   1172   1.1  christos       ret->bytes_per_rela = sizeof (Elf32_External_Rela);
   1173   1.1  christos       ret->dynamic_interpreter = ELF32_DYNAMIC_INTERPRETER;
   1174   1.1  christos       ret->dynamic_interpreter_size = sizeof ELF32_DYNAMIC_INTERPRETER;
   1175   1.1  christos 
   1176   1.1  christos       ret->build_plt_entry = sparc32_plt_entry_build;
   1177   1.1  christos       ret->plt_header_size = PLT32_HEADER_SIZE;
   1178   1.1  christos       ret->plt_entry_size = PLT32_ENTRY_SIZE;
   1179   1.1  christos     }
   1180   1.1  christos 
   1181  1.10  christos   if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc,
   1182   1.1  christos 				      sizeof (struct _bfd_sparc_elf_link_hash_entry)))
   1183   1.1  christos     {
   1184   1.1  christos       free (ret);
   1185   1.1  christos       return NULL;
   1186   1.1  christos     }
   1187   1.1  christos 
   1188   1.1  christos   ret->loc_hash_table = htab_try_create (1024,
   1189   1.1  christos 					 elf_sparc_local_htab_hash,
   1190   1.1  christos 					 elf_sparc_local_htab_eq,
   1191   1.1  christos 					 NULL);
   1192   1.1  christos   ret->loc_hash_memory = objalloc_create ();
   1193   1.1  christos   if (!ret->loc_hash_table || !ret->loc_hash_memory)
   1194   1.3  christos     {
   1195   1.1  christos       _bfd_sparc_elf_link_hash_table_free (abfd);
   1196   1.1  christos       return NULL;
   1197   1.3  christos     }
   1198   1.1  christos   ret->elf.root.hash_table_free = _bfd_sparc_elf_link_hash_table_free;
   1199   1.1  christos 
   1200   1.1  christos   return &ret->elf.root;
   1201   1.1  christos }
   1202   1.1  christos 
   1203   1.1  christos /* Create .plt, .rela.plt, .got, .rela.got, .dynbss, and
   1204   1.1  christos    .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
   1205   1.1  christos    hash table.  */
   1206   1.8  christos 
   1207   1.1  christos bool
   1208   1.1  christos _bfd_sparc_elf_create_dynamic_sections (bfd *dynobj,
   1209   1.1  christos 					struct bfd_link_info *info)
   1210   1.1  christos {
   1211   1.1  christos   struct _bfd_sparc_elf_link_hash_table *htab;
   1212   1.1  christos 
   1213   1.1  christos   htab = _bfd_sparc_elf_hash_table (info);
   1214   1.1  christos   BFD_ASSERT (htab != NULL);
   1215   1.1  christos 
   1216   1.8  christos   if (!_bfd_elf_create_dynamic_sections (dynobj, info))
   1217   1.1  christos     return false;
   1218   1.8  christos 
   1219   1.1  christos   if (htab->elf.target_os == is_vxworks)
   1220   1.1  christos     {
   1221   1.8  christos       if (!elf_vxworks_create_dynamic_sections (dynobj, info, &htab->srelplt2))
   1222   1.3  christos 	return false;
   1223   1.1  christos       if (bfd_link_pic (info))
   1224   1.1  christos 	{
   1225   1.1  christos 	  htab->plt_header_size
   1226   1.1  christos 	    = 4 * ARRAY_SIZE (sparc_vxworks_shared_plt0_entry);
   1227   1.1  christos 	  htab->plt_entry_size
   1228   1.1  christos 	    = 4 * ARRAY_SIZE (sparc_vxworks_shared_plt_entry);
   1229   1.1  christos 	}
   1230   1.1  christos       else
   1231   1.1  christos 	{
   1232   1.1  christos 	  htab->plt_header_size
   1233   1.1  christos 	    = 4 * ARRAY_SIZE (sparc_vxworks_exec_plt0_entry);
   1234   1.1  christos 	  htab->plt_entry_size
   1235   1.1  christos 	    = 4 * ARRAY_SIZE (sparc_vxworks_exec_plt_entry);
   1236   1.1  christos 	}
   1237   1.1  christos     }
   1238   1.6  christos 
   1239   1.6  christos   if (!htab->elf.splt || !htab->elf.srelplt || !htab->elf.sdynbss
   1240   1.1  christos       || (!bfd_link_pic (info) && !htab->elf.srelbss))
   1241   1.1  christos     abort ();
   1242   1.8  christos 
   1243   1.1  christos   return true;
   1244   1.1  christos }
   1245   1.8  christos 
   1246   1.1  christos static bool
   1247   1.1  christos create_ifunc_sections (bfd *abfd, struct bfd_link_info *info)
   1248   1.1  christos {
   1249   1.1  christos   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
   1250   1.1  christos   struct elf_link_hash_table *htab = elf_hash_table (info);
   1251   1.1  christos   flagword flags, pltflags;
   1252   1.1  christos   asection *s;
   1253   1.1  christos 
   1254   1.8  christos   if (htab->irelifunc != NULL || htab->iplt != NULL)
   1255   1.1  christos     return true;
   1256   1.1  christos 
   1257   1.1  christos   flags = bed->dynamic_sec_flags;
   1258   1.1  christos   pltflags = flags | SEC_ALLOC | SEC_CODE | SEC_LOAD;
   1259   1.1  christos 
   1260   1.1  christos   s = bfd_make_section_with_flags (abfd, ".iplt", pltflags);
   1261   1.7  christos   if (s == NULL
   1262   1.8  christos       || !bfd_set_section_alignment (s, bed->plt_alignment))
   1263   1.1  christos     return false;
   1264   1.1  christos   htab->iplt = s;
   1265   1.1  christos 
   1266   1.1  christos   s = bfd_make_section_with_flags (abfd, ".rela.iplt",
   1267   1.1  christos 				   flags | SEC_READONLY);
   1268   1.7  christos   if (s == NULL
   1269   1.8  christos       || !bfd_set_section_alignment (s, bed->s->log_file_align))
   1270   1.1  christos     return false;
   1271   1.1  christos   htab->irelplt = s;
   1272   1.8  christos 
   1273   1.1  christos   return true;
   1274   1.1  christos }
   1275   1.1  christos 
   1276   1.1  christos /* Copy the extra info we tack onto an elf_link_hash_entry.  */
   1277   1.1  christos 
   1278   1.1  christos void
   1279   1.1  christos _bfd_sparc_elf_copy_indirect_symbol (struct bfd_link_info *info,
   1280   1.1  christos 				     struct elf_link_hash_entry *dir,
   1281   1.1  christos 				     struct elf_link_hash_entry *ind)
   1282   1.1  christos {
   1283   1.1  christos   struct _bfd_sparc_elf_link_hash_entry *edir, *eind;
   1284   1.1  christos 
   1285   1.1  christos   edir = (struct _bfd_sparc_elf_link_hash_entry *) dir;
   1286   1.1  christos   eind = (struct _bfd_sparc_elf_link_hash_entry *) ind;
   1287   1.6  christos 
   1288   1.1  christos   if (ind->root.type == bfd_link_hash_indirect && dir->got.refcount <= 0)
   1289   1.1  christos     {
   1290   1.1  christos       edir->tls_type = eind->tls_type;
   1291   1.1  christos       eind->tls_type = GOT_UNKNOWN;
   1292   1.6  christos     }
   1293   1.6  christos 
   1294   1.6  christos   /* Copy has_got_reloc and has_non_got_reloc.  */
   1295   1.6  christos   edir->has_got_reloc |= eind->has_got_reloc;
   1296   1.6  christos   edir->has_non_got_reloc |= eind->has_non_got_reloc;
   1297   1.1  christos 
   1298   1.1  christos   _bfd_elf_link_hash_copy_indirect (info, dir, ind);
   1299   1.1  christos }
   1300   1.1  christos 
   1301   1.1  christos static int
   1302   1.1  christos sparc_elf_tls_transition (struct bfd_link_info *info, bfd *abfd,
   1303   1.1  christos 			  int r_type, int is_local)
   1304   1.1  christos {
   1305   1.1  christos   if (! ABI_64_P (abfd)
   1306   1.1  christos       && r_type == R_SPARC_TLS_GD_HI22
   1307   1.6  christos       && ! _bfd_sparc_elf_tdata (abfd)->has_tlsgd)
   1308   1.1  christos     return R_SPARC_REV32;
   1309   1.6  christos 
   1310   1.1  christos   if (!bfd_link_executable (info))
   1311   1.1  christos     return r_type;
   1312   1.1  christos 
   1313   1.1  christos   switch (r_type)
   1314   1.1  christos     {
   1315   1.6  christos     case R_SPARC_TLS_GD_HI22:
   1316   1.1  christos       return is_local ? R_SPARC_TLS_LE_HIX22 : R_SPARC_TLS_IE_HI22;
   1317   1.6  christos     case R_SPARC_TLS_GD_LO10:
   1318   1.1  christos       return is_local ? R_SPARC_TLS_LE_LOX10 : R_SPARC_TLS_IE_LO10;
   1319   1.1  christos     case R_SPARC_TLS_LDM_HI22:
   1320   1.1  christos       return R_SPARC_TLS_LE_HIX22;
   1321   1.1  christos     case R_SPARC_TLS_LDM_LO10:
   1322   1.6  christos       return R_SPARC_TLS_LE_LOX10;
   1323   1.6  christos     case R_SPARC_TLS_IE_HI22:
   1324   1.6  christos       return is_local ? R_SPARC_TLS_LE_HIX22 : r_type;
   1325   1.6  christos     case R_SPARC_TLS_IE_LO10:
   1326   1.1  christos       return is_local ? R_SPARC_TLS_LE_LOX10 : r_type;
   1327   1.1  christos     }
   1328   1.1  christos 
   1329   1.1  christos   return r_type;
   1330   1.1  christos }
   1331   1.1  christos 
   1332   1.1  christos /* Look through the relocs for a section during the first phase, and
   1334   1.1  christos    allocate space in the global offset table or procedure linkage
   1335   1.8  christos    table.  */
   1336   1.1  christos 
   1337   1.1  christos bool
   1338   1.1  christos _bfd_sparc_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
   1339   1.1  christos 			     asection *sec, const Elf_Internal_Rela *relocs)
   1340   1.1  christos {
   1341   1.1  christos   struct _bfd_sparc_elf_link_hash_table *htab;
   1342   1.1  christos   Elf_Internal_Shdr *symtab_hdr;
   1343   1.1  christos   struct elf_link_hash_entry **sym_hashes;
   1344   1.1  christos   const Elf_Internal_Rela *rel;
   1345   1.1  christos   const Elf_Internal_Rela *rel_end;
   1346   1.8  christos   asection *sreloc;
   1347   1.1  christos   int num_relocs;
   1348   1.3  christos   bool checked_tlsgd = false;
   1349   1.8  christos 
   1350   1.1  christos   if (bfd_link_relocatable (info))
   1351   1.1  christos     return true;
   1352   1.1  christos 
   1353   1.1  christos   htab = _bfd_sparc_elf_hash_table (info);
   1354   1.1  christos   BFD_ASSERT (htab != NULL);
   1355   1.1  christos   symtab_hdr = &elf_symtab_hdr (abfd);
   1356   1.1  christos   sym_hashes = elf_sym_hashes (abfd);
   1357   1.1  christos 
   1358   1.1  christos   sreloc = NULL;
   1359   1.1  christos 
   1360   1.1  christos   if (ABI_64_P (abfd))
   1361   1.1  christos     num_relocs = NUM_SHDR_ENTRIES (_bfd_elf_single_rel_hdr (sec));
   1362   1.1  christos   else
   1363   1.1  christos     num_relocs = sec->reloc_count;
   1364   1.1  christos 
   1365   1.1  christos   BFD_ASSERT (is_sparc_elf (abfd) || num_relocs == 0);
   1366   1.1  christos 
   1367   1.1  christos   if (htab->elf.dynobj == NULL)
   1368   1.8  christos     htab->elf.dynobj = abfd;
   1369   1.1  christos   if (!create_ifunc_sections (htab->elf.dynobj, info))
   1370   1.1  christos     return false;
   1371   1.1  christos 
   1372   1.1  christos   rel_end = relocs + num_relocs;
   1373   1.1  christos   for (rel = relocs; rel < rel_end; rel++)
   1374   1.6  christos     {
   1375   1.1  christos       unsigned int r_type;
   1376   1.6  christos       unsigned int r_symndx;
   1377   1.1  christos       struct elf_link_hash_entry *h;
   1378   1.1  christos       struct _bfd_sparc_elf_link_hash_entry *eh;
   1379   1.1  christos       Elf_Internal_Sym *isym;
   1380   1.1  christos 
   1381   1.1  christos       r_symndx = SPARC_ELF_R_SYMNDX (htab, rel->r_info);
   1382   1.1  christos       r_type = SPARC_ELF_R_TYPE (rel->r_info);
   1383   1.1  christos 
   1384   1.6  christos       if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
   1385   1.6  christos 	{
   1386   1.8  christos 	  /* xgettext:c-format */
   1387   1.1  christos 	  _bfd_error_handler (_("%pB: bad symbol index: %d"), abfd, r_symndx);
   1388   1.1  christos 	  return false;
   1389   1.1  christos 	}
   1390   1.1  christos 
   1391   1.1  christos       isym = NULL;
   1392   1.1  christos       if (r_symndx < symtab_hdr->sh_info)
   1393   1.8  christos 	{
   1394   1.8  christos 	  /* A local symbol.  */
   1395   1.1  christos 	  isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache, abfd,
   1396   1.8  christos 					r_symndx);
   1397   1.1  christos 	  if (isym == NULL)
   1398   1.1  christos 	    return false;
   1399   1.1  christos 
   1400   1.1  christos 	  /* Check relocation against local STT_GNU_IFUNC symbol.  */
   1401   1.8  christos 	  if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
   1402   1.1  christos 	    {
   1403   1.8  christos 	      h = elf_sparc_get_local_sym_hash (htab, abfd, rel, true);
   1404   1.3  christos 	      if (h == NULL)
   1405   1.1  christos 		return false;
   1406   1.1  christos 
   1407   1.1  christos 	      /* Fake a STT_GNU_IFUNC symbol.  */
   1408   1.1  christos 	      h->type = STT_GNU_IFUNC;
   1409   1.1  christos 	      h->def_regular = 1;
   1410   1.1  christos 	      h->ref_regular = 1;
   1411   1.1  christos 	      h->forced_local = 1;
   1412   1.1  christos 	      h->root.type = bfd_link_hash_defined;
   1413   1.1  christos 	    }
   1414   1.1  christos 	  else
   1415   1.1  christos 	    h = NULL;
   1416   1.1  christos 	}
   1417   1.1  christos       else
   1418   1.1  christos 	{
   1419   1.1  christos 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
   1420   1.1  christos 	  while (h->root.type == bfd_link_hash_indirect
   1421   1.1  christos 		 || h->root.type == bfd_link_hash_warning)
   1422   1.1  christos 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
   1423   1.6  christos 	}
   1424   1.1  christos 
   1425   1.6  christos       if (h && h->type == STT_GNU_IFUNC && h->def_regular)
   1426   1.6  christos 	{
   1427   1.1  christos 	  h->ref_regular = 1;
   1428   1.1  christos 	  h->plt.refcount += 1;
   1429  1.10  christos 	}
   1430  1.10  christos 
   1431  1.10  christos       /* If a relocation refers to _GLOBAL_OFFSET_TABLE_, create the .got.  */
   1432  1.10  christos       if (h != NULL
   1433  1.10  christos 	  && htab->elf.sgot == NULL
   1434  1.10  christos 	  && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
   1435  1.10  christos 	{
   1436  1.10  christos 	  if (!_bfd_elf_create_got_section (htab->elf.dynobj, info))
   1437  1.10  christos 	    return false;
   1438  1.10  christos 	  BFD_ASSERT (h == htab->elf.hgot);
   1439   1.1  christos 	}
   1440   1.1  christos 
   1441   1.1  christos       /* Compatibility with old R_SPARC_REV32 reloc conflicting
   1442   1.1  christos 	 with R_SPARC_TLS_GD_HI22.  */
   1443   1.1  christos       if (! ABI_64_P (abfd) && ! checked_tlsgd)
   1444   1.1  christos 	switch (r_type)
   1445   1.1  christos 	  {
   1446   1.1  christos 	  case R_SPARC_TLS_GD_HI22:
   1447   1.1  christos 	    {
   1448   1.1  christos 	      const Elf_Internal_Rela *relt;
   1449   1.1  christos 
   1450   1.1  christos 	      for (relt = rel + 1; relt < rel_end; relt++)
   1451   1.1  christos 		if (ELF32_R_TYPE (relt->r_info) == R_SPARC_TLS_GD_LO10
   1452   1.1  christos 		    || ELF32_R_TYPE (relt->r_info) == R_SPARC_TLS_GD_ADD
   1453   1.8  christos 		    || ELF32_R_TYPE (relt->r_info) == R_SPARC_TLS_GD_CALL)
   1454   1.1  christos 		  break;
   1455   1.1  christos 	      checked_tlsgd = true;
   1456   1.1  christos 	      _bfd_sparc_elf_tdata (abfd)->has_tlsgd = relt < rel_end;
   1457   1.1  christos 	    }
   1458   1.1  christos 	    break;
   1459   1.1  christos 	  case R_SPARC_TLS_GD_LO10:
   1460   1.8  christos 	  case R_SPARC_TLS_GD_ADD:
   1461   1.8  christos 	  case R_SPARC_TLS_GD_CALL:
   1462   1.1  christos 	    checked_tlsgd = true;
   1463   1.1  christos 	    _bfd_sparc_elf_tdata (abfd)->has_tlsgd = true;
   1464   1.1  christos 	    break;
   1465   1.1  christos 	  }
   1466   1.6  christos 
   1467   1.6  christos       r_type = sparc_elf_tls_transition (info, abfd, r_type, h == NULL);
   1468   1.1  christos       eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
   1469   1.1  christos 
   1470   1.1  christos       switch (r_type)
   1471   1.1  christos 	{
   1472   1.1  christos 	case R_SPARC_TLS_LDM_HI22:
   1473   1.6  christos 	case R_SPARC_TLS_LDM_LO10:
   1474   1.6  christos 	  htab->tls_ldm_got.refcount += 1;
   1475   1.1  christos 	  if (eh != NULL)
   1476   1.1  christos 	    eh->has_got_reloc = 1;
   1477   1.1  christos 	  break;
   1478   1.1  christos 
   1479   1.6  christos 	case R_SPARC_TLS_LE_HIX22:
   1480   1.1  christos 	case R_SPARC_TLS_LE_LOX10:
   1481   1.1  christos 	  if (!bfd_link_executable (info))
   1482   1.1  christos 	    goto r_sparc_plt32;
   1483   1.1  christos 	  break;
   1484   1.1  christos 
   1485   1.6  christos 	case R_SPARC_TLS_IE_HI22:
   1486   1.1  christos 	case R_SPARC_TLS_IE_LO10:
   1487   1.1  christos 	  if (!bfd_link_executable (info))
   1488   1.1  christos 	    info->flags |= DF_STATIC_TLS;
   1489   1.1  christos 	  /* Fall through */
   1490   1.1  christos 
   1491   1.1  christos 	case R_SPARC_GOT10:
   1492   1.1  christos 	case R_SPARC_GOT13:
   1493   1.1  christos 	case R_SPARC_GOT22:
   1494   1.1  christos 	case R_SPARC_GOTDATA_HIX22:
   1495   1.1  christos 	case R_SPARC_GOTDATA_LOX10:
   1496   1.1  christos 	case R_SPARC_GOTDATA_OP_HIX22:
   1497   1.1  christos 	case R_SPARC_GOTDATA_OP_LOX10:
   1498   1.1  christos 	case R_SPARC_TLS_GD_HI22:
   1499   1.1  christos 	case R_SPARC_TLS_GD_LO10:
   1500   1.1  christos 	  /* This symbol requires a global offset table entry.  */
   1501   1.1  christos 	  {
   1502   1.1  christos 	    int tls_type, old_tls_type;
   1503   1.1  christos 
   1504   1.1  christos 	    switch (r_type)
   1505   1.1  christos 	      {
   1506   1.1  christos 	      case R_SPARC_TLS_GD_HI22:
   1507   1.1  christos 	      case R_SPARC_TLS_GD_LO10:
   1508   1.1  christos 		tls_type = GOT_TLS_GD;
   1509   1.1  christos 		break;
   1510   1.1  christos 	      case R_SPARC_TLS_IE_HI22:
   1511   1.1  christos 	      case R_SPARC_TLS_IE_LO10:
   1512   1.6  christos 		tls_type = GOT_TLS_IE;
   1513   1.6  christos 		break;
   1514   1.6  christos 	      default:
   1515   1.1  christos 		tls_type = GOT_NORMAL;
   1516   1.1  christos 		break;
   1517   1.1  christos 	      }
   1518   1.1  christos 
   1519   1.1  christos 	    if (h != NULL)
   1520   1.1  christos 	      {
   1521   1.1  christos 		h->got.refcount += 1;
   1522   1.1  christos 		old_tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type;
   1523   1.1  christos 	      }
   1524   1.1  christos 	    else
   1525   1.1  christos 	      {
   1526   1.1  christos 		bfd_signed_vma *local_got_refcounts;
   1527   1.1  christos 
   1528   1.1  christos 		/* This is a global offset table entry for a local symbol.  */
   1529   1.1  christos 		local_got_refcounts = elf_local_got_refcounts (abfd);
   1530   1.1  christos 		if (local_got_refcounts == NULL)
   1531   1.1  christos 		  {
   1532   1.1  christos 		    bfd_size_type size;
   1533   1.1  christos 
   1534   1.1  christos 		    size = symtab_hdr->sh_info;
   1535   1.1  christos 		    size *= (sizeof (bfd_signed_vma) + sizeof(char));
   1536   1.1  christos 		    local_got_refcounts = ((bfd_signed_vma *)
   1537   1.8  christos 					   bfd_zalloc (abfd, size));
   1538   1.1  christos 		    if (local_got_refcounts == NULL)
   1539   1.1  christos 		      return false;
   1540   1.1  christos 		    elf_local_got_refcounts (abfd) = local_got_refcounts;
   1541   1.1  christos 		    _bfd_sparc_elf_local_got_tls_type (abfd)
   1542   1.1  christos 		      = (char *) (local_got_refcounts + symtab_hdr->sh_info);
   1543   1.6  christos 		  }
   1544   1.6  christos 
   1545   1.6  christos 		if (r_type != R_SPARC_GOTDATA_OP_HIX22
   1546   1.6  christos 		    && r_type != R_SPARC_GOTDATA_OP_LOX10)
   1547   1.6  christos 		  local_got_refcounts[r_symndx] += 1;
   1548   1.6  christos 
   1549   1.1  christos 		old_tls_type
   1550   1.1  christos 		  = _bfd_sparc_elf_local_got_tls_type (abfd) [r_symndx];
   1551   1.6  christos 	      }
   1552   1.6  christos 
   1553   1.6  christos 	    /* If a TLS symbol is accessed using IE at least once, there is no
   1554   1.1  christos 	       point in using the dynamic model for it.  */
   1555   1.6  christos 	    if (old_tls_type != tls_type)
   1556   1.6  christos 	      {
   1557   1.6  christos 		if (old_tls_type == GOT_UNKNOWN)
   1558   1.6  christos 		  ;
   1559   1.6  christos 		else if (old_tls_type == GOT_TLS_GD && tls_type == GOT_TLS_IE)
   1560   1.1  christos 		  ;
   1561   1.1  christos 		else if (old_tls_type == GOT_TLS_IE && tls_type == GOT_TLS_GD)
   1562   1.1  christos 		  tls_type = old_tls_type;
   1563   1.6  christos 		else
   1564   1.6  christos 		  {
   1565   1.6  christos 		    _bfd_error_handler
   1566   1.1  christos 		      /* xgettext:c-format */
   1567   1.8  christos 		      (_("%pB: `%s' accessed both as normal and thread local symbol"),
   1568   1.1  christos 		       abfd, h ? h->root.root.string : "<local>");
   1569   1.1  christos 		    return false;
   1570   1.1  christos 		  }
   1571   1.1  christos 
   1572   1.1  christos 		if (h != NULL)
   1573   1.1  christos 		  _bfd_sparc_elf_hash_entry (h)->tls_type = tls_type;
   1574   1.1  christos 		else
   1575   1.1  christos 		  _bfd_sparc_elf_local_got_tls_type (abfd) [r_symndx] = tls_type;
   1576   1.1  christos 	      }
   1577   1.6  christos 	  }
   1578   1.6  christos 
   1579   1.8  christos 	  if (!htab->elf.sgot
   1580   1.6  christos 	      && !_bfd_elf_create_got_section (htab->elf.dynobj, info))
   1581   1.6  christos 	    return false;
   1582   1.1  christos 
   1583   1.6  christos 	  if (eh != NULL)
   1584   1.6  christos 	    {
   1585   1.6  christos 	      eh->has_got_reloc = 1;
   1586   1.6  christos 	      if (r_type == R_SPARC_GOT10
   1587   1.6  christos 		  || r_type == R_SPARC_GOT13
   1588   1.1  christos 		  || r_type == R_SPARC_GOT22)
   1589   1.1  christos 		eh->has_old_style_got_reloc = 1;
   1590   1.1  christos 	    }
   1591   1.1  christos 	  break;
   1592   1.1  christos 
   1593   1.6  christos 	case R_SPARC_TLS_GD_CALL:
   1594   1.1  christos 	case R_SPARC_TLS_LDM_CALL:
   1595   1.6  christos 	  if (bfd_link_executable (info))
   1596   1.6  christos 	    break;
   1597   1.6  christos 
   1598   1.8  christos 	  /* Essentially R_SPARC_WPLT30 relocs against __tls_get_addr.  */
   1599   1.8  christos 	  h = (struct elf_link_hash_entry *)
   1600   1.6  christos 	       bfd_link_hash_lookup (info->hash, "__tls_get_addr", false,
   1601   1.1  christos 				     false, true);
   1602   1.1  christos 	  BFD_ASSERT (h != NULL);
   1603   1.6  christos 	  /* Fall through */
   1604   1.1  christos 
   1605   1.6  christos 	case R_SPARC_WPLT30:
   1606   1.1  christos 	case R_SPARC_PLT32:
   1607   1.1  christos 	case R_SPARC_PLT64:
   1608   1.1  christos 	case R_SPARC_HIPLT22:
   1609   1.1  christos 	case R_SPARC_LOPLT10:
   1610   1.1  christos 	case R_SPARC_PCPLT32:
   1611   1.6  christos 	case R_SPARC_PCPLT22:
   1612   1.6  christos 	case R_SPARC_PCPLT10:
   1613   1.1  christos 	  /* This symbol requires a procedure linkage table entry.
   1614   1.1  christos 	     We actually build the entry in adjust_dynamic_symbol,
   1615   1.1  christos 	     because this might be a case of linking PIC code without
   1616   1.1  christos 	     linking in any dynamic objects, in which case we don't
   1617   1.1  christos 	     need to generate a procedure linkage table after all.  */
   1618   1.1  christos 
   1619   1.1  christos 	  if (h == NULL)
   1620   1.1  christos 	    {
   1621   1.1  christos 	      if (! ABI_64_P (abfd))
   1622   1.1  christos 		{
   1623   1.1  christos 		  /* The Solaris native assembler will generate a WPLT30
   1624   1.1  christos 		     reloc for a local symbol if you assemble a call from
   1625   1.6  christos 		     one section to another when using -K pic.  We treat
   1626   1.1  christos 		     it as WDISP30.  */
   1627   1.1  christos 		  if (r_type == R_SPARC_PLT32)
   1628   1.1  christos 		    goto r_sparc_plt32;
   1629   1.1  christos 		  break;
   1630   1.1  christos 		}
   1631   1.1  christos 	      /* PR 7027: We need similar behaviour for 64-bit binaries.  */
   1632   1.1  christos 	      else if (r_type == R_SPARC_WPLT30)
   1633   1.1  christos 		break;
   1634   1.6  christos 
   1635   1.1  christos 	      /* It does not make sense to have a procedure linkage
   1636   1.8  christos 		 table entry for a local symbol.  */
   1637   1.1  christos 	      bfd_set_error (bfd_error_bad_value);
   1638   1.1  christos 	      return false;
   1639   1.1  christos 	    }
   1640   1.1  christos 
   1641   1.6  christos 	  h->needs_plt = 1;
   1642   1.6  christos 
   1643   1.1  christos 	  if (r_type == R_SPARC_PLT32 || r_type == R_SPARC_PLT64)
   1644   1.1  christos 	    goto r_sparc_plt32;
   1645   1.6  christos 
   1646   1.6  christos 	  h->plt.refcount += 1;
   1647   1.6  christos 
   1648   1.1  christos 	  eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
   1649   1.1  christos 	  eh->has_got_reloc = 1;
   1650   1.1  christos 	  break;
   1651   1.1  christos 
   1652   1.1  christos 	case R_SPARC_PC10:
   1653   1.1  christos 	case R_SPARC_PC22:
   1654   1.1  christos 	case R_SPARC_PC_HH22:
   1655   1.1  christos 	case R_SPARC_PC_HM10:
   1656   1.1  christos 	case R_SPARC_PC_LM22:
   1657   1.1  christos 	  if (h != NULL)
   1658  1.10  christos 	    h->non_got_ref = 1;
   1659   1.1  christos 
   1660   1.1  christos 	  if (h != NULL && h == htab->elf.hgot)
   1661   1.1  christos 	    break;
   1662   1.1  christos 	  /* Fall through.  */
   1663   1.1  christos 
   1664   1.1  christos 	case R_SPARC_DISP8:
   1665   1.1  christos 	case R_SPARC_DISP16:
   1666   1.1  christos 	case R_SPARC_DISP32:
   1667   1.1  christos 	case R_SPARC_DISP64:
   1668   1.1  christos 	case R_SPARC_WDISP30:
   1669   1.1  christos 	case R_SPARC_WDISP22:
   1670   1.1  christos 	case R_SPARC_WDISP19:
   1671   1.1  christos 	case R_SPARC_WDISP16:
   1672   1.1  christos 	case R_SPARC_WDISP10:
   1673   1.1  christos 	case R_SPARC_8:
   1674   1.1  christos 	case R_SPARC_16:
   1675   1.1  christos 	case R_SPARC_32:
   1676   1.1  christos 	case R_SPARC_HI22:
   1677   1.1  christos 	case R_SPARC_22:
   1678   1.1  christos 	case R_SPARC_13:
   1679   1.1  christos 	case R_SPARC_LO10:
   1680   1.1  christos 	case R_SPARC_UA16:
   1681   1.1  christos 	case R_SPARC_UA32:
   1682   1.1  christos 	case R_SPARC_10:
   1683   1.1  christos 	case R_SPARC_11:
   1684   1.1  christos 	case R_SPARC_64:
   1685   1.1  christos 	case R_SPARC_OLO10:
   1686   1.1  christos 	case R_SPARC_HH22:
   1687   1.1  christos 	case R_SPARC_HM10:
   1688   1.1  christos 	case R_SPARC_LM22:
   1689   1.1  christos 	case R_SPARC_7:
   1690   1.1  christos 	case R_SPARC_5:
   1691   1.1  christos 	case R_SPARC_6:
   1692   1.1  christos 	case R_SPARC_HIX22:
   1693   1.1  christos 	case R_SPARC_LOX10:
   1694   1.1  christos 	case R_SPARC_H44:
   1695   1.1  christos 	case R_SPARC_M44:
   1696   1.1  christos 	case R_SPARC_L44:
   1697   1.1  christos 	case R_SPARC_H34:
   1698   1.1  christos 	case R_SPARC_UA64:
   1699   1.1  christos 	  if (h != NULL)
   1700   1.6  christos 	    h->non_got_ref = 1;
   1701   1.6  christos 
   1702   1.6  christos 	  if (eh != NULL && (sec->flags & SEC_CODE) != 0)
   1703   1.1  christos 	    eh->has_non_got_reloc = 1;
   1704   1.3  christos 
   1705   1.1  christos 	r_sparc_plt32:
   1706   1.1  christos 	  if (h != NULL && !bfd_link_pic (info))
   1707   1.1  christos 	    {
   1708   1.1  christos 	      /* We may need a .plt entry if the function this reloc
   1709   1.1  christos 		 refers to is in a shared lib.  */
   1710   1.1  christos 	      h->plt.refcount += 1;
   1711   1.1  christos 	    }
   1712   1.1  christos 
   1713   1.1  christos 	  /* If we are creating a shared library, and this is a reloc
   1714   1.1  christos 	     against a global symbol, or a non PC relative reloc
   1715   1.1  christos 	     against a local symbol, then we need to copy the reloc
   1716   1.1  christos 	     into the shared library.  However, if we are linking with
   1717   1.1  christos 	     -Bsymbolic, we do not need to copy a reloc against a
   1718   1.1  christos 	     global symbol which is defined in an object we are
   1719   1.1  christos 	     including in the link (i.e., DEF_REGULAR is set).  At
   1720   1.1  christos 	     this point we have not seen all the input files, so it is
   1721   1.1  christos 	     possible that DEF_REGULAR is not set now but will be set
   1722   1.1  christos 	     later (it is never cleared).  In case of a weak definition,
   1723   1.1  christos 	     DEF_REGULAR may be cleared later by a strong definition in
   1724   1.1  christos 	     a shared library.  We account for that possibility below by
   1725   1.1  christos 	     storing information in the relocs_copied field of the hash
   1726   1.1  christos 	     table entry.  A similar situation occurs when creating
   1727   1.1  christos 	     shared libraries and symbol visibility changes render the
   1728   1.1  christos 	     symbol local.
   1729   1.1  christos 
   1730   1.1  christos 	     If on the other hand, we are creating an executable, we
   1731   1.1  christos 	     may need to keep relocations for symbols satisfied by a
   1732   1.3  christos 	     dynamic library if we manage to avoid copy relocs for the
   1733   1.1  christos 	     symbol.  */
   1734   1.1  christos 	  if ((bfd_link_pic (info)
   1735   1.1  christos 	       && (sec->flags & SEC_ALLOC) != 0
   1736   1.1  christos 	       && (! _bfd_sparc_elf_howto_table[r_type].pc_relative
   1737   1.1  christos 		   || (h != NULL
   1738   1.1  christos 		       && (! SYMBOLIC_BIND (info, h)
   1739   1.3  christos 			   || h->root.type == bfd_link_hash_defweak
   1740   1.1  christos 			   || !h->def_regular))))
   1741   1.1  christos 	      || (!bfd_link_pic (info)
   1742   1.1  christos 		  && (sec->flags & SEC_ALLOC) != 0
   1743   1.1  christos 		  && h != NULL
   1744   1.3  christos 		  && (h->root.type == bfd_link_hash_defweak
   1745   1.1  christos 		      || !h->def_regular))
   1746   1.1  christos 	      || (!bfd_link_pic (info)
   1747   1.1  christos 		  && h != NULL
   1748   1.6  christos 		  && h->type == STT_GNU_IFUNC))
   1749   1.6  christos 	    {
   1750   1.1  christos 	      struct elf_dyn_relocs *p;
   1751   1.1  christos 	      struct elf_dyn_relocs **head;
   1752   1.1  christos 
   1753   1.1  christos 	      /* When creating a shared object, we must copy these
   1754   1.1  christos 		 relocs into the output file.  We create a reloc
   1755   1.1  christos 		 section in dynobj and make room for the reloc.  */
   1756   1.1  christos 	      if (sreloc == NULL)
   1757   1.1  christos 		{
   1758   1.8  christos 		  sreloc = _bfd_elf_make_dynamic_reloc_section
   1759   1.1  christos 		    (sec, htab->elf.dynobj, htab->word_align_power,
   1760   1.1  christos 		     abfd, /*rela?*/ true);
   1761   1.8  christos 
   1762   1.1  christos 		  if (sreloc == NULL)
   1763   1.1  christos 		    return false;
   1764   1.1  christos 		}
   1765   1.1  christos 
   1766   1.1  christos 	      /* If this is a global symbol, we count the number of
   1767   1.8  christos 		 relocations we need for this symbol.  */
   1768   1.1  christos 	      if (h != NULL)
   1769   1.1  christos 		head = &h->dyn_relocs;
   1770   1.1  christos 	      else
   1771   1.1  christos 		{
   1772   1.1  christos 		  /* Track dynamic relocs needed for local syms too.
   1773   1.1  christos 		     We really need local syms available to do this
   1774   1.1  christos 		     easily.  Oh well.  */
   1775   1.1  christos 		  asection *s;
   1776   1.1  christos 		  void *vpp;
   1777   1.1  christos 
   1778   1.1  christos 		  BFD_ASSERT (isym != NULL);
   1779   1.1  christos 		  s = bfd_section_from_elf_index (abfd, isym->st_shndx);
   1780   1.1  christos 		  if (s == NULL)
   1781   1.1  christos 		    s = sec;
   1782   1.6  christos 
   1783   1.1  christos 		  vpp = &elf_section_data (s)->local_dynrel;
   1784   1.1  christos 		  head = (struct elf_dyn_relocs **) vpp;
   1785   1.1  christos 		}
   1786   1.1  christos 
   1787   1.1  christos 	      p = *head;
   1788   1.8  christos 	      if (p == NULL || p->sec != sec)
   1789   1.6  christos 		{
   1790   1.1  christos 		  size_t amt = sizeof *p;
   1791   1.1  christos 		  p = ((struct elf_dyn_relocs *)
   1792   1.8  christos 		       bfd_alloc (htab->elf.dynobj, amt));
   1793   1.1  christos 		  if (p == NULL)
   1794   1.1  christos 		    return false;
   1795   1.1  christos 		  p->next = *head;
   1796   1.1  christos 		  *head = p;
   1797   1.1  christos 		  p->sec = sec;
   1798   1.1  christos 		  p->count = 0;
   1799   1.1  christos 		  p->pc_count = 0;
   1800   1.1  christos 		}
   1801   1.1  christos 
   1802   1.1  christos 	      p->count += 1;
   1803   1.1  christos 	      if (_bfd_sparc_elf_howto_table[r_type].pc_relative)
   1804   1.1  christos 		p->pc_count += 1;
   1805   1.1  christos 	    }
   1806   1.1  christos 
   1807   1.1  christos 	  break;
   1808   1.1  christos 
   1809   1.8  christos 	case R_SPARC_GNU_VTINHERIT:
   1810   1.1  christos 	  if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
   1811   1.1  christos 	    return false;
   1812   1.1  christos 	  break;
   1813   1.7  christos 
   1814   1.8  christos 	case R_SPARC_GNU_VTENTRY:
   1815   1.1  christos 	  if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
   1816   1.1  christos 	    return false;
   1817   1.1  christos 	  break;
   1818   1.1  christos 
   1819   1.1  christos 	case R_SPARC_REGISTER:
   1820   1.1  christos 	  /* Nothing to do.  */
   1821   1.1  christos 	  break;
   1822   1.1  christos 
   1823   1.1  christos 	default:
   1824   1.1  christos 	  break;
   1825   1.1  christos 	}
   1826   1.8  christos     }
   1827   1.1  christos 
   1828   1.1  christos   return true;
   1829   1.1  christos }
   1830   1.1  christos 
   1831   1.1  christos asection *
   1833   1.1  christos _bfd_sparc_elf_gc_mark_hook (asection *sec,
   1834   1.1  christos 			     struct bfd_link_info *info,
   1835   1.1  christos 			     Elf_Internal_Rela *rel,
   1836   1.1  christos 			     struct elf_link_hash_entry *h,
   1837   1.1  christos 			     Elf_Internal_Sym *sym)
   1838   1.1  christos {
   1839   1.1  christos   if (h != NULL)
   1840   1.1  christos     switch (SPARC_ELF_R_TYPE (rel->r_info))
   1841   1.1  christos       {
   1842   1.1  christos       case R_SPARC_GNU_VTINHERIT:
   1843   1.1  christos       case R_SPARC_GNU_VTENTRY:
   1844   1.6  christos 	return NULL;
   1845   1.1  christos       }
   1846   1.1  christos 
   1847   1.1  christos   if (!bfd_link_executable (info))
   1848   1.1  christos     {
   1849   1.1  christos       switch (SPARC_ELF_R_TYPE (rel->r_info))
   1850   1.1  christos 	{
   1851   1.1  christos 	case R_SPARC_TLS_GD_CALL:
   1852   1.1  christos 	case R_SPARC_TLS_LDM_CALL:
   1853   1.1  christos 	  /* This reloc implicitly references __tls_get_addr.  We know
   1854   1.1  christos 	     another reloc will reference the same symbol as the one
   1855   1.1  christos 	     on this reloc, so the real symbol and section will be
   1856   1.8  christos 	     gc marked when processing the other reloc.  That lets
   1857   1.1  christos 	     us handle __tls_get_addr here.  */
   1858   1.1  christos 	  h = elf_link_hash_lookup (elf_hash_table (info), "__tls_get_addr",
   1859   1.6  christos 				    false, false, true);
   1860   1.6  christos 	  BFD_ASSERT (h != NULL);
   1861   1.1  christos 	  h->mark = 1;
   1862   1.1  christos 	  if (h->is_weakalias)
   1863   1.1  christos 	    weakdef (h)->mark = 1;
   1864   1.1  christos 	  sym = NULL;
   1865   1.1  christos 	}
   1866   1.1  christos     }
   1867   1.1  christos 
   1868   1.1  christos   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
   1869   1.1  christos }
   1870   1.1  christos 
   1871   1.1  christos static Elf_Internal_Rela *
   1872   1.1  christos sparc_elf_find_reloc_at_ofs (Elf_Internal_Rela *rel,
   1873   1.1  christos 			     Elf_Internal_Rela *relend,
   1874   1.1  christos 			     bfd_vma offset)
   1875   1.1  christos {
   1876   1.1  christos   while (rel < relend)
   1877   1.1  christos     {
   1878   1.1  christos       if (rel->r_offset == offset)
   1879   1.1  christos 	return rel;
   1880   1.1  christos       rel++;
   1881   1.1  christos     }
   1882   1.6  christos   return NULL;
   1883   1.6  christos }
   1884   1.6  christos 
   1885   1.8  christos /* Remove undefined weak symbol from the dynamic symbol table if it
   1886   1.6  christos    is resolved to 0.   */
   1887   1.6  christos 
   1888   1.1  christos bool
   1889   1.6  christos _bfd_sparc_elf_fixup_symbol (struct bfd_link_info *info,
   1890   1.6  christos 			     struct elf_link_hash_entry *h)
   1891   1.6  christos {
   1892   1.6  christos   if (h->dynindx != -1
   1893   1.6  christos       && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info,
   1894   1.6  christos 					  _bfd_sparc_elf_hash_entry (h)))
   1895   1.6  christos     {
   1896   1.6  christos       h->dynindx = -1;
   1897   1.8  christos       _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
   1898   1.1  christos 			      h->dynstr_index);
   1899   1.1  christos     }
   1900   1.1  christos   return true;
   1901   1.1  christos }
   1902   1.1  christos 
   1903   1.1  christos /* Adjust a symbol defined by a dynamic object and referenced by a
   1904   1.1  christos    regular object.  The current definition is in some section of the
   1905   1.1  christos    dynamic object, but we're not including those sections.  We have to
   1906   1.8  christos    change the definition to something the rest of the link can
   1907   1.1  christos    understand.  */
   1908   1.1  christos 
   1909   1.1  christos bool
   1910   1.1  christos _bfd_sparc_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
   1911   1.6  christos 				     struct elf_link_hash_entry *h)
   1912   1.1  christos {
   1913   1.1  christos   struct _bfd_sparc_elf_link_hash_table *htab;
   1914   1.1  christos   asection *s, *srel;
   1915   1.1  christos 
   1916   1.1  christos   htab = _bfd_sparc_elf_hash_table (info);
   1917   1.1  christos   BFD_ASSERT (htab != NULL);
   1918   1.1  christos 
   1919   1.1  christos   /* Make sure we know what is going on here.  */
   1920   1.6  christos   BFD_ASSERT (htab->elf.dynobj != NULL
   1921   1.1  christos 	      && (h->needs_plt
   1922   1.1  christos 		  || h->type == STT_GNU_IFUNC
   1923   1.1  christos 		  || h->is_weakalias
   1924   1.1  christos 		  || (h->def_dynamic
   1925   1.1  christos 		      && h->ref_regular
   1926   1.1  christos 		      && !h->def_regular)));
   1927   1.1  christos 
   1928   1.1  christos   /* If this is a function, put it in the procedure linkage table.  We
   1929   1.1  christos      will fill in the contents of the procedure linkage table later
   1930   1.1  christos      (although we could actually do it here).  The STT_NOTYPE
   1931   1.1  christos      condition is a hack specifically for the Oracle libraries
   1932   1.1  christos      delivered for Solaris; for some inexplicable reason, they define
   1933   1.1  christos      some of their functions as STT_NOTYPE when they really should be
   1934   1.1  christos      STT_FUNC.  */
   1935   1.1  christos   if (h->type == STT_FUNC
   1936   1.1  christos       || h->type == STT_GNU_IFUNC
   1937   1.1  christos       || h->needs_plt
   1938   1.1  christos       || (h->type == STT_NOTYPE
   1939   1.1  christos 	  && (h->root.type == bfd_link_hash_defined
   1940   1.1  christos 	      || h->root.type == bfd_link_hash_defweak)
   1941   1.1  christos 	  && (h->root.u.def.section->flags & SEC_CODE) != 0))
   1942   1.1  christos     {
   1943   1.6  christos       if (h->plt.refcount <= 0
   1944   1.6  christos 	  || (h->type != STT_GNU_IFUNC
   1945   1.1  christos 	      && (SYMBOL_CALLS_LOCAL (info, h)
   1946   1.1  christos 		  || (h->root.type == bfd_link_hash_undefweak
   1947   1.1  christos 		      && ELF_ST_VISIBILITY (h->other) != STV_DEFAULT))))
   1948   1.1  christos 	{
   1949   1.1  christos 	  /* This case can occur if we saw a WPLT30 reloc in an input
   1950   1.1  christos 	     file, but the symbol was never referred to by a dynamic
   1951   1.1  christos 	     object, or if all references were garbage collected.  In
   1952   1.1  christos 	     such a case, we don't actually need to build a procedure
   1953   1.1  christos 	     linkage table, and we can just do a WDISP30 reloc instead.  */
   1954   1.1  christos 	  h->plt.offset = (bfd_vma) -1;
   1955   1.8  christos 	  h->needs_plt = 0;
   1956   1.1  christos 	}
   1957   1.1  christos 
   1958   1.1  christos       return true;
   1959   1.1  christos     }
   1960   1.1  christos   else
   1961   1.1  christos     h->plt.offset = (bfd_vma) -1;
   1962   1.1  christos 
   1963   1.6  christos   /* If this is a weak symbol, and there is a real definition, the
   1964   1.1  christos      processor independent code will have arranged for us to see the
   1965   1.6  christos      real definition first, and we can just use the same value.  */
   1966   1.6  christos   if (h->is_weakalias)
   1967   1.6  christos     {
   1968   1.6  christos       struct elf_link_hash_entry *def = weakdef (h);
   1969   1.8  christos       BFD_ASSERT (def->root.type == bfd_link_hash_defined);
   1970   1.1  christos       h->root.u.def.section = def->root.u.def.section;
   1971   1.1  christos       h->root.u.def.value = def->root.u.def.value;
   1972   1.1  christos       return true;
   1973   1.1  christos     }
   1974   1.1  christos 
   1975   1.1  christos   /* This is a reference to a symbol defined by a dynamic object which
   1976   1.1  christos      is not a function.  */
   1977   1.1  christos 
   1978   1.1  christos   /* If we are creating a shared library, we must presume that the
   1979   1.3  christos      only references to the symbol are via the global offset table.
   1980   1.8  christos      For such cases we need not do anything here; the relocations will
   1981   1.1  christos      be handled correctly by relocate_section.  */
   1982   1.1  christos   if (bfd_link_pic (info))
   1983   1.1  christos     return true;
   1984   1.1  christos 
   1985   1.8  christos   /* If there are no references to this symbol that do not use the
   1986   1.1  christos      GOT, we don't need to generate a copy reloc.  */
   1987   1.1  christos   if (!h->non_got_ref)
   1988   1.1  christos     return true;
   1989   1.1  christos 
   1990   1.1  christos   /* If -z nocopyreloc was given, we won't generate them either.  */
   1991   1.8  christos   if (info->nocopyreloc)
   1992   1.1  christos     {
   1993   1.1  christos       h->non_got_ref = 0;
   1994   1.6  christos       return true;
   1995   1.1  christos     }
   1996   1.8  christos 
   1997   1.1  christos   /* If we don't find any dynamic relocs in read-only sections, then
   1998   1.1  christos      we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
   1999   1.8  christos   if (!_bfd_elf_readonly_dynrelocs (h))
   2000   1.1  christos     {
   2001   1.1  christos       h->non_got_ref = 0;
   2002   1.1  christos       return true;
   2003   1.1  christos     }
   2004   1.1  christos 
   2005   1.1  christos   /* We must allocate the symbol in our .dynbss section, which will
   2006   1.1  christos      become part of the .bss section of the executable.  There will be
   2007   1.1  christos      an entry for this symbol in the .dynsym section.  The dynamic
   2008   1.1  christos      object will contain position independent code, so all references
   2009   1.1  christos      from the dynamic object to this symbol will go through the global
   2010   1.1  christos      offset table.  The dynamic linker will use the .dynsym entry to
   2011   1.1  christos      determine the address it must put in the global offset table, so
   2012   1.1  christos      both the dynamic object and the regular object will refer to the
   2013   1.1  christos      same memory location for the variable.  */
   2014   1.1  christos 
   2015   1.1  christos   /* We must generate a R_SPARC_COPY reloc to tell the dynamic linker
   2016   1.6  christos      to copy the initial value out of the dynamic object and into the
   2017   1.6  christos      runtime process image.  We need to remember the offset into the
   2018   1.6  christos      .rel.bss section we are going to use.  */
   2019   1.6  christos   if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
   2020   1.6  christos     {
   2021   1.6  christos       s = htab->elf.sdynrelro;
   2022   1.6  christos       srel = htab->elf.sreldynrelro;
   2023   1.6  christos     }
   2024   1.6  christos   else
   2025   1.6  christos     {
   2026   1.1  christos       s = htab->elf.sdynbss;
   2027   1.1  christos       srel = htab->elf.srelbss;
   2028   1.6  christos     }
   2029   1.1  christos   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
   2030   1.1  christos     {
   2031   1.1  christos       srel->size += SPARC_ELF_RELA_BYTES (htab);
   2032   1.3  christos       h->needs_copy = 1;
   2033   1.1  christos     }
   2034   1.1  christos 
   2035   1.1  christos   return _bfd_elf_adjust_dynamic_copy (info, h, s);
   2036   1.1  christos }
   2037   1.1  christos 
   2038   1.8  christos /* Allocate space in .plt, .got and associated reloc sections for
   2039   1.1  christos    dynamic relocs.  */
   2040   1.1  christos 
   2041   1.1  christos static bool
   2042   1.1  christos allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
   2043   1.1  christos {
   2044   1.6  christos   struct bfd_link_info *info;
   2045   1.8  christos   struct _bfd_sparc_elf_link_hash_table *htab;
   2046   1.1  christos   struct _bfd_sparc_elf_link_hash_entry *eh;
   2047   1.1  christos   struct elf_dyn_relocs *p;
   2048   1.8  christos   bool resolved_to_zero;
   2049   1.1  christos 
   2050   1.1  christos   if (h->root.type == bfd_link_hash_indirect)
   2051   1.1  christos     return true;
   2052   1.1  christos 
   2053   1.1  christos   info = (struct bfd_link_info *) inf;
   2054   1.6  christos   htab = _bfd_sparc_elf_hash_table (info);
   2055   1.6  christos   BFD_ASSERT (htab != NULL);
   2056   1.6  christos 
   2057   1.1  christos   eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
   2058   1.1  christos   resolved_to_zero = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
   2059   1.1  christos 
   2060   1.1  christos   if ((htab->elf.dynamic_sections_created
   2061   1.1  christos        && h->plt.refcount > 0)
   2062   1.1  christos       || (h->type == STT_GNU_IFUNC
   2063   1.6  christos 	  && h->def_regular
   2064   1.6  christos 	  && h->ref_regular))
   2065   1.6  christos     {
   2066   1.6  christos       /* Undefined weak syms won't yet be marked as dynamic.  */
   2067   1.1  christos       if (h->root.type == bfd_link_hash_undefweak
   2068   1.1  christos 	  && !resolved_to_zero
   2069   1.1  christos 	  && h->dynindx == -1
   2070   1.8  christos 	  && !h->forced_local)
   2071   1.1  christos 	{
   2072   1.1  christos 	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
   2073   1.3  christos 	    return false;
   2074   1.1  christos 	}
   2075   1.1  christos 
   2076   1.1  christos       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h)
   2077   1.1  christos 	  || (h->type == STT_GNU_IFUNC
   2078   1.1  christos 	      && h->def_regular))
   2079   1.1  christos 	{
   2080   1.1  christos 	  asection *s = htab->elf.splt;
   2081   1.1  christos 
   2082   1.1  christos 	  if (s == NULL)
   2083   1.1  christos 	    s = htab->elf.iplt;
   2084   1.1  christos 
   2085   1.1  christos 	  /* Allocate room for the header.  */
   2086   1.1  christos 	  if (s->size == 0)
   2087   1.1  christos 	    {
   2088   1.8  christos 	      s->size = htab->plt_header_size;
   2089   1.8  christos 
   2090   1.1  christos 	      /* Allocate space for the .rela.plt.unloaded relocations.  */
   2091   1.1  christos 	      if (htab->elf.target_os == is_vxworks
   2092   1.1  christos 		  && !bfd_link_pic (info))
   2093   1.1  christos 		htab->srelplt2->size = sizeof (Elf32_External_Rela) * 2;
   2094   1.1  christos 	    }
   2095   1.1  christos 
   2096   1.1  christos 	  /* The procedure linkage table size is bounded by the magnitude
   2097   1.1  christos 	     of the offset we can describe in the entry.  */
   2098   1.1  christos 	  if (s->size >= (SPARC_ELF_WORD_BYTES(htab) == 8 ?
   2099   1.8  christos 			  (((bfd_vma)1 << 31) << 1) : 0x400000))
   2100   1.1  christos 	    {
   2101   1.1  christos 	      bfd_set_error (bfd_error_bad_value);
   2102   1.1  christos 	      return false;
   2103   1.1  christos 	    }
   2104   1.1  christos 
   2105   1.1  christos 	  if (SPARC_ELF_WORD_BYTES(htab) == 8
   2106   1.1  christos 	      && s->size >= PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE)
   2107   1.1  christos 	    {
   2108   1.1  christos 	      bfd_vma off = s->size - PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE;
   2109   1.1  christos 
   2110   1.1  christos 
   2111   1.1  christos 	      off = (off % (160 * PLT64_ENTRY_SIZE)) / PLT64_ENTRY_SIZE;
   2112   1.1  christos 
   2113   1.1  christos 	      h->plt.offset = (s->size - (off * 8));
   2114   1.1  christos 	    }
   2115   1.1  christos 	  else
   2116   1.1  christos 	    h->plt.offset = s->size;
   2117   1.1  christos 
   2118   1.1  christos 	  /* If this symbol is not defined in a regular file, and we are
   2119   1.1  christos 	     not generating a shared library, then set the symbol to this
   2120   1.3  christos 	     location in the .plt.  This is required to make function
   2121   1.1  christos 	     pointers compare as equal between the normal executable and
   2122   1.1  christos 	     the shared library.  */
   2123   1.1  christos 	  if (! bfd_link_pic (info)
   2124   1.1  christos 	      && !h->def_regular)
   2125   1.1  christos 	    {
   2126   1.1  christos 	      h->root.u.def.section = s;
   2127   1.1  christos 	      h->root.u.def.value = h->plt.offset;
   2128   1.1  christos 	    }
   2129   1.1  christos 
   2130   1.6  christos 	  /* Make room for this entry.  */
   2131   1.6  christos 	  s->size += htab->plt_entry_size;
   2132   1.6  christos 
   2133   1.6  christos 	  /* There should be no PLT relocations against resolved undefined
   2134   1.6  christos 	     weak symbols in the executable.  */
   2135   1.6  christos 	  if (!resolved_to_zero)
   2136   1.6  christos 	    {
   2137   1.6  christos 	      /* We also need to make an entry in the .rela.plt section.  */
   2138   1.6  christos 	      if (s == htab->elf.splt)
   2139   1.6  christos 		htab->elf.srelplt->size += SPARC_ELF_RELA_BYTES (htab);
   2140   1.1  christos 	      else
   2141   1.8  christos 		htab->elf.irelplt->size += SPARC_ELF_RELA_BYTES (htab);
   2142   1.1  christos 	    }
   2143   1.1  christos 
   2144   1.1  christos 	  if (htab->elf.target_os == is_vxworks)
   2145   1.1  christos 	    {
   2146   1.1  christos 	      /* Allocate space for the .got.plt entry.  */
   2147   1.3  christos 	      htab->elf.sgotplt->size += 4;
   2148   1.1  christos 
   2149   1.1  christos 	      /* ...and for the .rela.plt.unloaded relocations.  */
   2150   1.1  christos 	      if (!bfd_link_pic (info))
   2151   1.1  christos 		htab->srelplt2->size += sizeof (Elf32_External_Rela) * 3;
   2152   1.1  christos 	    }
   2153   1.1  christos 	}
   2154   1.1  christos       else
   2155   1.1  christos 	{
   2156   1.1  christos 	  h->plt.offset = (bfd_vma) -1;
   2157   1.1  christos 	  h->needs_plt = 0;
   2158   1.1  christos 	}
   2159   1.1  christos     }
   2160   1.1  christos   else
   2161   1.1  christos     {
   2162   1.1  christos       h->plt.offset = (bfd_vma) -1;
   2163   1.1  christos       h->needs_plt = 0;
   2164   1.1  christos     }
   2165   1.1  christos 
   2166   1.6  christos   /* If R_SPARC_TLS_IE_{HI22,LO10} symbol is now local to the binary,
   2167   1.1  christos      make it a R_SPARC_TLS_LE_{HI22,LO10} requiring no TLS entry.  */
   2168   1.1  christos   if (h->got.refcount > 0
   2169   1.1  christos       && bfd_link_executable (info)
   2170   1.1  christos       && h->dynindx == -1
   2171   1.1  christos       && _bfd_sparc_elf_hash_entry(h)->tls_type == GOT_TLS_IE)
   2172   1.1  christos     h->got.offset = (bfd_vma) -1;
   2173   1.8  christos   else if (h->got.refcount > 0)
   2174   1.1  christos     {
   2175   1.1  christos       asection *s;
   2176   1.6  christos       bool dyn;
   2177   1.6  christos       int tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type;
   2178   1.6  christos 
   2179   1.6  christos       /* Undefined weak syms won't yet be marked as dynamic.  */
   2180   1.1  christos       if (h->root.type == bfd_link_hash_undefweak
   2181   1.1  christos 	  && !resolved_to_zero
   2182   1.1  christos 	  && h->dynindx == -1
   2183   1.8  christos 	  && !h->forced_local)
   2184   1.1  christos 	{
   2185   1.1  christos 	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
   2186   1.1  christos 	    return false;
   2187   1.1  christos 	}
   2188   1.1  christos 
   2189   1.1  christos       s = htab->elf.sgot;
   2190   1.1  christos       h->got.offset = s->size;
   2191   1.1  christos       s->size += SPARC_ELF_WORD_BYTES (htab);
   2192   1.1  christos       /* R_SPARC_TLS_GD_HI{22,LO10} needs 2 consecutive GOT slots.  */
   2193   1.1  christos       if (tls_type == GOT_TLS_GD)
   2194   1.6  christos 	s->size += SPARC_ELF_WORD_BYTES (htab);
   2195   1.1  christos       dyn = htab->elf.dynamic_sections_created;
   2196   1.1  christos       /* R_SPARC_TLS_IE_{HI22,LO10} needs one dynamic relocation,
   2197   1.1  christos 	 R_SPARC_TLS_GD_{HI22,LO10} needs one if local and two if global.  */
   2198   1.1  christos       if ((tls_type == GOT_TLS_GD && h->dynindx == -1)
   2199   1.1  christos 	  || tls_type == GOT_TLS_IE
   2200   1.1  christos 	  || h->type == STT_GNU_IFUNC)
   2201   1.6  christos 	htab->elf.srelgot->size += SPARC_ELF_RELA_BYTES (htab);
   2202   1.6  christos       else if (tls_type == GOT_TLS_GD)
   2203   1.6  christos 	htab->elf.srelgot->size += 2 * SPARC_ELF_RELA_BYTES (htab);
   2204   1.6  christos       else if ((WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
   2205   1.6  christos 		/* Even if the symbol isn't dynamic, we may generate a
   2206   1.6  christos 		   reloc for the dynamic linker in PIC mode.  */
   2207   1.6  christos 		|| (h->dynindx == -1
   2208   1.6  christos 		    && !h->forced_local
   2209   1.6  christos 		    && h->root.type != bfd_link_hash_undefweak
   2210   1.6  christos 		    && bfd_link_pic (info)))
   2211   1.6  christos 	       /* No dynamic relocations are needed against resolved
   2212   1.6  christos 		  undefined weak symbols in an executable.  */
   2213   1.1  christos 	       && !(h->root.type == bfd_link_hash_undefweak
   2214   1.1  christos 		    && (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
   2215   1.1  christos 			|| resolved_to_zero)))
   2216   1.1  christos 	htab->elf.srelgot->size += SPARC_ELF_RELA_BYTES (htab);
   2217   1.1  christos     }
   2218   1.8  christos   else
   2219   1.8  christos     h->got.offset = (bfd_vma) -1;
   2220   1.1  christos 
   2221   1.1  christos   if (h->dyn_relocs == NULL)
   2222   1.1  christos     return true;
   2223   1.1  christos 
   2224   1.1  christos   /* In the shared -Bsymbolic case, discard space allocated for
   2225   1.1  christos      dynamic pc-relative relocs against symbols which turn out to be
   2226   1.1  christos      defined in regular objects.  For the normal shared case, discard
   2227   1.3  christos      space for pc-relative relocs that have become local due to symbol
   2228   1.1  christos      visibility changes.  */
   2229   1.1  christos 
   2230   1.1  christos   if (bfd_link_pic (info))
   2231   1.6  christos     {
   2232   1.1  christos       if (SYMBOL_CALLS_LOCAL (info, h))
   2233   1.8  christos 	{
   2234   1.1  christos 	  struct elf_dyn_relocs **pp;
   2235   1.1  christos 
   2236   1.1  christos 	  for (pp = &h->dyn_relocs; (p = *pp) != NULL; )
   2237   1.1  christos 	    {
   2238   1.1  christos 	      p->count -= p->pc_count;
   2239   1.1  christos 	      p->pc_count = 0;
   2240   1.1  christos 	      if (p->count == 0)
   2241   1.1  christos 		*pp = p->next;
   2242   1.1  christos 	      else
   2243   1.1  christos 		pp = &p->next;
   2244   1.8  christos 	    }
   2245   1.1  christos 	}
   2246   1.6  christos 
   2247   1.1  christos       if (htab->elf.target_os == is_vxworks)
   2248   1.8  christos 	{
   2249   1.1  christos 	  struct elf_dyn_relocs **pp;
   2250   1.1  christos 
   2251   1.1  christos 	  for (pp = &h->dyn_relocs; (p = *pp) != NULL; )
   2252   1.1  christos 	    {
   2253   1.1  christos 	      if (strcmp (p->sec->output_section->name, ".tls_vars") == 0)
   2254   1.1  christos 		*pp = p->next;
   2255   1.1  christos 	      else
   2256   1.1  christos 		pp = &p->next;
   2257   1.1  christos 	    }
   2258   1.6  christos 	}
   2259   1.8  christos 
   2260   1.1  christos       /* Also discard relocs on undefined weak syms with non-default
   2261   1.1  christos 	 visibility or in PIE.  */
   2262   1.6  christos       if (h->dyn_relocs != NULL
   2263   1.6  christos 	  && h->root.type == bfd_link_hash_undefweak)
   2264   1.6  christos 	{
   2265   1.6  christos 	  /* An undefined weak symbol is never
   2266   1.6  christos 	     bound locally in a shared library.  */
   2267   1.6  christos 
   2268   1.6  christos 	  if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
   2269   1.6  christos 	      || resolved_to_zero)
   2270   1.6  christos 	    {
   2271   1.6  christos 	      if (h->non_got_ref)
   2272   1.6  christos 		{
   2273   1.6  christos 		  /* Keep dynamic non-GOT/non-PLT relocation so that we
   2274   1.8  christos 		     can branch to 0 without PLT.  */
   2275   1.6  christos 		  struct elf_dyn_relocs **pp;
   2276   1.6  christos 
   2277   1.6  christos 		  for (pp = &h->dyn_relocs; (p = *pp) != NULL;)
   2278   1.6  christos 		    if (p->pc_count == 0)
   2279   1.6  christos 		      *pp = p->next;
   2280   1.6  christos 		    else
   2281   1.6  christos 		      {
   2282   1.6  christos 			/* Remove other relocations.  */
   2283   1.6  christos 			p->count = p->pc_count;
   2284   1.8  christos 			pp = &p->next;
   2285   1.6  christos 		      }
   2286   1.6  christos 
   2287   1.6  christos 		  if (h->dyn_relocs != NULL)
   2288   1.6  christos 		    {
   2289   1.6  christos 		      /* Make sure undefined weak symbols are output
   2290   1.8  christos 			 as dynamic symbols in PIEs for dynamic non-GOT
   2291   1.6  christos 			 non-PLT reloations.  */
   2292   1.6  christos 		      if (! bfd_elf_link_record_dynamic_symbol (info, h))
   2293   1.6  christos 			return false;
   2294   1.8  christos 		    }
   2295   1.6  christos 		}
   2296   1.1  christos 	      else
   2297   1.1  christos 		h->dyn_relocs = NULL;
   2298   1.1  christos 	    }
   2299   1.1  christos 
   2300   1.1  christos 	  /* Make sure undefined weak symbols are output as a dynamic
   2301   1.1  christos 	     symbol in PIEs.  */
   2302   1.1  christos 	  else if (h->dynindx == -1
   2303   1.8  christos 		   && !h->forced_local)
   2304   1.1  christos 	    {
   2305   1.1  christos 	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
   2306   1.1  christos 		return false;
   2307   1.1  christos 	    }
   2308   1.1  christos 	}
   2309   1.1  christos     }
   2310   1.1  christos   else
   2311   1.1  christos     {
   2312   1.1  christos       /* For the non-shared case, discard space for relocs against
   2313   1.6  christos 	 symbols which turn out to need copy relocs or are not
   2314   1.6  christos 	 dynamic.  */
   2315   1.6  christos 
   2316   1.1  christos       if ((!h->non_got_ref
   2317   1.1  christos 	   || (h->root.type == bfd_link_hash_undefweak
   2318   1.1  christos 	       && !resolved_to_zero))
   2319   1.1  christos 	  && ((h->def_dynamic
   2320   1.1  christos 	       && !h->def_regular)
   2321   1.1  christos 	      || (htab->elf.dynamic_sections_created
   2322   1.6  christos 		  && (h->root.type == bfd_link_hash_undefweak
   2323   1.6  christos 		      || h->root.type == bfd_link_hash_undefined))))
   2324   1.6  christos 	{
   2325   1.6  christos 	  /* Undefined weak syms won't yet be marked as dynamic.  */
   2326   1.1  christos 	  if (h->root.type == bfd_link_hash_undefweak
   2327   1.1  christos 	      && !resolved_to_zero
   2328   1.1  christos 	      && h->dynindx == -1
   2329   1.8  christos 	      && !h->forced_local)
   2330   1.1  christos 	    {
   2331   1.1  christos 	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
   2332   1.1  christos 		return false;
   2333   1.1  christos 	    }
   2334   1.1  christos 
   2335   1.1  christos 	  /* If that succeeded, we know we'll be keeping all the
   2336   1.1  christos 	     relocs.  */
   2337   1.1  christos 	  if (h->dynindx != -1)
   2338   1.8  christos 	    goto keep;
   2339   1.1  christos 	}
   2340   1.1  christos 
   2341   1.1  christos       h->dyn_relocs = NULL;
   2342   1.1  christos 
   2343   1.1  christos     keep: ;
   2344   1.8  christos     }
   2345   1.1  christos 
   2346   1.1  christos   /* Finally, allocate space.  */
   2347   1.1  christos   for (p = h->dyn_relocs; p != NULL; p = p->next)
   2348   1.1  christos     {
   2349   1.1  christos       asection *sreloc = elf_section_data (p->sec)->sreloc;
   2350   1.8  christos       sreloc->size += p->count * SPARC_ELF_RELA_BYTES (htab);
   2351   1.1  christos     }
   2352   1.1  christos 
   2353   1.1  christos   return true;
   2354   1.1  christos }
   2355   1.1  christos 
   2356   1.8  christos /* Allocate space in .plt, .got and associated reloc sections for
   2357   1.1  christos    local dynamic relocs.  */
   2358   1.1  christos 
   2359   1.1  christos static int
   2360   1.1  christos allocate_local_dynrelocs (void **slot, void *inf)
   2361   1.1  christos {
   2362   1.1  christos   struct elf_link_hash_entry *h
   2363   1.1  christos     = (struct elf_link_hash_entry *) *slot;
   2364   1.1  christos 
   2365   1.1  christos   if (h->type != STT_GNU_IFUNC
   2366   1.1  christos       || !h->def_regular
   2367   1.1  christos       || !h->ref_regular
   2368   1.1  christos       || !h->forced_local
   2369   1.1  christos       || h->root.type != bfd_link_hash_defined)
   2370   1.1  christos     abort ();
   2371   1.1  christos 
   2372   1.1  christos   return allocate_dynrelocs (h, inf);
   2373   1.1  christos }
   2374   1.1  christos 
   2375   1.8  christos /* Return true if the dynamic symbol for a given section should be
   2376   1.1  christos    omitted when creating a shared library.  */
   2377   1.1  christos 
   2378   1.1  christos bool
   2379   1.1  christos _bfd_sparc_elf_omit_section_dynsym (bfd *output_bfd,
   2380   1.1  christos 				    struct bfd_link_info *info,
   2381   1.1  christos 				    asection *p)
   2382   1.1  christos {
   2383   1.1  christos   /* We keep the .got section symbol so that explicit relocations
   2384   1.8  christos      against the _GLOBAL_OFFSET_TABLE_ symbol emitted in PIC mode
   2385   1.1  christos      can be turned into relocations against the .got symbol.  */
   2386   1.6  christos   if (strcmp (p->name, ".got") == 0)
   2387   1.1  christos     return false;
   2388   1.1  christos 
   2389   1.1  christos   return _bfd_elf_omit_section_dynsym_default (output_bfd, info, p);
   2390   1.1  christos }
   2391   1.8  christos 
   2392  1.10  christos /* Set the sizes of the dynamic sections.  */
   2393  1.10  christos 
   2394   1.1  christos bool
   2395   1.1  christos _bfd_sparc_elf_late_size_sections (bfd *output_bfd,
   2396   1.1  christos 				   struct bfd_link_info *info)
   2397   1.1  christos {
   2398   1.1  christos   struct _bfd_sparc_elf_link_hash_table *htab;
   2399   1.1  christos   bfd *dynobj;
   2400   1.1  christos   asection *s;
   2401   1.1  christos   bfd *ibfd;
   2402   1.1  christos 
   2403  1.10  christos   htab = _bfd_sparc_elf_hash_table (info);
   2404  1.10  christos   BFD_ASSERT (htab != NULL);
   2405   1.1  christos   dynobj = htab->elf.dynobj;
   2406   1.1  christos   if (dynobj == NULL)
   2407   1.1  christos     return true;
   2408   1.1  christos 
   2409   1.3  christos   if (elf_hash_table (info)->dynamic_sections_created)
   2410   1.1  christos     {
   2411   1.1  christos       /* Set the contents of the .interp section to the interpreter.  */
   2412   1.1  christos       if (bfd_link_executable (info) && !info->nointerp)
   2413   1.1  christos 	{
   2414   1.1  christos 	  s = bfd_get_linker_section (dynobj, ".interp");
   2415  1.10  christos 	  BFD_ASSERT (s != NULL);
   2416   1.6  christos 	  s->size = htab->dynamic_interpreter_size;
   2417   1.1  christos 	  s->contents = (unsigned char *) htab->dynamic_interpreter;
   2418   1.1  christos 	  s->alloced = 1;
   2419   1.1  christos 	  htab->interp = s;
   2420   1.1  christos 	}
   2421   1.1  christos     }
   2422   1.3  christos 
   2423   1.1  christos   /* Set up .got offsets for local syms, and space for local dynamic
   2424   1.1  christos      relocs.  */
   2425   1.1  christos   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
   2426   1.1  christos     {
   2427   1.1  christos       bfd_signed_vma *local_got;
   2428   1.1  christos       bfd_signed_vma *end_local_got;
   2429   1.1  christos       char *local_tls_type;
   2430   1.1  christos       bfd_size_type locsymcount;
   2431   1.1  christos       Elf_Internal_Shdr *symtab_hdr;
   2432   1.1  christos       asection *srel;
   2433   1.1  christos 
   2434   1.1  christos       if (! is_sparc_elf (ibfd))
   2435   1.1  christos 	continue;
   2436   1.6  christos 
   2437   1.1  christos       for (s = ibfd->sections; s != NULL; s = s->next)
   2438   1.1  christos 	{
   2439   1.1  christos 	  struct elf_dyn_relocs *p;
   2440   1.1  christos 
   2441   1.1  christos 	  for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
   2442   1.1  christos 	    {
   2443   1.1  christos 	      if (!bfd_is_abs_section (p->sec)
   2444   1.1  christos 		  && bfd_is_abs_section (p->sec->output_section))
   2445   1.1  christos 		{
   2446   1.1  christos 		  /* Input section has been discarded, either because
   2447   1.1  christos 		     it is a copy of a linkonce section or due to
   2448   1.8  christos 		     linker script /DISCARD/, so we'll be discarding
   2449   1.1  christos 		     the relocs too.  */
   2450   1.1  christos 		}
   2451   1.1  christos 	      else if (htab->elf.target_os == is_vxworks
   2452   1.1  christos 		       && strcmp (p->sec->output_section->name,
   2453   1.1  christos 				  ".tls_vars") == 0)
   2454   1.1  christos 		{
   2455   1.1  christos 		  /* Relocations in vxworks .tls_vars sections are
   2456   1.1  christos 		     handled specially by the loader.  */
   2457   1.1  christos 		}
   2458   1.1  christos 	      else if (p->count != 0)
   2459   1.1  christos 		{
   2460   1.1  christos 		  srel = elf_section_data (p->sec)->sreloc;
   2461   1.1  christos 		  if (!htab->elf.dynamic_sections_created)
   2462   1.3  christos 		    srel = htab->elf.irelplt;
   2463   1.3  christos 		  srel->size += p->count * SPARC_ELF_RELA_BYTES (htab);
   2464   1.6  christos 		  if ((p->sec->output_section->flags & SEC_READONLY) != 0)
   2465   1.6  christos 		    {
   2466   1.3  christos 		      info->flags |= DF_TEXTREL;
   2467   1.1  christos 		      info->callbacks->minfo (_("%pB: dynamic relocation in read-only section `%pA'\n"),
   2468   1.1  christos 					      p->sec->owner, p->sec);
   2469   1.1  christos 		    }
   2470   1.1  christos 		}
   2471   1.1  christos 	    }
   2472   1.1  christos 	}
   2473   1.1  christos 
   2474   1.1  christos       local_got = elf_local_got_refcounts (ibfd);
   2475   1.1  christos       if (!local_got)
   2476   1.1  christos 	continue;
   2477   1.1  christos 
   2478   1.1  christos       symtab_hdr = &elf_symtab_hdr (ibfd);
   2479   1.1  christos       locsymcount = symtab_hdr->sh_info;
   2480   1.1  christos       end_local_got = local_got + locsymcount;
   2481   1.1  christos       local_tls_type = _bfd_sparc_elf_local_got_tls_type (ibfd);
   2482   1.1  christos       s = htab->elf.sgot;
   2483   1.1  christos       srel = htab->elf.srelgot;
   2484   1.1  christos       for (; local_got < end_local_got; ++local_got, ++local_tls_type)
   2485   1.1  christos 	{
   2486   1.1  christos 	  if (*local_got > 0)
   2487   1.1  christos 	    {
   2488   1.1  christos 	      *local_got = s->size;
   2489   1.3  christos 	      s->size += SPARC_ELF_WORD_BYTES (htab);
   2490   1.1  christos 	      if (*local_tls_type == GOT_TLS_GD)
   2491   1.1  christos 		s->size += SPARC_ELF_WORD_BYTES (htab);
   2492   1.1  christos 	      if (bfd_link_pic (info)
   2493   1.1  christos 		  || *local_tls_type == GOT_TLS_GD
   2494   1.1  christos 		  || *local_tls_type == GOT_TLS_IE)
   2495   1.1  christos 		srel->size += SPARC_ELF_RELA_BYTES (htab);
   2496   1.1  christos 	    }
   2497   1.1  christos 	  else
   2498   1.1  christos 	    *local_got = (bfd_vma) -1;
   2499   1.1  christos 	}
   2500   1.1  christos     }
   2501   1.1  christos 
   2502   1.1  christos   if (htab->tls_ldm_got.refcount > 0)
   2503   1.1  christos     {
   2504   1.1  christos       /* Allocate 2 got entries and 1 dynamic reloc for
   2505   1.1  christos 	 R_SPARC_TLS_LDM_{HI22,LO10} relocs.  */
   2506   1.1  christos       htab->tls_ldm_got.offset = htab->elf.sgot->size;
   2507   1.1  christos       htab->elf.sgot->size += (2 * SPARC_ELF_WORD_BYTES (htab));
   2508   1.1  christos       htab->elf.srelgot->size += SPARC_ELF_RELA_BYTES (htab);
   2509   1.1  christos     }
   2510   1.1  christos   else
   2511   1.1  christos     htab->tls_ldm_got.offset = -1;
   2512   1.1  christos 
   2513   1.1  christos   /* Allocate global sym .plt and .got entries, and space for global
   2514   1.1  christos      sym dynamic relocs.  */
   2515   1.1  christos   elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
   2516   1.1  christos 
   2517   1.1  christos   /* Allocate .plt and .got entries, and space for local symbols.  */
   2518   1.8  christos   htab_traverse (htab->loc_hash_table, allocate_local_dynrelocs, info);
   2519   1.1  christos 
   2520   1.1  christos   if (! ABI_64_P (output_bfd)
   2521   1.1  christos       && htab->elf.target_os != is_vxworks
   2522   1.1  christos       && elf_hash_table (info)->dynamic_sections_created)
   2523   1.1  christos     {
   2524   1.1  christos       /* Make space for the trailing nop in .plt.  */
   2525   1.1  christos       if (htab->elf.splt->size > 0)
   2526   1.1  christos 	htab->elf.splt->size += 1 * SPARC_INSN_BYTES;
   2527   1.1  christos 
   2528   1.1  christos       /* If the .got section is more than 0x1000 bytes, we add
   2529   1.1  christos 	 0x1000 to the value of _GLOBAL_OFFSET_TABLE_, so that 13
   2530   1.1  christos 	 bit relocations have a greater chance of working.
   2531   1.1  christos 
   2532   1.1  christos 	 FIXME: Make this optimization work for 64-bit too.  */
   2533   1.1  christos       if (htab->elf.sgot->size >= 0x1000
   2534   1.1  christos 	  && elf_hash_table (info)->hgot->root.u.def.value == 0)
   2535   1.1  christos 	elf_hash_table (info)->hgot->root.u.def.value = 0x1000;
   2536   1.1  christos     }
   2537   1.1  christos 
   2538   1.1  christos   /* The check_relocs and adjust_dynamic_symbol entry points have
   2539   1.1  christos      determined the sizes of the various dynamic sections.  Allocate
   2540   1.1  christos      memory for them.  */
   2541   1.1  christos   for (s = dynobj->sections; s != NULL; s = s->next)
   2542   1.1  christos     {
   2543   1.1  christos       if ((s->flags & SEC_LINKER_CREATED) == 0)
   2544   1.1  christos 	continue;
   2545   1.6  christos 
   2546   1.6  christos       if (s == htab->elf.splt
   2547   1.1  christos 	  || s == htab->elf.sgot
   2548   1.1  christos 	  || s == htab->elf.sdynbss
   2549   1.1  christos 	  || s == htab->elf.sdynrelro
   2550   1.1  christos 	  || s == htab->elf.iplt
   2551   1.1  christos 	  || s == htab->elf.sgotplt)
   2552   1.1  christos 	{
   2553   1.8  christos 	  /* Strip this section if we don't need it; see the
   2554   1.1  christos 	     comment below.  */
   2555   1.1  christos 	}
   2556   1.1  christos       else if (startswith (s->name, ".rela"))
   2557   1.1  christos 	{
   2558   1.1  christos 	  if (s->size != 0)
   2559   1.1  christos 	    {
   2560   1.1  christos 	      /* We use the reloc_count field as a counter if we need
   2561   1.1  christos 		 to copy relocs into the output file.  */
   2562   1.1  christos 	      s->reloc_count = 0;
   2563   1.1  christos 	    }
   2564   1.1  christos 	}
   2565   1.1  christos       else
   2566   1.1  christos 	{
   2567   1.1  christos 	  /* It's not one of our sections.  */
   2568   1.1  christos 	  continue;
   2569   1.1  christos 	}
   2570   1.1  christos 
   2571   1.1  christos       if (s->size == 0)
   2572   1.1  christos 	{
   2573   1.1  christos 	  /* If we don't need this section, strip it from the
   2574   1.1  christos 	     output file.  This is mostly to handle .rela.bss and
   2575   1.1  christos 	     .rela.plt.  We must create both sections in
   2576   1.1  christos 	     create_dynamic_sections, because they must be created
   2577   1.1  christos 	     before the linker maps input sections to output
   2578   1.1  christos 	     sections.  The linker does that before
   2579   1.1  christos 	     adjust_dynamic_symbol is called, and it is that
   2580   1.1  christos 	     function which decides whether anything needs to go
   2581   1.1  christos 	     into these sections.  */
   2582   1.1  christos 	  s->flags |= SEC_EXCLUDE;
   2583   1.1  christos 	  continue;
   2584   1.1  christos 	}
   2585   1.1  christos 
   2586   1.1  christos       if ((s->flags & SEC_HAS_CONTENTS) == 0)
   2587   1.1  christos 	continue;
   2588   1.1  christos 
   2589   1.1  christos       /* Allocate memory for the section contents.  Zero the memory
   2590   1.1  christos 	 for the benefit of .rela.plt, which has 4 unused entries
   2591   1.8  christos 	 at the beginning, and we don't want garbage.  */
   2592  1.10  christos       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
   2593   1.1  christos       if (s->contents == NULL)
   2594   1.1  christos 	return false;
   2595   1.1  christos       s->alloced = 1;
   2596   1.1  christos     }
   2597   1.1  christos 
   2598   1.1  christos   if (elf_hash_table (info)->dynamic_sections_created)
   2599   1.1  christos     {
   2600   1.1  christos       /* Add some entries to the .dynamic section.  We fill in the
   2601   1.1  christos 	 values later, in _bfd_sparc_elf_finish_dynamic_sections, but we
   2602   1.1  christos 	 must add the entries now so that we get the correct size for
   2603   1.1  christos 	 the .dynamic section.  The DT_DEBUG entry is filled in by the
   2604   1.1  christos 	 dynamic linker and used by the debugger.  */
   2605   1.8  christos #define add_dynamic_entry(TAG, VAL) \
   2606   1.8  christos   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
   2607   1.8  christos 
   2608   1.1  christos       if (!_bfd_elf_maybe_vxworks_add_dynamic_tags (output_bfd, info,
   2609   1.1  christos 						    true))
   2610   1.1  christos 	return false;
   2611   1.1  christos 
   2612   1.1  christos       if (ABI_64_P (output_bfd))
   2613   1.1  christos 	{
   2614   1.1  christos 	  int reg;
   2615   1.1  christos 	  struct _bfd_sparc_elf_app_reg * app_regs;
   2616   1.1  christos 	  struct elf_strtab_hash *dynstr;
   2617   1.1  christos 	  struct elf_link_hash_table *eht = elf_hash_table (info);
   2618   1.1  christos 
   2619   1.1  christos 	  /* Add dynamic STT_REGISTER symbols and corresponding DT_SPARC_REGISTER
   2620   1.1  christos 	     entries if needed.  */
   2621   1.1  christos 	  app_regs = _bfd_sparc_elf_hash_table (info)->app_regs;
   2622   1.1  christos 	  dynstr = eht->dynstr;
   2623   1.1  christos 
   2624   1.1  christos 	  for (reg = 0; reg < 4; reg++)
   2625   1.1  christos 	    if (app_regs [reg].name != NULL)
   2626   1.1  christos 	      {
   2627   1.8  christos 		struct elf_link_local_dynamic_entry *entry, *e;
   2628   1.1  christos 
   2629   1.1  christos 		if (!add_dynamic_entry (DT_SPARC_REGISTER, 0))
   2630   1.1  christos 		  return false;
   2631   1.1  christos 
   2632   1.8  christos 		entry = (struct elf_link_local_dynamic_entry *)
   2633   1.1  christos 		  bfd_hash_allocate (&info->hash->table, sizeof (*entry));
   2634   1.1  christos 		if (entry == NULL)
   2635   1.1  christos 		  return false;
   2636   1.1  christos 
   2637   1.1  christos 		/* We cheat here a little bit: the symbol will not be local, so we
   2638   1.1  christos 		   put it at the end of the dynlocal linked list.  We will fix it
   2639   1.1  christos 		   later on, as we have to fix other fields anyway.  */
   2640   1.1  christos 		entry->isym.st_value = reg < 2 ? reg + 2 : reg + 4;
   2641   1.8  christos 		entry->isym.st_size = 0;
   2642   1.1  christos 		if (*app_regs [reg].name != '\0')
   2643   1.1  christos 		  entry->isym.st_name
   2644   1.1  christos 		    = _bfd_elf_strtab_add (dynstr, app_regs[reg].name, false);
   2645   1.1  christos 		else
   2646   1.1  christos 		  entry->isym.st_name = 0;
   2647   1.1  christos 		entry->isym.st_other = 0;
   2648   1.1  christos 		entry->isym.st_info = ELF_ST_INFO (app_regs [reg].bind,
   2649   1.1  christos 						   STT_REGISTER);
   2650   1.1  christos 		entry->isym.st_shndx = app_regs [reg].shndx;
   2651   1.1  christos 		entry->isym.st_target_internal = 0;
   2652   1.1  christos 		entry->next = NULL;
   2653   1.1  christos 		entry->input_bfd = output_bfd;
   2654   1.1  christos 		entry->input_indx = -1;
   2655   1.1  christos 
   2656   1.1  christos 		if (eht->dynlocal == NULL)
   2657   1.1  christos 		  eht->dynlocal = entry;
   2658   1.1  christos 		else
   2659   1.1  christos 		  {
   2660   1.1  christos 		    for (e = eht->dynlocal; e->next; e = e->next)
   2661   1.1  christos 		      ;
   2662   1.1  christos 		    e->next = entry;
   2663   1.1  christos 		  }
   2664   1.1  christos 		eht->dynsymcount++;
   2665   1.1  christos 	      }
   2666   1.1  christos 	}
   2667   1.8  christos     }
   2668   1.1  christos #undef add_dynamic_entry
   2669   1.1  christos 
   2670   1.8  christos   return true;
   2671   1.1  christos }
   2672   1.1  christos 
   2673  1.10  christos bool
   2675  1.10  christos _bfd_sparc_elf_new_section_hook (bfd *abfd, asection *sec)
   2676  1.10  christos {
   2677  1.10  christos   struct _bfd_sparc_elf_section_data *sdata;
   2678  1.10  christos 
   2679   1.1  christos   sdata = bfd_zalloc (abfd, sizeof (*sdata));
   2680   1.1  christos   if (sdata == NULL)
   2681   1.1  christos     return false;
   2682   1.1  christos   sec->used_by_bfd = sdata;
   2683   1.8  christos 
   2684   1.1  christos   return _bfd_elf_new_section_hook (abfd, sec);
   2685   1.1  christos }
   2686   1.1  christos 
   2687   1.8  christos bool
   2688   1.1  christos _bfd_sparc_elf_relax_section (bfd *abfd ATTRIBUTE_UNUSED,
   2689   1.3  christos 			      struct bfd_section *section,
   2690  1.10  christos 			      struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
   2691  1.10  christos 			      bool *again)
   2692   1.1  christos {
   2693   1.8  christos   if (bfd_link_relocatable (link_info))
   2694   1.1  christos     link_info->callbacks->fatal
   2695   1.8  christos       (_("%P: --relax and -r may not be used together\n"));
   2696   1.1  christos 
   2697   1.1  christos   *again = false;
   2698   1.1  christos   sec_do_relax (section) = 1;
   2699   1.1  christos   return true;
   2700   1.1  christos }
   2701   1.1  christos 
   2702   1.1  christos /* Return the base VMA address which should be subtracted from real addresses
   2704   1.1  christos    when resolving @dtpoff relocation.
   2705   1.1  christos    This is PT_TLS segment p_vaddr.  */
   2706   1.1  christos 
   2707   1.1  christos static bfd_vma
   2708   1.1  christos dtpoff_base (struct bfd_link_info *info)
   2709   1.1  christos {
   2710   1.1  christos   /* If tls_sec is NULL, we should have signalled an error already.  */
   2711   1.1  christos   if (elf_hash_table (info)->tls_sec == NULL)
   2712   1.1  christos     return 0;
   2713   1.1  christos   return elf_hash_table (info)->tls_sec->vma;
   2714   1.1  christos }
   2715   1.1  christos 
   2716   1.1  christos /* Return the relocation value for @tpoff relocation
   2717   1.1  christos    if STT_TLS virtual address is ADDRESS.  */
   2718   1.1  christos 
   2719   1.1  christos static bfd_vma
   2720   1.1  christos tpoff (struct bfd_link_info *info, bfd_vma address)
   2721   1.1  christos {
   2722   1.1  christos   struct elf_link_hash_table *htab = elf_hash_table (info);
   2723   1.1  christos   const struct elf_backend_data *bed = get_elf_backend_data (info->output_bfd);
   2724   1.1  christos   bfd_vma static_tls_size;
   2725   1.1  christos 
   2726   1.1  christos   /* If tls_sec is NULL, we should have signalled an error already.  */
   2727   1.1  christos   if (htab->tls_sec == NULL)
   2728   1.1  christos     return 0;
   2729   1.1  christos 
   2730   1.1  christos   /* Consider special static TLS alignment requirements.  */
   2731   1.1  christos   static_tls_size = BFD_ALIGN (htab->tls_size, bed->static_tls_alignment);
   2732   1.1  christos   return address - static_tls_size - htab->tls_sec->vma;
   2733   1.1  christos }
   2734   1.1  christos 
   2735   1.1  christos /* Return the relocation value for a %gdop relocation.  */
   2736   1.1  christos 
   2737   1.1  christos static bfd_vma
   2738   1.1  christos gdopoff (struct bfd_link_info *info, bfd_vma address)
   2739   1.1  christos {
   2740   1.1  christos   struct elf_link_hash_table *htab = elf_hash_table (info);
   2741   1.1  christos   bfd_vma got_base;
   2742   1.1  christos 
   2743   1.1  christos   got_base = (htab->hgot->root.u.def.value
   2744   1.1  christos 	      + htab->hgot->root.u.def.section->output_offset
   2745   1.6  christos 	      + htab->hgot->root.u.def.section->output_section->vma);
   2746   1.6  christos 
   2747   1.6  christos   return address - got_base;
   2748   1.6  christos }
   2749   1.8  christos 
   2750   1.6  christos /* Return whether H is local and its ADDRESS is within 4G of
   2751   1.6  christos    _GLOBAL_OFFSET_TABLE_ and thus the offset may be calculated by a
   2752   1.6  christos    sethi, xor sequence.  */
   2753   1.6  christos 
   2754   1.6  christos static bool
   2755   1.8  christos gdop_relative_offset_ok (struct bfd_link_info *info,
   2756   1.6  christos 			 struct elf_link_hash_entry *h,
   2757   1.6  christos 			 bfd_vma address ATTRIBUTE_UNUSED)
   2758   1.6  christos {
   2759   1.6  christos   if (!SYMBOL_REFERENCES_LOCAL (info, h))
   2760   1.6  christos     return false;
   2761   1.6  christos   /* If H is undefined, ADDRESS will be zero.  We can't allow a
   2762   1.6  christos      relative offset to "zero" when producing PIEs or shared libs.
   2763   1.6  christos      Note that to get here with an undefined symbol it must also be
   2764   1.8  christos      hidden or internal visibility.  */
   2765   1.6  christos   if (bfd_link_pic (info)
   2766   1.6  christos       && h != NULL
   2767   1.6  christos       && (h->root.type == bfd_link_hash_undefweak
   2768   1.8  christos 	  || h->root.type == bfd_link_hash_undefined))
   2769   1.6  christos     return false;
   2770   1.6  christos #ifdef BFD64
   2771   1.6  christos   return gdopoff (info, address) + ((bfd_vma) 1 << 32) < (bfd_vma) 2 << 32;
   2772   1.1  christos #else
   2773   1.1  christos   return true;
   2774   1.8  christos #endif
   2775   1.1  christos }
   2776   1.1  christos 
   2777   1.1  christos /* Relocate a SPARC ELF section.  */
   2778   1.1  christos 
   2779   1.1  christos int
   2780   1.1  christos _bfd_sparc_elf_relocate_section (bfd *output_bfd,
   2781   1.1  christos 				 struct bfd_link_info *info,
   2782   1.1  christos 				 bfd *input_bfd,
   2783   1.1  christos 				 asection *input_section,
   2784   1.1  christos 				 bfd_byte *contents,
   2785   1.1  christos 				 Elf_Internal_Rela *relocs,
   2786   1.1  christos 				 Elf_Internal_Sym *local_syms,
   2787   1.1  christos 				 asection **local_sections)
   2788   1.1  christos {
   2789   1.1  christos   struct _bfd_sparc_elf_link_hash_table *htab;
   2790   1.1  christos   Elf_Internal_Shdr *symtab_hdr;
   2791   1.1  christos   struct elf_link_hash_entry **sym_hashes;
   2792   1.1  christos   bfd_vma *local_got_offsets;
   2793   1.8  christos   bfd_vma got_base;
   2794   1.1  christos   asection *sreloc;
   2795   1.1  christos   Elf_Internal_Rela *rel;
   2796   1.1  christos   Elf_Internal_Rela *relend;
   2797   1.1  christos   int num_relocs;
   2798   1.1  christos   bool is_vxworks_tls;
   2799   1.1  christos 
   2800   1.1  christos   htab = _bfd_sparc_elf_hash_table (info);
   2801   1.1  christos   BFD_ASSERT (htab != NULL);
   2802   1.1  christos   symtab_hdr = &elf_symtab_hdr (input_bfd);
   2803   1.1  christos   sym_hashes = elf_sym_hashes (input_bfd);
   2804   1.1  christos   local_got_offsets = elf_local_got_offsets (input_bfd);
   2805   1.1  christos 
   2806   1.1  christos   if (elf_hash_table (info)->hgot == NULL)
   2807   1.1  christos     got_base = 0;
   2808   1.1  christos   else
   2809   1.8  christos     got_base = elf_hash_table (info)->hgot->root.u.def.value;
   2810   1.8  christos 
   2811   1.1  christos   sreloc = elf_section_data (input_section)->sreloc;
   2812   1.1  christos   /* We have to handle relocations in vxworks .tls_vars sections
   2813   1.1  christos      specially, because the dynamic loader is 'weird'.  */
   2814   1.1  christos   is_vxworks_tls = (htab->elf.target_os == is_vxworks
   2815   1.1  christos 		    && bfd_link_pic (info)
   2816   1.1  christos 		    && !strcmp (input_section->output_section->name,
   2817   1.1  christos 				".tls_vars"));
   2818   1.1  christos 
   2819   1.1  christos   rel = relocs;
   2820   1.1  christos   if (ABI_64_P (output_bfd))
   2821   1.1  christos     num_relocs = NUM_SHDR_ENTRIES (_bfd_elf_single_rel_hdr (input_section));
   2822   1.1  christos   else
   2823   1.1  christos     num_relocs = input_section->reloc_count;
   2824   1.1  christos   relend = relocs + num_relocs;
   2825   1.1  christos   for (; rel < relend; rel++)
   2826   1.6  christos     {
   2827   1.1  christos       int r_type, tls_type;
   2828   1.1  christos       reloc_howto_type *howto;
   2829   1.1  christos       unsigned long r_symndx;
   2830   1.1  christos       struct elf_link_hash_entry *h;
   2831   1.8  christos       struct _bfd_sparc_elf_link_hash_entry *eh;
   2832   1.8  christos       Elf_Internal_Sym *sym;
   2833   1.8  christos       asection *sec;
   2834   1.8  christos       bfd_vma relocation, off;
   2835   1.1  christos       bfd_reloc_status_type r;
   2836   1.1  christos       bool is_plt = false;
   2837   1.1  christos       bool unresolved_reloc;
   2838   1.1  christos       bool resolved_to_zero;
   2839   1.1  christos       bool relative_reloc;
   2840   1.1  christos 
   2841   1.1  christos       r_type = SPARC_ELF_R_TYPE (rel->r_info);
   2842   1.1  christos       if (r_type == R_SPARC_GNU_VTINHERIT
   2843   1.1  christos 	  || r_type == R_SPARC_GNU_VTENTRY)
   2844   1.8  christos 	continue;
   2845   1.1  christos 
   2846   1.6  christos       if (r_type < 0 || r_type >= (int) R_SPARC_max_std)
   2847   1.1  christos 	{
   2848   1.1  christos 	  bfd_set_error (bfd_error_bad_value);
   2849   1.1  christos 	  return false;
   2850   1.1  christos 	}
   2851   1.1  christos 
   2852   1.8  christos       howto = _bfd_sparc_elf_howto_table + r_type;
   2853   1.1  christos       r_symndx = SPARC_ELF_R_SYMNDX (htab, rel->r_info);
   2854   1.1  christos       h = NULL;
   2855   1.1  christos       sym = NULL;
   2856   1.1  christos       sec = NULL;
   2857   1.1  christos       unresolved_reloc = false;
   2858   1.1  christos       if (r_symndx < symtab_hdr->sh_info)
   2859   1.3  christos 	{
   2860   1.1  christos 	  sym = local_syms + r_symndx;
   2861   1.1  christos 	  sec = local_sections[r_symndx];
   2862   1.1  christos 	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
   2863   1.1  christos 
   2864   1.8  christos 	  if (!bfd_link_relocatable (info)
   2865   1.1  christos 	      && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
   2866   1.1  christos 	    {
   2867   1.1  christos 	      /* Relocate against local STT_GNU_IFUNC symbol.  */
   2868   1.3  christos 	      h = elf_sparc_get_local_sym_hash (htab, input_bfd,
   2869   1.1  christos 						rel, false);
   2870   1.1  christos 	      if (h == NULL)
   2871   1.1  christos 		abort ();
   2872   1.1  christos 
   2873   1.1  christos 	      /* Set STT_GNU_IFUNC symbol value.  */
   2874   1.1  christos 	      h->root.u.def.value = sym->st_value;
   2875   1.8  christos 	      h->root.u.def.section = sec;
   2876   1.1  christos 	    }
   2877   1.1  christos 	}
   2878   1.1  christos       else
   2879   1.1  christos 	{
   2880   1.3  christos 	  bool warned, ignored;
   2881   1.1  christos 
   2882   1.1  christos 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
   2883   1.1  christos 				   r_symndx, symtab_hdr, sym_hashes,
   2884   1.1  christos 				   h, sec, relocation,
   2885   1.1  christos 				   unresolved_reloc, warned, ignored);
   2886   1.1  christos 	  if (warned)
   2887   1.1  christos 	    {
   2888   1.1  christos 	      /* To avoid generating warning messages about truncated
   2889   1.1  christos 		 relocations, set the relocation's address to be the same as
   2890   1.1  christos 		 the start of this section.  */
   2891   1.1  christos 	      if (input_section->output_section != NULL)
   2892   1.1  christos 		relocation = input_section->output_section->vma;
   2893   1.1  christos 	      else
   2894   1.1  christos 		relocation = 0;
   2895   1.1  christos 	    }
   2896   1.1  christos 	}
   2897   1.3  christos 
   2898   1.1  christos       if (sec != NULL && discarded_section (sec))
   2899   1.1  christos 	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
   2900   1.1  christos 					 rel, 1, relend, howto, 0, contents);
   2901   1.1  christos 
   2902   1.1  christos       if (bfd_link_relocatable (info))
   2903   1.1  christos 	continue;
   2904   1.1  christos 
   2905   1.1  christos       if (h != NULL
   2906   1.1  christos 	  && h->type == STT_GNU_IFUNC
   2907   1.1  christos 	  && h->def_regular)
   2908   1.1  christos 	{
   2909   1.6  christos 	  asection *plt_sec;
   2910   1.6  christos 	  const char *name;
   2911   1.6  christos 
   2912   1.6  christos 	  if ((input_section->flags & SEC_ALLOC) == 0
   2913   1.6  christos 	      || h->plt.offset == (bfd_vma) -1)
   2914   1.8  christos 	    {
   2915   1.8  christos 	      /* If this is a SHT_NOTE section without SHF_ALLOC, treat
   2916   1.8  christos 	         STT_GNU_IFUNC symbol as STT_FUNC.  */
   2917   1.8  christos 	      if (elf_section_type (input_section) == SHT_NOTE)
   2918   1.8  christos 		goto skip_ifunc;
   2919   1.8  christos 
   2920   1.8  christos 	      /* Dynamic relocs are not propagated for SEC_DEBUGGING
   2921   1.8  christos 		 sections because such sections are not SEC_ALLOC and
   2922   1.8  christos 		 thus ld.so will not process them.  */
   2923   1.8  christos 	      if ((input_section->flags & SEC_ALLOC) == 0
   2924   1.8  christos 		  && (input_section->flags & SEC_DEBUGGING) != 0)
   2925   1.8  christos 		continue;
   2926   1.8  christos 
   2927   1.8  christos 	      _bfd_error_handler
   2928   1.8  christos 		/* xgettext:c-format */
   2929   1.8  christos 		(_("%pB(%pA+%#" PRIx64 "): "
   2930   1.8  christos 		   "unresolvable %s relocation against symbol `%s'"),
   2931   1.8  christos 		 input_bfd,
   2932   1.8  christos 		 input_section,
   2933   1.6  christos 		 (uint64_t) rel->r_offset,
   2934   1.1  christos 		 howto->name,
   2935   1.1  christos 		 h->root.root.string);
   2936   1.1  christos 	      bfd_set_error (bfd_error_bad_value);
   2937   1.1  christos 	      return false;
   2938   1.1  christos 	    }
   2939   1.1  christos 
   2940   1.1  christos 	  plt_sec = htab->elf.splt;
   2941   1.1  christos 	  if (! plt_sec)
   2942   1.1  christos 	    plt_sec =htab->elf.iplt;
   2943   1.1  christos 
   2944   1.1  christos 	  switch (r_type)
   2945   1.1  christos 	    {
   2946   1.1  christos 	    case R_SPARC_GOTDATA_OP:
   2947   1.1  christos 	      continue;
   2948   1.1  christos 
   2949   1.1  christos 	    case R_SPARC_GOTDATA_OP_HIX22:
   2950   1.1  christos 	    case R_SPARC_GOTDATA_OP_LOX10:
   2951   1.1  christos 	      r_type = (r_type == R_SPARC_GOTDATA_OP_HIX22
   2952   1.1  christos 			? R_SPARC_GOT22
   2953   1.1  christos 			: R_SPARC_GOT10);
   2954   1.1  christos 	      howto = _bfd_sparc_elf_howto_table + r_type;
   2955   1.1  christos 	      /* Fall through.  */
   2956   1.1  christos 
   2957   1.1  christos 	    case R_SPARC_GOT10:
   2958   1.1  christos 	    case R_SPARC_GOT13:
   2959   1.1  christos 	    case R_SPARC_GOT22:
   2960   1.1  christos 	      if (htab->elf.sgot == NULL)
   2961   1.1  christos 		abort ();
   2962   1.1  christos 	      off = h->got.offset;
   2963   1.1  christos 	      if (off == (bfd_vma) -1)
   2964   1.1  christos 		abort();
   2965   1.1  christos 	      relocation = htab->elf.sgot->output_offset + off - got_base;
   2966   1.1  christos 	      goto do_relocation;
   2967   1.1  christos 
   2968   1.1  christos 	    case R_SPARC_WPLT30:
   2969   1.1  christos 	    case R_SPARC_WDISP30:
   2970   1.1  christos 	      relocation = (plt_sec->output_section->vma
   2971   1.3  christos 			    + plt_sec->output_offset + h->plt.offset);
   2972   1.1  christos 	      goto do_relocation;
   2973   1.1  christos 
   2974   1.1  christos 	    case R_SPARC_32:
   2975   1.1  christos 	    case R_SPARC_64:
   2976   1.1  christos 	      if (bfd_link_pic (info) && h->non_got_ref)
   2977   1.1  christos 		{
   2978   1.1  christos 		  Elf_Internal_Rela outrel;
   2979   1.1  christos 		  bfd_vma offset;
   2980   1.1  christos 
   2981   1.1  christos 		  offset = _bfd_elf_section_offset (output_bfd, info,
   2982   1.1  christos 						    input_section,
   2983   1.1  christos 						    rel->r_offset);
   2984   1.1  christos 		  if (offset == (bfd_vma) -1
   2985   1.1  christos 		      || offset == (bfd_vma) -2)
   2986   1.1  christos 		    abort();
   2987   1.1  christos 
   2988   1.1  christos 		  outrel.r_offset = (input_section->output_section->vma
   2989   1.3  christos 				     + input_section->output_offset
   2990   1.1  christos 				     + offset);
   2991   1.1  christos 
   2992   1.1  christos 		  if (h->dynindx == -1
   2993   1.1  christos 		      || h->forced_local
   2994   1.1  christos 		      || bfd_link_executable (info))
   2995   1.1  christos 		    {
   2996   1.1  christos 		      outrel.r_info = SPARC_ELF_R_INFO (htab, NULL,
   2997   1.1  christos 							0, R_SPARC_IRELATIVE);
   2998   1.1  christos 		      outrel.r_addend = relocation + rel->r_addend;
   2999   1.1  christos 		    }
   3000   1.1  christos 		  else
   3001   1.1  christos 		    {
   3002   1.1  christos 		      if (h->dynindx == -1)
   3003   1.1  christos 			abort();
   3004   1.1  christos 		      outrel.r_info = SPARC_ELF_R_INFO (htab, rel, h->dynindx, r_type);
   3005   1.1  christos 		      outrel.r_addend = rel->r_addend;
   3006   1.1  christos 		    }
   3007   1.1  christos 
   3008   1.1  christos 		  sparc_elf_append_rela (output_bfd, sreloc, &outrel);
   3009   1.1  christos 		  continue;
   3010   1.1  christos 		}
   3011   1.1  christos 
   3012   1.1  christos 	      relocation = (plt_sec->output_section->vma
   3013   1.1  christos 			    + plt_sec->output_offset + h->plt.offset);
   3014   1.3  christos 	      goto do_relocation;
   3015   1.1  christos 
   3016   1.1  christos 	    case R_SPARC_HI22:
   3017   1.1  christos 	    case R_SPARC_LO10:
   3018   1.1  christos 	      /* We should only see such relocs in static links.  */
   3019   1.1  christos 	      if (bfd_link_pic (info))
   3020   1.1  christos 		abort();
   3021   1.1  christos 	      relocation = (plt_sec->output_section->vma
   3022   1.1  christos 			    + plt_sec->output_offset + h->plt.offset);
   3023   1.1  christos 	      goto do_relocation;
   3024   1.1  christos 
   3025   1.1  christos 	    default:
   3026   1.6  christos 	      if (h->root.root.string)
   3027   1.6  christos 		name = h->root.root.string;
   3028   1.6  christos 	      else
   3029   1.1  christos 		name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
   3030   1.1  christos 					 NULL);
   3031   1.9  christos 	      _bfd_error_handler
   3032   1.1  christos 		/* xgettext:c-format */
   3033   1.8  christos 		(_("%pB: relocation %s against STT_GNU_IFUNC "
   3034   1.1  christos 		   "symbol `%s' isn't handled by %s"), input_bfd,
   3035   1.1  christos 		 _bfd_sparc_elf_howto_table[r_type].name,
   3036   1.1  christos 		 name, __func__);
   3037   1.6  christos 	      bfd_set_error (bfd_error_bad_value);
   3038   1.6  christos 	      return false;
   3039   1.6  christos 	    }
   3040   1.6  christos 	}
   3041   1.1  christos 
   3042   1.1  christos     skip_ifunc:
   3043   1.1  christos       eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
   3044   1.1  christos       resolved_to_zero = eh && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
   3045   1.6  christos 
   3046   1.6  christos       switch (r_type)
   3047   1.6  christos 	{
   3048   1.6  christos 	case R_SPARC_GOTDATA_OP_HIX22:
   3049   1.6  christos 	case R_SPARC_GOTDATA_OP_LOX10:
   3050   1.6  christos 	  if (gdop_relative_offset_ok (info, h, relocation))
   3051   1.6  christos 	    {
   3052   1.1  christos 	      r_type = (r_type == R_SPARC_GOTDATA_OP_HIX22
   3053   1.1  christos 			? R_SPARC_GOTDATA_HIX22
   3054   1.1  christos 			: R_SPARC_GOTDATA_LOX10);
   3055   1.6  christos 	      howto = _bfd_sparc_elf_howto_table + r_type;
   3056   1.1  christos 	    }
   3057   1.1  christos 	  break;
   3058   1.1  christos 
   3059   1.1  christos 	case R_SPARC_GOTDATA_OP:
   3060   1.1  christos 	  if (gdop_relative_offset_ok (info, h, relocation))
   3061   1.1  christos 	    {
   3062   1.6  christos 	      bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
   3063   1.6  christos 
   3064   1.6  christos 	      /* {ld,ldx} [%rs1 + %rs2], %rd --> add %rs1, %rs2, %rd */
   3065   1.6  christos 	      relocation = 0x80000000 | (insn & 0x3e07c01f);
   3066   1.6  christos 	      bfd_put_32 (output_bfd, relocation, contents + rel->r_offset);
   3067   1.6  christos 
   3068   1.6  christos 	      /* If the symbol is global but not dynamic, an .rela.* slot has
   3069   1.6  christos 		 been allocated for it in the GOT so output R_SPARC_NONE here,
   3070   1.6  christos 		 if it isn't also subject to another, old-style GOT relocation.
   3071   1.6  christos 		 See also the handling of these GOT relocations just below.  */
   3072   1.6  christos 	      if (h != NULL
   3073   1.6  christos 		  && h->dynindx == -1
   3074   1.6  christos 		  && !h->forced_local
   3075   1.6  christos 		  && h->root.type != bfd_link_hash_undefweak
   3076   1.6  christos 		  && !eh->has_old_style_got_reloc
   3077   1.6  christos 		  && (h->got.offset & 1) == 0
   3078   1.6  christos 		  && bfd_link_pic (info))
   3079   1.6  christos 		{
   3080   1.6  christos 		  asection *s = htab->elf.srelgot;
   3081   1.6  christos 		  Elf_Internal_Rela outrel;
   3082   1.6  christos 
   3083   1.6  christos 		  BFD_ASSERT (s != NULL);
   3084   1.1  christos 
   3085   1.1  christos 		  memset (&outrel, 0, sizeof outrel);
   3086   1.1  christos 		  sparc_elf_append_rela (output_bfd, s, &outrel);
   3087   1.1  christos 		  h->got.offset |= 1;
   3088   1.1  christos 		}
   3089   1.1  christos 	    }
   3090   1.1  christos 	  continue;
   3091   1.1  christos 	}
   3092   1.1  christos 
   3093   1.1  christos       switch (r_type)
   3094   1.1  christos 	{
   3095   1.6  christos 	case R_SPARC_GOTDATA_HIX22:
   3096   1.6  christos 	case R_SPARC_GOTDATA_LOX10:
   3097   1.1  christos 	  relocation = gdopoff (info, relocation);
   3098   1.1  christos 	  break;
   3099   1.1  christos 
   3100   1.1  christos 	case R_SPARC_GOTDATA_OP_HIX22:
   3101   1.1  christos 	case R_SPARC_GOTDATA_OP_LOX10:
   3102   1.1  christos 	case R_SPARC_GOT10:
   3103   1.1  christos 	case R_SPARC_GOT13:
   3104   1.1  christos 	case R_SPARC_GOT22:
   3105   1.8  christos 	  /* Relocation is to the entry for this symbol in the global
   3106   1.1  christos 	     offset table.  */
   3107   1.1  christos 	  if (htab->elf.sgot == NULL)
   3108   1.8  christos 	    abort ();
   3109   1.1  christos 
   3110   1.1  christos 	  relative_reloc = false;
   3111   1.1  christos 	  if (h != NULL)
   3112   1.1  christos 	    {
   3113   1.1  christos 	      bool dyn;
   3114   1.3  christos 
   3115   1.3  christos 	      off = h->got.offset;
   3116   1.3  christos 	      BFD_ASSERT (off != (bfd_vma) -1);
   3117   1.3  christos 	      dyn = elf_hash_table (info)->dynamic_sections_created;
   3118   1.1  christos 
   3119   1.1  christos 	      if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
   3120   1.1  christos 						     bfd_link_pic (info),
   3121   1.1  christos 						     h)
   3122   1.1  christos 		  || (bfd_link_pic (info)
   3123   1.1  christos 		      && SYMBOL_REFERENCES_LOCAL (info, h)))
   3124   1.1  christos 		{
   3125   1.1  christos 		  /* This is actually a static link, or it is a
   3126   1.1  christos 		     -Bsymbolic link and the symbol is defined
   3127   1.1  christos 		     locally, or the symbol was forced to be local
   3128   1.1  christos 		     because of a version file.  We must initialize
   3129   1.1  christos 		     this entry in the global offset table.  Since the
   3130   1.1  christos 		     offset must always be a multiple of 8 for 64-bit
   3131   1.1  christos 		     and 4 for 32-bit, we use the least significant bit
   3132   1.1  christos 		     to record whether we have initialized it already.
   3133   1.1  christos 
   3134   1.1  christos 		     When doing a dynamic link, we create a .rela.got
   3135   1.1  christos 		     relocation entry to initialize the value.  This
   3136   1.6  christos 		     is done in the finish_dynamic_symbol routine.  */
   3137   1.6  christos 		  if ((off & 1) != 0)
   3138   1.6  christos 		    off &= ~1;
   3139   1.6  christos 		  else
   3140   1.6  christos 		    {
   3141   1.6  christos 		      /* If this symbol isn't dynamic in PIC mode, treat it
   3142   1.8  christos 			 like a local symbol in PIC mode below.  */
   3143   1.6  christos 		      if (h->dynindx == -1
   3144   1.6  christos 			  && !h->forced_local
   3145   1.6  christos 			  && h->root.type != bfd_link_hash_undefweak
   3146   1.1  christos 			  && bfd_link_pic (info))
   3147   1.1  christos 			relative_reloc = true;
   3148   1.1  christos 		      else
   3149   1.1  christos 			SPARC_ELF_PUT_WORD (htab, output_bfd, relocation,
   3150   1.8  christos 					    htab->elf.sgot->contents + off);
   3151   1.1  christos 		      h->got.offset |= 1;
   3152   1.1  christos 		    }
   3153   1.1  christos 		}
   3154   1.1  christos 	      else
   3155   1.1  christos 		unresolved_reloc = false;
   3156   1.1  christos 	    }
   3157   1.1  christos 	  else
   3158   1.1  christos 	    {
   3159   1.1  christos 	      BFD_ASSERT (local_got_offsets != NULL
   3160   1.1  christos 			  && local_got_offsets[r_symndx] != (bfd_vma) -1);
   3161   1.1  christos 
   3162   1.1  christos 	      off = local_got_offsets[r_symndx];
   3163   1.1  christos 
   3164   1.1  christos 	      /* The offset must always be a multiple of 8 on 64-bit and
   3165   1.1  christos 		 4 on 32-bit.  We use the least significant bit to record
   3166   1.6  christos 		 whether we have already processed this entry.  */
   3167   1.6  christos 	      if ((off & 1) != 0)
   3168   1.6  christos 		off &= ~1;
   3169   1.8  christos 	      else
   3170   1.6  christos 		{
   3171   1.6  christos 		  /* For a local symbol in PIC mode, we need to generate a
   3172   1.6  christos 		     R_SPARC_RELATIVE reloc for the dynamic linker.  */
   3173   1.6  christos 		  if (bfd_link_pic (info))
   3174   1.6  christos 		    relative_reloc = true;
   3175   1.6  christos 		  else
   3176   1.1  christos 		    SPARC_ELF_PUT_WORD (htab, output_bfd, relocation,
   3177   1.6  christos 					htab->elf.sgot->contents + off);
   3178   1.6  christos 		  local_got_offsets[r_symndx] |= 1;
   3179   1.6  christos 		}
   3180   1.6  christos 	    }
   3181   1.1  christos 
   3182   1.6  christos 	  if (relative_reloc)
   3183   1.1  christos 	    {
   3184   1.6  christos 	      asection *s = htab->elf.srelgot;
   3185   1.6  christos 	      Elf_Internal_Rela outrel;
   3186   1.6  christos 
   3187   1.6  christos 	      BFD_ASSERT (s != NULL);
   3188   1.6  christos 
   3189   1.6  christos 	      outrel.r_offset = (htab->elf.sgot->output_section->vma
   3190   1.6  christos 				 + htab->elf.sgot->output_offset
   3191   1.6  christos 				 + off);
   3192   1.6  christos 	      outrel.r_info = SPARC_ELF_R_INFO (htab, NULL,
   3193   1.6  christos 						0, R_SPARC_RELATIVE);
   3194   1.6  christos 	      outrel.r_addend = relocation;
   3195   1.6  christos 	      sparc_elf_append_rela (output_bfd, s, &outrel);
   3196   1.6  christos 	      /* Versions of glibc ld.so at least up to 2.26 wrongly
   3197   1.6  christos 		 add the section contents to the value calculated for
   3198   1.1  christos 		 a RELATIVE reloc.  Zero the contents to work around
   3199   1.6  christos 		 this bug.  */
   3200   1.1  christos 	      relocation = 0;
   3201   1.1  christos 	      SPARC_ELF_PUT_WORD (htab, output_bfd, relocation,
   3202   1.1  christos 				  htab->elf.sgot->contents + off);
   3203   1.1  christos 	    }
   3204   1.1  christos 
   3205   1.1  christos 	  relocation = htab->elf.sgot->output_offset + off - got_base;
   3206   1.1  christos 	  break;
   3207   1.1  christos 
   3208   1.1  christos 	case R_SPARC_PLT32:
   3209   1.1  christos 	case R_SPARC_PLT64:
   3210   1.1  christos 	  if (h == NULL || h->plt.offset == (bfd_vma) -1)
   3211   1.1  christos 	    {
   3212   1.1  christos 	      r_type = (r_type == R_SPARC_PLT32) ? R_SPARC_32 : R_SPARC_64;
   3213   1.1  christos 	      goto r_sparc_plt32;
   3214   1.1  christos 	    }
   3215   1.1  christos 	  /* Fall through.  */
   3216   1.1  christos 
   3217   1.1  christos 	case R_SPARC_WPLT30:
   3218   1.1  christos 	case R_SPARC_HIPLT22:
   3219   1.1  christos 	case R_SPARC_LOPLT10:
   3220   1.1  christos 	case R_SPARC_PCPLT32:
   3221   1.1  christos 	case R_SPARC_PCPLT22:
   3222   1.1  christos 	case R_SPARC_PCPLT10:
   3223   1.1  christos 	r_sparc_wplt30:
   3224   1.1  christos 	  /* Relocation is to the entry for this symbol in the
   3225   1.1  christos 	     procedure linkage table.  */
   3226   1.1  christos 
   3227   1.1  christos 	  if (! ABI_64_P (output_bfd))
   3228   1.1  christos 	    {
   3229   1.1  christos 	      /* The Solaris native assembler will generate a WPLT30 reloc
   3230   1.1  christos 		 for a local symbol if you assemble a call from one
   3231   1.3  christos 		 section to another when using -K pic.  We treat it as
   3232   1.1  christos 		 WDISP30.  */
   3233   1.1  christos 	      if (h == NULL)
   3234   1.1  christos 		break;
   3235   1.1  christos 	    }
   3236   1.1  christos 	  /* PR 7027: We need similar behaviour for 64-bit binaries.  */
   3237   1.1  christos 	  else if (r_type == R_SPARC_WPLT30 && h == NULL)
   3238   1.1  christos 	    break;
   3239   1.1  christos 	  else
   3240   1.1  christos 	    {
   3241   1.1  christos 	      BFD_ASSERT (h != NULL);
   3242   1.1  christos 	    }
   3243   1.1  christos 
   3244   1.1  christos 	  if (h->plt.offset == (bfd_vma) -1 || htab->elf.splt == NULL)
   3245   1.1  christos 	    {
   3246   1.1  christos 	      /* We didn't make a PLT entry for this symbol.  This
   3247   1.1  christos 		 happens when statically linking PIC code, or when
   3248   1.1  christos 		 using -Bsymbolic.  */
   3249   1.1  christos 	      break;
   3250   1.8  christos 	    }
   3251   1.1  christos 
   3252   1.1  christos 	  relocation = (htab->elf.splt->output_section->vma
   3253   1.1  christos 			+ htab->elf.splt->output_offset
   3254   1.8  christos 			+ h->plt.offset);
   3255   1.1  christos 	  unresolved_reloc = false;
   3256   1.1  christos 	  if (r_type == R_SPARC_PLT32 || r_type == R_SPARC_PLT64)
   3257   1.1  christos 	    {
   3258   1.1  christos 	      r_type = r_type == R_SPARC_PLT32 ? R_SPARC_32 : R_SPARC_64;
   3259   1.1  christos 	      is_plt = true;
   3260   1.1  christos 	      goto r_sparc_plt32;
   3261   1.1  christos 	    }
   3262   1.1  christos 	  break;
   3263   1.1  christos 
   3264  1.10  christos 	case R_SPARC_PC10:
   3265   1.1  christos 	case R_SPARC_PC22:
   3266   1.1  christos 	case R_SPARC_PC_HH22:
   3267   1.1  christos 	case R_SPARC_PC_HM10:
   3268   1.1  christos 	case R_SPARC_PC_LM22:
   3269   1.1  christos 	  if (h != NULL && h == htab->elf.hgot)
   3270   1.1  christos 	    break;
   3271   1.1  christos 	  /* Fall through.  */
   3272   1.1  christos 	case R_SPARC_DISP8:
   3273   1.1  christos 	case R_SPARC_DISP16:
   3274   1.1  christos 	case R_SPARC_DISP32:
   3275   1.1  christos 	case R_SPARC_DISP64:
   3276   1.1  christos 	case R_SPARC_WDISP30:
   3277   1.1  christos 	case R_SPARC_WDISP22:
   3278   1.1  christos 	case R_SPARC_WDISP19:
   3279   1.1  christos 	case R_SPARC_WDISP16:
   3280   1.1  christos 	case R_SPARC_WDISP10:
   3281   1.1  christos 	case R_SPARC_8:
   3282   1.1  christos 	case R_SPARC_16:
   3283   1.1  christos 	case R_SPARC_32:
   3284   1.1  christos 	case R_SPARC_HI22:
   3285   1.1  christos 	case R_SPARC_22:
   3286   1.1  christos 	case R_SPARC_13:
   3287   1.1  christos 	case R_SPARC_LO10:
   3288   1.1  christos 	case R_SPARC_UA16:
   3289   1.1  christos 	case R_SPARC_UA32:
   3290   1.1  christos 	case R_SPARC_10:
   3291   1.1  christos 	case R_SPARC_11:
   3292   1.1  christos 	case R_SPARC_64:
   3293   1.1  christos 	case R_SPARC_OLO10:
   3294   1.1  christos 	case R_SPARC_HH22:
   3295   1.1  christos 	case R_SPARC_HM10:
   3296   1.1  christos 	case R_SPARC_LM22:
   3297   1.1  christos 	case R_SPARC_7:
   3298   1.1  christos 	case R_SPARC_5:
   3299   1.1  christos 	case R_SPARC_6:
   3300   1.1  christos 	case R_SPARC_HIX22:
   3301   1.1  christos 	case R_SPARC_LOX10:
   3302   1.1  christos 	case R_SPARC_H44:
   3303   1.6  christos 	case R_SPARC_M44:
   3304   1.1  christos 	case R_SPARC_L44:
   3305   1.1  christos 	case R_SPARC_H34:
   3306   1.6  christos 	case R_SPARC_UA64:
   3307   1.6  christos 	r_sparc_plt32:
   3308   1.6  christos 	  if ((input_section->flags & SEC_ALLOC) == 0 || is_vxworks_tls)
   3309   1.3  christos 	    break;
   3310   1.1  christos 
   3311   1.6  christos 	  /* Copy dynamic function pointer relocations.  Don't generate
   3312   1.6  christos 	     dynamic relocations against resolved undefined weak symbols
   3313   1.6  christos 	     in PIE.  */
   3314   1.1  christos 	  if ((bfd_link_pic (info)
   3315   1.1  christos 	       && (h == NULL
   3316   1.3  christos 		   || !(h->root.type == bfd_link_hash_undefweak
   3317   1.1  christos 			&& (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
   3318   1.1  christos 			    || resolved_to_zero)))
   3319   1.1  christos 	       && (! howto->pc_relative
   3320   1.1  christos 		   || !SYMBOL_CALLS_LOCAL (info, h)))
   3321   1.1  christos 	      || (!bfd_link_pic (info)
   3322   1.6  christos 		  && h != NULL
   3323   1.6  christos 		  && h->dynindx != -1
   3324   1.1  christos 		  && !h->non_got_ref
   3325   1.1  christos 		  && ((h->def_dynamic
   3326   1.1  christos 		       && !h->def_regular)
   3327   1.8  christos 		      || (h->root.type == bfd_link_hash_undefweak
   3328   1.1  christos 			  && !resolved_to_zero)
   3329   1.1  christos 		      || h->root.type == bfd_link_hash_undefined)))
   3330   1.1  christos 	    {
   3331   1.1  christos 	      Elf_Internal_Rela outrel;
   3332   1.1  christos 	      bool skip, relocate = false;
   3333   1.1  christos 
   3334   1.1  christos 	      /* When generating a shared object, these relocations
   3335   1.8  christos 		 are copied into the output file to be resolved at run
   3336   1.1  christos 		 time.  */
   3337   1.1  christos 
   3338   1.1  christos 	      BFD_ASSERT (sreloc != NULL);
   3339   1.1  christos 
   3340   1.1  christos 	      skip = false;
   3341   1.8  christos 
   3342   1.1  christos 	      outrel.r_offset =
   3343   1.8  christos 		_bfd_elf_section_offset (output_bfd, info, input_section,
   3344   1.1  christos 					 rel->r_offset);
   3345   1.1  christos 	      if (outrel.r_offset == (bfd_vma) -1)
   3346   1.1  christos 		skip = true;
   3347   1.1  christos 	      else if (outrel.r_offset == (bfd_vma) -2)
   3348   1.1  christos 		skip = true, relocate = true;
   3349   1.1  christos 	      outrel.r_offset += (input_section->output_section->vma
   3350   1.1  christos 				  + input_section->output_offset);
   3351   1.1  christos 
   3352   1.1  christos 	      /* Optimize unaligned reloc usage now that we know where
   3353   1.1  christos 		 it finally resides.  */
   3354   1.1  christos 	      switch (r_type)
   3355   1.1  christos 		{
   3356   1.1  christos 		case R_SPARC_16:
   3357   1.1  christos 		  if (outrel.r_offset & 1)
   3358   1.1  christos 		    r_type = R_SPARC_UA16;
   3359   1.1  christos 		  break;
   3360   1.1  christos 		case R_SPARC_UA16:
   3361   1.1  christos 		  if (!(outrel.r_offset & 1))
   3362   1.1  christos 		    r_type = R_SPARC_16;
   3363   1.1  christos 		  break;
   3364   1.1  christos 		case R_SPARC_32:
   3365   1.1  christos 		  if (outrel.r_offset & 3)
   3366   1.1  christos 		    r_type = R_SPARC_UA32;
   3367   1.1  christos 		  break;
   3368   1.1  christos 		case R_SPARC_UA32:
   3369   1.1  christos 		  if (!(outrel.r_offset & 3))
   3370   1.1  christos 		    r_type = R_SPARC_32;
   3371   1.1  christos 		  break;
   3372   1.1  christos 		case R_SPARC_64:
   3373   1.1  christos 		  if (outrel.r_offset & 7)
   3374   1.1  christos 		    r_type = R_SPARC_UA64;
   3375   1.6  christos 		  break;
   3376   1.1  christos 		case R_SPARC_UA64:
   3377   1.6  christos 		  if (!(outrel.r_offset & 7))
   3378   1.6  christos 		    r_type = R_SPARC_64;
   3379   1.1  christos 		  break;
   3380   1.1  christos 		case R_SPARC_DISP8:
   3381   1.1  christos 		case R_SPARC_DISP16:
   3382   1.1  christos 		case R_SPARC_DISP32:
   3383   1.1  christos 		case R_SPARC_DISP64:
   3384   1.1  christos 		  /* If the symbol is not dynamic, we should not keep
   3385   1.8  christos 		     a dynamic relocation.  But an .rela.* slot has been
   3386   1.1  christos 		     allocated for it, output R_SPARC_NONE.
   3387   1.1  christos 		     FIXME: Add code tracking needed dynamic relocs as
   3388   1.1  christos 		     e.g. i386 has.  */
   3389   1.1  christos 		  if (h->dynindx == -1)
   3390   1.1  christos 		    skip = true, relocate = true;
   3391   1.1  christos 		  break;
   3392   1.1  christos 		}
   3393   1.3  christos 
   3394   1.3  christos 	      if (skip)
   3395   1.3  christos 		memset (&outrel, 0, sizeof outrel);
   3396   1.3  christos 	      /* h->dynindx may be -1 if the symbol was marked to
   3397   1.1  christos 		 become local.  */
   3398   1.1  christos 	      else if (h != NULL
   3399   1.1  christos 		       && h->dynindx != -1
   3400   1.1  christos 		       && (_bfd_sparc_elf_howto_table[r_type].pc_relative
   3401   1.1  christos 			   || !bfd_link_pic (info)
   3402   1.1  christos 			   || !SYMBOLIC_BIND (info, h)
   3403   1.1  christos 			   || !h->def_regular))
   3404   1.1  christos 		{
   3405   1.5  christos 		  outrel.r_info = SPARC_ELF_R_INFO (htab, rel, h->dynindx, r_type);
   3406   1.5  christos 		  outrel.r_addend = rel->r_addend;
   3407   1.1  christos 		}
   3408   1.1  christos 	      else
   3409   1.1  christos 		{
   3410   1.1  christos 		  if (  (!ABI_64_P (output_bfd) && r_type == R_SPARC_32)
   3411   1.1  christos 		      || (ABI_64_P (output_bfd) && r_type == R_SPARC_64))
   3412   1.1  christos 		    {
   3413   1.1  christos 		      outrel.r_info = SPARC_ELF_R_INFO (htab, NULL,
   3414   1.1  christos 							0, R_SPARC_RELATIVE);
   3415   1.1  christos 		      outrel.r_addend = relocation + rel->r_addend;
   3416   1.1  christos 		    }
   3417   1.1  christos 		  else
   3418   1.1  christos 		    {
   3419   1.1  christos 		      long indx;
   3420   1.1  christos 
   3421   1.1  christos 		      outrel.r_addend = relocation + rel->r_addend;
   3422   1.1  christos 
   3423   1.1  christos 		      if (is_plt)
   3424   1.1  christos 			sec = htab->elf.splt;
   3425   1.1  christos 
   3426   1.8  christos 		      if (bfd_is_abs_section (sec))
   3427   1.1  christos 			indx = 0;
   3428   1.1  christos 		      else if (sec == NULL || sec->owner == NULL)
   3429   1.1  christos 			{
   3430   1.1  christos 			  bfd_set_error (bfd_error_bad_value);
   3431   1.1  christos 			  return false;
   3432   1.1  christos 			}
   3433   1.1  christos 		      else
   3434   1.1  christos 			{
   3435   1.1  christos 			  asection *osec;
   3436   1.1  christos 
   3437   1.1  christos 			  /* We are turning this relocation into one
   3438   1.1  christos 			     against a section symbol.  It would be
   3439   1.1  christos 			     proper to subtract the symbol's value,
   3440   1.1  christos 			     osec->vma, from the emitted reloc addend,
   3441   1.1  christos 			     but ld.so expects buggy relocs.  */
   3442   1.1  christos 			  osec = sec->output_section;
   3443   1.1  christos 			  indx = elf_section_data (osec)->dynindx;
   3444   1.1  christos 
   3445   1.1  christos 			  if (indx == 0)
   3446   1.1  christos 			    {
   3447   1.1  christos 			      osec = htab->elf.text_index_section;
   3448   1.1  christos 			      indx = elf_section_data (osec)->dynindx;
   3449   1.1  christos 			    }
   3450   1.1  christos 
   3451   1.6  christos 			  /* FIXME: we really should be able to link non-pic
   3452   1.6  christos 			     shared libraries.  */
   3453   1.1  christos 			  if (indx == 0)
   3454   1.1  christos 			    {
   3455   1.8  christos 			      BFD_FAIL ();
   3456   1.1  christos 			      _bfd_error_handler
   3457   1.1  christos 				(_("%pB: probably compiled without -fPIC?"),
   3458   1.1  christos 				 input_bfd);
   3459   1.1  christos 			      bfd_set_error (bfd_error_bad_value);
   3460   1.1  christos 			      return false;
   3461   1.1  christos 			    }
   3462   1.1  christos 			}
   3463   1.1  christos 
   3464   1.1  christos 		      outrel.r_info = SPARC_ELF_R_INFO (htab, rel, indx,
   3465   1.1  christos 							r_type);
   3466   1.1  christos 		    }
   3467   1.1  christos 		}
   3468   1.1  christos 
   3469   1.1  christos 	      sparc_elf_append_rela (output_bfd, sreloc, &outrel);
   3470   1.1  christos 
   3471   1.1  christos 	      /* This reloc will be computed at runtime, so there's no
   3472   1.1  christos 		 need to do anything now.  */
   3473   1.1  christos 	      if (! relocate)
   3474   1.1  christos 		continue;
   3475   1.1  christos 	    }
   3476   1.1  christos 	  break;
   3477   1.6  christos 
   3478   1.6  christos 	case R_SPARC_TLS_GD_HI22:
   3479   1.6  christos 	case R_SPARC_TLS_GD_LO10:
   3480   1.6  christos 	case R_SPARC_TLS_IE_HI22:
   3481   1.6  christos 	case R_SPARC_TLS_IE_LO10:
   3482   1.6  christos 	  r_type = sparc_elf_tls_transition (info, input_bfd, r_type,
   3483   1.6  christos 					     h == NULL || h->dynindx == -1);
   3484   1.1  christos 	  if (r_type == R_SPARC_REV32)
   3485   1.1  christos 	    break;
   3486   1.1  christos 	  if (h != NULL)
   3487   1.1  christos 	    tls_type = _bfd_sparc_elf_hash_entry (h)->tls_type;
   3488   1.5  christos 	  else if (local_got_offsets)
   3489   1.3  christos 	    tls_type = _bfd_sparc_elf_local_got_tls_type (input_bfd) [r_symndx];
   3490   1.3  christos 	  else if (h != NULL)
   3491   1.1  christos 	    {
   3492   1.1  christos 	      tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type;
   3493   1.1  christos 	      if (!bfd_link_dll (info)
   3494   1.1  christos 		  && h->dynindx == -1
   3495   1.1  christos 		  && tls_type == GOT_TLS_IE)
   3496   1.1  christos 		switch (SPARC_ELF_R_TYPE (rel->r_info))
   3497   1.1  christos 		  {
   3498   1.1  christos 		  case R_SPARC_TLS_GD_HI22:
   3499   1.1  christos 		  case R_SPARC_TLS_IE_HI22:
   3500   1.1  christos 		    r_type = R_SPARC_TLS_LE_HIX22;
   3501   1.1  christos 		    break;
   3502   1.6  christos 		  default:
   3503   1.6  christos 		    r_type = R_SPARC_TLS_LE_LOX10;
   3504   1.1  christos 		    break;
   3505   1.1  christos 		  }
   3506   1.1  christos 	    }
   3507   1.1  christos 	  else
   3508   1.1  christos 	    tls_type = GOT_UNKNOWN;
   3509   1.1  christos 	  if (tls_type == GOT_TLS_IE)
   3510   1.1  christos 	    switch (r_type)
   3511   1.1  christos 	      {
   3512   1.1  christos 	      case R_SPARC_TLS_GD_HI22:
   3513   1.1  christos 		r_type = R_SPARC_TLS_IE_HI22;
   3514   1.1  christos 		break;
   3515   1.1  christos 	      case R_SPARC_TLS_GD_LO10:
   3516   1.1  christos 		r_type = R_SPARC_TLS_IE_LO10;
   3517   1.1  christos 		break;
   3518   1.1  christos 	      }
   3519   1.1  christos 
   3520   1.1  christos 	  if (r_type == R_SPARC_TLS_LE_HIX22)
   3521   1.1  christos 	    {
   3522   1.1  christos 	      relocation = tpoff (info, relocation);
   3523   1.1  christos 	      break;
   3524   1.1  christos 	    }
   3525   1.1  christos 	  if (r_type == R_SPARC_TLS_LE_LOX10)
   3526   1.1  christos 	    {
   3527   1.1  christos 	      /* Change add into xor.  */
   3528   1.1  christos 	      relocation = tpoff (info, relocation);
   3529   1.1  christos 	      bfd_put_32 (output_bfd, (bfd_get_32 (input_bfd,
   3530   1.1  christos 						   contents + rel->r_offset)
   3531   1.1  christos 				       | 0x80182000), contents + rel->r_offset);
   3532   1.1  christos 	      break;
   3533   1.1  christos 	    }
   3534   1.1  christos 
   3535   1.1  christos 	  if (h != NULL)
   3536   1.1  christos 	    {
   3537   1.1  christos 	      off = h->got.offset;
   3538   1.1  christos 	      h->got.offset |= 1;
   3539   1.1  christos 	    }
   3540   1.1  christos 	  else
   3541   1.1  christos 	    {
   3542   1.1  christos 	      BFD_ASSERT (local_got_offsets != NULL);
   3543   1.1  christos 	      off = local_got_offsets[r_symndx];
   3544   1.1  christos 	      local_got_offsets[r_symndx] |= 1;
   3545   1.1  christos 	    }
   3546   1.1  christos 
   3547   1.1  christos 	r_sparc_tlsldm:
   3548   1.1  christos 	  if (htab->elf.sgot == NULL)
   3549   1.1  christos 	    abort ();
   3550   1.1  christos 
   3551   1.1  christos 	  if ((off & 1) != 0)
   3552   1.1  christos 	    off &= ~1;
   3553   1.1  christos 	  else
   3554   1.1  christos 	    {
   3555   1.1  christos 	      Elf_Internal_Rela outrel;
   3556   1.1  christos 	      int dr_type, indx;
   3557   1.1  christos 
   3558   1.1  christos 	      if (htab->elf.srelgot == NULL)
   3559   1.1  christos 		abort ();
   3560   1.1  christos 
   3561   1.1  christos 	      SPARC_ELF_PUT_WORD (htab, output_bfd, 0,
   3562   1.1  christos 				  htab->elf.sgot->contents + off);
   3563   1.1  christos 	      outrel.r_offset = (htab->elf.sgot->output_section->vma
   3564   1.1  christos 				 + htab->elf.sgot->output_offset + off);
   3565   1.1  christos 	      indx = h && h->dynindx != -1 ? h->dynindx : 0;
   3566   1.1  christos 	      if (r_type == R_SPARC_TLS_IE_HI22
   3567   1.1  christos 		  || r_type == R_SPARC_TLS_IE_LO10)
   3568   1.1  christos 		dr_type = SPARC_ELF_TPOFF_RELOC (htab);
   3569   1.1  christos 	      else
   3570   1.1  christos 		dr_type = SPARC_ELF_DTPMOD_RELOC (htab);
   3571   1.1  christos 	      if (dr_type == SPARC_ELF_TPOFF_RELOC (htab) && indx == 0)
   3572   1.1  christos 		outrel.r_addend = relocation - dtpoff_base (info);
   3573   1.1  christos 	      else
   3574   1.1  christos 		outrel.r_addend = 0;
   3575   1.1  christos 	      outrel.r_info = SPARC_ELF_R_INFO (htab, NULL, indx, dr_type);
   3576   1.1  christos 	      sparc_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
   3577   1.1  christos 
   3578   1.6  christos 	      if (r_type == R_SPARC_TLS_GD_HI22
   3579   1.1  christos 		  || r_type == R_SPARC_TLS_GD_LO10)
   3580   1.1  christos 		{
   3581   1.1  christos 		  if (indx == 0)
   3582   1.1  christos 		    {
   3583   1.1  christos 		      BFD_ASSERT (! unresolved_reloc);
   3584   1.1  christos 		      SPARC_ELF_PUT_WORD (htab, output_bfd,
   3585   1.1  christos 					  relocation - dtpoff_base (info),
   3586   1.1  christos 					  (htab->elf.sgot->contents + off
   3587   1.1  christos 					   + SPARC_ELF_WORD_BYTES (htab)));
   3588   1.1  christos 		    }
   3589   1.1  christos 		  else
   3590   1.1  christos 		    {
   3591   1.1  christos 		      SPARC_ELF_PUT_WORD (htab, output_bfd, 0,
   3592   1.1  christos 					  (htab->elf.sgot->contents + off
   3593   1.1  christos 					   + SPARC_ELF_WORD_BYTES (htab)));
   3594   1.1  christos 		      outrel.r_info = SPARC_ELF_R_INFO (htab, NULL, indx,
   3595   1.1  christos 							SPARC_ELF_DTPOFF_RELOC (htab));
   3596   1.1  christos 		      outrel.r_offset += SPARC_ELF_WORD_BYTES (htab);
   3597   1.1  christos 		      sparc_elf_append_rela (output_bfd, htab->elf.srelgot,
   3598   1.1  christos 					     &outrel);
   3599   1.1  christos 		    }
   3600   1.1  christos 		}
   3601   1.1  christos 	      else if (dr_type == SPARC_ELF_DTPMOD_RELOC (htab))
   3602   1.1  christos 		{
   3603   1.1  christos 		  SPARC_ELF_PUT_WORD (htab, output_bfd, 0,
   3604   1.1  christos 				      (htab->elf.sgot->contents + off
   3605   1.1  christos 				       + SPARC_ELF_WORD_BYTES (htab)));
   3606   1.1  christos 		}
   3607   1.1  christos 	    }
   3608   1.8  christos 
   3609   1.1  christos 	  if (off >= (bfd_vma) -2)
   3610   1.1  christos 	    abort ();
   3611   1.1  christos 
   3612   1.1  christos 	  relocation = htab->elf.sgot->output_offset + off - got_base;
   3613   1.1  christos 	  unresolved_reloc = false;
   3614   1.6  christos 	  howto = _bfd_sparc_elf_howto_table + r_type;
   3615   1.6  christos 	  break;
   3616   1.1  christos 
   3617   1.1  christos 	case R_SPARC_TLS_LDM_HI22:
   3618   1.1  christos 	case R_SPARC_TLS_LDM_LO10:
   3619   1.1  christos 	  /* LD -> LE */
   3620   1.1  christos 	  if (bfd_link_executable (info))
   3621   1.1  christos 	    {
   3622   1.1  christos 	      bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
   3623   1.1  christos 	      continue;
   3624   1.1  christos 	    }
   3625   1.1  christos 	  off = htab->tls_ldm_got.offset;
   3626   1.6  christos 	  htab->tls_ldm_got.offset |= 1;
   3627   1.6  christos 	  goto r_sparc_tlsldm;
   3628   1.6  christos 
   3629   1.6  christos 	case R_SPARC_TLS_LDO_HIX22:
   3630   1.6  christos 	case R_SPARC_TLS_LDO_LOX10:
   3631   1.6  christos 	  /* LD -> LE */
   3632   1.6  christos 	  if (bfd_link_executable (info))
   3633   1.6  christos 	    {
   3634   1.6  christos 	      if (r_type == R_SPARC_TLS_LDO_HIX22)
   3635   1.1  christos 		r_type = R_SPARC_TLS_LE_HIX22;
   3636   1.1  christos 	      else
   3637   1.1  christos 		r_type = R_SPARC_TLS_LE_LOX10;
   3638   1.1  christos 	    }
   3639   1.1  christos 	  else
   3640   1.1  christos 	    {
   3641   1.1  christos 	      relocation -= dtpoff_base (info);
   3642   1.1  christos 	      break;
   3643   1.6  christos 	    }
   3644   1.1  christos 	  /* Fall through.  */
   3645   1.1  christos 
   3646   1.6  christos 	case R_SPARC_TLS_LE_HIX22:
   3647   1.6  christos 	case R_SPARC_TLS_LE_LOX10:
   3648   1.6  christos 	  if (!bfd_link_executable (info))
   3649   1.6  christos 	    {
   3650   1.1  christos 	      Elf_Internal_Rela outrel;
   3651   1.1  christos 	      bfd_vma offset
   3652   1.1  christos 		= _bfd_elf_section_offset (output_bfd, info, input_section,
   3653   1.6  christos 					   rel->r_offset);
   3654   1.6  christos 	      if (offset == (bfd_vma) -1 || offset == (bfd_vma) -2)
   3655   1.6  christos 		memset (&outrel, 0, sizeof outrel);
   3656   1.1  christos 	      else
   3657   1.6  christos 		{
   3658   1.6  christos 		  outrel.r_offset = offset
   3659   1.1  christos 				    + input_section->output_section->vma
   3660   1.1  christos 				    + input_section->output_offset;
   3661   1.6  christos 		  outrel.r_info = SPARC_ELF_R_INFO (htab, NULL, 0, r_type);
   3662   1.1  christos 		  outrel.r_addend
   3663   1.1  christos 		    = relocation - dtpoff_base (info) + rel->r_addend;
   3664   1.1  christos 		}
   3665   1.1  christos 
   3666   1.1  christos 	      BFD_ASSERT (sreloc != NULL);
   3667   1.1  christos 	      sparc_elf_append_rela (output_bfd, sreloc, &outrel);
   3668   1.1  christos 	      continue;
   3669   1.6  christos 	    }
   3670   1.6  christos 	  relocation = tpoff (info, relocation);
   3671   1.1  christos 	  break;
   3672   1.1  christos 
   3673   1.1  christos 	case R_SPARC_TLS_LDM_CALL:
   3674   1.1  christos 	  /* LD -> LE */
   3675   1.1  christos 	  if (bfd_link_executable (info))
   3676   1.1  christos 	    {
   3677   1.1  christos 	      /* mov %g0, %o0 */
   3678   1.1  christos 	      bfd_put_32 (output_bfd, 0x90100000, contents + rel->r_offset);
   3679   1.6  christos 	      continue;
   3680   1.6  christos 	    }
   3681   1.6  christos 	  /* Fall through */
   3682   1.1  christos 
   3683   1.1  christos 	case R_SPARC_TLS_GD_CALL:
   3684   1.1  christos 	  if (h != NULL)
   3685   1.6  christos 	    tls_type = _bfd_sparc_elf_hash_entry (h)->tls_type;
   3686   1.6  christos 	  else if (local_got_offsets)
   3687   1.6  christos 	    tls_type = _bfd_sparc_elf_local_got_tls_type (input_bfd) [r_symndx];
   3688   1.6  christos 	  else if (h != NULL)
   3689   1.1  christos 	    tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type;
   3690   1.1  christos 	  else
   3691   1.1  christos 	    tls_type = GOT_UNKNOWN;
   3692   1.1  christos 	  /* GD -> IE or LE */
   3693   1.1  christos 	  if (bfd_link_executable (info)
   3694   1.6  christos 	      || (r_type == R_SPARC_TLS_GD_CALL && tls_type == GOT_TLS_IE))
   3695   1.6  christos 	    {
   3696   1.1  christos 	      Elf_Internal_Rela *rel2;
   3697   1.1  christos 	      bfd_vma insn;
   3698   1.1  christos 
   3699   1.1  christos 	      /* GD -> LE */
   3700   1.1  christos 	      if (bfd_link_executable (info) && (h == NULL || h->dynindx == -1))
   3701   1.1  christos 		{
   3702   1.1  christos 		  bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
   3703   1.1  christos 		  continue;
   3704   1.1  christos 		}
   3705   1.1  christos 
   3706   1.1  christos 	      /* GD -> IE */
   3707   1.1  christos 	      if (rel + 1 < relend
   3708   1.1  christos 		  && SPARC_ELF_R_TYPE (rel[1].r_info) == R_SPARC_TLS_GD_ADD
   3709   1.1  christos 		  && rel[1].r_offset == rel->r_offset + 4
   3710   1.1  christos 		  && SPARC_ELF_R_SYMNDX (htab, rel[1].r_info) == r_symndx
   3711   1.1  christos 		  && (((insn = bfd_get_32 (input_bfd,
   3712   1.1  christos 					   contents + rel[1].r_offset))
   3713   1.1  christos 		       >> 25) & 0x1f) == 8)
   3714   1.1  christos 		{
   3715   1.1  christos 		  /* We have
   3716   1.1  christos 		     call __tls_get_addr, %tgd_call(foo)
   3717   1.1  christos 		      add %reg1, %reg2, %o0, %tgd_add(foo)
   3718   1.1  christos 		     and change it into IE:
   3719   1.1  christos 		     {ld,ldx} [%reg1 + %reg2], %o0, %tie_ldx(foo)
   3720   1.1  christos 		     add %g7, %o0, %o0, %tie_add(foo).
   3721   1.1  christos 		     add is 0x80000000 | (rd << 25) | (rs1 << 14) | rs2,
   3722   1.1  christos 		     ld is 0xc0000000 | (rd << 25) | (rs1 << 14) | rs2,
   3723   1.1  christos 		     ldx is 0xc0580000 | (rd << 25) | (rs1 << 14) | rs2.  */
   3724   1.1  christos 		  bfd_put_32 (output_bfd, insn | (ABI_64_P (output_bfd) ? 0xc0580000 : 0xc0000000),
   3725   1.1  christos 			      contents + rel->r_offset);
   3726   1.1  christos 		  bfd_put_32 (output_bfd, 0x9001c008,
   3727   1.1  christos 			      contents + rel->r_offset + 4);
   3728   1.1  christos 		  rel++;
   3729   1.1  christos 		  continue;
   3730   1.1  christos 		}
   3731   1.1  christos 
   3732   1.1  christos 	      /* We cannot just overwrite the delay slot instruction,
   3733   1.1  christos 		 as it might be what puts the %o0 argument to
   3734   1.1  christos 		 __tls_get_addr into place.  So we have to transpose
   3735   1.1  christos 		 the delay slot with the add we patch in.  */
   3736   1.1  christos 	      insn = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
   3737   1.1  christos 	      bfd_put_32 (output_bfd, insn,
   3738   1.1  christos 			  contents + rel->r_offset);
   3739   1.1  christos 	      bfd_put_32 (output_bfd, 0x9001c008,
   3740   1.1  christos 			  contents + rel->r_offset + 4);
   3741   1.1  christos 
   3742   1.1  christos 	      rel2 = rel;
   3743   1.1  christos 	      while ((rel2 = sparc_elf_find_reloc_at_ofs (rel2 + 1, relend,
   3744   1.1  christos 							  rel->r_offset + 4))
   3745   1.1  christos 		     != NULL)
   3746   1.1  christos 		{
   3747   1.1  christos 		  /* If the instruction we moved has a relocation attached to
   3748   1.1  christos 		     it, adjust the offset so that it will apply to the correct
   3749   1.1  christos 		     instruction.  */
   3750   1.1  christos 		  rel2->r_offset -= 4;
   3751   1.8  christos 		}
   3752   1.8  christos 	      continue;
   3753   1.1  christos 	    }
   3754   1.1  christos 
   3755   1.1  christos 	  h = (struct elf_link_hash_entry *)
   3756   1.1  christos 	      bfd_link_hash_lookup (info->hash, "__tls_get_addr", false,
   3757   1.1  christos 				    false, true);
   3758   1.1  christos 	  BFD_ASSERT (h != NULL);
   3759   1.6  christos 	  r_type = R_SPARC_WPLT30;
   3760   1.6  christos 	  howto = _bfd_sparc_elf_howto_table + r_type;
   3761   1.6  christos 	  goto r_sparc_wplt30;
   3762   1.1  christos 
   3763   1.6  christos 	case R_SPARC_TLS_GD_ADD:
   3764   1.6  christos 	  if (h != NULL)
   3765   1.6  christos 	    tls_type = _bfd_sparc_elf_hash_entry (h)->tls_type;
   3766   1.6  christos 	  else if (local_got_offsets)
   3767   1.1  christos 	    tls_type = _bfd_sparc_elf_local_got_tls_type (input_bfd) [r_symndx];
   3768   1.1  christos 	  else
   3769   1.1  christos 	    tls_type = GOT_UNKNOWN;
   3770   1.1  christos 	  /* GD -> IE or LE */
   3771   1.1  christos 	  if (bfd_link_executable (info) || tls_type == GOT_TLS_IE)
   3772   1.1  christos 	    {
   3773   1.1  christos 	      /* add %reg1, %reg2, %reg3, %tgd_add(foo)
   3774   1.6  christos 		 changed into IE:
   3775   1.6  christos 		 {ld,ldx} [%reg1 + %reg2], %reg3, %tie_ldx(foo)
   3776   1.6  christos 		 or LE:
   3777   1.1  christos 		 add %g7, %reg2, %reg3.  */
   3778   1.1  christos 	      bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
   3779   1.1  christos 	      if (bfd_link_executable (info) && (h == NULL || h->dynindx == -1))
   3780   1.1  christos 		relocation = (insn & ~0x7c000) | 0x1c000;
   3781   1.1  christos 	      else
   3782   1.1  christos 		relocation = insn | (ABI_64_P (output_bfd) ? 0xc0580000 : 0xc0000000);
   3783   1.6  christos 	      bfd_put_32 (output_bfd, relocation, contents + rel->r_offset);
   3784   1.6  christos 	    }
   3785   1.1  christos 	  continue;
   3786   1.1  christos 
   3787   1.1  christos 	case R_SPARC_TLS_LDM_ADD:
   3788   1.1  christos 	  /* LD -> LE */
   3789   1.6  christos 	  if (bfd_link_executable (info))
   3790   1.6  christos 	    bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
   3791   1.1  christos 	  continue;
   3792   1.1  christos 
   3793   1.1  christos 	case R_SPARC_TLS_LDO_ADD:
   3794   1.1  christos 	  /* LD -> LE */
   3795   1.1  christos 	  if (bfd_link_executable (info))
   3796   1.1  christos 	    {
   3797   1.1  christos 	      /* Change rs1 into %g7.  */
   3798   1.1  christos 	      bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
   3799   1.1  christos 	      insn = (insn & ~0x7c000) | 0x1c000;
   3800   1.1  christos 	      bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
   3801   1.6  christos 	    }
   3802   1.6  christos 	  continue;
   3803   1.1  christos 
   3804   1.1  christos 	case R_SPARC_TLS_IE_LD:
   3805   1.1  christos 	case R_SPARC_TLS_IE_LDX:
   3806   1.1  christos 	  /* IE -> LE */
   3807   1.1  christos 	  if (bfd_link_executable (info) && (h == NULL || h->dynindx == -1))
   3808   1.1  christos 	    {
   3809   1.1  christos 	      bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
   3810   1.1  christos 	      int rs2 = insn & 0x1f;
   3811   1.1  christos 	      int rd = (insn >> 25) & 0x1f;
   3812   1.1  christos 
   3813   1.1  christos 	      if (rs2 == rd)
   3814   1.1  christos 		relocation = SPARC_NOP;
   3815   1.1  christos 	      else
   3816   1.1  christos 		relocation = 0x80100000 | (insn & 0x3e00001f);
   3817   1.1  christos 	      bfd_put_32 (output_bfd, relocation, contents + rel->r_offset);
   3818   1.1  christos 	    }
   3819   1.1  christos 	  continue;
   3820   1.1  christos 
   3821   1.1  christos 	case R_SPARC_TLS_IE_ADD:
   3822   1.1  christos 	  /* Totally useless relocation.  */
   3823   1.1  christos 	  continue;
   3824   1.1  christos 
   3825   1.1  christos 	case R_SPARC_TLS_DTPOFF32:
   3826   1.1  christos 	case R_SPARC_TLS_DTPOFF64:
   3827   1.1  christos 	  relocation -= dtpoff_base (info);
   3828   1.1  christos 	  break;
   3829   1.1  christos 
   3830   1.1  christos 	default:
   3831   1.1  christos 	  break;
   3832   1.1  christos 	}
   3833   1.1  christos 
   3834   1.1  christos       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
   3835   1.1  christos 	 because such sections are not SEC_ALLOC and thus ld.so will
   3836   1.1  christos 	 not process them.  */
   3837   1.6  christos       if (unresolved_reloc
   3838   1.6  christos 	  && !((input_section->flags & SEC_DEBUGGING) != 0
   3839   1.6  christos 	       && h->def_dynamic)
   3840   1.6  christos 	  && _bfd_elf_section_offset (output_bfd, info, input_section,
   3841   1.1  christos 				      rel->r_offset) != (bfd_vma) -1)
   3842   1.1  christos 	_bfd_error_handler
   3843   1.6  christos 	  /* xgettext:c-format */
   3844   1.1  christos 	  (_("%pB(%pA+%#" PRIx64 "): "
   3845   1.1  christos 	     "unresolvable %s relocation against symbol `%s'"),
   3846   1.1  christos 	   input_bfd,
   3847   1.1  christos 	   input_section,
   3848   1.1  christos 	   (uint64_t) rel->r_offset,
   3849   1.1  christos 	   howto->name,
   3850   1.1  christos 	   h->root.root.string);
   3851   1.1  christos 
   3852   1.1  christos       r = bfd_reloc_continue;
   3853   1.1  christos       if (r_type == R_SPARC_OLO10)
   3854   1.1  christos 	{
   3855   1.1  christos 	    bfd_vma x;
   3856   1.1  christos 
   3857   1.1  christos 	    if (! ABI_64_P (output_bfd))
   3858   1.1  christos 	      abort ();
   3859   1.1  christos 
   3860   1.1  christos 	    relocation += rel->r_addend;
   3861   1.1  christos 	    relocation = (relocation & 0x3ff) + ELF64_R_TYPE_DATA (rel->r_info);
   3862   1.1  christos 
   3863   1.1  christos 	    x = bfd_get_32 (input_bfd, contents + rel->r_offset);
   3864   1.1  christos 	    x = (x & ~(bfd_vma) 0x1fff) | (relocation & 0x1fff);
   3865   1.1  christos 	    bfd_put_32 (input_bfd, x, contents + rel->r_offset);
   3866   1.1  christos 
   3867   1.1  christos 	    r = bfd_check_overflow (howto->complain_on_overflow,
   3868   1.1  christos 				    howto->bitsize, howto->rightshift,
   3869   1.1  christos 				    bfd_arch_bits_per_address (input_bfd),
   3870   1.1  christos 				    relocation);
   3871   1.1  christos 	}
   3872   1.1  christos       else if (r_type == R_SPARC_WDISP16)
   3873   1.1  christos 	{
   3874   1.1  christos 	  bfd_vma x;
   3875   1.1  christos 
   3876   1.1  christos 	  relocation += rel->r_addend;
   3877   1.1  christos 	  relocation -= (input_section->output_section->vma
   3878   1.1  christos 			 + input_section->output_offset);
   3879   1.1  christos 	  relocation -= rel->r_offset;
   3880   1.1  christos 
   3881   1.1  christos 	  x = bfd_get_32 (input_bfd, contents + rel->r_offset);
   3882   1.1  christos 	  x |= ((((relocation >> 2) & 0xc000) << 6)
   3883   1.1  christos 		| ((relocation >> 2) & 0x3fff));
   3884   1.1  christos 	  bfd_put_32 (input_bfd, x, contents + rel->r_offset);
   3885   1.1  christos 
   3886   1.1  christos 	  r = bfd_check_overflow (howto->complain_on_overflow,
   3887   1.1  christos 				  howto->bitsize, howto->rightshift,
   3888   1.1  christos 				  bfd_arch_bits_per_address (input_bfd),
   3889   1.1  christos 				  relocation);
   3890   1.1  christos 	}
   3891   1.1  christos       else if (r_type == R_SPARC_WDISP10)
   3892   1.1  christos 	{
   3893   1.1  christos 	  bfd_vma x;
   3894   1.1  christos 
   3895   1.1  christos 	  relocation += rel->r_addend;
   3896   1.1  christos 	  relocation -= (input_section->output_section->vma
   3897   1.1  christos 			 + input_section->output_offset);
   3898   1.1  christos 	  relocation -= rel->r_offset;
   3899   1.1  christos 
   3900   1.1  christos 	  x = bfd_get_32 (input_bfd, contents + rel->r_offset);
   3901   1.1  christos 	  x |= ((((relocation >> 2) & 0x300) << 11)
   3902   1.1  christos 		| (((relocation >> 2) & 0xff) << 5));
   3903   1.1  christos 	  bfd_put_32 (input_bfd, x, contents + rel->r_offset);
   3904   1.1  christos 
   3905   1.1  christos 	  r = bfd_check_overflow (howto->complain_on_overflow,
   3906   1.1  christos 				  howto->bitsize, howto->rightshift,
   3907   1.1  christos 				  bfd_arch_bits_per_address (input_bfd),
   3908   1.1  christos 				  relocation);
   3909   1.1  christos 	}
   3910   1.1  christos       else if (r_type == R_SPARC_REV32)
   3911   1.1  christos 	{
   3912   1.1  christos 	  bfd_vma x;
   3913   1.1  christos 
   3914   1.1  christos 	  relocation = relocation + rel->r_addend;
   3915   1.1  christos 
   3916   1.1  christos 	  x = bfd_get_32 (input_bfd, contents + rel->r_offset);
   3917   1.1  christos 	  x = x + relocation;
   3918   1.1  christos 	  bfd_putl32 (/*input_bfd,*/ x, contents + rel->r_offset);
   3919   1.1  christos 	  r = bfd_reloc_ok;
   3920   1.1  christos 	}
   3921   1.1  christos       else if (r_type == R_SPARC_TLS_LDO_HIX22
   3922   1.1  christos 	       || r_type == R_SPARC_TLS_LE_HIX22)
   3923   1.1  christos 	{
   3924   1.1  christos 	  bfd_vma x;
   3925   1.1  christos 
   3926   1.1  christos 	  relocation += rel->r_addend;
   3927   1.1  christos 	  if (r_type == R_SPARC_TLS_LE_HIX22)
   3928   1.1  christos 	    relocation ^= MINUS_ONE;
   3929   1.1  christos 
   3930   1.1  christos 	  x = bfd_get_32 (input_bfd, contents + rel->r_offset);
   3931   1.1  christos 	  x = (x & ~(bfd_vma) 0x3fffff) | ((relocation >> 10) & 0x3fffff);
   3932   1.1  christos 	  bfd_put_32 (input_bfd, x, contents + rel->r_offset);
   3933   1.1  christos 	  r = bfd_reloc_ok;
   3934   1.1  christos 	}
   3935   1.1  christos       else if (r_type == R_SPARC_TLS_LDO_LOX10
   3936   1.1  christos 	       || r_type == R_SPARC_TLS_LE_LOX10)
   3937   1.1  christos 	{
   3938   1.1  christos 	  bfd_vma x;
   3939   1.1  christos 
   3940   1.1  christos 	  relocation += rel->r_addend;
   3941   1.1  christos 	  relocation &= 0x3ff;
   3942   1.1  christos 	  if (r_type == R_SPARC_TLS_LE_LOX10)
   3943   1.1  christos 	    relocation |= 0x1c00;
   3944   1.1  christos 
   3945   1.1  christos 	  x = bfd_get_32 (input_bfd, contents + rel->r_offset);
   3946   1.1  christos 	  x = (x & ~(bfd_vma) 0x1fff) | relocation;
   3947   1.6  christos 	  bfd_put_32 (input_bfd, x, contents + rel->r_offset);
   3948   1.6  christos 
   3949   1.1  christos 	  r = bfd_reloc_ok;
   3950   1.1  christos 	}
   3951   1.1  christos       else if (r_type == R_SPARC_HIX22
   3952   1.1  christos 	       || r_type == R_SPARC_GOTDATA_HIX22
   3953   1.1  christos 	       || r_type == R_SPARC_GOTDATA_OP_HIX22)
   3954   1.1  christos 	{
   3955   1.1  christos 	  bfd_vma x;
   3956   1.1  christos 
   3957   1.1  christos 	  relocation += rel->r_addend;
   3958   1.1  christos 	  if (r_type == R_SPARC_HIX22
   3959   1.1  christos 	      || (bfd_signed_vma) relocation < 0)
   3960   1.1  christos 	    relocation = relocation ^ MINUS_ONE;
   3961   1.1  christos 
   3962   1.1  christos 	  x = bfd_get_32 (input_bfd, contents + rel->r_offset);
   3963   1.1  christos 	  x = (x & ~(bfd_vma) 0x3fffff) | ((relocation >> 10) & 0x3fffff);
   3964   1.1  christos 	  bfd_put_32 (input_bfd, x, contents + rel->r_offset);
   3965   1.1  christos 
   3966   1.1  christos 	  r = bfd_check_overflow (howto->complain_on_overflow,
   3967   1.6  christos 				  howto->bitsize, howto->rightshift,
   3968   1.6  christos 				  bfd_arch_bits_per_address (input_bfd),
   3969   1.1  christos 				  relocation);
   3970   1.1  christos 	}
   3971   1.1  christos       else if (r_type == R_SPARC_LOX10
   3972   1.1  christos 	       || r_type == R_SPARC_GOTDATA_LOX10
   3973   1.1  christos 	       || r_type == R_SPARC_GOTDATA_OP_LOX10)
   3974   1.1  christos 	{
   3975   1.1  christos 	  bfd_vma x;
   3976   1.1  christos 
   3977   1.1  christos 	  relocation += rel->r_addend;
   3978   1.1  christos 	  if (r_type == R_SPARC_LOX10
   3979   1.1  christos 	      || (bfd_signed_vma) relocation < 0)
   3980   1.1  christos 	    relocation = (relocation & 0x3ff) | 0x1c00;
   3981   1.1  christos 	  else
   3982   1.1  christos 	    relocation = (relocation & 0x3ff);
   3983   1.1  christos 
   3984   1.1  christos 	  x = bfd_get_32 (input_bfd, contents + rel->r_offset);
   3985   1.1  christos 	  x = (x & ~(bfd_vma) 0x1fff) | relocation;
   3986   1.1  christos 	  bfd_put_32 (input_bfd, x, contents + rel->r_offset);
   3987   1.1  christos 
   3988   1.1  christos 	  r = bfd_reloc_ok;
   3989   1.1  christos 	}
   3990   1.1  christos       else if ((r_type == R_SPARC_WDISP30 || r_type == R_SPARC_WPLT30)
   3991   1.1  christos 	       && sec_do_relax (input_section)
   3992   1.1  christos 	       && rel->r_offset + 4 < input_section->size)
   3993   1.1  christos 	{
   3994   1.1  christos #define G0		0
   3995   1.1  christos #define O7		15
   3996   1.1  christos #define XCC		(2 << 20)
   3997   1.1  christos #define COND(x)		(((x)&0xf)<<25)
   3998   1.1  christos #define CONDA		COND(0x8)
   3999   1.1  christos #define INSN_BPA	(F2(0,1) | CONDA | BPRED | XCC)
   4000   1.1  christos #define INSN_BA		(F2(0,2) | CONDA)
   4001   1.1  christos #define INSN_OR		F3(2, 0x2, 0)
   4002   1.1  christos #define INSN_NOP	F2(0,4)
   4003   1.1  christos 
   4004   1.1  christos 	  bfd_vma x, y;
   4005   1.1  christos 
   4006   1.1  christos 	  /* If the instruction is a call with either:
   4007   1.1  christos 	     restore
   4008   1.1  christos 	     arithmetic instruction with rd == %o7
   4009   1.1  christos 	     where rs1 != %o7 and rs2 if it is register != %o7
   4010   1.1  christos 	     then we can optimize if the call destination is near
   4011   1.1  christos 	     by changing the call into a branch always.  */
   4012   1.1  christos 	  x = bfd_get_32 (input_bfd, contents + rel->r_offset);
   4013   1.1  christos 	  y = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
   4014   1.1  christos 	  if ((x & OP(~0)) == OP(1) && (y & OP(~0)) == OP(2))
   4015   1.1  christos 	    {
   4016   1.1  christos 	      if (((y & OP3(~0)) == OP3(0x3d) /* restore */
   4017   1.1  christos 		   || ((y & OP3(0x28)) == 0 /* arithmetic */
   4018   1.1  christos 		       && (y & RD(~0)) == RD(O7)))
   4019   1.1  christos 		  && (y & RS1(~0)) != RS1(O7)
   4020   1.1  christos 		  && ((y & F3I(~0))
   4021   1.1  christos 		      || (y & RS2(~0)) != RS2(O7)))
   4022   1.1  christos 		{
   4023   1.1  christos 		  bfd_vma reloc;
   4024   1.1  christos 
   4025   1.1  christos 		  reloc = relocation + rel->r_addend - rel->r_offset;
   4026   1.1  christos 		  reloc -= (input_section->output_section->vma
   4027   1.1  christos 			    + input_section->output_offset);
   4028   1.1  christos 
   4029   1.1  christos 		  /* Ensure the branch fits into simm22.  */
   4030   1.1  christos 		  if ((reloc & 3) == 0
   4031   1.1  christos 		      && ((reloc & ~(bfd_vma)0x7fffff) == 0
   4032   1.1  christos 			  || ((reloc | 0x7fffff) == ~(bfd_vma)0)))
   4033   1.1  christos 		    {
   4034   1.1  christos 		      reloc >>= 2;
   4035   1.1  christos 
   4036   1.1  christos 		      /* Check whether it fits into simm19.  */
   4037   1.1  christos 		      if (((reloc & 0x3c0000) == 0
   4038   1.1  christos 			   || (reloc & 0x3c0000) == 0x3c0000)
   4039   1.1  christos 			  && (ABI_64_P (output_bfd)
   4040   1.1  christos 			      || elf_elfheader (output_bfd)->e_flags & EF_SPARC_32PLUS))
   4041   1.1  christos 			x = INSN_BPA | (reloc & 0x7ffff); /* ba,pt %xcc */
   4042   1.1  christos 		      else
   4043   1.1  christos 			x = INSN_BA | (reloc & 0x3fffff); /* ba */
   4044   1.1  christos 		      bfd_put_32 (input_bfd, x, contents + rel->r_offset);
   4045   1.1  christos 		      r = bfd_reloc_ok;
   4046   1.1  christos 		      if (rel->r_offset >= 4
   4047   1.1  christos 			  && (y & (0xffffffff ^ RS1(~0)))
   4048   1.1  christos 			     == (INSN_OR | RD(O7) | RS2(G0)))
   4049   1.1  christos 			{
   4050   1.1  christos 			  bfd_vma z;
   4051   1.1  christos 			  unsigned int reg;
   4052   1.6  christos 
   4053   1.1  christos 			  z = bfd_get_32 (input_bfd,
   4054   1.1  christos 					  contents + rel->r_offset - 4);
   4055   1.1  christos 			  if ((z & (0xffffffff ^ RD(~0)))
   4056   1.1  christos 			      != (INSN_OR | RS1(O7) | RS2(G0)))
   4057   1.1  christos 			    continue;
   4058   1.1  christos 
   4059   1.1  christos 			  /* The sequence was
   4060   1.1  christos 			     or %o7, %g0, %rN
   4061   1.1  christos 			     call foo
   4062   1.1  christos 			     or %rN, %g0, %o7
   4063   1.1  christos 
   4064   1.1  christos 			     If call foo was replaced with ba, replace
   4065   1.6  christos 			     or %rN, %g0, %o7 with nop.  */
   4066   1.1  christos 
   4067   1.1  christos 			  reg = (y & RS1(~0)) >> 14;
   4068   1.1  christos 			  if (reg != ((z & RD(~0)) >> 25)
   4069   1.1  christos 			      || reg == G0 || reg == O7)
   4070   1.1  christos 			    continue;
   4071   1.1  christos 
   4072   1.1  christos 			  bfd_put_32 (input_bfd, (bfd_vma) INSN_NOP,
   4073   1.1  christos 				      contents + rel->r_offset + 4);
   4074   1.1  christos 			}
   4075   1.1  christos 
   4076   1.1  christos 		    }
   4077   1.1  christos 		}
   4078   1.8  christos 	    }
   4079   1.1  christos 	}
   4080   1.1  christos 
   4081   1.1  christos       if (r == bfd_reloc_continue)
   4082   1.1  christos 	{
   4083   1.1  christos 	do_relocation:
   4084   1.1  christos 	  r = _bfd_final_link_relocate (howto, input_bfd, input_section,
   4085   1.1  christos 					contents, rel->r_offset,
   4086   1.1  christos 					relocation, rel->r_addend);
   4087   1.1  christos 	}
   4088   1.1  christos       if (r != bfd_reloc_ok)
   4089   1.1  christos 	{
   4090   1.1  christos 	  switch (r)
   4091   1.1  christos 	    {
   4092   1.1  christos 	    default:
   4093   1.1  christos 	    case bfd_reloc_outofrange:
   4094   1.3  christos 	      abort ();
   4095   1.1  christos 	    case bfd_reloc_overflow:
   4096   1.1  christos 	      {
   4097   1.1  christos 		const char *name;
   4098   1.1  christos 
   4099   1.1  christos 		/* The Solaris native linker silently disregards overflows.
   4100   1.1  christos 		   We don't, but this breaks stabs debugging info, whose
   4101   1.1  christos 		   relocations are only 32-bits wide.  Ignore overflows in
   4102   1.7  christos 		   this case and also for discarded entries.  */
   4103   1.1  christos 		if ((r_type == R_SPARC_32
   4104   1.1  christos 		     || r_type == R_SPARC_UA32
   4105   1.1  christos 		     || r_type == R_SPARC_DISP32)
   4106   1.1  christos 		    && (((input_section->flags & SEC_DEBUGGING) != 0
   4107   1.1  christos 			 && strcmp (bfd_section_name (input_section),
   4108   1.1  christos 				    ".stab") == 0)
   4109   1.1  christos 			|| _bfd_elf_section_offset (output_bfd, info,
   4110   1.1  christos 						    input_section,
   4111   1.1  christos 						    rel->r_offset)
   4112   1.1  christos 			     == (bfd_vma)-1))
   4113   1.1  christos 		  break;
   4114   1.1  christos 
   4115   1.1  christos 		if (h != NULL)
   4116   1.1  christos 		  {
   4117   1.1  christos 		    /* Assume this is a call protected by other code that
   4118   1.1  christos 		       detect the symbol is undefined.  If this is the case,
   4119   1.1  christos 		       we can safely ignore the overflow.  If not, the
   4120   1.1  christos 		       program is hosed anyway, and a little warning isn't
   4121   1.6  christos 		       going to help.  */
   4122   1.1  christos 		    if (h->root.type == bfd_link_hash_undefweak
   4123   1.1  christos 			&& howto->pc_relative)
   4124   1.1  christos 		      break;
   4125   1.1  christos 
   4126   1.1  christos 		    name = NULL;
   4127   1.1  christos 		  }
   4128   1.1  christos 		else
   4129   1.8  christos 		  {
   4130   1.1  christos 		    name = bfd_elf_string_from_elf_section (input_bfd,
   4131   1.7  christos 							    symtab_hdr->sh_link,
   4132   1.1  christos 							    sym->st_name);
   4133   1.5  christos 		    if (name == NULL)
   4134   1.5  christos 		      return false;
   4135   1.5  christos 		    if (*name == '\0')
   4136   1.1  christos 		      name = bfd_section_name (sec);
   4137   1.1  christos 		  }
   4138   1.1  christos 		(*info->callbacks->reloc_overflow)
   4139   1.1  christos 		  (info, (h ? &h->root : NULL), name, howto->name,
   4140   1.1  christos 		   (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
   4141   1.1  christos 	      }
   4142   1.8  christos 	      break;
   4143   1.1  christos 	    }
   4144   1.1  christos 	}
   4145   1.1  christos     }
   4146   1.1  christos 
   4147   1.1  christos   return true;
   4148   1.1  christos }
   4149   1.1  christos 
   4150   1.1  christos /* Build a VxWorks PLT entry.  PLT_INDEX is the index of the PLT entry
   4151   1.1  christos    and PLT_OFFSET is the byte offset from the start of .plt.  GOT_OFFSET
   4152   1.1  christos    is the offset of the associated .got.plt entry from
   4153   1.1  christos    _GLOBAL_OFFSET_TABLE_.  */
   4154   1.1  christos 
   4155   1.1  christos static void
   4156   1.1  christos sparc_vxworks_build_plt_entry (bfd *output_bfd, struct bfd_link_info *info,
   4157   1.1  christos 			       bfd_vma plt_offset, bfd_vma plt_index,
   4158   1.1  christos 			       bfd_vma got_offset)
   4159   1.1  christos {
   4160   1.1  christos   bfd_vma got_base;
   4161   1.1  christos   const bfd_vma *plt_entry;
   4162   1.1  christos   struct _bfd_sparc_elf_link_hash_table *htab;
   4163   1.1  christos   bfd_byte *loc;
   4164   1.3  christos   Elf_Internal_Rela rela;
   4165   1.1  christos 
   4166   1.1  christos   htab = _bfd_sparc_elf_hash_table (info);
   4167   1.1  christos   BFD_ASSERT (htab != NULL);
   4168   1.1  christos 
   4169   1.1  christos   if (bfd_link_pic (info))
   4170   1.1  christos     {
   4171   1.1  christos       plt_entry = sparc_vxworks_shared_plt_entry;
   4172   1.1  christos       got_base = 0;
   4173   1.1  christos     }
   4174   1.1  christos   else
   4175   1.1  christos     {
   4176   1.1  christos       plt_entry = sparc_vxworks_exec_plt_entry;
   4177   1.1  christos       got_base = (htab->elf.hgot->root.u.def.value
   4178   1.1  christos 		  + htab->elf.hgot->root.u.def.section->output_offset
   4179   1.1  christos 		  + htab->elf.hgot->root.u.def.section->output_section->vma);
   4180   1.1  christos     }
   4181   1.1  christos 
   4182   1.1  christos   /* Fill in the entry in the procedure linkage table.  */
   4183   1.1  christos   bfd_put_32 (output_bfd, plt_entry[0] + ((got_base + got_offset) >> 10),
   4184   1.1  christos 	      htab->elf.splt->contents + plt_offset);
   4185   1.1  christos   bfd_put_32 (output_bfd, plt_entry[1] + ((got_base + got_offset) & 0x3ff),
   4186   1.1  christos 	      htab->elf.splt->contents + plt_offset + 4);
   4187   1.1  christos   bfd_put_32 (output_bfd, plt_entry[2],
   4188   1.1  christos 	      htab->elf.splt->contents + plt_offset + 8);
   4189   1.1  christos   bfd_put_32 (output_bfd, plt_entry[3],
   4190   1.1  christos 	      htab->elf.splt->contents + plt_offset + 12);
   4191   1.1  christos   bfd_put_32 (output_bfd, plt_entry[4],
   4192   1.1  christos 	      htab->elf.splt->contents + plt_offset + 16);
   4193   1.1  christos   bfd_put_32 (output_bfd, plt_entry[5] + (plt_index >> 10),
   4194   1.1  christos 	      htab->elf.splt->contents + plt_offset + 20);
   4195   1.1  christos   /* PC-relative displacement for a branch to the start of
   4196   1.1  christos      the PLT section.  */
   4197   1.1  christos   bfd_put_32 (output_bfd, plt_entry[6] + (((-plt_offset - 24) >> 2)
   4198   1.1  christos 					  & 0x003fffff),
   4199   1.1  christos 	      htab->elf.splt->contents + plt_offset + 24);
   4200   1.1  christos   bfd_put_32 (output_bfd, plt_entry[7] + (plt_index & 0x3ff),
   4201   1.1  christos 	      htab->elf.splt->contents + plt_offset + 28);
   4202   1.1  christos 
   4203   1.1  christos   /* Fill in the .got.plt entry, pointing initially at the
   4204   1.1  christos      second half of the PLT entry.  */
   4205   1.1  christos   BFD_ASSERT (htab->elf.sgotplt != NULL);
   4206   1.1  christos   bfd_put_32 (output_bfd,
   4207   1.1  christos 	      htab->elf.splt->output_section->vma
   4208   1.3  christos 	      + htab->elf.splt->output_offset
   4209   1.1  christos 	      + plt_offset + 20,
   4210   1.1  christos 	      htab->elf.sgotplt->contents + got_offset);
   4211   1.1  christos 
   4212   1.1  christos   /* Add relocations to .rela.plt.unloaded.  */
   4213   1.1  christos   if (!bfd_link_pic (info))
   4214   1.1  christos     {
   4215   1.1  christos       loc = (htab->srelplt2->contents
   4216   1.1  christos 	     + (2 + 3 * plt_index) * sizeof (Elf32_External_Rela));
   4217   1.1  christos 
   4218   1.1  christos       /* Relocate the initial sethi.  */
   4219   1.1  christos       rela.r_offset = (htab->elf.splt->output_section->vma
   4220   1.1  christos 		       + htab->elf.splt->output_offset
   4221   1.1  christos 		       + plt_offset);
   4222   1.1  christos       rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_HI22);
   4223   1.1  christos       rela.r_addend = got_offset;
   4224   1.1  christos       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
   4225   1.1  christos       loc += sizeof (Elf32_External_Rela);
   4226   1.1  christos 
   4227   1.1  christos       /* Likewise the following or.  */
   4228   1.1  christos       rela.r_offset += 4;
   4229   1.1  christos       rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_LO10);
   4230   1.1  christos       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
   4231   1.1  christos       loc += sizeof (Elf32_External_Rela);
   4232   1.1  christos 
   4233   1.1  christos       /* Relocate the .got.plt entry.  */
   4234   1.1  christos       rela.r_offset = (htab->elf.sgotplt->output_section->vma
   4235   1.1  christos 		       + htab->elf.sgotplt->output_offset
   4236   1.1  christos 		       + got_offset);
   4237   1.1  christos       rela.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_SPARC_32);
   4238   1.1  christos       rela.r_addend = plt_offset + 20;
   4239   1.1  christos       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
   4240   1.1  christos     }
   4241   1.8  christos }
   4242   1.1  christos 
   4243   1.1  christos /* Finish up dynamic symbol handling.  We set the contents of various
   4244   1.1  christos    dynamic sections here.  */
   4245   1.1  christos 
   4246   1.1  christos bool
   4247   1.1  christos _bfd_sparc_elf_finish_dynamic_symbol (bfd *output_bfd,
   4248   1.1  christos 				      struct bfd_link_info *info,
   4249   1.6  christos 				      struct elf_link_hash_entry *h,
   4250   1.8  christos 				      Elf_Internal_Sym *sym)
   4251   1.1  christos {
   4252   1.1  christos   struct _bfd_sparc_elf_link_hash_table *htab;
   4253   1.1  christos   const struct elf_backend_data *bed;
   4254   1.1  christos   struct _bfd_sparc_elf_link_hash_entry  *eh;
   4255   1.1  christos   bool resolved_to_zero;
   4256   1.6  christos 
   4257   1.6  christos   htab = _bfd_sparc_elf_hash_table (info);
   4258   1.6  christos   BFD_ASSERT (htab != NULL);
   4259   1.6  christos   bed = get_elf_backend_data (output_bfd);
   4260   1.6  christos 
   4261   1.6  christos   eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
   4262   1.6  christos 
   4263   1.1  christos   /* We keep PLT/GOT entries without dynamic PLT/GOT relocations for
   4264   1.1  christos      resolved undefined weak symbols in executable so that their
   4265   1.1  christos      references have value 0 at run-time.  */
   4266   1.1  christos   resolved_to_zero = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
   4267   1.1  christos 
   4268   1.1  christos   if (h->plt.offset != (bfd_vma) -1)
   4269   1.1  christos     {
   4270   1.1  christos       asection *splt;
   4271   1.1  christos       asection *srela;
   4272   1.1  christos       Elf_Internal_Rela rela;
   4273   1.1  christos       bfd_byte *loc;
   4274   1.1  christos       bfd_vma r_offset, got_offset;
   4275   1.1  christos       int rela_index;
   4276   1.1  christos 
   4277   1.1  christos       /* When building a static executable, use .iplt and
   4278   1.1  christos 	 .rela.iplt sections for STT_GNU_IFUNC symbols.  */
   4279   1.1  christos       if (htab->elf.splt != NULL)
   4280   1.1  christos 	{
   4281   1.1  christos 	  splt = htab->elf.splt;
   4282   1.1  christos 	  srela = htab->elf.srelplt;
   4283   1.1  christos 	}
   4284   1.1  christos       else
   4285   1.1  christos 	{
   4286   1.1  christos 	  splt = htab->elf.iplt;
   4287   1.1  christos 	  srela = htab->elf.irelplt;
   4288   1.1  christos 	}
   4289   1.8  christos 
   4290   1.1  christos       if (splt == NULL || srela == NULL)
   4291   1.1  christos 	abort ();
   4292   1.1  christos 
   4293   1.1  christos       /* Fill in the entry in the .rela.plt section.  */
   4294   1.1  christos       if (htab->elf.target_os == is_vxworks)
   4295   1.1  christos 	{
   4296   1.1  christos 	  /* Work out the index of this PLT entry.  */
   4297   1.1  christos 	  rela_index = ((h->plt.offset - htab->plt_header_size)
   4298   1.1  christos 			/ htab->plt_entry_size);
   4299   1.1  christos 
   4300   1.1  christos 	  /* Calculate the offset of the associated .got.plt entry.
   4301   1.1  christos 	     The first three entries are reserved.  */
   4302   1.1  christos 	  got_offset = (rela_index + 3) * 4;
   4303   1.1  christos 
   4304   1.1  christos 	  sparc_vxworks_build_plt_entry (output_bfd, info, h->plt.offset,
   4305   1.1  christos 					 rela_index, got_offset);
   4306   1.1  christos 
   4307   1.1  christos 
   4308   1.1  christos 	  /* On VxWorks, the relocation points to the .got.plt entry,
   4309   1.1  christos 	     not the .plt entry.  */
   4310   1.1  christos 	  rela.r_offset = (htab->elf.sgotplt->output_section->vma
   4311   1.1  christos 			   + htab->elf.sgotplt->output_offset
   4312   1.1  christos 			   + got_offset);
   4313   1.1  christos 	  rela.r_addend = 0;
   4314   1.8  christos 	  rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx,
   4315   1.1  christos 					  R_SPARC_JMP_SLOT);
   4316   1.1  christos 	}
   4317   1.1  christos       else
   4318   1.1  christos 	{
   4319   1.1  christos 	  bool ifunc = false;
   4320   1.1  christos 
   4321   1.1  christos 	  /* Fill in the entry in the procedure linkage table.  */
   4322   1.1  christos 	  rela_index = SPARC_ELF_BUILD_PLT_ENTRY (htab, output_bfd, splt,
   4323   1.3  christos 						  h->plt.offset, splt->size,
   4324   1.1  christos 						  &r_offset);
   4325   1.1  christos 
   4326   1.1  christos 	  if (h == NULL
   4327   1.1  christos 	      || h->dynindx == -1
   4328   1.8  christos 	      || ((bfd_link_executable (info)
   4329   1.1  christos 		   || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
   4330   1.1  christos 		  && h->def_regular
   4331   1.1  christos 		  && h->type == STT_GNU_IFUNC))
   4332   1.1  christos 	    {
   4333   1.1  christos 	      ifunc = true;
   4334   1.1  christos 	      BFD_ASSERT (h == NULL
   4335   1.1  christos 			  || (h->type == STT_GNU_IFUNC
   4336   1.1  christos 			      && h->def_regular
   4337   1.1  christos 			      && (h->root.type == bfd_link_hash_defined
   4338   1.1  christos 				  || h->root.type == bfd_link_hash_defweak)));
   4339   1.1  christos 	    }
   4340   1.1  christos 
   4341   1.1  christos 	  rela.r_offset = r_offset
   4342   1.1  christos 	    + (splt->output_section->vma + splt->output_offset);
   4343   1.1  christos 	  if (ABI_64_P (output_bfd)
   4344   1.1  christos 	      && h->plt.offset >= (PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE))
   4345   1.1  christos 	    {
   4346   1.1  christos 	      if (ifunc)
   4347   1.1  christos 		{
   4348   1.1  christos 		  rela.r_addend = (h->root.u.def.section->output_section->vma
   4349   1.1  christos 				   + h->root.u.def.section->output_offset
   4350   1.1  christos 				   + h->root.u.def.value);
   4351   1.1  christos 		  rela.r_info = SPARC_ELF_R_INFO (htab, NULL, 0,
   4352   1.1  christos 						  R_SPARC_IRELATIVE);
   4353   1.1  christos 		}
   4354   1.1  christos 	      else
   4355   1.1  christos 		{
   4356   1.1  christos 		  rela.r_addend = (-(h->plt.offset + 4)
   4357   1.1  christos 				   - splt->output_section->vma
   4358   1.1  christos 				   - splt->output_offset);
   4359   1.1  christos 		  rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx,
   4360   1.1  christos 						  R_SPARC_JMP_SLOT);
   4361   1.1  christos 		}
   4362   1.1  christos 	    }
   4363   1.1  christos 	  else
   4364   1.1  christos 	    {
   4365   1.1  christos 	      if (ifunc)
   4366   1.1  christos 		{
   4367   1.1  christos 		  rela.r_addend = (h->root.u.def.section->output_section->vma
   4368   1.1  christos 				   + h->root.u.def.section->output_offset
   4369   1.1  christos 				   + h->root.u.def.value);
   4370   1.1  christos 		  rela.r_info = SPARC_ELF_R_INFO (htab, NULL, 0,
   4371   1.1  christos 						  R_SPARC_JMP_IREL);
   4372   1.1  christos 		}
   4373   1.1  christos 	      else
   4374   1.1  christos 		{
   4375   1.1  christos 		  rela.r_addend = 0;
   4376   1.1  christos 		  rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx,
   4377   1.1  christos 						  R_SPARC_JMP_SLOT);
   4378   1.1  christos 		}
   4379   1.1  christos 	    }
   4380   1.1  christos 	}
   4381   1.1  christos 
   4382   1.1  christos       /* Adjust for the first 4 reserved elements in the .plt section
   4383   1.1  christos 	 when setting the offset in the .rela.plt section.
   4384   1.1  christos 	 Sun forgot to read their own ABI and copied elf32-sparc behaviour,
   4385   1.1  christos 	 thus .plt[4] has corresponding .rela.plt[0] and so on.  */
   4386   1.6  christos 
   4387   1.1  christos       loc = srela->contents;
   4388   1.1  christos       loc += rela_index * bed->s->sizeof_rela;
   4389   1.1  christos       bed->s->swap_reloca_out (output_bfd, &rela, loc);
   4390   1.1  christos 
   4391   1.1  christos       if (!resolved_to_zero && !h->def_regular)
   4392   1.1  christos 	{
   4393   1.1  christos 	  /* Mark the symbol as undefined, rather than as defined in
   4394   1.1  christos 	     the .plt section.  Leave the value alone.  */
   4395   1.1  christos 	  sym->st_shndx = SHN_UNDEF;
   4396   1.1  christos 	  /* If the symbol is weak, we do need to clear the value.
   4397   1.1  christos 	     Otherwise, the PLT entry would provide a definition for
   4398   1.1  christos 	     the symbol even if the symbol wasn't defined anywhere,
   4399   1.1  christos 	     and so the symbol would never be NULL.  */
   4400   1.6  christos 	  if (!h->ref_regular_nonweak)
   4401   1.6  christos 	    sym->st_value = 0;
   4402   1.1  christos 	}
   4403   1.1  christos     }
   4404   1.6  christos 
   4405   1.6  christos   /* Don't generate dynamic GOT relocation against resolved undefined weak
   4406   1.6  christos      symbols in an executable.  */
   4407   1.6  christos   if (h->got.offset != (bfd_vma) -1
   4408   1.1  christos       && _bfd_sparc_elf_hash_entry(h)->tls_type != GOT_TLS_GD
   4409   1.1  christos       && _bfd_sparc_elf_hash_entry(h)->tls_type != GOT_TLS_IE
   4410   1.1  christos       && !(h->root.type == bfd_link_hash_undefweak
   4411   1.1  christos 	   && (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
   4412   1.1  christos 	       || resolved_to_zero)))
   4413   1.1  christos     {
   4414   1.1  christos       asection *sgot;
   4415   1.1  christos       asection *srela;
   4416   1.1  christos       Elf_Internal_Rela rela;
   4417   1.1  christos 
   4418   1.1  christos       /* This symbol has an entry in the GOT.  Set it up.  */
   4419   1.1  christos 
   4420   1.1  christos       sgot = htab->elf.sgot;
   4421   1.1  christos       srela = htab->elf.srelgot;
   4422   1.1  christos       BFD_ASSERT (sgot != NULL && srela != NULL);
   4423   1.1  christos 
   4424   1.1  christos       rela.r_offset = (sgot->output_section->vma
   4425   1.1  christos 		       + sgot->output_offset
   4426   1.1  christos 		       + (h->got.offset &~ (bfd_vma) 1));
   4427   1.1  christos 
   4428   1.3  christos       /* If this is a -Bsymbolic link, and the symbol is defined
   4429   1.1  christos 	 locally, we just want to emit a RELATIVE reloc.  Likewise if
   4430   1.1  christos 	 the symbol was forced to be local because of a version file.
   4431   1.1  christos 	 The entry in the global offset table will already have been
   4432   1.1  christos 	 initialized in the relocate_section function.  */
   4433   1.1  christos       if (! bfd_link_pic (info)
   4434   1.1  christos 	  && h->type == STT_GNU_IFUNC
   4435   1.1  christos 	  && h->def_regular)
   4436   1.1  christos 	{
   4437   1.1  christos 	  asection *plt;
   4438   1.1  christos 
   4439   1.1  christos 	  /* We load the GOT entry with the PLT entry.  */
   4440   1.1  christos 	  plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt;
   4441   1.8  christos 	  SPARC_ELF_PUT_WORD (htab, output_bfd,
   4442   1.1  christos 			      (plt->output_section->vma
   4443   1.6  christos 			       + plt->output_offset + h->plt.offset),
   4444   1.8  christos 			      htab->elf.sgot->contents
   4445   1.8  christos 			      + (h->got.offset & ~(bfd_vma) 1));
   4446   1.8  christos 	  return true;
   4447   1.8  christos 	}
   4448   1.1  christos 
   4449   1.1  christos       if (bfd_link_pic (info)
   4450   1.1  christos 	  && (h->root.type == bfd_link_hash_defined
   4451   1.1  christos 	      || h->root.type == bfd_link_hash_defweak)
   4452   1.1  christos 	  && SYMBOL_REFERENCES_LOCAL (info, h))
   4453   1.1  christos 	{
   4454   1.1  christos 	  asection *sec = h->root.u.def.section;
   4455   1.1  christos 	  if (h->type == STT_GNU_IFUNC)
   4456   1.1  christos 	    rela.r_info = SPARC_ELF_R_INFO (htab, NULL, 0, R_SPARC_IRELATIVE);
   4457   1.1  christos 	  else
   4458   1.1  christos 	    rela.r_info = SPARC_ELF_R_INFO (htab, NULL, 0, R_SPARC_RELATIVE);
   4459   1.1  christos 	  rela.r_addend = (h->root.u.def.value
   4460   1.1  christos 			   + sec->output_section->vma
   4461   1.1  christos 			   + sec->output_offset);
   4462   1.1  christos 	}
   4463   1.1  christos       else
   4464   1.1  christos 	{
   4465   1.1  christos 	  rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx, R_SPARC_GLOB_DAT);
   4466   1.1  christos 	  rela.r_addend = 0;
   4467   1.1  christos 	}
   4468   1.1  christos 
   4469   1.1  christos       SPARC_ELF_PUT_WORD (htab, output_bfd, 0,
   4470   1.1  christos 			  sgot->contents + (h->got.offset & ~(bfd_vma) 1));
   4471   1.1  christos       sparc_elf_append_rela (output_bfd, srela, &rela);
   4472   1.1  christos     }
   4473   1.1  christos 
   4474   1.1  christos   if (h->needs_copy)
   4475   1.1  christos     {
   4476   1.1  christos       asection *s;
   4477   1.1  christos       Elf_Internal_Rela rela;
   4478   1.1  christos 
   4479   1.1  christos       /* This symbols needs a copy reloc.  Set it up.  */
   4480   1.1  christos       BFD_ASSERT (h->dynindx != -1);
   4481   1.1  christos 
   4482   1.6  christos       rela.r_offset = (h->root.u.def.value
   4483   1.6  christos 		       + h->root.u.def.section->output_section->vma
   4484   1.6  christos 		       + h->root.u.def.section->output_offset);
   4485   1.6  christos       rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx, R_SPARC_COPY);
   4486   1.1  christos       rela.r_addend = 0;
   4487   1.1  christos       if (h->root.u.def.section == htab->elf.sdynrelro)
   4488   1.1  christos 	s = htab->elf.sreldynrelro;
   4489   1.1  christos       else
   4490   1.1  christos 	s = htab->elf.srelbss;
   4491   1.1  christos       sparc_elf_append_rela (output_bfd, s, &rela);
   4492   1.1  christos     }
   4493   1.3  christos 
   4494   1.8  christos   /* Mark some specially defined symbols as absolute.  On VxWorks,
   4495   1.1  christos      _GLOBAL_OFFSET_TABLE_ is not absolute: it is relative to the
   4496   1.1  christos      ".got" section.  Likewise _PROCEDURE_LINKAGE_TABLE_ and ".plt".  */
   4497   1.1  christos   if (sym != NULL
   4498   1.8  christos       && (h == htab->elf.hdynamic
   4499   1.1  christos 	  || (htab->elf.target_os != is_vxworks
   4500   1.1  christos 	      && (h == htab->elf.hgot || h == htab->elf.hplt))))
   4501   1.1  christos     sym->st_shndx = SHN_ABS;
   4502   1.1  christos 
   4503   1.8  christos   return true;
   4504   1.1  christos }
   4505   1.1  christos 
   4506   1.1  christos /* Finish up the dynamic sections.  */
   4507   1.1  christos 
   4508   1.1  christos static bool
   4509   1.1  christos sparc_finish_dyn (bfd *output_bfd, struct bfd_link_info *info,
   4510   1.1  christos 		  bfd *dynobj, asection *sdyn,
   4511   1.1  christos 		  asection *splt ATTRIBUTE_UNUSED)
   4512   1.1  christos {
   4513   1.8  christos   struct _bfd_sparc_elf_link_hash_table *htab;
   4514   1.1  christos   const struct elf_backend_data *bed;
   4515   1.1  christos   bfd_byte *dyncon, *dynconend;
   4516   1.1  christos   size_t dynsize;
   4517   1.1  christos   int stt_regidx = -1;
   4518   1.1  christos   bool abi_64_p;
   4519   1.1  christos 
   4520   1.1  christos   htab = _bfd_sparc_elf_hash_table (info);
   4521   1.1  christos   BFD_ASSERT (htab != NULL);
   4522   1.1  christos   bed = get_elf_backend_data (output_bfd);
   4523   1.1  christos   dynsize = bed->s->sizeof_dyn;
   4524   1.8  christos   dynconend = sdyn->contents + sdyn->size;
   4525   1.1  christos   abi_64_p = ABI_64_P (output_bfd);
   4526   1.1  christos   for (dyncon = sdyn->contents; dyncon < dynconend; dyncon += dynsize)
   4527   1.1  christos     {
   4528   1.8  christos       Elf_Internal_Dyn dyn;
   4529   1.1  christos       bool size;
   4530   1.1  christos 
   4531   1.1  christos       bed->s->swap_dyn_in (dynobj, dyncon, &dyn);
   4532   1.1  christos 
   4533   1.1  christos       if (htab->elf.target_os == is_vxworks && dyn.d_tag == DT_PLTGOT)
   4534   1.1  christos 	{
   4535   1.1  christos 	  /* On VxWorks, DT_PLTGOT should point to the start of the GOT,
   4536   1.1  christos 	     not to the start of the PLT.  */
   4537   1.1  christos 	  if (htab->elf.sgotplt)
   4538   1.1  christos 	    {
   4539   1.8  christos 	      dyn.d_un.d_val = (htab->elf.sgotplt->output_section->vma
   4540   1.1  christos 				+ htab->elf.sgotplt->output_offset);
   4541   1.1  christos 	      bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
   4542   1.1  christos 	    }
   4543   1.1  christos 	}
   4544   1.1  christos       else if (htab->elf.target_os == is_vxworks
   4545   1.1  christos 	       && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
   4546   1.1  christos 	bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
   4547   1.1  christos       else if (abi_64_p && dyn.d_tag == DT_SPARC_REGISTER)
   4548   1.1  christos 	{
   4549   1.8  christos 	  if (stt_regidx == -1)
   4550   1.1  christos 	    {
   4551   1.1  christos 	      stt_regidx =
   4552   1.1  christos 		_bfd_elf_link_lookup_local_dynindx (info, output_bfd, -1);
   4553   1.1  christos 	      if (stt_regidx == -1)
   4554   1.1  christos 		return false;
   4555   1.1  christos 	    }
   4556   1.6  christos 	  dyn.d_un.d_val = stt_regidx++;
   4557   1.6  christos 	  bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
   4558   1.1  christos 	}
   4559   1.1  christos       else
   4560   1.6  christos 	{
   4561   1.6  christos 	  asection *s;
   4562   1.8  christos 
   4563   1.6  christos 	  switch (dyn.d_tag)
   4564   1.6  christos 	    {
   4565   1.6  christos 	    case DT_PLTGOT:
   4566   1.8  christos 	      s = htab->elf.splt;
   4567   1.6  christos 	      size = false;
   4568   1.6  christos 	      break;
   4569   1.6  christos 	    case DT_PLTRELSZ:
   4570   1.8  christos 	      s = htab->elf.srelplt;
   4571   1.6  christos 	      size = true;
   4572   1.6  christos 	      break;
   4573   1.6  christos 	    case DT_JMPREL:
   4574   1.1  christos 	      s = htab->elf.srelplt;
   4575   1.1  christos 	      size = false;
   4576   1.6  christos 	      break;
   4577   1.6  christos 	    default:
   4578   1.6  christos 	      continue;
   4579   1.1  christos 	    }
   4580   1.6  christos 
   4581   1.6  christos 	  if (s == NULL)
   4582   1.1  christos 	    dyn.d_un.d_val = 0;
   4583   1.6  christos 	  else
   4584   1.1  christos 	    {
   4585   1.6  christos 	      if (!size)
   4586   1.1  christos 		dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
   4587   1.1  christos 	      else
   4588   1.8  christos 		dyn.d_un.d_val = s->size;
   4589   1.1  christos 	    }
   4590   1.1  christos 	  bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
   4591   1.1  christos 	}
   4592   1.1  christos     }
   4593   1.1  christos   return true;
   4594   1.1  christos }
   4595   1.1  christos 
   4596   1.1  christos /* Install the first PLT entry in a VxWorks executable and make sure that
   4597   1.1  christos    .rela.plt.unloaded relocations have the correct symbol indexes.  */
   4598   1.1  christos 
   4599   1.1  christos static void
   4600   1.1  christos sparc_vxworks_finish_exec_plt (bfd *output_bfd, struct bfd_link_info *info)
   4601   1.1  christos {
   4602   1.1  christos   struct _bfd_sparc_elf_link_hash_table *htab;
   4603   1.1  christos   Elf_Internal_Rela rela;
   4604   1.1  christos   bfd_vma got_base;
   4605   1.1  christos   bfd_byte *loc;
   4606   1.1  christos 
   4607   1.1  christos   htab = _bfd_sparc_elf_hash_table (info);
   4608   1.1  christos   BFD_ASSERT (htab != NULL);
   4609   1.1  christos 
   4610   1.1  christos   /* Calculate the absolute value of _GLOBAL_OFFSET_TABLE_.  */
   4611   1.1  christos   got_base = (htab->elf.hgot->root.u.def.section->output_section->vma
   4612   1.1  christos 	      + htab->elf.hgot->root.u.def.section->output_offset
   4613   1.1  christos 	      + htab->elf.hgot->root.u.def.value);
   4614   1.1  christos 
   4615   1.1  christos   /* Install the initial PLT entry.  */
   4616   1.1  christos   bfd_put_32 (output_bfd,
   4617   1.1  christos 	      sparc_vxworks_exec_plt0_entry[0] + ((got_base + 8) >> 10),
   4618   1.1  christos 	      htab->elf.splt->contents);
   4619   1.1  christos   bfd_put_32 (output_bfd,
   4620   1.1  christos 	      sparc_vxworks_exec_plt0_entry[1] + ((got_base + 8) & 0x3ff),
   4621   1.1  christos 	      htab->elf.splt->contents + 4);
   4622   1.1  christos   bfd_put_32 (output_bfd,
   4623   1.1  christos 	      sparc_vxworks_exec_plt0_entry[2],
   4624   1.1  christos 	      htab->elf.splt->contents + 8);
   4625   1.1  christos   bfd_put_32 (output_bfd,
   4626   1.1  christos 	      sparc_vxworks_exec_plt0_entry[3],
   4627   1.1  christos 	      htab->elf.splt->contents + 12);
   4628   1.1  christos   bfd_put_32 (output_bfd,
   4629   1.1  christos 	      sparc_vxworks_exec_plt0_entry[4],
   4630   1.1  christos 	      htab->elf.splt->contents + 16);
   4631   1.1  christos 
   4632   1.1  christos   loc = htab->srelplt2->contents;
   4633   1.1  christos 
   4634   1.1  christos   /* Add an unloaded relocation for the initial entry's "sethi".  */
   4635   1.1  christos   rela.r_offset = (htab->elf.splt->output_section->vma
   4636   1.1  christos 		   + htab->elf.splt->output_offset);
   4637   1.1  christos   rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_HI22);
   4638   1.1  christos   rela.r_addend = 8;
   4639   1.1  christos   bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
   4640   1.1  christos   loc += sizeof (Elf32_External_Rela);
   4641   1.1  christos 
   4642   1.1  christos   /* Likewise the following "or".  */
   4643   1.1  christos   rela.r_offset += 4;
   4644   1.1  christos   rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_LO10);
   4645   1.1  christos   bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
   4646   1.1  christos   loc += sizeof (Elf32_External_Rela);
   4647   1.1  christos 
   4648   1.1  christos   /* Fix up the remaining .rela.plt.unloaded relocations.  They may have
   4649   1.1  christos      the wrong symbol index for _G_O_T_ or _P_L_T_ depending on the order
   4650   1.1  christos      in which symbols were output.  */
   4651   1.1  christos   while (loc < htab->srelplt2->contents + htab->srelplt2->size)
   4652   1.1  christos     {
   4653   1.1  christos       Elf_Internal_Rela rel;
   4654   1.1  christos 
   4655   1.1  christos       /* The entry's initial "sethi" (against _G_O_T_).  */
   4656   1.1  christos       bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
   4657   1.1  christos       rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_HI22);
   4658   1.1  christos       bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
   4659   1.1  christos       loc += sizeof (Elf32_External_Rela);
   4660   1.1  christos 
   4661   1.1  christos       /* The following "or" (also against _G_O_T_).  */
   4662   1.1  christos       bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
   4663   1.1  christos       rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_LO10);
   4664   1.1  christos       bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
   4665   1.1  christos       loc += sizeof (Elf32_External_Rela);
   4666   1.1  christos 
   4667   1.1  christos       /* The .got.plt entry (against _P_L_T_).  */
   4668   1.1  christos       bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
   4669   1.1  christos       rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_SPARC_32);
   4670   1.1  christos       bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
   4671   1.1  christos       loc += sizeof (Elf32_External_Rela);
   4672   1.1  christos     }
   4673   1.1  christos }
   4674   1.1  christos 
   4675   1.1  christos /* Install the first PLT entry in a VxWorks shared object.  */
   4676   1.1  christos 
   4677   1.1  christos static void
   4678   1.1  christos sparc_vxworks_finish_shared_plt (bfd *output_bfd, struct bfd_link_info *info)
   4679   1.1  christos {
   4680   1.1  christos   struct _bfd_sparc_elf_link_hash_table *htab;
   4681   1.1  christos   unsigned int i;
   4682   1.1  christos 
   4683   1.1  christos   htab = _bfd_sparc_elf_hash_table (info);
   4684   1.1  christos   BFD_ASSERT (htab != NULL);
   4685   1.1  christos 
   4686   1.1  christos   for (i = 0; i < ARRAY_SIZE (sparc_vxworks_shared_plt0_entry); i++)
   4687   1.1  christos     bfd_put_32 (output_bfd, sparc_vxworks_shared_plt0_entry[i],
   4688   1.1  christos 		htab->elf.splt->contents + i * 4);
   4689   1.8  christos }
   4690   1.1  christos 
   4691   1.1  christos /* Finish up local dynamic symbol handling.  We set the contents of
   4692   1.1  christos    various dynamic sections here.  */
   4693   1.1  christos 
   4694   1.1  christos static int
   4695   1.3  christos finish_local_dynamic_symbol (void **slot, void *inf)
   4696   1.1  christos {
   4697   1.1  christos   struct elf_link_hash_entry *h
   4698   1.1  christos     = (struct elf_link_hash_entry *) *slot;
   4699   1.1  christos   struct bfd_link_info *info
   4700   1.1  christos     = (struct bfd_link_info *) inf;
   4701   1.6  christos 
   4702   1.6  christos   return _bfd_sparc_elf_finish_dynamic_symbol (info->output_bfd, info,
   4703   1.6  christos 					       h, NULL);
   4704   1.6  christos }
   4705   1.8  christos 
   4706   1.6  christos /* Finish up undefined weak symbol handling in PIE.  Fill its PLT entry
   4707   1.6  christos    here since undefined weak symbol may not be dynamic and may not be
   4708   1.6  christos    called for _bfd_sparc_elf_finish_dynamic_symbol.  */
   4709   1.6  christos 
   4710   1.6  christos static bool
   4711   1.6  christos pie_finish_undefweak_symbol (struct bfd_hash_entry *bh,
   4712   1.6  christos 			     void *inf)
   4713   1.6  christos {
   4714   1.8  christos   struct elf_link_hash_entry *h = (struct elf_link_hash_entry *) bh;
   4715   1.6  christos   struct bfd_link_info *info = (struct bfd_link_info *) inf;
   4716   1.6  christos 
   4717   1.6  christos   if (h->root.type != bfd_link_hash_undefweak
   4718   1.6  christos       || h->dynindx != -1)
   4719   1.6  christos     return true;
   4720   1.8  christos 
   4721   1.1  christos   return _bfd_sparc_elf_finish_dynamic_symbol (info->output_bfd, info,
   4722   1.1  christos 					       h, NULL);
   4723   1.1  christos }
   4724   1.1  christos 
   4725   1.1  christos bool
   4726   1.1  christos _bfd_sparc_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
   4727   1.1  christos {
   4728   1.1  christos   bfd *dynobj;
   4729   1.1  christos   asection *sdyn;
   4730   1.1  christos   struct _bfd_sparc_elf_link_hash_table *htab;
   4731   1.7  christos 
   4732   1.7  christos   htab = _bfd_sparc_elf_hash_table (info);
   4733   1.7  christos   BFD_ASSERT (htab != NULL);
   4734   1.7  christos   dynobj = htab->elf.dynobj;
   4735   1.7  christos 
   4736   1.7  christos   /* We arranged in size_dynamic_sections to put the STT_REGISTER
   4737   1.7  christos      entries at the end of the dynlocal list, so they came at the end
   4738   1.7  christos      of the local symbols in the symtab.  Except that they aren't
   4739   1.7  christos      STB_LOCAL, so we need to back up symtab->sh_info.  */
   4740   1.7  christos   if (ABI_64_P (output_bfd)
   4741   1.7  christos       && elf_hash_table (info)->dynlocal)
   4742   1.7  christos     {
   4743   1.7  christos       asection *dynsymsec = bfd_get_linker_section (dynobj, ".dynsym");
   4744   1.7  christos       struct elf_link_local_dynamic_entry *e;
   4745   1.7  christos 
   4746   1.7  christos       for (e = elf_hash_table (info)->dynlocal; e ; e = e->next)
   4747   1.7  christos 	if (e->input_indx == -1)
   4748   1.7  christos 	  break;
   4749   1.1  christos       if (e)
   4750   1.1  christos 	elf_section_data (dynsymsec->output_section)->this_hdr.sh_info
   4751   1.1  christos 	  = e->dynindx;
   4752   1.1  christos     }
   4753   1.1  christos 
   4754   1.1  christos   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
   4755   1.1  christos 
   4756   1.1  christos   if (elf_hash_table (info)->dynamic_sections_created)
   4757   1.1  christos     {
   4758   1.1  christos       asection *splt;
   4759   1.8  christos 
   4760   1.1  christos       splt = htab->elf.splt;
   4761   1.1  christos       BFD_ASSERT (splt != NULL && sdyn != NULL);
   4762   1.1  christos 
   4763   1.1  christos       if (!sparc_finish_dyn (output_bfd, info, dynobj, sdyn, splt))
   4764   1.8  christos 	return false;
   4765   1.1  christos 
   4766   1.3  christos       /* Initialize the contents of the .plt section.  */
   4767   1.1  christos       if (splt->size > 0)
   4768   1.1  christos 	{
   4769   1.1  christos 	  if (htab->elf.target_os == is_vxworks)
   4770   1.1  christos 	    {
   4771   1.1  christos 	      if (bfd_link_pic (info))
   4772   1.1  christos 		sparc_vxworks_finish_shared_plt (output_bfd, info);
   4773   1.1  christos 	      else
   4774   1.1  christos 		sparc_vxworks_finish_exec_plt (output_bfd, info);
   4775   1.1  christos 	    }
   4776   1.1  christos 	  else
   4777   1.1  christos 	    {
   4778   1.1  christos 	      memset (splt->contents, 0, htab->plt_header_size);
   4779   1.1  christos 	      if (!ABI_64_P (output_bfd))
   4780   1.3  christos 		bfd_put_32 (output_bfd, (bfd_vma) SPARC_NOP,
   4781   1.6  christos 			    splt->contents + splt->size - 4);
   4782   1.8  christos 	    }
   4783   1.8  christos 	}
   4784   1.6  christos 
   4785   1.1  christos       if (elf_section_data (splt->output_section) != NULL)
   4786   1.1  christos 	elf_section_data (splt->output_section)->this_hdr.sh_entsize
   4787   1.1  christos 	  = ((htab->elf.target_os == is_vxworks
   4788   1.1  christos 	      || !ABI_64_P (output_bfd))
   4789   1.1  christos 	     ? 0 : htab->plt_entry_size);
   4790   1.1  christos     }
   4791   1.1  christos 
   4792   1.1  christos   /* Set the first entry in the global offset table to the address of
   4793   1.1  christos      the dynamic section.  */
   4794   1.1  christos   if (htab->elf.sgot && htab->elf.sgot->size > 0)
   4795   1.1  christos     {
   4796   1.1  christos       bfd_vma val = (sdyn ?
   4797   1.1  christos 		     sdyn->output_section->vma + sdyn->output_offset :
   4798   1.1  christos 		     0);
   4799   1.1  christos 
   4800   1.1  christos       SPARC_ELF_PUT_WORD (htab, output_bfd, val, htab->elf.sgot->contents);
   4801   1.1  christos     }
   4802   1.1  christos 
   4803   1.1  christos   if (htab->elf.sgot)
   4804   1.1  christos     elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize =
   4805   1.6  christos       SPARC_ELF_WORD_BYTES (htab);
   4806   1.6  christos 
   4807   1.6  christos   /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols.  */
   4808   1.6  christos   htab_traverse (htab->loc_hash_table, finish_local_dynamic_symbol, info);
   4809   1.6  christos 
   4810   1.8  christos   /* Fill PLT entries for undefined weak symbols in PIE.  */
   4811   1.1  christos   if (bfd_link_pie (info))
   4812   1.1  christos     bfd_hash_traverse (&info->hash->table,
   4813   1.1  christos 		       pie_finish_undefweak_symbol,
   4814   1.1  christos 		       info);
   4815   1.1  christos   return true;
   4816   1.8  christos }
   4817   1.1  christos 
   4818   1.1  christos 
   4819   1.5  christos /* Set the right machine number for a SPARC ELF file.  */
   4821   1.5  christos 
   4822   1.5  christos bool
   4823   1.5  christos _bfd_sparc_elf_object_p (bfd *abfd)
   4824   1.5  christos {
   4825   1.6  christos   obj_attribute *attrs = elf_known_obj_attributes (abfd)[OBJ_ATTR_GNU];
   4826   1.6  christos   obj_attribute *hwcaps = &attrs[Tag_GNU_Sparc_HWCAPS];
   4827   1.5  christos   obj_attribute *hwcaps2 = &attrs[Tag_GNU_Sparc_HWCAPS2];
   4828   1.6  christos 
   4829   1.6  christos   unsigned int v9c_hwcaps_mask = ELF_SPARC_HWCAP_ASI_BLK_INIT;
   4830   1.6  christos   unsigned int v9d_hwcaps_mask = (ELF_SPARC_HWCAP_FMAF
   4831   1.6  christos 				  | ELF_SPARC_HWCAP_VIS3
   4832   1.6  christos 				  | ELF_SPARC_HWCAP_HPC);
   4833   1.6  christos   unsigned int v9e_hwcaps_mask = (ELF_SPARC_HWCAP_AES
   4834   1.6  christos 				  | ELF_SPARC_HWCAP_DES
   4835   1.6  christos 				  | ELF_SPARC_HWCAP_KASUMI
   4836   1.6  christos 				  | ELF_SPARC_HWCAP_CAMELLIA
   4837   1.6  christos 				  | ELF_SPARC_HWCAP_MD5
   4838   1.6  christos 				  | ELF_SPARC_HWCAP_SHA1
   4839   1.6  christos 				  | ELF_SPARC_HWCAP_SHA256
   4840   1.5  christos 				  | ELF_SPARC_HWCAP_SHA512
   4841   1.6  christos 				  | ELF_SPARC_HWCAP_MPMUL
   4842   1.5  christos 				  | ELF_SPARC_HWCAP_MONT
   4843   1.6  christos 				  | ELF_SPARC_HWCAP_CRC32C
   4844   1.6  christos 				  | ELF_SPARC_HWCAP_CBCOND
   4845   1.6  christos 				  | ELF_SPARC_HWCAP_PAUSE);
   4846   1.6  christos   unsigned int v9v_hwcaps_mask = (ELF_SPARC_HWCAP_FJFMAU
   4847   1.6  christos 				 | ELF_SPARC_HWCAP_IMA);
   4848   1.6  christos   unsigned int v9m_hwcaps2_mask = (ELF_SPARC_HWCAP2_SPARC5
   4849   1.6  christos 				   | ELF_SPARC_HWCAP2_MWAIT
   4850   1.6  christos 				   | ELF_SPARC_HWCAP2_XMPMUL
   4851   1.6  christos 				   | ELF_SPARC_HWCAP2_XMONT);
   4852   1.6  christos   unsigned int m8_hwcaps2_mask = (ELF_SPARC_HWCAP2_SPARC6
   4853   1.6  christos 				  | ELF_SPARC_HWCAP2_ONADDSUB
   4854   1.5  christos 				  | ELF_SPARC_HWCAP2_ONMUL
   4855   1.1  christos 				  | ELF_SPARC_HWCAP2_ONDIV
   4856   1.1  christos 				  | ELF_SPARC_HWCAP2_DICTUNP
   4857   1.1  christos 				  | ELF_SPARC_HWCAP2_FPCMPSHL
   4858   1.1  christos 				  | ELF_SPARC_HWCAP2_RLE
   4859   1.6  christos 				  | ELF_SPARC_HWCAP2_SHA3);
   4860   1.6  christos 
   4861   1.6  christos   if (ABI_64_P (abfd))
   4862   1.6  christos     {
   4863   1.5  christos       unsigned long mach = bfd_mach_sparc_v9;
   4864   1.6  christos 
   4865   1.5  christos       if (hwcaps2->i & m8_hwcaps2_mask)
   4866   1.6  christos 	mach = bfd_mach_sparc_v9m8;
   4867   1.5  christos       else if (hwcaps2->i & v9m_hwcaps2_mask)
   4868   1.6  christos 	mach = bfd_mach_sparc_v9m;
   4869   1.5  christos       else if (hwcaps->i & v9v_hwcaps_mask)
   4870   1.6  christos 	mach = bfd_mach_sparc_v9v;
   4871   1.5  christos       else if (hwcaps->i & v9e_hwcaps_mask)
   4872   1.1  christos 	mach = bfd_mach_sparc_v9e;
   4873   1.1  christos       else if (hwcaps->i & v9d_hwcaps_mask)
   4874   1.1  christos 	mach = bfd_mach_sparc_v9d;
   4875   1.1  christos       else if (hwcaps->i & v9c_hwcaps_mask)
   4876   1.1  christos 	mach = bfd_mach_sparc_v9c;
   4877   1.1  christos       else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US3)
   4878   1.1  christos 	mach = bfd_mach_sparc_v9b;
   4879   1.1  christos       else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US1)
   4880   1.1  christos 	mach = bfd_mach_sparc_v9a;
   4881   1.6  christos       return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, mach);
   4882   1.6  christos     }
   4883   1.6  christos   else
   4884   1.6  christos     {
   4885   1.5  christos       if (elf_elfheader (abfd)->e_machine == EM_SPARC32PLUS)
   4886   1.5  christos 	{
   4887   1.6  christos 	  if (hwcaps2->i & m8_hwcaps2_mask)
   4888   1.6  christos 	    return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
   4889   1.5  christos 					      bfd_mach_sparc_v8plusm8);
   4890   1.6  christos 	  else if (hwcaps2->i & v9m_hwcaps2_mask)
   4891   1.6  christos 	    return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
   4892   1.5  christos 					      bfd_mach_sparc_v8plusm);
   4893   1.6  christos 	  else if (hwcaps->i & v9v_hwcaps_mask)
   4894   1.6  christos 	    return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
   4895   1.5  christos 					      bfd_mach_sparc_v8plusv);
   4896   1.6  christos 	  else if (hwcaps->i & v9e_hwcaps_mask)
   4897   1.6  christos 	    return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
   4898   1.5  christos 					      bfd_mach_sparc_v8pluse);
   4899   1.5  christos 	  else if (hwcaps->i & v9d_hwcaps_mask)
   4900   1.1  christos 	    return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
   4901   1.1  christos 					      bfd_mach_sparc_v8plusd);
   4902   1.1  christos 	  else if (hwcaps->i & v9c_hwcaps_mask)
   4903   1.1  christos 	    return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
   4904   1.1  christos 					      bfd_mach_sparc_v8plusc);
   4905   1.1  christos 	  else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US3)
   4906   1.1  christos 	    return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
   4907   1.1  christos 					      bfd_mach_sparc_v8plusb);
   4908   1.1  christos 	  else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US1)
   4909   1.8  christos 	    return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
   4910   1.1  christos 					      bfd_mach_sparc_v8plusa);
   4911   1.1  christos 	  else if (elf_elfheader (abfd)->e_flags & EF_SPARC_32PLUS)
   4912   1.1  christos 	    return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
   4913   1.1  christos 					      bfd_mach_sparc_v8plus);
   4914   1.1  christos 	  else
   4915   1.1  christos 	    return false;
   4916   1.1  christos 	}
   4917   1.1  christos       else if (elf_elfheader (abfd)->e_flags & EF_SPARC_LEDATA)
   4918   1.1  christos 	return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
   4919   1.1  christos 					  bfd_mach_sparc_sparclite_le);
   4920   1.1  christos       else
   4921   1.1  christos 	return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc);
   4922   1.1  christos     }
   4923   1.1  christos }
   4924   1.1  christos 
   4925   1.1  christos /* Return address for Ith PLT stub in section PLT, for relocation REL
   4926   1.1  christos    or (bfd_vma) -1 if it should not be included.  */
   4927   1.1  christos 
   4928   1.1  christos bfd_vma
   4929   1.1  christos _bfd_sparc_elf_plt_sym_val (bfd_vma i, const asection *plt, const arelent *rel)
   4930   1.1  christos {
   4931   1.1  christos   if (ABI_64_P (plt->owner))
   4932   1.1  christos     {
   4933   1.1  christos       bfd_vma j;
   4934   1.1  christos 
   4935   1.1  christos       i += PLT64_HEADER_SIZE / PLT64_ENTRY_SIZE;
   4936   1.1  christos       if (i < PLT64_LARGE_THRESHOLD)
   4937   1.1  christos 	return plt->vma + i * PLT64_ENTRY_SIZE;
   4938   1.1  christos 
   4939   1.1  christos       j = (i - PLT64_LARGE_THRESHOLD) % 160;
   4940   1.1  christos       i -= j;
   4941   1.1  christos       return plt->vma + i * PLT64_ENTRY_SIZE + j * 4 * 6;
   4942   1.1  christos     }
   4943   1.1  christos   else
   4944   1.8  christos     return rel->address;
   4945   1.6  christos }
   4946   1.1  christos 
   4947   1.6  christos /* Merge backend specific data from an object file to the output
   4948   1.1  christos    object file when linking.  */
   4949   1.1  christos 
   4950   1.1  christos bool
   4951   1.1  christos _bfd_sparc_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
   4952   1.1  christos {
   4953   1.1  christos   bfd *obfd = info->output_bfd;
   4954   1.1  christos   obj_attribute *in_attr, *in_attrs;
   4955   1.1  christos   obj_attribute *out_attr, *out_attrs;
   4956   1.1  christos 
   4957   1.1  christos   if (!elf_known_obj_attributes_proc (obfd)[0].i)
   4958   1.1  christos     {
   4959   1.1  christos       /* This is the first object.  Copy the attributes.  */
   4960   1.8  christos       _bfd_elf_copy_obj_attributes (ibfd, obfd);
   4961   1.1  christos 
   4962   1.1  christos       /* Use the Tag_null value to indicate the attributes have been
   4963   1.1  christos 	 initialized.  */
   4964   1.1  christos       elf_known_obj_attributes_proc (obfd)[0].i = 1;
   4965   1.1  christos 
   4966   1.1  christos       return true;
   4967   1.1  christos     }
   4968   1.1  christos 
   4969   1.1  christos   in_attrs = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
   4970   1.3  christos   out_attrs = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
   4971   1.3  christos 
   4972   1.3  christos   in_attr = &in_attrs[Tag_GNU_Sparc_HWCAPS];
   4973   1.3  christos   out_attr = &out_attrs[Tag_GNU_Sparc_HWCAPS];
   4974   1.3  christos 
   4975   1.3  christos   out_attr->i |= in_attr->i;
   4976   1.3  christos   out_attr->type = 1;
   4977   1.3  christos 
   4978   1.1  christos   in_attr = &in_attrs[Tag_GNU_Sparc_HWCAPS2];
   4979   1.6  christos   out_attr = &out_attrs[Tag_GNU_Sparc_HWCAPS2];
   4980   1.1  christos 
   4981   1.8  christos   out_attr->i |= in_attr->i;
   4982   1.1  christos   out_attr->type = 1;
   4983                 
   4984                   /* Merge Tag_compatibility attributes and any common GNU ones.  */
   4985                   _bfd_elf_merge_object_attributes (ibfd, info);
   4986                 
   4987                   return true;
   4988                 }
   4989