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