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