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