Home | History | Annotate | Line # | Download | only in bfd
elf64-s390.c revision 1.6
      1 /* IBM S/390-specific support for 64-bit ELF
      2    Copyright (C) 2000-2016 Free Software Foundation, Inc.
      3    Contributed Martin Schwidefsky (schwidefsky (at) de.ibm.com).
      4 
      5    This file is part of BFD, the Binary File Descriptor library.
      6 
      7    This program is free software; you can redistribute it and/or modify
      8    it under the terms of the GNU General Public License as published by
      9    the Free Software Foundation; either version 3 of the License, or
     10    (at your option) any later version.
     11 
     12    This program is distributed in the hope that it will be useful,
     13    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15    GNU General Public License for more details.
     16 
     17    You should have received a copy of the GNU General Public License
     18    along with this program; if not, write to the Free Software
     19    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
     20    02110-1301, USA.  */
     21 
     22 #include "sysdep.h"
     23 #include "bfd.h"
     24 #include "bfdlink.h"
     25 #include "libbfd.h"
     26 #include "elf-bfd.h"
     27 #include "elf/s390.h"
     28 
     29 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
     30    from smaller values.  Start with zero, widen, *then* decrement.  */
     31 #define MINUS_ONE      (((bfd_vma)0) - 1)
     32 
     33 static bfd_reloc_status_type
     34 s390_tls_reloc (bfd *, arelent *, asymbol *, void *,
     35 		asection *, bfd *, char **);
     36 static bfd_reloc_status_type
     37 s390_elf_ldisp_reloc (bfd *, arelent *, asymbol *, void *,
     38 		      asection *, bfd *, char **);
     39 
     40 /* The relocation "howto" table.  */
     41 static reloc_howto_type elf_howto_table[] =
     42 {
     43   HOWTO (R_390_NONE,		/* type */
     44 	 0,			/* rightshift */
     45 	 3,			/* size (0 = byte, 1 = 2 byte, 2 = 4 byte) */
     46 	 0,			/* bitsize */
     47 	 FALSE,			/* pc_relative */
     48 	 0,			/* bitpos */
     49 	 complain_overflow_dont, /* complain_on_overflow */
     50 	 bfd_elf_generic_reloc, /* special_function */
     51 	 "R_390_NONE",		/* name */
     52 	 FALSE,			/* partial_inplace */
     53 	 0,			/* src_mask */
     54 	 0,			/* dst_mask */
     55 	 FALSE),		/* pcrel_offset */
     56 
     57   HOWTO(R_390_8,         0, 0,  8, FALSE, 0, complain_overflow_bitfield,
     58 	bfd_elf_generic_reloc, "R_390_8",        FALSE, 0,0x000000ff, FALSE),
     59   HOWTO(R_390_12,        0, 1, 12, FALSE, 0, complain_overflow_dont,
     60 	bfd_elf_generic_reloc, "R_390_12",       FALSE, 0,0x00000fff, FALSE),
     61   HOWTO(R_390_16,        0, 1, 16, FALSE, 0, complain_overflow_bitfield,
     62 	bfd_elf_generic_reloc, "R_390_16",       FALSE, 0,0x0000ffff, FALSE),
     63   HOWTO(R_390_32,        0, 2, 32, FALSE, 0, complain_overflow_bitfield,
     64 	bfd_elf_generic_reloc, "R_390_32",       FALSE, 0,0xffffffff, FALSE),
     65   HOWTO(R_390_PC32,	 0, 2, 32,  TRUE, 0, complain_overflow_bitfield,
     66 	bfd_elf_generic_reloc, "R_390_PC32",     FALSE, 0,0xffffffff, TRUE),
     67   HOWTO(R_390_GOT12,	 0, 1, 12, FALSE, 0, complain_overflow_bitfield,
     68 	bfd_elf_generic_reloc, "R_390_GOT12",    FALSE, 0,0x00000fff, FALSE),
     69   HOWTO(R_390_GOT32,	 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
     70 	bfd_elf_generic_reloc, "R_390_GOT32",    FALSE, 0,0xffffffff, FALSE),
     71   HOWTO(R_390_PLT32,	 0, 2, 32,  TRUE, 0, complain_overflow_bitfield,
     72 	bfd_elf_generic_reloc, "R_390_PLT32",    FALSE, 0,0xffffffff, TRUE),
     73   HOWTO(R_390_COPY,      0, 4, 64, FALSE, 0, complain_overflow_bitfield,
     74 	bfd_elf_generic_reloc, "R_390_COPY",     FALSE, 0,MINUS_ONE,  FALSE),
     75   HOWTO(R_390_GLOB_DAT,  0, 4, 64, FALSE, 0, complain_overflow_bitfield,
     76 	bfd_elf_generic_reloc, "R_390_GLOB_DAT", FALSE, 0,MINUS_ONE,  FALSE),
     77   HOWTO(R_390_JMP_SLOT,  0, 4, 64, FALSE, 0, complain_overflow_bitfield,
     78 	bfd_elf_generic_reloc, "R_390_JMP_SLOT", FALSE, 0,MINUS_ONE,  FALSE),
     79   HOWTO(R_390_RELATIVE,  0, 4, 64,  TRUE, 0, complain_overflow_bitfield,
     80 	bfd_elf_generic_reloc, "R_390_RELATIVE", FALSE, 0,MINUS_ONE,  FALSE),
     81   HOWTO(R_390_GOTOFF32,  0, 2, 32, FALSE, 0, complain_overflow_bitfield,
     82 	bfd_elf_generic_reloc, "R_390_GOTOFF32", FALSE, 0,MINUS_ONE,  FALSE),
     83   HOWTO(R_390_GOTPC,     0, 4, 64,  TRUE, 0, complain_overflow_bitfield,
     84 	bfd_elf_generic_reloc, "R_390_GOTPC",    FALSE, 0,MINUS_ONE,  TRUE),
     85   HOWTO(R_390_GOT16,     0, 1, 16, FALSE, 0, complain_overflow_bitfield,
     86 	bfd_elf_generic_reloc, "R_390_GOT16",    FALSE, 0,0x0000ffff, FALSE),
     87   HOWTO(R_390_PC16,      0, 1, 16,  TRUE, 0, complain_overflow_bitfield,
     88 	bfd_elf_generic_reloc, "R_390_PC16",     FALSE, 0,0x0000ffff, TRUE),
     89   HOWTO(R_390_PC16DBL,   1, 1, 16,  TRUE, 0, complain_overflow_bitfield,
     90 	bfd_elf_generic_reloc, "R_390_PC16DBL",  FALSE, 0,0x0000ffff, TRUE),
     91   HOWTO(R_390_PLT16DBL,  1, 1, 16,  TRUE, 0, complain_overflow_bitfield,
     92 	bfd_elf_generic_reloc, "R_390_PLT16DBL", FALSE, 0,0x0000ffff, TRUE),
     93   HOWTO(R_390_PC32DBL,	 1, 2, 32,  TRUE, 0, complain_overflow_bitfield,
     94 	bfd_elf_generic_reloc, "R_390_PC32DBL",  FALSE, 0,0xffffffff, TRUE),
     95   HOWTO(R_390_PLT32DBL,	 1, 2, 32,  TRUE, 0, complain_overflow_bitfield,
     96 	bfd_elf_generic_reloc, "R_390_PLT32DBL", FALSE, 0,0xffffffff, TRUE),
     97   HOWTO(R_390_GOTPCDBL,  1, 2, 32,  TRUE, 0, complain_overflow_bitfield,
     98 	bfd_elf_generic_reloc, "R_390_GOTPCDBL", FALSE, 0,MINUS_ONE,  TRUE),
     99   HOWTO(R_390_64,        0, 4, 64, FALSE, 0, complain_overflow_bitfield,
    100 	bfd_elf_generic_reloc, "R_390_64",       FALSE, 0,MINUS_ONE,  FALSE),
    101   HOWTO(R_390_PC64,	 0, 4, 64,  TRUE, 0, complain_overflow_bitfield,
    102 	bfd_elf_generic_reloc, "R_390_PC64",     FALSE, 0,MINUS_ONE,  TRUE),
    103   HOWTO(R_390_GOT64,	 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
    104 	bfd_elf_generic_reloc, "R_390_GOT64",    FALSE, 0,MINUS_ONE,  FALSE),
    105   HOWTO(R_390_PLT64,	 0, 4, 64,  TRUE, 0, complain_overflow_bitfield,
    106 	bfd_elf_generic_reloc, "R_390_PLT64",    FALSE, 0,MINUS_ONE,  TRUE),
    107   HOWTO(R_390_GOTENT,	 1, 2, 32,  TRUE, 0, complain_overflow_bitfield,
    108 	bfd_elf_generic_reloc, "R_390_GOTENT",   FALSE, 0,MINUS_ONE,  TRUE),
    109   HOWTO(R_390_GOTOFF16,  0, 1, 16, FALSE, 0, complain_overflow_bitfield,
    110 	bfd_elf_generic_reloc, "R_390_GOTOFF16", FALSE, 0,0x0000ffff, FALSE),
    111   HOWTO(R_390_GOTOFF64,  0, 4, 64, FALSE, 0, complain_overflow_bitfield,
    112 	bfd_elf_generic_reloc, "R_390_GOTOFF64", FALSE, 0,MINUS_ONE,  FALSE),
    113   HOWTO(R_390_GOTPLT12,	 0, 1, 12, FALSE, 0, complain_overflow_dont,
    114 	bfd_elf_generic_reloc, "R_390_GOTPLT12", FALSE, 0,0x00000fff, FALSE),
    115   HOWTO(R_390_GOTPLT16,  0, 1, 16, FALSE, 0, complain_overflow_bitfield,
    116 	bfd_elf_generic_reloc, "R_390_GOTPLT16", FALSE, 0,0x0000ffff, FALSE),
    117   HOWTO(R_390_GOTPLT32,	 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
    118 	bfd_elf_generic_reloc, "R_390_GOTPLT32", FALSE, 0,0xffffffff, FALSE),
    119   HOWTO(R_390_GOTPLT64,	 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
    120 	bfd_elf_generic_reloc, "R_390_GOTPLT64", FALSE, 0,MINUS_ONE,  FALSE),
    121   HOWTO(R_390_GOTPLTENT, 1, 2, 32,  TRUE, 0, complain_overflow_bitfield,
    122 	bfd_elf_generic_reloc, "R_390_GOTPLTENT",FALSE, 0,MINUS_ONE,  TRUE),
    123   HOWTO(R_390_PLTOFF16,  0, 1, 16, FALSE, 0, complain_overflow_bitfield,
    124 	bfd_elf_generic_reloc, "R_390_PLTOFF16", FALSE, 0,0x0000ffff, FALSE),
    125   HOWTO(R_390_PLTOFF32,  0, 2, 32, FALSE, 0, complain_overflow_bitfield,
    126 	bfd_elf_generic_reloc, "R_390_PLTOFF32", FALSE, 0,0xffffffff, FALSE),
    127   HOWTO(R_390_PLTOFF64,  0, 4, 64, FALSE, 0, complain_overflow_bitfield,
    128 	bfd_elf_generic_reloc, "R_390_PLTOFF64", FALSE, 0,MINUS_ONE,  FALSE),
    129   HOWTO(R_390_TLS_LOAD, 0, 0, 0, FALSE, 0, complain_overflow_dont,
    130 	s390_tls_reloc, "R_390_TLS_LOAD", FALSE, 0, 0, FALSE),
    131   HOWTO(R_390_TLS_GDCALL, 0, 0, 0, FALSE, 0, complain_overflow_dont,
    132 	s390_tls_reloc, "R_390_TLS_GDCALL", FALSE, 0, 0, FALSE),
    133   HOWTO(R_390_TLS_LDCALL, 0, 0, 0, FALSE, 0, complain_overflow_dont,
    134 	s390_tls_reloc, "R_390_TLS_LDCALL", FALSE, 0, 0, FALSE),
    135   EMPTY_HOWTO (R_390_TLS_GD32),	/* Empty entry for R_390_TLS_GD32.  */
    136   HOWTO(R_390_TLS_GD64,  0, 4, 64, FALSE, 0, complain_overflow_bitfield,
    137 	bfd_elf_generic_reloc, "R_390_TLS_GD64", FALSE, 0, MINUS_ONE, FALSE),
    138   HOWTO(R_390_TLS_GOTIE12, 0, 1, 12, FALSE, 0, complain_overflow_dont,
    139 	bfd_elf_generic_reloc, "R_390_TLS_GOTIE12", FALSE, 0, 0x00000fff, FALSE),
    140   EMPTY_HOWTO (R_390_TLS_GOTIE32),	/* Empty entry for R_390_TLS_GOTIE32.  */
    141   HOWTO(R_390_TLS_GOTIE64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
    142 	bfd_elf_generic_reloc, "R_390_TLS_GOTIE64", FALSE, 0, MINUS_ONE, FALSE),
    143   EMPTY_HOWTO (R_390_TLS_LDM32),	/* Empty entry for R_390_TLS_LDM32.  */
    144   HOWTO(R_390_TLS_LDM64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
    145 	bfd_elf_generic_reloc, "R_390_TLS_LDM64", FALSE, 0, MINUS_ONE, FALSE),
    146   EMPTY_HOWTO (R_390_TLS_IE32),	/* Empty entry for R_390_TLS_IE32.  */
    147   HOWTO(R_390_TLS_IE64,  0, 4, 64, FALSE, 0, complain_overflow_bitfield,
    148 	bfd_elf_generic_reloc, "R_390_TLS_IE64", FALSE, 0, MINUS_ONE, FALSE),
    149   HOWTO(R_390_TLS_IEENT, 1, 2, 32, TRUE, 0, complain_overflow_bitfield,
    150 	bfd_elf_generic_reloc, "R_390_TLS_IEENT", FALSE, 0, MINUS_ONE, TRUE),
    151   EMPTY_HOWTO (R_390_TLS_LE32),	/* Empty entry for R_390_TLS_LE32.  */
    152   HOWTO(R_390_TLS_LE64,  0, 2, 32, FALSE, 0, complain_overflow_bitfield,
    153 	bfd_elf_generic_reloc, "R_390_TLS_LE64", FALSE, 0, MINUS_ONE, FALSE),
    154   EMPTY_HOWTO (R_390_TLS_LDO32),	/* Empty entry for R_390_TLS_LDO32.  */
    155   HOWTO(R_390_TLS_LDO64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
    156 	bfd_elf_generic_reloc, "R_390_TLS_LDO64", FALSE, 0, MINUS_ONE, FALSE),
    157   HOWTO(R_390_TLS_DTPMOD, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
    158 	bfd_elf_generic_reloc, "R_390_TLS_DTPMOD", FALSE, 0, MINUS_ONE, FALSE),
    159   HOWTO(R_390_TLS_DTPOFF, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
    160 	bfd_elf_generic_reloc, "R_390_TLS_DTPOFF", FALSE, 0, MINUS_ONE, FALSE),
    161   HOWTO(R_390_TLS_TPOFF, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
    162 	bfd_elf_generic_reloc, "R_390_TLS_TPOFF", FALSE, 0, MINUS_ONE, FALSE),
    163   HOWTO(R_390_20,        0, 2, 20, FALSE, 8, complain_overflow_dont,
    164 	s390_elf_ldisp_reloc, "R_390_20",      FALSE, 0,0x0fffff00, FALSE),
    165   HOWTO(R_390_GOT20,	 0, 2, 20, FALSE, 8, complain_overflow_dont,
    166 	s390_elf_ldisp_reloc, "R_390_GOT20",   FALSE, 0,0x0fffff00, FALSE),
    167   HOWTO(R_390_GOTPLT20,  0, 2, 20, FALSE, 8, complain_overflow_dont,
    168 	s390_elf_ldisp_reloc, "R_390_GOTPLT20", FALSE, 0,0x0fffff00, FALSE),
    169   HOWTO(R_390_TLS_GOTIE20, 0, 2, 20, FALSE, 8, complain_overflow_dont,
    170 	s390_elf_ldisp_reloc, "R_390_TLS_GOTIE20", FALSE, 0,0x0fffff00, FALSE),
    171   HOWTO(R_390_IRELATIVE, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
    172 	bfd_elf_generic_reloc, "R_390_IRELATIVE", FALSE, 0, MINUS_ONE, FALSE),
    173   HOWTO(R_390_PC12DBL,   1, 1, 12,  TRUE, 0, complain_overflow_bitfield,
    174 	bfd_elf_generic_reloc, "R_390_PC12DBL",  FALSE, 0,0x00000fff, TRUE),
    175   HOWTO(R_390_PLT12DBL,  1, 1, 12,  TRUE, 0, complain_overflow_bitfield,
    176 	bfd_elf_generic_reloc, "R_390_PLT12DBL", FALSE, 0,0x00000fff, TRUE),
    177   HOWTO(R_390_PC24DBL,   1, 2, 24,  TRUE, 0, complain_overflow_bitfield,
    178 	bfd_elf_generic_reloc, "R_390_PC24DBL",  FALSE, 0,0x00ffffff, TRUE),
    179   HOWTO(R_390_PLT24DBL,  1, 2, 24,  TRUE, 0, complain_overflow_bitfield,
    180 	bfd_elf_generic_reloc, "R_390_PLT24DBL", FALSE, 0,0x00ffffff, TRUE),
    181 };
    182 
    183 /* GNU extension to record C++ vtable hierarchy.  */
    184 static reloc_howto_type elf64_s390_vtinherit_howto =
    185   HOWTO (R_390_GNU_VTINHERIT, 0,4,0,FALSE,0,complain_overflow_dont, NULL, "R_390_GNU_VTINHERIT", FALSE,0, 0, FALSE);
    186 static reloc_howto_type elf64_s390_vtentry_howto =
    187   HOWTO (R_390_GNU_VTENTRY, 0,4,0,FALSE,0,complain_overflow_dont, _bfd_elf_rel_vtable_reloc_fn,"R_390_GNU_VTENTRY", FALSE,0,0, FALSE);
    188 
    189 static reloc_howto_type *
    190 elf_s390_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
    191 			    bfd_reloc_code_real_type code)
    192 {
    193   switch (code)
    194     {
    195     case BFD_RELOC_NONE:
    196       return &elf_howto_table[(int) R_390_NONE];
    197     case BFD_RELOC_8:
    198       return &elf_howto_table[(int) R_390_8];
    199     case BFD_RELOC_390_12:
    200       return &elf_howto_table[(int) R_390_12];
    201     case BFD_RELOC_16:
    202       return &elf_howto_table[(int) R_390_16];
    203     case BFD_RELOC_32:
    204       return &elf_howto_table[(int) R_390_32];
    205     case BFD_RELOC_CTOR:
    206       return &elf_howto_table[(int) R_390_32];
    207     case BFD_RELOC_32_PCREL:
    208       return &elf_howto_table[(int) R_390_PC32];
    209     case BFD_RELOC_390_GOT12:
    210       return &elf_howto_table[(int) R_390_GOT12];
    211     case BFD_RELOC_32_GOT_PCREL:
    212       return &elf_howto_table[(int) R_390_GOT32];
    213     case BFD_RELOC_390_PLT32:
    214       return &elf_howto_table[(int) R_390_PLT32];
    215     case BFD_RELOC_390_COPY:
    216       return &elf_howto_table[(int) R_390_COPY];
    217     case BFD_RELOC_390_GLOB_DAT:
    218       return &elf_howto_table[(int) R_390_GLOB_DAT];
    219     case BFD_RELOC_390_JMP_SLOT:
    220       return &elf_howto_table[(int) R_390_JMP_SLOT];
    221     case BFD_RELOC_390_RELATIVE:
    222       return &elf_howto_table[(int) R_390_RELATIVE];
    223     case BFD_RELOC_32_GOTOFF:
    224       return &elf_howto_table[(int) R_390_GOTOFF32];
    225     case BFD_RELOC_390_GOTPC:
    226       return &elf_howto_table[(int) R_390_GOTPC];
    227     case BFD_RELOC_390_GOT16:
    228       return &elf_howto_table[(int) R_390_GOT16];
    229     case BFD_RELOC_16_PCREL:
    230       return &elf_howto_table[(int) R_390_PC16];
    231     case BFD_RELOC_390_PC12DBL:
    232       return &elf_howto_table[(int) R_390_PC12DBL];
    233     case BFD_RELOC_390_PLT12DBL:
    234       return &elf_howto_table[(int) R_390_PLT12DBL];
    235     case BFD_RELOC_390_PC16DBL:
    236       return &elf_howto_table[(int) R_390_PC16DBL];
    237     case BFD_RELOC_390_PLT16DBL:
    238       return &elf_howto_table[(int) R_390_PLT16DBL];
    239     case BFD_RELOC_390_PC24DBL:
    240       return &elf_howto_table[(int) R_390_PC24DBL];
    241     case BFD_RELOC_390_PLT24DBL:
    242       return &elf_howto_table[(int) R_390_PLT24DBL];
    243     case BFD_RELOC_390_PC32DBL:
    244       return &elf_howto_table[(int) R_390_PC32DBL];
    245     case BFD_RELOC_390_PLT32DBL:
    246       return &elf_howto_table[(int) R_390_PLT32DBL];
    247     case BFD_RELOC_390_GOTPCDBL:
    248       return &elf_howto_table[(int) R_390_GOTPCDBL];
    249     case BFD_RELOC_64:
    250       return &elf_howto_table[(int) R_390_64];
    251     case BFD_RELOC_64_PCREL:
    252       return &elf_howto_table[(int) R_390_PC64];
    253     case BFD_RELOC_390_GOT64:
    254       return &elf_howto_table[(int) R_390_GOT64];
    255     case BFD_RELOC_390_PLT64:
    256       return &elf_howto_table[(int) R_390_PLT64];
    257     case BFD_RELOC_390_GOTENT:
    258       return &elf_howto_table[(int) R_390_GOTENT];
    259     case BFD_RELOC_16_GOTOFF:
    260       return &elf_howto_table[(int) R_390_GOTOFF16];
    261     case BFD_RELOC_390_GOTOFF64:
    262       return &elf_howto_table[(int) R_390_GOTOFF64];
    263     case BFD_RELOC_390_GOTPLT12:
    264       return &elf_howto_table[(int) R_390_GOTPLT12];
    265     case BFD_RELOC_390_GOTPLT16:
    266       return &elf_howto_table[(int) R_390_GOTPLT16];
    267     case BFD_RELOC_390_GOTPLT32:
    268       return &elf_howto_table[(int) R_390_GOTPLT32];
    269     case BFD_RELOC_390_GOTPLT64:
    270       return &elf_howto_table[(int) R_390_GOTPLT64];
    271     case BFD_RELOC_390_GOTPLTENT:
    272       return &elf_howto_table[(int) R_390_GOTPLTENT];
    273     case BFD_RELOC_390_PLTOFF16:
    274       return &elf_howto_table[(int) R_390_PLTOFF16];
    275     case BFD_RELOC_390_PLTOFF32:
    276       return &elf_howto_table[(int) R_390_PLTOFF32];
    277     case BFD_RELOC_390_PLTOFF64:
    278       return &elf_howto_table[(int) R_390_PLTOFF64];
    279     case BFD_RELOC_390_TLS_LOAD:
    280       return &elf_howto_table[(int) R_390_TLS_LOAD];
    281     case BFD_RELOC_390_TLS_GDCALL:
    282       return &elf_howto_table[(int) R_390_TLS_GDCALL];
    283     case BFD_RELOC_390_TLS_LDCALL:
    284       return &elf_howto_table[(int) R_390_TLS_LDCALL];
    285     case BFD_RELOC_390_TLS_GD64:
    286       return &elf_howto_table[(int) R_390_TLS_GD64];
    287     case BFD_RELOC_390_TLS_GOTIE12:
    288       return &elf_howto_table[(int) R_390_TLS_GOTIE12];
    289     case BFD_RELOC_390_TLS_GOTIE64:
    290       return &elf_howto_table[(int) R_390_TLS_GOTIE64];
    291     case BFD_RELOC_390_TLS_LDM64:
    292       return &elf_howto_table[(int) R_390_TLS_LDM64];
    293     case BFD_RELOC_390_TLS_IE64:
    294       return &elf_howto_table[(int) R_390_TLS_IE64];
    295     case BFD_RELOC_390_TLS_IEENT:
    296       return &elf_howto_table[(int) R_390_TLS_IEENT];
    297     case BFD_RELOC_390_TLS_LE64:
    298       return &elf_howto_table[(int) R_390_TLS_LE64];
    299     case BFD_RELOC_390_TLS_LDO64:
    300       return &elf_howto_table[(int) R_390_TLS_LDO64];
    301     case BFD_RELOC_390_TLS_DTPMOD:
    302       return &elf_howto_table[(int) R_390_TLS_DTPMOD];
    303     case BFD_RELOC_390_TLS_DTPOFF:
    304       return &elf_howto_table[(int) R_390_TLS_DTPOFF];
    305     case BFD_RELOC_390_TLS_TPOFF:
    306       return &elf_howto_table[(int) R_390_TLS_TPOFF];
    307     case BFD_RELOC_390_20:
    308       return &elf_howto_table[(int) R_390_20];
    309     case BFD_RELOC_390_GOT20:
    310       return &elf_howto_table[(int) R_390_GOT20];
    311     case BFD_RELOC_390_GOTPLT20:
    312       return &elf_howto_table[(int) R_390_GOTPLT20];
    313     case BFD_RELOC_390_TLS_GOTIE20:
    314       return &elf_howto_table[(int) R_390_TLS_GOTIE20];
    315     case BFD_RELOC_390_IRELATIVE:
    316       return &elf_howto_table[(int) R_390_IRELATIVE];
    317     case BFD_RELOC_VTABLE_INHERIT:
    318       return &elf64_s390_vtinherit_howto;
    319     case BFD_RELOC_VTABLE_ENTRY:
    320       return &elf64_s390_vtentry_howto;
    321     default:
    322       break;
    323     }
    324   return 0;
    325 }
    326 
    327 static reloc_howto_type *
    328 elf_s390_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
    329 			    const char *r_name)
    330 {
    331   unsigned int i;
    332 
    333   for (i = 0;
    334        i < sizeof (elf_howto_table) / sizeof (elf_howto_table[0]);
    335        i++)
    336     if (elf_howto_table[i].name != NULL
    337 	&& strcasecmp (elf_howto_table[i].name, r_name) == 0)
    338       return &elf_howto_table[i];
    339 
    340   if (strcasecmp (elf64_s390_vtinherit_howto.name, r_name) == 0)
    341     return &elf64_s390_vtinherit_howto;
    342   if (strcasecmp (elf64_s390_vtentry_howto.name, r_name) == 0)
    343     return &elf64_s390_vtentry_howto;
    344 
    345   return NULL;
    346 }
    347 
    348 /* We need to use ELF64_R_TYPE so we have our own copy of this function,
    349    and elf64-s390.c has its own copy.  */
    350 
    351 static void
    352 elf_s390_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
    353 			arelent *cache_ptr,
    354 			Elf_Internal_Rela *dst)
    355 {
    356   unsigned int r_type = ELF64_R_TYPE(dst->r_info);
    357   switch (r_type)
    358     {
    359     case R_390_GNU_VTINHERIT:
    360       cache_ptr->howto = &elf64_s390_vtinherit_howto;
    361       break;
    362 
    363     case R_390_GNU_VTENTRY:
    364       cache_ptr->howto = &elf64_s390_vtentry_howto;
    365       break;
    366 
    367     default:
    368       if (r_type >= sizeof (elf_howto_table) / sizeof (elf_howto_table[0]))
    369 	{
    370 	  (*_bfd_error_handler) (_("%B: invalid relocation type %d"),
    371 				 abfd, (int) r_type);
    372 	  r_type = R_390_NONE;
    373 	}
    374       cache_ptr->howto = &elf_howto_table[r_type];
    375     }
    376 }
    377 
    378 /* A relocation function which doesn't do anything.  */
    379 static bfd_reloc_status_type
    380 s390_tls_reloc (bfd *abfd ATTRIBUTE_UNUSED,
    381 		arelent *reloc_entry,
    382 		asymbol *symbol ATTRIBUTE_UNUSED,
    383 		void * data ATTRIBUTE_UNUSED,
    384 		asection *input_section,
    385 		bfd *output_bfd,
    386 		char **error_message ATTRIBUTE_UNUSED)
    387 {
    388   if (output_bfd)
    389     reloc_entry->address += input_section->output_offset;
    390   return bfd_reloc_ok;
    391 }
    392 
    393 /* Handle the large displacement relocs.  */
    394 static bfd_reloc_status_type
    395 s390_elf_ldisp_reloc (bfd *abfd,
    396 		      arelent *reloc_entry,
    397 		      asymbol *symbol,
    398 		      void * data,
    399 		      asection *input_section,
    400 		      bfd *output_bfd,
    401 		      char **error_message ATTRIBUTE_UNUSED)
    402 {
    403   reloc_howto_type *howto = reloc_entry->howto;
    404   bfd_vma relocation;
    405   bfd_vma insn;
    406 
    407   if (output_bfd != (bfd *) NULL
    408       && (symbol->flags & BSF_SECTION_SYM) == 0
    409       && (! howto->partial_inplace
    410 	  || reloc_entry->addend == 0))
    411     {
    412       reloc_entry->address += input_section->output_offset;
    413       return bfd_reloc_ok;
    414     }
    415   if (output_bfd != NULL)
    416     return bfd_reloc_continue;
    417 
    418   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
    419     return bfd_reloc_outofrange;
    420 
    421   relocation = (symbol->value
    422 		+ symbol->section->output_section->vma
    423 		+ symbol->section->output_offset);
    424   relocation += reloc_entry->addend;
    425   if (howto->pc_relative)
    426     {
    427       relocation -= (input_section->output_section->vma
    428 		     + input_section->output_offset);
    429       relocation -= reloc_entry->address;
    430     }
    431 
    432   insn = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
    433   insn |= (relocation & 0xfff) << 16 | (relocation & 0xff000) >> 4;
    434   bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
    435 
    436   if ((bfd_signed_vma) relocation < - 0x80000
    437       || (bfd_signed_vma) relocation > 0x7ffff)
    438     return bfd_reloc_overflow;
    439   else
    440     return bfd_reloc_ok;
    441 }
    442 
    443 static bfd_boolean
    444 elf_s390_is_local_label_name (bfd *abfd, const char *name)
    445 {
    446   if (name[0] == '.' && (name[1] == 'X' || name[1] == 'L'))
    447     return TRUE;
    448 
    449   return _bfd_elf_is_local_label_name (abfd, name);
    450 }
    451 
    452 /* Functions for the 390 ELF linker.  */
    453 
    454 /* The name of the dynamic interpreter.  This is put in the .interp
    455    section.  */
    456 
    457 #define ELF_DYNAMIC_INTERPRETER "/lib/ld64.so.1"
    458 
    459 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
    460    copying dynamic variables from a shared lib into an app's dynbss
    461    section, and instead use a dynamic relocation to point into the
    462    shared lib.  */
    463 #define ELIMINATE_COPY_RELOCS 1
    464 
    465 /* The size in bytes of the first entry in the procedure linkage table.  */
    466 #define PLT_FIRST_ENTRY_SIZE 32
    467 /* The size in bytes of an entry in the procedure linkage table.  */
    468 #define PLT_ENTRY_SIZE 32
    469 
    470 #define GOT_ENTRY_SIZE 8
    471 
    472 #define RELA_ENTRY_SIZE sizeof (Elf64_External_Rela)
    473 
    474 /* The first three entries in a procedure linkage table are reserved,
    475    and the initial contents are unimportant (we zero them out).
    476    Subsequent entries look like this.  See the SVR4 ABI 386
    477    supplement to see how this works.  */
    478 
    479 /* For the s390, simple addr offset can only be 0 - 4096.
    480    To use the full 16777216 TB address space, several instructions
    481    are needed to load an address in a register and execute
    482    a branch( or just saving the address)
    483 
    484    Furthermore, only r 0 and 1 are free to use!!!  */
    485 
    486 /* The first 3 words in the GOT are then reserved.
    487    Word 0 is the address of the dynamic table.
    488    Word 1 is a pointer to a structure describing the object
    489    Word 2 is used to point to the loader entry address.
    490 
    491    The code for PLT entries looks like this:
    492 
    493    The GOT holds the address in the PLT to be executed.
    494    The loader then gets:
    495    48(15) =  Pointer to the structure describing the object.
    496    56(15) =  Offset in symbol table
    497    The loader  must  then find the module where the function is
    498    and insert the address in the GOT.
    499 
    500    PLT1: LARL 1,<fn>@GOTENT # 6 bytes  Load address of GOT entry in r1
    501          LG   1,0(1)      # 6 bytes  Load address from GOT in r1
    502          BCR  15,1        # 2 bytes  Jump to address
    503    RET1: BASR 1,0         # 2 bytes  Return from GOT 1st time
    504          LGF  1,12(1)     # 6 bytes  Load offset in symbl table in r1
    505          BRCL 15,-x       # 6 bytes  Jump to start of PLT
    506          .long ?          # 4 bytes  offset into .rela.plt
    507 
    508    Total = 32 bytes per PLT entry
    509    Fixup at offset 2: relative address to GOT entry
    510    Fixup at offset 22: relative branch to PLT0
    511    Fixup at offset 28: 32 bit offset into .rela.plt
    512 
    513    A 32 bit offset into the symbol table is enough. It allows for
    514    .rela.plt sections up to a size of 2 gigabyte.  A single dynamic
    515    object (the main program, any shared library) is limited to 4GB in
    516    size.  Having a .rela.plt of 2GB would already make the .plt
    517    section bigger than 8GB.  */
    518 
    519 static const bfd_byte elf_s390x_plt_entry[PLT_ENTRY_SIZE] =
    520   {
    521     0xc0, 0x10, 0x00, 0x00, 0x00, 0x00,     /* larl    %r1,.       */
    522     0xe3, 0x10, 0x10, 0x00, 0x00, 0x04,     /* lg      %r1,0(%r1)  */
    523     0x07, 0xf1,                             /* br      %r1         */
    524     0x0d, 0x10,                             /* basr    %r1,%r0     */
    525     0xe3, 0x10, 0x10, 0x0c, 0x00, 0x14,     /* lgf     %r1,12(%r1) */
    526     0xc0, 0xf4, 0x00, 0x00, 0x00, 0x00,     /* jg      first plt   */
    527     0x00, 0x00, 0x00, 0x00                  /* .long   0x00000000  */
    528   };
    529 
    530 /* The first PLT entry pushes the offset into the symbol table
    531    from R1 onto the stack at 56(15) and the loader object info
    532    at 48(15), loads the loader address in R1 and jumps to it.  */
    533 
    534 /* The first entry in the PLT:
    535 
    536   PLT0:
    537      STG  1,56(15)  # r1 contains the offset into the symbol table
    538      LARL 1,_GLOBAL_OFFSET_TABLE # load address of global offset table
    539      MVC  48(8,15),8(1) # move loader ino (object struct address) to stack
    540      LG   1,16(1)   # get entry address of loader
    541      BCR  15,1      # jump to loader
    542 
    543      Fixup at offset 8: relative address to start of GOT.  */
    544 
    545 static const bfd_byte elf_s390x_first_plt_entry[PLT_FIRST_ENTRY_SIZE] =
    546   {
    547     0xe3, 0x10, 0xf0, 0x38, 0x00, 0x24,     /* stg     %r1,56(%r15)      */
    548     0xc0, 0x10, 0x00, 0x00, 0x00, 0x00,     /* larl    %r1,.             */
    549     0xd2, 0x07, 0xf0, 0x30, 0x10, 0x08,     /* mvc     48(8,%r15),8(%r1) */
    550     0xe3, 0x10, 0x10, 0x10, 0x00, 0x04,     /* lg      %r1,16(%r1)       */
    551     0x07, 0xf1,                             /* br      %r1               */
    552     0x07, 0x00,                             /* nopr    %r0               */
    553     0x07, 0x00,                             /* nopr    %r0               */
    554     0x07, 0x00                              /* nopr    %r0               */
    555   };
    556 
    557 
    558 /* s390 ELF linker hash entry.  */
    559 
    560 struct elf_s390_link_hash_entry
    561 {
    562   struct elf_link_hash_entry elf;
    563 
    564   /* Track dynamic relocs copied for this symbol.  */
    565   struct elf_dyn_relocs *dyn_relocs;
    566 
    567   /* Number of GOTPLT references for a function.  */
    568   bfd_signed_vma gotplt_refcount;
    569 
    570 #define GOT_UNKNOWN	0
    571 #define GOT_NORMAL	1
    572 #define GOT_TLS_GD	2
    573 #define GOT_TLS_IE	3
    574 #define GOT_TLS_IE_NLT	3
    575   unsigned char tls_type;
    576 
    577   /* For pointer equality reasons we might need to change the symbol
    578      type from STT_GNU_IFUNC to STT_FUNC together with its value and
    579      section entry.  So after alloc_dynrelocs only these values should
    580      be used.  In order to check whether a symbol is IFUNC use
    581      s390_is_ifunc_symbol_p.  */
    582   bfd_vma ifunc_resolver_address;
    583   asection *ifunc_resolver_section;
    584 };
    585 
    586 #define elf_s390_hash_entry(ent) \
    587   ((struct elf_s390_link_hash_entry *)(ent))
    588 
    589 /* This structure represents an entry in the local PLT list needed for
    590    local IFUNC symbols.  */
    591 struct plt_entry
    592 {
    593   /* The section of the local symbol.
    594      Set in relocate_section and used in finish_dynamic_sections.  */
    595   asection *sec;
    596 
    597   union
    598     {
    599       bfd_signed_vma refcount;
    600       bfd_vma offset;
    601     } plt;
    602 };
    603 
    604 /* NOTE: Keep this structure in sync with
    605    the one declared in elf32-s390.c.  */
    606 struct elf_s390_obj_tdata
    607 {
    608   struct elf_obj_tdata root;
    609 
    610   /* A local PLT is needed for ifunc symbols.  */
    611   struct plt_entry *local_plt;
    612 
    613   /* TLS type for each local got entry.  */
    614   char *local_got_tls_type;
    615 };
    616 
    617 #define elf_s390_tdata(abfd) \
    618   ((struct elf_s390_obj_tdata *) (abfd)->tdata.any)
    619 
    620 #define elf_s390_local_plt(abfd) \
    621   (elf_s390_tdata (abfd)->local_plt)
    622 
    623 #define elf_s390_local_got_tls_type(abfd) \
    624   (elf_s390_tdata (abfd)->local_got_tls_type)
    625 
    626 #define is_s390_elf(bfd)				\
    627   (bfd_get_flavour (bfd) == bfd_target_elf_flavour	\
    628    && elf_tdata (bfd) != NULL				\
    629    && elf_object_id (bfd) == S390_ELF_DATA)
    630 
    631 static bfd_boolean
    632 elf_s390_mkobject (bfd *abfd)
    633 {
    634   return bfd_elf_allocate_object (abfd, sizeof (struct elf_s390_obj_tdata),
    635 				  S390_ELF_DATA);
    636 }
    637 
    638 static bfd_boolean
    639 elf_s390_object_p (bfd *abfd)
    640 {
    641   /* Set the right machine number for an s390 elf32 file.  */
    642   return bfd_default_set_arch_mach (abfd, bfd_arch_s390, bfd_mach_s390_64);
    643 }
    644 
    645 /* s390 ELF linker hash table.  */
    646 
    647 struct elf_s390_link_hash_table
    648 {
    649   struct elf_link_hash_table elf;
    650 
    651   /* Short-cuts to get to dynamic linker sections.  */
    652   asection *sdynbss;
    653   asection *srelbss;
    654   asection *irelifunc;
    655 
    656   union {
    657     bfd_signed_vma refcount;
    658     bfd_vma offset;
    659   } tls_ldm_got;
    660 
    661   /* Small local sym cache.  */
    662   struct sym_cache sym_cache;
    663 };
    664 
    665 /* Get the s390 ELF linker hash table from a link_info structure.  */
    666 
    667 #define elf_s390_hash_table(p) \
    668   (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
    669   == S390_ELF_DATA ? ((struct elf_s390_link_hash_table *) ((p)->hash)) : NULL)
    670 
    671 #define ELF64 1
    672 #include "elf-s390-common.c"
    673 
    674 /* Create an entry in an s390 ELF linker hash table.  */
    675 
    676 static struct bfd_hash_entry *
    677 link_hash_newfunc (struct bfd_hash_entry *entry,
    678 		   struct bfd_hash_table *table,
    679 		   const char *string)
    680 {
    681   /* Allocate the structure if it has not already been allocated by a
    682      subclass.  */
    683   if (entry == NULL)
    684     {
    685       entry = bfd_hash_allocate (table,
    686 				 sizeof (struct elf_s390_link_hash_entry));
    687       if (entry == NULL)
    688 	return entry;
    689     }
    690 
    691   /* Call the allocation method of the superclass.  */
    692   entry = _bfd_elf_link_hash_newfunc (entry, table, string);
    693   if (entry != NULL)
    694     {
    695       struct elf_s390_link_hash_entry *eh;
    696 
    697       eh = (struct elf_s390_link_hash_entry *) entry;
    698       eh->dyn_relocs = NULL;
    699       eh->gotplt_refcount = 0;
    700       eh->tls_type = GOT_UNKNOWN;
    701       eh->ifunc_resolver_address = 0;
    702       eh->ifunc_resolver_section = NULL;
    703     }
    704 
    705   return entry;
    706 }
    707 
    708 /* Create an s390 ELF linker hash table.  */
    709 
    710 static struct bfd_link_hash_table *
    711 elf_s390_link_hash_table_create (bfd *abfd)
    712 {
    713   struct elf_s390_link_hash_table *ret;
    714   bfd_size_type amt = sizeof (struct elf_s390_link_hash_table);
    715 
    716   ret = (struct elf_s390_link_hash_table *) bfd_zmalloc (amt);
    717   if (ret == NULL)
    718     return NULL;
    719 
    720   if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc,
    721 				      sizeof (struct elf_s390_link_hash_entry),
    722 				      S390_ELF_DATA))
    723     {
    724       free (ret);
    725       return NULL;
    726     }
    727 
    728   return &ret->elf.root;
    729 }
    730 
    731 /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
    732    shortcuts to them in our hash table.  */
    733 
    734 static bfd_boolean
    735 create_got_section (bfd *dynobj,
    736 		    struct bfd_link_info *info)
    737 {
    738   struct elf_s390_link_hash_table *htab;
    739 
    740   if (! _bfd_elf_create_got_section (dynobj, info))
    741     return FALSE;
    742 
    743   htab = elf_s390_hash_table (info);
    744   if (htab == NULL)
    745     return FALSE;
    746 
    747   htab->elf.sgot = bfd_get_linker_section (dynobj, ".got");
    748   htab->elf.sgotplt = bfd_get_linker_section (dynobj, ".got.plt");
    749   htab->elf.srelgot = bfd_get_linker_section (dynobj, ".rela.got");
    750   if (!htab->elf.sgot || !htab->elf.sgotplt || !htab->elf.srelgot)
    751     abort ();
    752   return TRUE;
    753 }
    754 
    755 /* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
    756    .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
    757    hash table.  */
    758 
    759 static bfd_boolean
    760 elf_s390_create_dynamic_sections (bfd *dynobj,
    761 				  struct bfd_link_info *info)
    762 {
    763   struct elf_s390_link_hash_table *htab;
    764 
    765   htab = elf_s390_hash_table (info);
    766   if (htab == NULL)
    767     return FALSE;
    768 
    769   if (!htab->elf.sgot && !create_got_section (dynobj, info))
    770     return FALSE;
    771 
    772   if (!_bfd_elf_create_dynamic_sections (dynobj, info))
    773     return FALSE;
    774 
    775   htab->elf.splt = bfd_get_linker_section (dynobj, ".plt");
    776   htab->elf.srelplt = bfd_get_linker_section (dynobj, ".rela.plt");
    777   htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss");
    778   if (!bfd_link_pic (info))
    779     htab->srelbss = bfd_get_linker_section (dynobj, ".rela.bss");
    780 
    781   if (!htab->elf.splt || !htab->elf.srelplt || !htab->sdynbss
    782       || (!bfd_link_pic (info) && !htab->srelbss))
    783     abort ();
    784 
    785   return TRUE;
    786 }
    787 
    788 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
    789 
    790 static void
    791 elf_s390_copy_indirect_symbol (struct bfd_link_info *info,
    792 			       struct elf_link_hash_entry *dir,
    793 			       struct elf_link_hash_entry *ind)
    794 {
    795   struct elf_s390_link_hash_entry *edir, *eind;
    796 
    797   edir = (struct elf_s390_link_hash_entry *) dir;
    798   eind = (struct elf_s390_link_hash_entry *) ind;
    799 
    800   if (eind->dyn_relocs != NULL)
    801     {
    802       if (edir->dyn_relocs != NULL)
    803 	{
    804 	  struct elf_dyn_relocs **pp;
    805 	  struct elf_dyn_relocs *p;
    806 
    807 	  /* Add reloc counts against the indirect sym to the direct sym
    808 	     list.  Merge any entries against the same section.  */
    809 	  for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
    810 	    {
    811 	      struct elf_dyn_relocs *q;
    812 
    813 	      for (q = edir->dyn_relocs; q != NULL; q = q->next)
    814 		if (q->sec == p->sec)
    815 		  {
    816 		    q->pc_count += p->pc_count;
    817 		    q->count += p->count;
    818 		    *pp = p->next;
    819 		    break;
    820 		  }
    821 	      if (q == NULL)
    822 		pp = &p->next;
    823 	    }
    824 	  *pp = edir->dyn_relocs;
    825 	}
    826 
    827       edir->dyn_relocs = eind->dyn_relocs;
    828       eind->dyn_relocs = NULL;
    829     }
    830 
    831   if (ind->root.type == bfd_link_hash_indirect
    832       && dir->got.refcount <= 0)
    833     {
    834       edir->tls_type = eind->tls_type;
    835       eind->tls_type = GOT_UNKNOWN;
    836     }
    837 
    838   if (ELIMINATE_COPY_RELOCS
    839       && ind->root.type != bfd_link_hash_indirect
    840       && dir->dynamic_adjusted)
    841     {
    842       /* If called to transfer flags for a weakdef during processing
    843 	 of elf_adjust_dynamic_symbol, don't copy non_got_ref.
    844 	 We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
    845       dir->ref_dynamic |= ind->ref_dynamic;
    846       dir->ref_regular |= ind->ref_regular;
    847       dir->ref_regular_nonweak |= ind->ref_regular_nonweak;
    848       dir->needs_plt |= ind->needs_plt;
    849     }
    850   else
    851     _bfd_elf_link_hash_copy_indirect (info, dir, ind);
    852 }
    853 
    854 static int
    855 elf_s390_tls_transition (struct bfd_link_info *info,
    856 			 int r_type,
    857 			 int is_local)
    858 {
    859   if (bfd_link_pic (info))
    860     return r_type;
    861 
    862   switch (r_type)
    863     {
    864     case R_390_TLS_GD64:
    865     case R_390_TLS_IE64:
    866       if (is_local)
    867 	return R_390_TLS_LE64;
    868       return R_390_TLS_IE64;
    869     case R_390_TLS_GOTIE64:
    870       if (is_local)
    871 	return R_390_TLS_LE64;
    872       return R_390_TLS_GOTIE64;
    873     case R_390_TLS_LDM64:
    874       return R_390_TLS_LE64;
    875     }
    876 
    877   return r_type;
    878 }
    879 
    880 /* Look through the relocs for a section during the first phase, and
    881    allocate space in the global offset table or procedure linkage
    882    table.  */
    883 
    884 static bfd_boolean
    885 elf_s390_check_relocs (bfd *abfd,
    886 		       struct bfd_link_info *info,
    887 		       asection *sec,
    888 		       const Elf_Internal_Rela *relocs)
    889 {
    890   struct elf_s390_link_hash_table *htab;
    891   Elf_Internal_Shdr *symtab_hdr;
    892   struct elf_link_hash_entry **sym_hashes;
    893   const Elf_Internal_Rela *rel;
    894   const Elf_Internal_Rela *rel_end;
    895   asection *sreloc;
    896   bfd_signed_vma *local_got_refcounts;
    897   int tls_type, old_tls_type;
    898 
    899   if (bfd_link_relocatable (info))
    900     return TRUE;
    901 
    902   BFD_ASSERT (is_s390_elf (abfd));
    903 
    904   htab = elf_s390_hash_table (info);
    905   if (htab == NULL)
    906     return FALSE;
    907 
    908   symtab_hdr = &elf_symtab_hdr (abfd);
    909   sym_hashes = elf_sym_hashes (abfd);
    910   local_got_refcounts = elf_local_got_refcounts (abfd);
    911 
    912   sreloc = NULL;
    913 
    914   rel_end = relocs + sec->reloc_count;
    915   for (rel = relocs; rel < rel_end; rel++)
    916     {
    917       unsigned int r_type;
    918       unsigned long r_symndx;
    919       struct elf_link_hash_entry *h;
    920       Elf_Internal_Sym *isym;
    921 
    922       r_symndx = ELF64_R_SYM (rel->r_info);
    923 
    924       if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
    925 	{
    926 	  (*_bfd_error_handler) (_("%B: bad symbol index: %d"),
    927 				 abfd,
    928 				 r_symndx);
    929 	  return FALSE;
    930 	}
    931 
    932       if (r_symndx < symtab_hdr->sh_info)
    933 	{
    934 	  /* A local symbol.  */
    935 	  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
    936 					abfd, r_symndx);
    937 	  if (isym == NULL)
    938 	    return FALSE;
    939 
    940 	  if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
    941 	    {
    942 	      struct plt_entry *plt;
    943 
    944 	      if (htab->elf.dynobj == NULL)
    945 		htab->elf.dynobj = abfd;
    946 
    947 	      if (!s390_elf_create_ifunc_sections (htab->elf.dynobj, info))
    948 		return FALSE;
    949 
    950 	      if (local_got_refcounts == NULL)
    951 		{
    952 		  if (!elf_s390_allocate_local_syminfo (abfd, symtab_hdr))
    953 		    return FALSE;
    954 		  local_got_refcounts = elf_local_got_refcounts (abfd);
    955 		}
    956 	      plt = elf_s390_local_plt (abfd);
    957 	      plt[r_symndx].plt.refcount++;
    958 	    }
    959 	  h = NULL;
    960 	}
    961       else
    962 	{
    963 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
    964 	  while (h->root.type == bfd_link_hash_indirect
    965 		 || h->root.type == bfd_link_hash_warning)
    966 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
    967 
    968 	  /* PR15323, ref flags aren't set for references in the same
    969 	     object.  */
    970 	  h->root.non_ir_ref = 1;
    971 	}
    972 
    973       /* Create got section and local_got_refcounts array if they
    974 	 are needed.  */
    975       r_type = elf_s390_tls_transition (info,
    976 					ELF64_R_TYPE (rel->r_info),
    977 					h == NULL);
    978       switch (r_type)
    979 	{
    980 	case R_390_GOT12:
    981 	case R_390_GOT16:
    982 	case R_390_GOT20:
    983 	case R_390_GOT32:
    984 	case R_390_GOT64:
    985 	case R_390_GOTENT:
    986 	case R_390_GOTPLT12:
    987 	case R_390_GOTPLT16:
    988 	case R_390_GOTPLT20:
    989 	case R_390_GOTPLT32:
    990 	case R_390_GOTPLT64:
    991 	case R_390_GOTPLTENT:
    992 	case R_390_TLS_GD64:
    993 	case R_390_TLS_GOTIE12:
    994 	case R_390_TLS_GOTIE20:
    995 	case R_390_TLS_GOTIE64:
    996 	case R_390_TLS_IEENT:
    997 	case R_390_TLS_IE64:
    998 	case R_390_TLS_LDM64:
    999 	  if (h == NULL
   1000 	      && local_got_refcounts == NULL)
   1001 	    {
   1002 	      if (!elf_s390_allocate_local_syminfo (abfd, symtab_hdr))
   1003 		return FALSE;
   1004 	      local_got_refcounts = elf_local_got_refcounts (abfd);
   1005 	    }
   1006 
   1007 	  /* Fall through.  */
   1008 	case R_390_GOTOFF16:
   1009 	case R_390_GOTOFF32:
   1010 	case R_390_GOTOFF64:
   1011 	case R_390_GOTPC:
   1012 	case R_390_GOTPCDBL:
   1013 	  if (htab->elf.sgot == NULL)
   1014 	    {
   1015 	      if (htab->elf.dynobj == NULL)
   1016 		htab->elf.dynobj = abfd;
   1017 	      if (!create_got_section (htab->elf.dynobj, info))
   1018 		return FALSE;
   1019 	    }
   1020 	}
   1021 
   1022       if (h != NULL)
   1023 	{
   1024 	  if (htab->elf.dynobj == NULL)
   1025 	    htab->elf.dynobj = abfd;
   1026 	  if (!s390_elf_create_ifunc_sections (htab->elf.dynobj, info))
   1027 	    return FALSE;
   1028 
   1029 	  /* Make sure an IFUNC symbol defined in a non-shared object
   1030 	     always gets a PLT slot.  */
   1031 	  if (s390_is_ifunc_symbol_p (h) && h->def_regular)
   1032 	    {
   1033 	      /* The symbol is called by the dynamic loader in order
   1034 		 to resolve the relocation.  So it is in fact also
   1035 		 referenced.  */
   1036 	      h->ref_regular = 1;
   1037 	      h->needs_plt = 1;
   1038 	    }
   1039 	}
   1040 
   1041       switch (r_type)
   1042 	{
   1043 	case R_390_GOTPC:
   1044 	case R_390_GOTPCDBL:
   1045 	  /* These relocs do not need a GOT slot.  They just load the
   1046 	     GOT pointer itself or address something else relative to
   1047 	     the GOT.  Since the GOT pointer has been set up above we
   1048 	     are done.  */
   1049 	  break;
   1050 	case R_390_GOTOFF16:
   1051 	case R_390_GOTOFF32:
   1052 	case R_390_GOTOFF64:
   1053 	  if (h == NULL || !s390_is_ifunc_symbol_p (h) || !h->def_regular)
   1054 	    break;
   1055 
   1056 	case R_390_PLT12DBL:
   1057 	case R_390_PLT16DBL:
   1058 	case R_390_PLT24DBL:
   1059 	case R_390_PLT32:
   1060 	case R_390_PLT32DBL:
   1061 	case R_390_PLT64:
   1062 	case R_390_PLTOFF16:
   1063 	case R_390_PLTOFF32:
   1064 	case R_390_PLTOFF64:
   1065 	  /* This symbol requires a procedure linkage table entry.  We
   1066 	     actually build the entry in adjust_dynamic_symbol,
   1067 	     because this might be a case of linking PIC code which is
   1068 	     never referenced by a dynamic object, in which case we
   1069 	     don't need to generate a procedure linkage table entry
   1070 	     after all.  */
   1071 
   1072 	  /* If this is a local symbol, we resolve it directly without
   1073 	     creating a procedure linkage table entry.  */
   1074 	  if (h != NULL)
   1075 	    {
   1076 	      h->needs_plt = 1;
   1077 	      h->plt.refcount += 1;
   1078 	    }
   1079 	  break;
   1080 
   1081 	case R_390_GOTPLT12:
   1082 	case R_390_GOTPLT16:
   1083 	case R_390_GOTPLT20:
   1084 	case R_390_GOTPLT32:
   1085 	case R_390_GOTPLT64:
   1086 	case R_390_GOTPLTENT:
   1087 	  /* This symbol requires either a procedure linkage table entry
   1088 	     or an entry in the local got. We actually build the entry
   1089 	     in adjust_dynamic_symbol because whether this is really a
   1090 	     global reference can change and with it the fact if we have
   1091 	     to create a plt entry or a local got entry. To be able to
   1092 	     make a once global symbol a local one we have to keep track
   1093 	     of the number of gotplt references that exist for this
   1094 	     symbol.  */
   1095 	  if (h != NULL)
   1096 	    {
   1097 	      ((struct elf_s390_link_hash_entry *) h)->gotplt_refcount++;
   1098 	      h->needs_plt = 1;
   1099 	      h->plt.refcount += 1;
   1100 	    }
   1101 	  else
   1102 	    local_got_refcounts[r_symndx] += 1;
   1103 	  break;
   1104 
   1105 	case R_390_TLS_LDM64:
   1106 	  htab->tls_ldm_got.refcount += 1;
   1107 	  break;
   1108 
   1109 	case R_390_TLS_IE64:
   1110 	case R_390_TLS_GOTIE12:
   1111 	case R_390_TLS_GOTIE20:
   1112 	case R_390_TLS_GOTIE64:
   1113 	case R_390_TLS_IEENT:
   1114 	  if (bfd_link_pic (info))
   1115 	    info->flags |= DF_STATIC_TLS;
   1116 	  /* Fall through */
   1117 
   1118 	case R_390_GOT12:
   1119 	case R_390_GOT16:
   1120 	case R_390_GOT20:
   1121 	case R_390_GOT32:
   1122 	case R_390_GOT64:
   1123 	case R_390_GOTENT:
   1124 	case R_390_TLS_GD64:
   1125 	  /* This symbol requires a global offset table entry.  */
   1126 	  switch (r_type)
   1127 	    {
   1128 	    default:
   1129 	    case R_390_GOT12:
   1130 	    case R_390_GOT16:
   1131 	    case R_390_GOT20:
   1132 	    case R_390_GOT32:
   1133 	    case R_390_GOTENT:
   1134 	      tls_type = GOT_NORMAL;
   1135 	      break;
   1136 	    case R_390_TLS_GD64:
   1137 	      tls_type = GOT_TLS_GD;
   1138 	      break;
   1139 	    case R_390_TLS_IE64:
   1140 	    case R_390_TLS_GOTIE64:
   1141 	      tls_type = GOT_TLS_IE;
   1142 	      break;
   1143 	    case R_390_TLS_GOTIE12:
   1144 	    case R_390_TLS_GOTIE20:
   1145 	    case R_390_TLS_IEENT:
   1146 	      tls_type = GOT_TLS_IE_NLT;
   1147 	      break;
   1148 	    }
   1149 
   1150 	  if (h != NULL)
   1151 	    {
   1152 	      h->got.refcount += 1;
   1153 	      old_tls_type = elf_s390_hash_entry(h)->tls_type;
   1154 	    }
   1155 	  else
   1156 	    {
   1157 	      local_got_refcounts[r_symndx] += 1;
   1158 	      old_tls_type = elf_s390_local_got_tls_type (abfd) [r_symndx];
   1159 	    }
   1160 	  /* If a TLS symbol is accessed using IE at least once,
   1161 	     there is no point to use dynamic model for it.  */
   1162 	  if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN)
   1163 	    {
   1164 	      if (old_tls_type == GOT_NORMAL || tls_type == GOT_NORMAL)
   1165 		{
   1166 		  (*_bfd_error_handler)
   1167 		    (_("%B: `%s' accessed both as normal and thread local symbol"),
   1168 		     abfd, h->root.root.string);
   1169 		  return FALSE;
   1170 		}
   1171 	      if (old_tls_type > tls_type)
   1172 		tls_type = old_tls_type;
   1173 	    }
   1174 
   1175 	  if (old_tls_type != tls_type)
   1176 	    {
   1177 	      if (h != NULL)
   1178 		elf_s390_hash_entry (h)->tls_type = tls_type;
   1179 	      else
   1180 		elf_s390_local_got_tls_type (abfd) [r_symndx] = tls_type;
   1181 	    }
   1182 
   1183 	  if (r_type != R_390_TLS_IE64)
   1184 	    break;
   1185 	  /* Fall through */
   1186 
   1187 	case R_390_TLS_LE64:
   1188 	  /* For static linking and executables this reloc will be
   1189 	     calculated at linktime otherwise a TLS_TPOFF runtime
   1190 	     reloc will be generated.  */
   1191 	  if (r_type == R_390_TLS_LE64 && bfd_link_pie (info))
   1192 	    break;
   1193 
   1194 	  if (!bfd_link_pic (info))
   1195 	    break;
   1196 	  info->flags |= DF_STATIC_TLS;
   1197 	  /* Fall through */
   1198 
   1199 	case R_390_8:
   1200 	case R_390_16:
   1201 	case R_390_32:
   1202 	case R_390_64:
   1203 	case R_390_PC12DBL:
   1204 	case R_390_PC16:
   1205 	case R_390_PC16DBL:
   1206 	case R_390_PC24DBL:
   1207 	case R_390_PC32:
   1208 	case R_390_PC32DBL:
   1209 	case R_390_PC64:
   1210 	  if (h != NULL && bfd_link_executable (info))
   1211 	    {
   1212 	      /* If this reloc is in a read-only section, we might
   1213 		 need a copy reloc.  We can't check reliably at this
   1214 		 stage whether the section is read-only, as input
   1215 		 sections have not yet been mapped to output sections.
   1216 		 Tentatively set the flag for now, and correct in
   1217 		 adjust_dynamic_symbol.  */
   1218 	      h->non_got_ref = 1;
   1219 
   1220 	      if (!bfd_link_pic (info))
   1221 		{
   1222 		  /* We may need a .plt entry if the function this reloc
   1223 		     refers to is in a shared lib.  */
   1224 		  h->plt.refcount += 1;
   1225 		}
   1226 	    }
   1227 
   1228 	  /* If we are creating a shared library, and this is a reloc
   1229 	     against a global symbol, or a non PC relative reloc
   1230 	     against a local symbol, then we need to copy the reloc
   1231 	     into the shared library.  However, if we are linking with
   1232 	     -Bsymbolic, we do not need to copy a reloc against a
   1233 	     global symbol which is defined in an object we are
   1234 	     including in the link (i.e., DEF_REGULAR is set).  At
   1235 	     this point we have not seen all the input files, so it is
   1236 	     possible that DEF_REGULAR is not set now but will be set
   1237 	     later (it is never cleared).  In case of a weak definition,
   1238 	     DEF_REGULAR may be cleared later by a strong definition in
   1239 	     a shared library. We account for that possibility below by
   1240 	     storing information in the relocs_copied field of the hash
   1241 	     table entry.  A similar situation occurs when creating
   1242 	     shared libraries and symbol visibility changes render the
   1243 	     symbol local.
   1244 
   1245 	     If on the other hand, we are creating an executable, we
   1246 	     may need to keep relocations for symbols satisfied by a
   1247 	     dynamic library if we manage to avoid copy relocs for the
   1248 	     symbol.  */
   1249 	  if ((bfd_link_pic (info)
   1250 	       && (sec->flags & SEC_ALLOC) != 0
   1251 	       && ((ELF64_R_TYPE (rel->r_info) != R_390_PC16
   1252 		    && ELF64_R_TYPE (rel->r_info) != R_390_PC12DBL
   1253 		    && ELF64_R_TYPE (rel->r_info) != R_390_PC16DBL
   1254 		    && ELF64_R_TYPE (rel->r_info) != R_390_PC24DBL
   1255 		    && ELF64_R_TYPE (rel->r_info) != R_390_PC32
   1256 		    && ELF64_R_TYPE (rel->r_info) != R_390_PC32DBL
   1257 		    && ELF64_R_TYPE (rel->r_info) != R_390_PC64)
   1258 		   || (h != NULL
   1259 		       && (! SYMBOLIC_BIND (info, h)
   1260 			   || h->root.type == bfd_link_hash_defweak
   1261 			   || !h->def_regular))))
   1262 	      || (ELIMINATE_COPY_RELOCS
   1263 		  && !bfd_link_pic (info)
   1264 		  && (sec->flags & SEC_ALLOC) != 0
   1265 		  && h != NULL
   1266 		  && (h->root.type == bfd_link_hash_defweak
   1267 		      || !h->def_regular)))
   1268 	    {
   1269 	      struct elf_dyn_relocs *p;
   1270 	      struct elf_dyn_relocs **head;
   1271 
   1272 	      /* We must copy these reloc types into the output file.
   1273 		 Create a reloc section in dynobj and make room for
   1274 		 this reloc.  */
   1275 	      if (sreloc == NULL)
   1276 		{
   1277 		  if (htab->elf.dynobj == NULL)
   1278 		    htab->elf.dynobj = abfd;
   1279 
   1280 		  sreloc = _bfd_elf_make_dynamic_reloc_section
   1281 		    (sec, htab->elf.dynobj, 3, abfd, /*rela?*/ TRUE);
   1282 
   1283 		  if (sreloc == NULL)
   1284 		    return FALSE;
   1285 		}
   1286 
   1287 	      /* If this is a global symbol, we count the number of
   1288 		 relocations we need for this symbol.  */
   1289 	      if (h != NULL)
   1290 		{
   1291 		  head = &((struct elf_s390_link_hash_entry *) h)->dyn_relocs;
   1292 		}
   1293 	      else
   1294 		{
   1295 		  /* Track dynamic relocs needed for local syms too.
   1296 		     We really need local syms available to do this
   1297 		     easily.  Oh well.  */
   1298 		  asection *s;
   1299 		  void *vpp;
   1300 
   1301 		  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
   1302 						abfd, r_symndx);
   1303 		  if (isym == NULL)
   1304 		    return FALSE;
   1305 
   1306 		  s = bfd_section_from_elf_index (abfd, isym->st_shndx);
   1307 		  if (s == NULL)
   1308 		    s = sec;
   1309 
   1310 		  vpp = &elf_section_data (s)->local_dynrel;
   1311 		  head = (struct elf_dyn_relocs **) vpp;
   1312 		}
   1313 
   1314 	      p = *head;
   1315 	      if (p == NULL || p->sec != sec)
   1316 		{
   1317 		  bfd_size_type amt = sizeof *p;
   1318 		  p = ((struct elf_dyn_relocs *)
   1319 		       bfd_alloc (htab->elf.dynobj, amt));
   1320 		  if (p == NULL)
   1321 		    return FALSE;
   1322 		  p->next = *head;
   1323 		  *head = p;
   1324 		  p->sec = sec;
   1325 		  p->count = 0;
   1326 		  p->pc_count = 0;
   1327 		}
   1328 
   1329 	      p->count += 1;
   1330 	      if (ELF64_R_TYPE (rel->r_info) == R_390_PC16
   1331 		  || ELF64_R_TYPE (rel->r_info) == R_390_PC12DBL
   1332 		  || ELF64_R_TYPE (rel->r_info) == R_390_PC16DBL
   1333 		  || ELF64_R_TYPE (rel->r_info) == R_390_PC16DBL
   1334 		  || ELF64_R_TYPE (rel->r_info) == R_390_PC32
   1335 		  || ELF64_R_TYPE (rel->r_info) == R_390_PC32DBL
   1336 		  || ELF64_R_TYPE (rel->r_info) == R_390_PC64)
   1337 		p->pc_count += 1;
   1338 	    }
   1339 	  break;
   1340 
   1341 	  /* This relocation describes the C++ object vtable hierarchy.
   1342 	     Reconstruct it for later use during GC.  */
   1343 	case R_390_GNU_VTINHERIT:
   1344 	  if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
   1345 	    return FALSE;
   1346 	  break;
   1347 
   1348 	  /* This relocation describes which C++ vtable entries are actually
   1349 	     used.  Record for later use during GC.  */
   1350 	case R_390_GNU_VTENTRY:
   1351 	  BFD_ASSERT (h != NULL);
   1352 	  if (h != NULL
   1353 	      && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
   1354 	    return FALSE;
   1355 	  break;
   1356 
   1357 	default:
   1358 	  break;
   1359 	}
   1360     }
   1361 
   1362   return TRUE;
   1363 }
   1364 
   1365 /* Return the section that should be marked against GC for a given
   1366    relocation.  */
   1367 
   1368 static asection *
   1369 elf_s390_gc_mark_hook (asection *sec,
   1370 		       struct bfd_link_info *info,
   1371 		       Elf_Internal_Rela *rel,
   1372 		       struct elf_link_hash_entry *h,
   1373 		       Elf_Internal_Sym *sym)
   1374 {
   1375   if (h != NULL)
   1376     switch (ELF64_R_TYPE (rel->r_info))
   1377       {
   1378       case R_390_GNU_VTINHERIT:
   1379       case R_390_GNU_VTENTRY:
   1380 	return NULL;
   1381       }
   1382 
   1383   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
   1384 }
   1385 
   1386 /* Update the got entry reference counts for the section being removed.  */
   1387 
   1388 static bfd_boolean
   1389 elf_s390_gc_sweep_hook (bfd *abfd,
   1390 			struct bfd_link_info *info,
   1391 			asection *sec,
   1392 			const Elf_Internal_Rela *relocs)
   1393 {
   1394   struct elf_s390_link_hash_table *htab;
   1395   Elf_Internal_Shdr *symtab_hdr;
   1396   struct elf_link_hash_entry **sym_hashes;
   1397   bfd_signed_vma *local_got_refcounts;
   1398   const Elf_Internal_Rela *rel, *relend;
   1399 
   1400   if (bfd_link_relocatable (info))
   1401     return TRUE;
   1402 
   1403   htab = elf_s390_hash_table (info);
   1404   if (htab == NULL)
   1405     return FALSE;
   1406 
   1407   elf_section_data (sec)->local_dynrel = NULL;
   1408 
   1409   symtab_hdr = &elf_symtab_hdr (abfd);
   1410   sym_hashes = elf_sym_hashes (abfd);
   1411   local_got_refcounts = elf_local_got_refcounts (abfd);
   1412 
   1413   relend = relocs + sec->reloc_count;
   1414   for (rel = relocs; rel < relend; rel++)
   1415     {
   1416       unsigned long r_symndx;
   1417       unsigned int r_type;
   1418       struct elf_link_hash_entry *h = NULL;
   1419 
   1420       r_symndx = ELF64_R_SYM (rel->r_info);
   1421       if (r_symndx >= symtab_hdr->sh_info)
   1422 	{
   1423 	  struct elf_s390_link_hash_entry *eh;
   1424 	  struct elf_dyn_relocs **pp;
   1425 	  struct elf_dyn_relocs *p;
   1426 
   1427 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
   1428 	  while (h->root.type == bfd_link_hash_indirect
   1429 		 || h->root.type == bfd_link_hash_warning)
   1430 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
   1431 	  eh = (struct elf_s390_link_hash_entry *) h;
   1432 
   1433 	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
   1434 	    if (p->sec == sec)
   1435 	      {
   1436 		/* Everything must go for SEC.  */
   1437 		*pp = p->next;
   1438 		break;
   1439 	      }
   1440 	}
   1441       else
   1442 	{
   1443 	  Elf_Internal_Sym *isym;
   1444 
   1445 	  /* A local symbol.  */
   1446 	  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
   1447 					abfd, r_symndx);
   1448 	  if (isym == NULL)
   1449 	    return FALSE;
   1450 
   1451 	  if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
   1452 	    {
   1453 	      struct plt_entry *plt = elf_s390_local_plt (abfd);
   1454 	      if (plt[r_symndx].plt.refcount > 0)
   1455 		plt[r_symndx].plt.refcount--;
   1456 	    }
   1457 	}
   1458 
   1459       r_type = ELF64_R_TYPE (rel->r_info);
   1460       r_type = elf_s390_tls_transition (info, r_type, h != NULL);
   1461       switch (r_type)
   1462 	{
   1463 	case R_390_TLS_LDM64:
   1464 	  if (htab->tls_ldm_got.refcount > 0)
   1465 	    htab->tls_ldm_got.refcount -= 1;
   1466 	  break;
   1467 	case R_390_GOTOFF16:
   1468 	case R_390_GOTOFF32:
   1469 	case R_390_GOTOFF64:
   1470 	  if (h != NULL && s390_is_ifunc_symbol_p (h) && h->def_regular)
   1471 	    {
   1472 	      h->plt.refcount--;
   1473 	      break;
   1474 	    }
   1475 
   1476 	case R_390_GOTPC:
   1477 	case R_390_GOTPCDBL:
   1478 	  break;
   1479 
   1480 	case R_390_TLS_GD64:
   1481 	case R_390_TLS_IE64:
   1482 	case R_390_TLS_GOTIE12:
   1483 	case R_390_TLS_GOTIE20:
   1484 	case R_390_TLS_GOTIE64:
   1485 	case R_390_TLS_IEENT:
   1486 	case R_390_GOT12:
   1487 	case R_390_GOT16:
   1488 	case R_390_GOT20:
   1489 	case R_390_GOT32:
   1490 	case R_390_GOT64:
   1491 	case R_390_GOTENT:
   1492 	  if (h != NULL)
   1493 	    {
   1494 	      if (h->got.refcount > 0)
   1495 		h->got.refcount -= 1;
   1496 	    }
   1497 	  else if (local_got_refcounts != NULL)
   1498 	    {
   1499 	      if (local_got_refcounts[r_symndx] > 0)
   1500 		local_got_refcounts[r_symndx] -= 1;
   1501 	    }
   1502 	  break;
   1503 
   1504 	case R_390_8:
   1505 	case R_390_12:
   1506 	case R_390_16:
   1507 	case R_390_20:
   1508 	case R_390_32:
   1509 	case R_390_64:
   1510 	case R_390_PC16:
   1511 	case R_390_PC12DBL:
   1512 	case R_390_PC16DBL:
   1513 	case R_390_PC24DBL:
   1514 	case R_390_PC32:
   1515 	case R_390_PC32DBL:
   1516 	case R_390_PC64:
   1517 	  if (bfd_link_pic (info))
   1518 	    break;
   1519 	  /* Fall through */
   1520 
   1521 	case R_390_PLT12DBL:
   1522 	case R_390_PLT16DBL:
   1523 	case R_390_PLT24DBL:
   1524 	case R_390_PLT32:
   1525 	case R_390_PLT32DBL:
   1526 	case R_390_PLT64:
   1527 	case R_390_PLTOFF16:
   1528 	case R_390_PLTOFF32:
   1529 	case R_390_PLTOFF64:
   1530 	  if (h != NULL)
   1531 	    {
   1532 	      if (h->plt.refcount > 0)
   1533 		h->plt.refcount -= 1;
   1534 	    }
   1535 	  break;
   1536 
   1537 	case R_390_GOTPLT12:
   1538 	case R_390_GOTPLT16:
   1539 	case R_390_GOTPLT20:
   1540 	case R_390_GOTPLT32:
   1541 	case R_390_GOTPLT64:
   1542 	case R_390_GOTPLTENT:
   1543 	  if (h != NULL)
   1544 	    {
   1545 	      if (h->plt.refcount > 0)
   1546 		{
   1547 		  ((struct elf_s390_link_hash_entry *) h)->gotplt_refcount--;
   1548 		  h->plt.refcount -= 1;
   1549 		}
   1550 	    }
   1551 	  else if (local_got_refcounts != NULL)
   1552 	    {
   1553 	      if (local_got_refcounts[r_symndx] > 0)
   1554 		local_got_refcounts[r_symndx] -= 1;
   1555 	    }
   1556 	  break;
   1557 
   1558 	default:
   1559 	  break;
   1560 	}
   1561     }
   1562 
   1563   return TRUE;
   1564 }
   1565 
   1566 /* Make sure we emit a GOT entry if the symbol was supposed to have a PLT
   1567    entry but we found we will not create any.  Called when we find we will
   1568    not have any PLT for this symbol, by for example
   1569    elf_s390_adjust_dynamic_symbol when we're doing a proper dynamic link,
   1570    or elf_s390_size_dynamic_sections if no dynamic sections will be
   1571    created (we're only linking static objects).  */
   1572 
   1573 static void
   1574 elf_s390_adjust_gotplt (struct elf_s390_link_hash_entry *h)
   1575 {
   1576   if (h->elf.root.type == bfd_link_hash_warning)
   1577     h = (struct elf_s390_link_hash_entry *) h->elf.root.u.i.link;
   1578 
   1579   if (h->gotplt_refcount <= 0)
   1580     return;
   1581 
   1582   /* We simply add the number of gotplt references to the number
   1583    * of got references for this symbol.  */
   1584   h->elf.got.refcount += h->gotplt_refcount;
   1585   h->gotplt_refcount = -1;
   1586 }
   1587 
   1588 /* Adjust a symbol defined by a dynamic object and referenced by a
   1589    regular object.  The current definition is in some section of the
   1590    dynamic object, but we're not including those sections.  We have to
   1591    change the definition to something the rest of the link can
   1592    understand.  */
   1593 
   1594 static bfd_boolean
   1595 elf_s390_adjust_dynamic_symbol (struct bfd_link_info *info,
   1596 				struct elf_link_hash_entry *h)
   1597 {
   1598   struct elf_s390_link_hash_table *htab;
   1599   asection *s;
   1600 
   1601   /* STT_GNU_IFUNC symbol must go through PLT. */
   1602   if (s390_is_ifunc_symbol_p (h))
   1603     {
   1604       /* All local STT_GNU_IFUNC references must be treated as local
   1605 	 calls via local PLT.  */
   1606       if (h->ref_regular && SYMBOL_CALLS_LOCAL (info, h))
   1607 	{
   1608 	  bfd_size_type pc_count = 0, count = 0;
   1609 	  struct elf_dyn_relocs **pp;
   1610 	  struct elf_s390_link_hash_entry *eh;
   1611 	  struct elf_dyn_relocs *p;
   1612 
   1613 	  eh = (struct elf_s390_link_hash_entry *) h;
   1614 	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
   1615 	    {
   1616 	      pc_count += p->pc_count;
   1617 	      p->count -= p->pc_count;
   1618 	      p->pc_count = 0;
   1619 	      count += p->count;
   1620 	      if (p->count == 0)
   1621 		*pp = p->next;
   1622 	      else
   1623 		pp = &p->next;
   1624 	    }
   1625 
   1626 	  if (pc_count || count)
   1627 	    {
   1628 	      h->needs_plt = 1;
   1629 	      h->non_got_ref = 1;
   1630 	      if (h->plt.refcount <= 0)
   1631 		h->plt.refcount = 1;
   1632 	      else
   1633 		h->plt.refcount += 1;
   1634 	    }
   1635 	}
   1636 
   1637       if (h->plt.refcount <= 0)
   1638 	{
   1639 	  h->plt.offset = (bfd_vma) -1;
   1640 	  h->needs_plt = 0;
   1641 	}
   1642       return TRUE;
   1643     }
   1644 
   1645   /* If this is a function, put it in the procedure linkage table.  We
   1646      will fill in the contents of the procedure linkage table later
   1647      (although we could actually do it here).  */
   1648   if (h->type == STT_FUNC
   1649       || h->needs_plt)
   1650     {
   1651       if (h->plt.refcount <= 0
   1652 	  || SYMBOL_CALLS_LOCAL (info, h)
   1653 	  || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
   1654 	      && h->root.type == bfd_link_hash_undefweak))
   1655 	{
   1656 	  /* This case can occur if we saw a PLT32 reloc in an input
   1657 	     file, but the symbol was never referred to by a dynamic
   1658 	     object, or if all references were garbage collected.  In
   1659 	     such a case, we don't actually need to build a procedure
   1660 	     linkage table, and we can just do a PC32 reloc instead.  */
   1661 	  h->plt.offset = (bfd_vma) -1;
   1662 	  h->needs_plt = 0;
   1663 	  elf_s390_adjust_gotplt((struct elf_s390_link_hash_entry *) h);
   1664 	}
   1665 
   1666       return TRUE;
   1667     }
   1668   else
   1669     /* It's possible that we incorrectly decided a .plt reloc was
   1670        needed for an R_390_PC32 reloc to a non-function sym in
   1671        check_relocs.  We can't decide accurately between function and
   1672        non-function syms in check-relocs;  Objects loaded later in
   1673        the link may change h->type.  So fix it now.  */
   1674     h->plt.offset = (bfd_vma) -1;
   1675 
   1676   /* If this is a weak symbol, and there is a real definition, the
   1677      processor independent code will have arranged for us to see the
   1678      real definition first, and we can just use the same value.  */
   1679   if (h->u.weakdef != NULL)
   1680     {
   1681       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
   1682 		  || h->u.weakdef->root.type == bfd_link_hash_defweak);
   1683       h->root.u.def.section = h->u.weakdef->root.u.def.section;
   1684       h->root.u.def.value = h->u.weakdef->root.u.def.value;
   1685       if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
   1686 	h->non_got_ref = h->u.weakdef->non_got_ref;
   1687       return TRUE;
   1688     }
   1689 
   1690   /* This is a reference to a symbol defined by a dynamic object which
   1691      is not a function.  */
   1692 
   1693   /* If we are creating a shared library, we must presume that the
   1694      only references to the symbol are via the global offset table.
   1695      For such cases we need not do anything here; the relocations will
   1696      be handled correctly by relocate_section.  */
   1697   if (bfd_link_pic (info))
   1698     return TRUE;
   1699 
   1700   /* If there are no references to this symbol that do not use the
   1701      GOT, we don't need to generate a copy reloc.  */
   1702   if (!h->non_got_ref)
   1703     return TRUE;
   1704 
   1705   /* If -z nocopyreloc was given, we won't generate them either.  */
   1706   if (info->nocopyreloc)
   1707     {
   1708       h->non_got_ref = 0;
   1709       return TRUE;
   1710     }
   1711 
   1712   if (ELIMINATE_COPY_RELOCS)
   1713     {
   1714       struct elf_s390_link_hash_entry * eh;
   1715       struct elf_dyn_relocs *p;
   1716 
   1717       eh = (struct elf_s390_link_hash_entry *) h;
   1718       for (p = eh->dyn_relocs; p != NULL; p = p->next)
   1719 	{
   1720 	  s = p->sec->output_section;
   1721 	  if (s != NULL && (s->flags & SEC_READONLY) != 0)
   1722 	    break;
   1723 	}
   1724 
   1725       /* If we didn't find any dynamic relocs in read-only sections, then
   1726 	 we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
   1727       if (p == NULL)
   1728 	{
   1729 	  h->non_got_ref = 0;
   1730 	  return TRUE;
   1731 	}
   1732     }
   1733 
   1734   /* We must allocate the symbol in our .dynbss section, which will
   1735      become part of the .bss section of the executable.  There will be
   1736      an entry for this symbol in the .dynsym section.  The dynamic
   1737      object will contain position independent code, so all references
   1738      from the dynamic object to this symbol will go through the global
   1739      offset table.  The dynamic linker will use the .dynsym entry to
   1740      determine the address it must put in the global offset table, so
   1741      both the dynamic object and the regular object will refer to the
   1742      same memory location for the variable.  */
   1743 
   1744   htab = elf_s390_hash_table (info);
   1745   if (htab == NULL)
   1746     return FALSE;
   1747 
   1748   /* We must generate a R_390_COPY reloc to tell the dynamic linker to
   1749      copy the initial value out of the dynamic object and into the
   1750      runtime process image.  */
   1751   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
   1752     {
   1753       htab->srelbss->size += sizeof (Elf64_External_Rela);
   1754       h->needs_copy = 1;
   1755     }
   1756 
   1757   s = htab->sdynbss;
   1758 
   1759   return _bfd_elf_adjust_dynamic_copy (info, h, s);
   1760 }
   1761 
   1762 /* Allocate space in .plt, .got and associated reloc sections for
   1763    dynamic relocs.  */
   1764 
   1765 static bfd_boolean
   1766 allocate_dynrelocs (struct elf_link_hash_entry *h,
   1767 		    void * inf)
   1768 {
   1769   struct bfd_link_info *info;
   1770   struct elf_s390_link_hash_table *htab;
   1771   struct elf_s390_link_hash_entry *eh = (struct elf_s390_link_hash_entry *)h;
   1772   struct elf_dyn_relocs *p;
   1773 
   1774   if (h->root.type == bfd_link_hash_indirect)
   1775     return TRUE;
   1776 
   1777   info = (struct bfd_link_info *) inf;
   1778   htab = elf_s390_hash_table (info);
   1779   if (htab == NULL)
   1780     return FALSE;
   1781 
   1782   /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it
   1783      here if it is defined and referenced in a non-shared object.  */
   1784   if (s390_is_ifunc_symbol_p (h) && h->def_regular)
   1785     return s390_elf_allocate_ifunc_dyn_relocs (info, h);
   1786   else if (htab->elf.dynamic_sections_created
   1787 	   && h->plt.refcount > 0)
   1788     {
   1789       /* Make sure this symbol is output as a dynamic symbol.
   1790 	 Undefined weak syms won't yet be marked as dynamic.  */
   1791       if (h->dynindx == -1
   1792 	  && !h->forced_local)
   1793 	{
   1794 	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
   1795 	    return FALSE;
   1796 	}
   1797 
   1798       if (bfd_link_pic (info)
   1799 	  || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
   1800 	{
   1801 	  asection *s = htab->elf.splt;
   1802 
   1803 	  /* If this is the first .plt entry, make room for the special
   1804 	     first entry.  */
   1805 	  if (s->size == 0)
   1806 	    s->size += PLT_FIRST_ENTRY_SIZE;
   1807 
   1808 	  h->plt.offset = s->size;
   1809 
   1810 	  /* If this symbol is not defined in a regular file, and we are
   1811 	     not generating a shared library, then set the symbol to this
   1812 	     location in the .plt.  This is required to make function
   1813 	     pointers compare as equal between the normal executable and
   1814 	     the shared library.  */
   1815 	  if (! bfd_link_pic (info)
   1816 	      && !h->def_regular)
   1817 	    {
   1818 	      h->root.u.def.section = s;
   1819 	      h->root.u.def.value = h->plt.offset;
   1820 	    }
   1821 
   1822 	  /* Make room for this entry.  */
   1823 	  s->size += PLT_ENTRY_SIZE;
   1824 
   1825 	  /* We also need to make an entry in the .got.plt section, which
   1826 	     will be placed in the .got section by the linker script.  */
   1827 	  htab->elf.sgotplt->size += GOT_ENTRY_SIZE;
   1828 
   1829 	  /* We also need to make an entry in the .rela.plt section.  */
   1830 	  htab->elf.srelplt->size += sizeof (Elf64_External_Rela);
   1831 	}
   1832       else
   1833 	{
   1834 	  h->plt.offset = (bfd_vma) -1;
   1835 	  h->needs_plt = 0;
   1836 	  elf_s390_adjust_gotplt((struct elf_s390_link_hash_entry *) h);
   1837 	}
   1838     }
   1839   else
   1840     {
   1841       h->plt.offset = (bfd_vma) -1;
   1842       h->needs_plt = 0;
   1843       elf_s390_adjust_gotplt((struct elf_s390_link_hash_entry *) h);
   1844     }
   1845 
   1846   /* If R_390_TLS_{IE64,GOTIE64,GOTIE12,IEENT} symbol is now local to
   1847      the binary, we can optimize a bit. IE64 and GOTIE64 get converted
   1848      to R_390_TLS_LE64 requiring no TLS entry. For GOTIE12 and IEENT
   1849      we can save the dynamic TLS relocation.  */
   1850   if (h->got.refcount > 0
   1851       && !bfd_link_pic (info)
   1852       && h->dynindx == -1
   1853       && elf_s390_hash_entry(h)->tls_type >= GOT_TLS_IE)
   1854     {
   1855       if (elf_s390_hash_entry(h)->tls_type == GOT_TLS_IE_NLT)
   1856 	/* For the GOTIE access without a literal pool entry the offset has
   1857 	   to be stored somewhere. The immediate value in the instruction
   1858 	   is not bit enough so the value is stored in the got.  */
   1859 	{
   1860 	  h->got.offset = htab->elf.sgot->size;
   1861 	  htab->elf.sgot->size += GOT_ENTRY_SIZE;
   1862 	}
   1863       else
   1864 	h->got.offset = (bfd_vma) -1;
   1865     }
   1866   else if (h->got.refcount > 0)
   1867     {
   1868       asection *s;
   1869       bfd_boolean dyn;
   1870       int tls_type = elf_s390_hash_entry(h)->tls_type;
   1871 
   1872       /* Make sure this symbol is output as a dynamic symbol.
   1873 	 Undefined weak syms won't yet be marked as dynamic.  */
   1874       if (h->dynindx == -1
   1875 	  && !h->forced_local)
   1876 	{
   1877 	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
   1878 	    return FALSE;
   1879 	}
   1880 
   1881       s = htab->elf.sgot;
   1882       h->got.offset = s->size;
   1883       s->size += GOT_ENTRY_SIZE;
   1884       /* R_390_TLS_GD64 needs 2 consecutive GOT slots.  */
   1885       if (tls_type == GOT_TLS_GD)
   1886 	s->size += GOT_ENTRY_SIZE;
   1887       dyn = htab->elf.dynamic_sections_created;
   1888       /* R_390_TLS_IE64 needs one dynamic relocation,
   1889 	 R_390_TLS_GD64 needs one if local symbol and two if global.  */
   1890       if ((tls_type == GOT_TLS_GD && h->dynindx == -1)
   1891 	  || tls_type >= GOT_TLS_IE)
   1892 	htab->elf.srelgot->size += sizeof (Elf64_External_Rela);
   1893       else if (tls_type == GOT_TLS_GD)
   1894 	htab->elf.srelgot->size += 2 * sizeof (Elf64_External_Rela);
   1895       else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
   1896 		|| h->root.type != bfd_link_hash_undefweak)
   1897 	       && (bfd_link_pic (info)
   1898 		   || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
   1899 	htab->elf.srelgot->size += sizeof (Elf64_External_Rela);
   1900     }
   1901   else
   1902     h->got.offset = (bfd_vma) -1;
   1903 
   1904   if (eh->dyn_relocs == NULL)
   1905     return TRUE;
   1906 
   1907   /* In the shared -Bsymbolic case, discard space allocated for
   1908      dynamic pc-relative relocs against symbols which turn out to be
   1909      defined in regular objects.  For the normal shared case, discard
   1910      space for pc-relative relocs that have become local due to symbol
   1911      visibility changes.  */
   1912 
   1913   if (bfd_link_pic (info))
   1914     {
   1915       if (SYMBOL_CALLS_LOCAL (info, h))
   1916 	{
   1917 	  struct elf_dyn_relocs **pp;
   1918 
   1919 	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
   1920 	    {
   1921 	      p->count -= p->pc_count;
   1922 	      p->pc_count = 0;
   1923 	      if (p->count == 0)
   1924 		*pp = p->next;
   1925 	      else
   1926 		pp = &p->next;
   1927 	    }
   1928 	}
   1929 
   1930       /* Also discard relocs on undefined weak syms with non-default
   1931 	 visibility.  */
   1932       if (eh->dyn_relocs != NULL
   1933 	  && h->root.type == bfd_link_hash_undefweak)
   1934 	{
   1935 	  if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
   1936 	    eh->dyn_relocs = NULL;
   1937 
   1938 	  /* Make sure undefined weak symbols are output as a dynamic
   1939 	     symbol in PIEs.  */
   1940 	  else if (h->dynindx == -1
   1941 		   && !h->forced_local)
   1942 	    {
   1943 	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
   1944 		return FALSE;
   1945 	    }
   1946 	}
   1947     }
   1948   else if (ELIMINATE_COPY_RELOCS)
   1949     {
   1950       /* For the non-shared case, discard space for relocs against
   1951 	 symbols which turn out to need copy relocs or are not
   1952 	 dynamic.  */
   1953 
   1954       if (!h->non_got_ref
   1955 	  && ((h->def_dynamic
   1956 	       && !h->def_regular)
   1957 	      || (htab->elf.dynamic_sections_created
   1958 		  && (h->root.type == bfd_link_hash_undefweak
   1959 		      || h->root.type == bfd_link_hash_undefined))))
   1960 	{
   1961 	  /* Make sure this symbol is output as a dynamic symbol.
   1962 	     Undefined weak syms won't yet be marked as dynamic.  */
   1963 	  if (h->dynindx == -1
   1964 	      && !h->forced_local)
   1965 	    {
   1966 	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
   1967 		return FALSE;
   1968 	    }
   1969 
   1970 	  /* If that succeeded, we know we'll be keeping all the
   1971 	     relocs.  */
   1972 	  if (h->dynindx != -1)
   1973 	    goto keep;
   1974 	}
   1975 
   1976       eh->dyn_relocs = NULL;
   1977 
   1978     keep: ;
   1979     }
   1980 
   1981   /* Finally, allocate space.  */
   1982   for (p = eh->dyn_relocs; p != NULL; p = p->next)
   1983     {
   1984       asection *sreloc = elf_section_data (p->sec)->sreloc;
   1985       sreloc->size += p->count * sizeof (Elf64_External_Rela);
   1986     }
   1987 
   1988   return TRUE;
   1989 }
   1990 
   1991 /* Find any dynamic relocs that apply to read-only sections.  */
   1992 
   1993 static bfd_boolean
   1994 readonly_dynrelocs (struct elf_link_hash_entry *h, void * inf)
   1995 {
   1996   struct elf_s390_link_hash_entry *eh;
   1997   struct elf_dyn_relocs *p;
   1998 
   1999   eh = (struct elf_s390_link_hash_entry *) h;
   2000   for (p = eh->dyn_relocs; p != NULL; p = p->next)
   2001     {
   2002       asection *s = p->sec->output_section;
   2003 
   2004       if (s != NULL && (s->flags & SEC_READONLY) != 0)
   2005 	{
   2006 	  struct bfd_link_info *info = (struct bfd_link_info *) inf;
   2007 
   2008 	  info->flags |= DF_TEXTREL;
   2009 
   2010 	  /* Not an error, just cut short the traversal.  */
   2011 	  return FALSE;
   2012 	}
   2013     }
   2014   return TRUE;
   2015 }
   2016 
   2017 /* Set the sizes of the dynamic sections.  */
   2018 
   2019 static bfd_boolean
   2020 elf_s390_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
   2021 				struct bfd_link_info *info)
   2022 {
   2023   struct elf_s390_link_hash_table *htab;
   2024   bfd *dynobj;
   2025   asection *s;
   2026   bfd_boolean relocs;
   2027   bfd *ibfd;
   2028 
   2029   htab = elf_s390_hash_table (info);
   2030   if (htab == NULL)
   2031     return FALSE;
   2032 
   2033   dynobj = htab->elf.dynobj;
   2034   if (dynobj == NULL)
   2035     abort ();
   2036 
   2037   if (htab->elf.dynamic_sections_created)
   2038     {
   2039       /* Set the contents of the .interp section to the interpreter.  */
   2040       if (bfd_link_executable (info) && !info->nointerp)
   2041 	{
   2042 	  s = bfd_get_linker_section (dynobj, ".interp");
   2043 	  if (s == NULL)
   2044 	    abort ();
   2045 	  s->size = sizeof ELF_DYNAMIC_INTERPRETER;
   2046 	  s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
   2047 	}
   2048     }
   2049 
   2050   /* Set up .got offsets for local syms, and space for local dynamic
   2051      relocs.  */
   2052   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
   2053     {
   2054       bfd_signed_vma *local_got;
   2055       bfd_signed_vma *end_local_got;
   2056       char *local_tls_type;
   2057       bfd_size_type locsymcount;
   2058       Elf_Internal_Shdr *symtab_hdr;
   2059       asection *srela;
   2060       struct plt_entry *local_plt;
   2061       unsigned int i;
   2062 
   2063       if (! is_s390_elf (ibfd))
   2064 	continue;
   2065 
   2066       for (s = ibfd->sections; s != NULL; s = s->next)
   2067 	{
   2068 	  struct elf_dyn_relocs *p;
   2069 
   2070 	  for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
   2071 	    {
   2072 	      if (!bfd_is_abs_section (p->sec)
   2073 		  && bfd_is_abs_section (p->sec->output_section))
   2074 		{
   2075 		  /* Input section has been discarded, either because
   2076 		     it is a copy of a linkonce section or due to
   2077 		     linker script /DISCARD/, so we'll be discarding
   2078 		     the relocs too.  */
   2079 		}
   2080 	      else if (p->count != 0)
   2081 		{
   2082 		  srela = elf_section_data (p->sec)->sreloc;
   2083 		  srela->size += p->count * sizeof (Elf64_External_Rela);
   2084 		  if ((p->sec->output_section->flags & SEC_READONLY) != 0)
   2085 		    info->flags |= DF_TEXTREL;
   2086 		}
   2087 	    }
   2088 	}
   2089 
   2090       local_got = elf_local_got_refcounts (ibfd);
   2091       if (!local_got)
   2092 	continue;
   2093 
   2094       symtab_hdr = &elf_symtab_hdr (ibfd);
   2095       locsymcount = symtab_hdr->sh_info;
   2096       end_local_got = local_got + locsymcount;
   2097       local_tls_type = elf_s390_local_got_tls_type (ibfd);
   2098       s = htab->elf.sgot;
   2099       srela = htab->elf.srelgot;
   2100       for (; local_got < end_local_got; ++local_got, ++local_tls_type)
   2101 	{
   2102 	  if (*local_got > 0)
   2103 	    {
   2104 	      *local_got = s->size;
   2105 	      s->size += GOT_ENTRY_SIZE;
   2106 	      if (*local_tls_type == GOT_TLS_GD)
   2107 		s->size += GOT_ENTRY_SIZE;
   2108 	      if (bfd_link_pic (info))
   2109 		srela->size += sizeof (Elf64_External_Rela);
   2110 	    }
   2111 	  else
   2112 	    *local_got = (bfd_vma) -1;
   2113 	}
   2114 
   2115       local_plt = elf_s390_local_plt (ibfd);
   2116       for (i = 0; i < symtab_hdr->sh_info; i++)
   2117 	{
   2118 	  if (local_plt[i].plt.refcount > 0)
   2119 	    {
   2120 	      local_plt[i].plt.offset = htab->elf.iplt->size;
   2121 	      htab->elf.iplt->size += PLT_ENTRY_SIZE;
   2122 	      htab->elf.igotplt->size += GOT_ENTRY_SIZE;
   2123 	      htab->elf.irelplt->size += sizeof (Elf64_External_Rela);
   2124 	    }
   2125 	  else
   2126 	    local_plt[i].plt.offset = (bfd_vma) -1;
   2127 	}
   2128     }
   2129 
   2130   if (htab->tls_ldm_got.refcount > 0)
   2131     {
   2132       /* Allocate 2 got entries and 1 dynamic reloc for R_390_TLS_LDM64
   2133 	 relocs.  */
   2134       htab->tls_ldm_got.offset = htab->elf.sgot->size;
   2135       htab->elf.sgot->size += 2 * GOT_ENTRY_SIZE;
   2136       htab->elf.srelgot->size += sizeof (Elf64_External_Rela);
   2137     }
   2138   else
   2139     htab->tls_ldm_got.offset = -1;
   2140 
   2141   /* Allocate global sym .plt and .got entries, and space for global
   2142      sym dynamic relocs.  */
   2143   elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
   2144 
   2145   /* We now have determined the sizes of the various dynamic sections.
   2146      Allocate memory for them.  */
   2147   relocs = FALSE;
   2148   for (s = dynobj->sections; s != NULL; s = s->next)
   2149     {
   2150       if ((s->flags & SEC_LINKER_CREATED) == 0)
   2151 	continue;
   2152 
   2153       if (s == htab->elf.splt
   2154 	  || s == htab->elf.sgot
   2155 	  || s == htab->elf.sgotplt
   2156 	  || s == htab->sdynbss
   2157 	  || s == htab->elf.iplt
   2158 	  || s == htab->elf.igotplt
   2159 	  || s == htab->irelifunc)
   2160 	{
   2161 	  /* Strip this section if we don't need it; see the
   2162 	     comment below.  */
   2163 	}
   2164       else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
   2165 	{
   2166 	  if (s->size != 0 && s != htab->elf.srelplt)
   2167 	    relocs = TRUE;
   2168 
   2169 	  /* We use the reloc_count field as a counter if we need
   2170 	     to copy relocs into the output file.  */
   2171 	  s->reloc_count = 0;
   2172 	}
   2173       else
   2174 	{
   2175 	  /* It's not one of our sections, so don't allocate space.  */
   2176 	  continue;
   2177 	}
   2178 
   2179       if (s->size == 0)
   2180 	{
   2181 	  /* If we don't need this section, strip it from the
   2182 	     output file.  This is to handle .rela.bss and
   2183 	     .rela.plt.  We must create it in
   2184 	     create_dynamic_sections, because it must be created
   2185 	     before the linker maps input sections to output
   2186 	     sections.  The linker does that before
   2187 	     adjust_dynamic_symbol is called, and it is that
   2188 	     function which decides whether anything needs to go
   2189 	     into these sections.  */
   2190 
   2191 	  s->flags |= SEC_EXCLUDE;
   2192 	  continue;
   2193 	}
   2194 
   2195       if ((s->flags & SEC_HAS_CONTENTS) == 0)
   2196 	continue;
   2197 
   2198       /* Allocate memory for the section contents.  We use bfd_zalloc
   2199 	 here in case unused entries are not reclaimed before the
   2200 	 section's contents are written out.  This should not happen,
   2201 	 but this way if it does, we get a R_390_NONE reloc instead
   2202 	 of garbage.  */
   2203       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
   2204       if (s->contents == NULL)
   2205 	return FALSE;
   2206     }
   2207 
   2208   if (htab->elf.dynamic_sections_created)
   2209     {
   2210       /* Add some entries to the .dynamic section.  We fill in the
   2211 	 values later, in elf_s390_finish_dynamic_sections, but we
   2212 	 must add the entries now so that we get the correct size for
   2213 	 the .dynamic section.  The DT_DEBUG entry is filled in by the
   2214 	 dynamic linker and used by the debugger.  */
   2215 #define add_dynamic_entry(TAG, VAL) \
   2216   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
   2217 
   2218       if (bfd_link_executable (info))
   2219 	{
   2220 	  if (!add_dynamic_entry (DT_DEBUG, 0))
   2221 	    return FALSE;
   2222 	}
   2223 
   2224       if (htab->elf.splt->size != 0)
   2225 	{
   2226 	  if (!add_dynamic_entry (DT_PLTGOT, 0)
   2227 	      || !add_dynamic_entry (DT_PLTRELSZ, 0)
   2228 	      || !add_dynamic_entry (DT_PLTREL, DT_RELA)
   2229 	      || !add_dynamic_entry (DT_JMPREL, 0))
   2230 	    return FALSE;
   2231 	}
   2232 
   2233       if (relocs)
   2234 	{
   2235 	  if (!add_dynamic_entry (DT_RELA, 0)
   2236 	      || !add_dynamic_entry (DT_RELASZ, 0)
   2237 	      || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
   2238 	    return FALSE;
   2239 
   2240 	  /* If any dynamic relocs apply to a read-only section,
   2241 	     then we need a DT_TEXTREL entry.  */
   2242 	  if ((info->flags & DF_TEXTREL) == 0)
   2243 	    elf_link_hash_traverse (&htab->elf, readonly_dynrelocs,
   2244 				    info);
   2245 
   2246 	  if ((info->flags & DF_TEXTREL) != 0)
   2247 	    {
   2248 	      if (!add_dynamic_entry (DT_TEXTREL, 0))
   2249 		return FALSE;
   2250 	    }
   2251 	}
   2252     }
   2253 #undef add_dynamic_entry
   2254 
   2255   return TRUE;
   2256 }
   2257 
   2258 /* Return the base VMA address which should be subtracted from real addresses
   2259    when resolving @dtpoff relocation.
   2260    This is PT_TLS segment p_vaddr.  */
   2261 
   2262 static bfd_vma
   2263 dtpoff_base (struct bfd_link_info *info)
   2264 {
   2265   /* If tls_sec is NULL, we should have signalled an error already.  */
   2266   if (elf_hash_table (info)->tls_sec == NULL)
   2267     return 0;
   2268   return elf_hash_table (info)->tls_sec->vma;
   2269 }
   2270 
   2271 /* Return the relocation value for @tpoff relocation
   2272    if STT_TLS virtual address is ADDRESS.  */
   2273 
   2274 static bfd_vma
   2275 tpoff (struct bfd_link_info *info, bfd_vma address)
   2276 {
   2277   struct elf_link_hash_table *htab = elf_hash_table (info);
   2278 
   2279   /* If tls_sec is NULL, we should have signalled an error already.  */
   2280   if (htab->tls_sec == NULL)
   2281     return 0;
   2282   return htab->tls_size + htab->tls_sec->vma - address;
   2283 }
   2284 
   2285 /* Complain if TLS instruction relocation is against an invalid
   2286    instruction.  */
   2287 
   2288 static void
   2289 invalid_tls_insn (bfd *input_bfd,
   2290 		  asection *input_section,
   2291 		  Elf_Internal_Rela *rel)
   2292 {
   2293   reloc_howto_type *howto;
   2294 
   2295   howto = elf_howto_table + ELF64_R_TYPE (rel->r_info);
   2296   (*_bfd_error_handler)
   2297     (_("%B(%A+0x%lx): invalid instruction for TLS relocation %s"),
   2298      input_bfd,
   2299      input_section,
   2300      (long) rel->r_offset,
   2301      howto->name);
   2302   bfd_set_error (bfd_error_bad_value);
   2303 }
   2304 
   2305 /* Relocate a 390 ELF section.  */
   2306 
   2307 static bfd_boolean
   2308 elf_s390_relocate_section (bfd *output_bfd,
   2309 			   struct bfd_link_info *info,
   2310 			   bfd *input_bfd,
   2311 			   asection *input_section,
   2312 			   bfd_byte *contents,
   2313 			   Elf_Internal_Rela *relocs,
   2314 			   Elf_Internal_Sym *local_syms,
   2315 			   asection **local_sections)
   2316 {
   2317   struct elf_s390_link_hash_table *htab;
   2318   Elf_Internal_Shdr *symtab_hdr;
   2319   struct elf_link_hash_entry **sym_hashes;
   2320   bfd_vma *local_got_offsets;
   2321   Elf_Internal_Rela *rel;
   2322   Elf_Internal_Rela *relend;
   2323 
   2324   BFD_ASSERT (is_s390_elf (input_bfd));
   2325 
   2326   htab = elf_s390_hash_table (info);
   2327   if (htab == NULL)
   2328     return FALSE;
   2329 
   2330   symtab_hdr = &elf_symtab_hdr (input_bfd);
   2331   sym_hashes = elf_sym_hashes (input_bfd);
   2332   local_got_offsets = elf_local_got_offsets (input_bfd);
   2333 
   2334   rel = relocs;
   2335   relend = relocs + input_section->reloc_count;
   2336   for (; rel < relend; rel++)
   2337     {
   2338       unsigned int r_type;
   2339       reloc_howto_type *howto;
   2340       unsigned long r_symndx;
   2341       struct elf_link_hash_entry *h;
   2342       Elf_Internal_Sym *sym;
   2343       asection *sec;
   2344       bfd_vma off;
   2345       bfd_vma relocation;
   2346       bfd_boolean unresolved_reloc;
   2347       bfd_reloc_status_type r;
   2348       int tls_type;
   2349       asection *base_got = htab->elf.sgot;
   2350 
   2351       r_type = ELF64_R_TYPE (rel->r_info);
   2352       if (r_type == (int) R_390_GNU_VTINHERIT
   2353 	  || r_type == (int) R_390_GNU_VTENTRY)
   2354 	continue;
   2355       if (r_type >= (int) R_390_max)
   2356 	{
   2357 	  bfd_set_error (bfd_error_bad_value);
   2358 	  return FALSE;
   2359 	}
   2360 
   2361       howto = elf_howto_table + r_type;
   2362       r_symndx = ELF64_R_SYM (rel->r_info);
   2363 
   2364       h = NULL;
   2365       sym = NULL;
   2366       sec = NULL;
   2367       unresolved_reloc = FALSE;
   2368       if (r_symndx < symtab_hdr->sh_info)
   2369 	{
   2370 	  sym = local_syms + r_symndx;
   2371 	  sec = local_sections[r_symndx];
   2372 
   2373 	  if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
   2374 	    {
   2375 	      struct plt_entry *local_plt = elf_s390_local_plt (input_bfd);
   2376 	      if (local_plt == NULL)
   2377 		return FALSE;
   2378 
   2379 	      /* Address of the PLT slot.  */
   2380 	      relocation = (htab->elf.iplt->output_section->vma
   2381 			    + htab->elf.iplt->output_offset
   2382 			    + local_plt[r_symndx].plt.offset);
   2383 
   2384 	      switch (r_type)
   2385 		{
   2386 		case R_390_PLTOFF16:
   2387 		case R_390_PLTOFF32:
   2388 		case R_390_PLTOFF64:
   2389 		  relocation -= htab->elf.sgot->output_section->vma;
   2390 		  break;
   2391 		case R_390_GOTPLT12:
   2392 		case R_390_GOTPLT16:
   2393 		case R_390_GOTPLT20:
   2394 		case R_390_GOTPLT32:
   2395 		case R_390_GOTPLT64:
   2396 		case R_390_GOTPLTENT:
   2397 		case R_390_GOT12:
   2398 		case R_390_GOT16:
   2399 		case R_390_GOT20:
   2400 		case R_390_GOT32:
   2401 		case R_390_GOT64:
   2402 		case R_390_GOTENT:
   2403 		  {
   2404 		    /* Write the PLT slot address into the GOT slot.  */
   2405 		    bfd_put_64 (output_bfd, relocation,
   2406 				htab->elf.sgot->contents +
   2407 				local_got_offsets[r_symndx]);
   2408 		    relocation = (local_got_offsets[r_symndx] +
   2409 				  htab->elf.sgot->output_offset);
   2410 
   2411 		    if (r_type == R_390_GOTENT || r_type == R_390_GOTPLTENT)
   2412 		      relocation += htab->elf.sgot->output_section->vma;
   2413 		    break;
   2414 		  }
   2415 		default:
   2416 		  break;
   2417 		}
   2418 	      /* The output section is needed later in
   2419 		 finish_dynamic_section when creating the dynamic
   2420 		 relocation.  */
   2421 	      local_plt[r_symndx].sec = sec;
   2422 	      goto do_relocation;
   2423 	    }
   2424 	  else
   2425 	    relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
   2426 	}
   2427       else
   2428 	{
   2429 	  bfd_boolean warned ATTRIBUTE_UNUSED;
   2430 	  bfd_boolean ignored ATTRIBUTE_UNUSED;
   2431 
   2432 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
   2433 				   r_symndx, symtab_hdr, sym_hashes,
   2434 				   h, sec, relocation,
   2435 				   unresolved_reloc, warned, ignored);
   2436 	}
   2437 
   2438       if (sec != NULL && discarded_section (sec))
   2439 	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
   2440 					 rel, 1, relend, howto, 0, contents);
   2441 
   2442       if (bfd_link_relocatable (info))
   2443 	continue;
   2444 
   2445       switch (r_type)
   2446 	{
   2447 	case R_390_GOTPLT12:
   2448 	case R_390_GOTPLT16:
   2449 	case R_390_GOTPLT20:
   2450 	case R_390_GOTPLT32:
   2451 	case R_390_GOTPLT64:
   2452 	case R_390_GOTPLTENT:
   2453 	  /* There are three cases for a GOTPLT relocation. 1) The
   2454 	     relocation is against the jump slot entry of a plt that
   2455 	     will get emitted to the output file. 2) The relocation
   2456 	     is against the jump slot of a plt entry that has been
   2457 	     removed. elf_s390_adjust_gotplt has created a GOT entry
   2458 	     as replacement. 3) The relocation is against a local symbol.
   2459 	     Cases 2) and 3) are the same as the GOT relocation code
   2460 	     so we just have to test for case 1 and fall through for
   2461 	     the other two.  */
   2462 	  if (h != NULL && h->plt.offset != (bfd_vma) -1)
   2463 	    {
   2464 	      bfd_vma plt_index;
   2465 
   2466 	      if (s390_is_ifunc_symbol_p (h))
   2467 		{
   2468 		  plt_index = h->plt.offset / PLT_ENTRY_SIZE;
   2469 		  relocation = (plt_index * GOT_ENTRY_SIZE +
   2470 				htab->elf.igotplt->output_offset);
   2471 		  if (r_type == R_390_GOTPLTENT)
   2472 		    relocation += htab->elf.igotplt->output_section->vma;
   2473 		}
   2474 	      else
   2475 		{
   2476 		  /* Calc. index no.
   2477 		     Current offset - size first entry / entry size.  */
   2478 		  plt_index = (h->plt.offset - PLT_FIRST_ENTRY_SIZE) /
   2479 		    PLT_ENTRY_SIZE;
   2480 
   2481 		  /* Offset in GOT is PLT index plus GOT headers(3)
   2482 		     times 8, addr & GOT addr.  */
   2483 		  relocation = (plt_index + 3) * GOT_ENTRY_SIZE;
   2484 		  if (r_type == R_390_GOTPLTENT)
   2485 		    relocation += htab->elf.sgot->output_section->vma;
   2486 		}
   2487 	      unresolved_reloc = FALSE;
   2488 	      break;
   2489 	    }
   2490 	  /* Fall through.  */
   2491 
   2492 	case R_390_GOT12:
   2493 	case R_390_GOT16:
   2494 	case R_390_GOT20:
   2495 	case R_390_GOT32:
   2496 	case R_390_GOT64:
   2497 	case R_390_GOTENT:
   2498 	  /* Relocation is to the entry for this symbol in the global
   2499 	     offset table.  */
   2500 	  if (base_got == NULL)
   2501 	    abort ();
   2502 
   2503 	  if (h != NULL)
   2504 	    {
   2505 	      bfd_boolean dyn;
   2506 
   2507 	      off = h->got.offset;
   2508 	      dyn = htab->elf.dynamic_sections_created;
   2509 
   2510 	      if (s390_is_ifunc_symbol_p (h))
   2511 		{
   2512 		  BFD_ASSERT (h->plt.offset != (bfd_vma) -1);
   2513 		  if (off == (bfd_vma)-1)
   2514 		    {
   2515 		      /* No explicit GOT usage so redirect to the
   2516 			 got.iplt slot.  */
   2517 		      base_got = htab->elf.igotplt;
   2518 		      off = h->plt.offset / PLT_ENTRY_SIZE * GOT_ENTRY_SIZE;
   2519 		    }
   2520 		  else
   2521 		    {
   2522 		      /* Explicit GOT slots must contain the address
   2523 			 of the PLT slot. This will be handled in
   2524 			 finish_dynamic_symbol.  */
   2525 		    }
   2526 		}
   2527 	      else if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
   2528 							  bfd_link_pic (info),
   2529 							  h)
   2530 		       || (bfd_link_pic (info)
   2531 			   && SYMBOL_REFERENCES_LOCAL (info, h))
   2532 		       || (ELF_ST_VISIBILITY (h->other)
   2533 			   && h->root.type == bfd_link_hash_undefweak))
   2534 		{
   2535 		  /* This is actually a static link, or it is a
   2536 		     -Bsymbolic link and the symbol is defined
   2537 		     locally, or the symbol was forced to be local
   2538 		     because of a version file.  We must initialize
   2539 		     this entry in the global offset table.  Since the
   2540 		     offset must always be a multiple of 2, we use the
   2541 		     least significant bit to record whether we have
   2542 		     initialized it already.
   2543 
   2544 		     When doing a dynamic link, we create a .rel.got
   2545 		     relocation entry to initialize the value.  This
   2546 		     is done in the finish_dynamic_symbol routine.  */
   2547 		  if ((off & 1) != 0)
   2548 		    off &= ~1;
   2549 		  else
   2550 		    {
   2551 		      bfd_put_64 (output_bfd, relocation,
   2552 				  base_got->contents + off);
   2553 		      h->got.offset |= 1;
   2554 		    }
   2555 
   2556 		  if ((h->def_regular
   2557 		       && bfd_link_pic (info)
   2558 		       && SYMBOL_REFERENCES_LOCAL (info, h))
   2559 		      /* lgrl rx,sym@GOTENT -> larl rx, sym */
   2560 		      && ((r_type == R_390_GOTENT
   2561 			   && (bfd_get_16 (input_bfd,
   2562 					   contents + rel->r_offset - 2)
   2563 			       & 0xff0f) == 0xc408)
   2564 			  /* lg rx, sym@GOT(r12) -> larl rx, sym */
   2565 			  || (r_type == R_390_GOT20
   2566 			      && (bfd_get_32 (input_bfd,
   2567 					      contents + rel->r_offset - 2)
   2568 				  & 0xff00f000) == 0xe300c000
   2569 			      && bfd_get_8 (input_bfd,
   2570 					    contents + rel->r_offset + 3) == 0x04)))
   2571 
   2572 		    {
   2573 		      unsigned short new_insn =
   2574 			(0xc000 | (bfd_get_8 (input_bfd,
   2575 					      contents + rel->r_offset - 1) & 0xf0));
   2576 		      bfd_put_16 (output_bfd, new_insn,
   2577 				  contents + rel->r_offset - 2);
   2578 		      r_type = R_390_PC32DBL;
   2579 		      rel->r_addend = 2;
   2580 		      howto = elf_howto_table + r_type;
   2581 		      relocation = h->root.u.def.value
   2582 			+ h->root.u.def.section->output_section->vma
   2583 			+ h->root.u.def.section->output_offset;
   2584 		      goto do_relocation;
   2585 		    }
   2586 		}
   2587 	      else
   2588 		unresolved_reloc = FALSE;
   2589 	    }
   2590 	  else
   2591 	    {
   2592 	      if (local_got_offsets == NULL)
   2593 		abort ();
   2594 
   2595 	      off = local_got_offsets[r_symndx];
   2596 
   2597 	      /* The offset must always be a multiple of 8.  We use
   2598 		 the least significant bit to record whether we have
   2599 		 already generated the necessary reloc.  */
   2600 	      if ((off & 1) != 0)
   2601 		off &= ~1;
   2602 	      else
   2603 		{
   2604 		  bfd_put_64 (output_bfd, relocation,
   2605 			      htab->elf.sgot->contents + off);
   2606 
   2607 		  if (bfd_link_pic (info))
   2608 		    {
   2609 		      asection *s;
   2610 		      Elf_Internal_Rela outrel;
   2611 		      bfd_byte *loc;
   2612 
   2613 		      s = htab->elf.srelgot;
   2614 		      if (s == NULL)
   2615 			abort ();
   2616 
   2617 		      outrel.r_offset = (htab->elf.sgot->output_section->vma
   2618 					 + htab->elf.sgot->output_offset
   2619 					 + off);
   2620 		      outrel.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
   2621 		      outrel.r_addend = relocation;
   2622 		      loc = s->contents;
   2623 		      loc += s->reloc_count++ * sizeof (Elf64_External_Rela);
   2624 		      bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
   2625 		    }
   2626 
   2627 		  local_got_offsets[r_symndx] |= 1;
   2628 		}
   2629 	    }
   2630 
   2631 	  if (off >= (bfd_vma) -2)
   2632 	    abort ();
   2633 
   2634 	  relocation = base_got->output_offset + off;
   2635 
   2636 	  /* For @GOTENT the relocation is against the offset between
   2637 	     the instruction and the symbols entry in the GOT and not
   2638 	     between the start of the GOT and the symbols entry. We
   2639 	     add the vma of the GOT to get the correct value.  */
   2640 	  if (   r_type == R_390_GOTENT
   2641 	      || r_type == R_390_GOTPLTENT)
   2642 	    relocation += base_got->output_section->vma;
   2643 
   2644 	  break;
   2645 
   2646 	case R_390_GOTOFF16:
   2647 	case R_390_GOTOFF32:
   2648 	case R_390_GOTOFF64:
   2649 	  /* Relocation is relative to the start of the global offset
   2650 	     table.  */
   2651 
   2652 	  if (h != NULL
   2653 	      && s390_is_ifunc_symbol_p (h)
   2654 	      && h->def_regular
   2655 	      && !bfd_link_executable (info))
   2656 	    {
   2657 	      relocation = (htab->elf.iplt->output_section->vma
   2658 			    + htab->elf.iplt->output_offset
   2659 			    + h->plt.offset
   2660 			    - htab->elf.sgot->output_section->vma);
   2661 	      goto do_relocation;
   2662 	    }
   2663 
   2664 	  /* Note that sgot->output_offset is not involved in this
   2665 	     calculation.  We always want the start of .got.  If we
   2666 	     defined _GLOBAL_OFFSET_TABLE in a different way, as is
   2667 	     permitted by the ABI, we might have to change this
   2668 	     calculation.  */
   2669 	  relocation -= htab->elf.sgot->output_section->vma;
   2670 	  break;
   2671 
   2672 	case R_390_GOTPC:
   2673 	case R_390_GOTPCDBL:
   2674 	  /* Use global offset table as symbol value.  */
   2675 	  relocation = htab->elf.sgot->output_section->vma;
   2676 	  unresolved_reloc = FALSE;
   2677 	  break;
   2678 
   2679 	case R_390_PLT12DBL:
   2680 	case R_390_PLT16DBL:
   2681 	case R_390_PLT24DBL:
   2682 	case R_390_PLT32:
   2683 	case R_390_PLT32DBL:
   2684 	case R_390_PLT64:
   2685 	  /* Relocation is to the entry for this symbol in the
   2686 	     procedure linkage table.  */
   2687 
   2688 	  /* Resolve a PLT32 reloc against a local symbol directly,
   2689 	     without using the procedure linkage table.  */
   2690 	  if (h == NULL)
   2691 	    break;
   2692 
   2693 	  if (h->plt.offset == (bfd_vma) -1
   2694 	      || (htab->elf.splt == NULL && !s390_is_ifunc_symbol_p (h)))
   2695 	    {
   2696 	      /* We didn't make a PLT entry for this symbol.  This
   2697 		 happens when statically linking PIC code, or when
   2698 		 using -Bsymbolic.  */
   2699 	      break;
   2700 	    }
   2701 	  if (s390_is_ifunc_symbol_p (h))
   2702 	    relocation = (htab->elf.iplt->output_section->vma
   2703 			  + htab->elf.iplt->output_offset
   2704 			  + h->plt.offset);
   2705 	  else
   2706 	    relocation = (htab->elf.splt->output_section->vma
   2707 			  + htab->elf.splt->output_offset
   2708 			  + h->plt.offset);
   2709 	  unresolved_reloc = FALSE;
   2710 	  break;
   2711 
   2712 	case R_390_PLTOFF16:
   2713 	case R_390_PLTOFF32:
   2714 	case R_390_PLTOFF64:
   2715 	  /* Relocation is to the entry for this symbol in the
   2716 	     procedure linkage table relative to the start of the GOT.  */
   2717 
   2718 	  /* For local symbols or if we didn't make a PLT entry for
   2719 	     this symbol resolve the symbol directly.  */
   2720 	  if (h == NULL
   2721 	      || h->plt.offset == (bfd_vma) -1
   2722 	      || (htab->elf.splt == NULL && !s390_is_ifunc_symbol_p (h)))
   2723 	    {
   2724 	      relocation -= htab->elf.sgot->output_section->vma;
   2725 	      break;
   2726 	    }
   2727 
   2728 	  if (s390_is_ifunc_symbol_p (h))
   2729 	    relocation = (htab->elf.iplt->output_section->vma
   2730 			  + htab->elf.iplt->output_offset
   2731 			  + h->plt.offset
   2732 			  - htab->elf.sgot->output_section->vma);
   2733 	  else
   2734 	    relocation = (htab->elf.splt->output_section->vma
   2735 			  + htab->elf.splt->output_offset
   2736 			  + h->plt.offset
   2737 			  - htab->elf.sgot->output_section->vma);
   2738 	  unresolved_reloc = FALSE;
   2739 	  break;
   2740 
   2741 	case R_390_PC16:
   2742 	case R_390_PC12DBL:
   2743 	case R_390_PC16DBL:
   2744 	case R_390_PC24DBL:
   2745 	case R_390_PC32:
   2746 	case R_390_PC32DBL:
   2747 	case R_390_PC64:
   2748 	  /* The target of these relocs are instruction operands
   2749 	     residing in read-only sections.  We cannot emit a runtime
   2750 	     reloc for it.  */
   2751 	  if (h != NULL
   2752 	      && s390_is_ifunc_symbol_p (h)
   2753 	      && h->def_regular
   2754 	      && bfd_link_pic (info))
   2755 	    {
   2756 	      relocation = (htab->elf.iplt->output_section->vma
   2757 			    + htab->elf.iplt->output_offset
   2758 			    + h->plt.offset);
   2759 	      goto do_relocation;
   2760 	    }
   2761 
   2762 	case R_390_8:
   2763 	case R_390_16:
   2764 	case R_390_32:
   2765 	case R_390_64:
   2766 
   2767 	  if (h != NULL
   2768 	      && s390_is_ifunc_symbol_p (h)
   2769 	      && h->def_regular)
   2770 	    {
   2771 	      if (!bfd_link_pic (info) || !h->non_got_ref)
   2772 		{
   2773 		  /* For a non-shared object STT_GNU_IFUNC symbol must
   2774 		     go through PLT.  */
   2775 		  relocation = (htab->elf.iplt->output_section->vma
   2776 				+ htab->elf.iplt->output_offset
   2777 				+ h ->plt.offset);
   2778 		  goto do_relocation;
   2779 		}
   2780 	      else
   2781 		{
   2782 		  /* For shared objects a runtime relocation is needed.  */
   2783 
   2784 		  Elf_Internal_Rela outrel;
   2785 		  asection *sreloc;
   2786 
   2787 		  /* Need a dynamic relocation to get the real function
   2788 		     address.  */
   2789 		  outrel.r_offset = _bfd_elf_section_offset (output_bfd,
   2790 							     info,
   2791 							     input_section,
   2792 							     rel->r_offset);
   2793 		  if (outrel.r_offset == (bfd_vma) -1
   2794 		      || outrel.r_offset == (bfd_vma) -2)
   2795 		    abort ();
   2796 
   2797 		  outrel.r_offset += (input_section->output_section->vma
   2798 				      + input_section->output_offset);
   2799 
   2800 		  if (h->dynindx == -1
   2801 		      || h->forced_local
   2802 		      || bfd_link_executable (info))
   2803 		    {
   2804 		      /* This symbol is resolved locally.  */
   2805 		      outrel.r_info = ELF64_R_INFO (0, R_390_IRELATIVE);
   2806 		      outrel.r_addend = (h->root.u.def.value
   2807 					 + h->root.u.def.section->output_section->vma
   2808 					 + h->root.u.def.section->output_offset);
   2809 		    }
   2810 		  else
   2811 		    {
   2812 		      outrel.r_info = ELF64_R_INFO (h->dynindx, r_type);
   2813 		      outrel.r_addend = 0;
   2814 		    }
   2815 
   2816 		  sreloc = htab->elf.irelifunc;
   2817 		  elf_append_rela (output_bfd, sreloc, &outrel);
   2818 
   2819 		  /* If this reloc is against an external symbol, we
   2820 		     do not want to fiddle with the addend.  Otherwise,
   2821 		     we need to include the symbol value so that it
   2822 		     becomes an addend for the dynamic reloc.  For an
   2823 		     internal symbol, we have updated addend.  */
   2824 		  continue;
   2825 		}
   2826 	    }
   2827 
   2828 	  if ((input_section->flags & SEC_ALLOC) == 0)
   2829 	    break;
   2830 
   2831 	  if ((bfd_link_pic (info)
   2832 	       && (h == NULL
   2833 		   || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
   2834 		   || h->root.type != bfd_link_hash_undefweak)
   2835 	       && ((r_type != R_390_PC16
   2836 		    && r_type != R_390_PC12DBL
   2837 		    && r_type != R_390_PC16DBL
   2838 		    && r_type != R_390_PC24DBL
   2839 		    && r_type != R_390_PC32
   2840 		    && r_type != R_390_PC32DBL
   2841 		    && r_type != R_390_PC64)
   2842 		   || !SYMBOL_CALLS_LOCAL (info, h)))
   2843 	      || (ELIMINATE_COPY_RELOCS
   2844 		  && !bfd_link_pic (info)
   2845 		  && h != NULL
   2846 		  && h->dynindx != -1
   2847 		  && !h->non_got_ref
   2848 		  && ((h->def_dynamic
   2849 		       && !h->def_regular)
   2850 		      || h->root.type == bfd_link_hash_undefweak
   2851 		      || h->root.type == bfd_link_hash_undefined)))
   2852 	    {
   2853 	      Elf_Internal_Rela outrel;
   2854 	      bfd_boolean skip, relocate;
   2855 	      asection *sreloc;
   2856 	      bfd_byte *loc;
   2857 
   2858 	      /* When generating a shared object, these relocations
   2859 		 are copied into the output file to be resolved at run
   2860 		 time.  */
   2861 	      skip = FALSE;
   2862 	      relocate = FALSE;
   2863 
   2864 	      outrel.r_offset =
   2865 		_bfd_elf_section_offset (output_bfd, info, input_section,
   2866 					 rel->r_offset);
   2867 	      if (outrel.r_offset == (bfd_vma) -1)
   2868 		skip = TRUE;
   2869 	      else if (outrel.r_offset == (bfd_vma) -2)
   2870 		skip = TRUE, relocate = TRUE;
   2871 
   2872 	      outrel.r_offset += (input_section->output_section->vma
   2873 				  + input_section->output_offset);
   2874 
   2875 	      if (skip)
   2876 		memset (&outrel, 0, sizeof outrel);
   2877 	      else if (h != NULL
   2878 		       && h->dynindx != -1
   2879 		       && (r_type == R_390_PC16
   2880 			   || r_type == R_390_PC12DBL
   2881 			   || r_type == R_390_PC16DBL
   2882 			   || r_type == R_390_PC24DBL
   2883 			   || r_type == R_390_PC32
   2884 			   || r_type == R_390_PC32DBL
   2885 			   || r_type == R_390_PC64
   2886 			   || !bfd_link_pic (info)
   2887 			   || !SYMBOLIC_BIND (info, h)
   2888 			   || !h->def_regular))
   2889 		{
   2890 		  outrel.r_info = ELF64_R_INFO (h->dynindx, r_type);
   2891 		  outrel.r_addend = rel->r_addend;
   2892 		}
   2893 	      else
   2894 		{
   2895 		  /* This symbol is local, or marked to become local.  */
   2896 		  outrel.r_addend = relocation + rel->r_addend;
   2897 		  if (r_type == R_390_64)
   2898 		    {
   2899 		      relocate = TRUE;
   2900 		      outrel.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
   2901 		    }
   2902 		  else
   2903 		    {
   2904 		      long sindx;
   2905 
   2906 		      if (bfd_is_abs_section (sec))
   2907 			sindx = 0;
   2908 		      else if (sec == NULL || sec->owner == NULL)
   2909 			{
   2910 			  bfd_set_error(bfd_error_bad_value);
   2911 			  return FALSE;
   2912 			}
   2913 		      else
   2914 			{
   2915 			  asection *osec;
   2916 
   2917 			  osec = sec->output_section;
   2918 			  sindx = elf_section_data (osec)->dynindx;
   2919 
   2920 			  if (sindx == 0)
   2921 			    {
   2922 			      osec = htab->elf.text_index_section;
   2923 			      sindx = elf_section_data (osec)->dynindx;
   2924 			    }
   2925 			  BFD_ASSERT (sindx != 0);
   2926 
   2927 			  /* We are turning this relocation into one
   2928 			     against a section symbol, so subtract out
   2929 			     the output section's address but not the
   2930 			     offset of the input section in the output
   2931 			     section.  */
   2932 			  outrel.r_addend -= osec->vma;
   2933 			}
   2934 		      outrel.r_info = ELF64_R_INFO (sindx, r_type);
   2935 		    }
   2936 		}
   2937 
   2938 	      sreloc = elf_section_data (input_section)->sreloc;
   2939 	      if (sreloc == NULL)
   2940 		abort ();
   2941 
   2942 	      loc = sreloc->contents;
   2943 	      loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
   2944 	      bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
   2945 
   2946 	      /* If this reloc is against an external symbol, we do
   2947 		 not want to fiddle with the addend.  Otherwise, we
   2948 		 need to include the symbol value so that it becomes
   2949 		 an addend for the dynamic reloc.  */
   2950 	      if (! relocate)
   2951 		continue;
   2952 	    }
   2953 
   2954 	  break;
   2955 
   2956 	  /* Relocations for tls literal pool entries.  */
   2957 	case R_390_TLS_IE64:
   2958 	  if (bfd_link_pic (info))
   2959 	    {
   2960 	      Elf_Internal_Rela outrel;
   2961 	      asection *sreloc;
   2962 	      bfd_byte *loc;
   2963 
   2964 	      outrel.r_offset = rel->r_offset
   2965 				+ input_section->output_section->vma
   2966 				+ input_section->output_offset;
   2967 	      outrel.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
   2968 	      sreloc = elf_section_data (input_section)->sreloc;
   2969 	      if (sreloc == NULL)
   2970 		abort ();
   2971 	      loc = sreloc->contents;
   2972 	      loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
   2973 	      bfd_elf64_swap_reloc_out (output_bfd, &outrel, loc);
   2974 	    }
   2975 	  /* Fall through.  */
   2976 
   2977 	case R_390_TLS_GD64:
   2978 	case R_390_TLS_GOTIE64:
   2979 	  r_type = elf_s390_tls_transition (info, r_type, h == NULL);
   2980 	  tls_type = GOT_UNKNOWN;
   2981 	  if (h == NULL && local_got_offsets)
   2982 	    tls_type = elf_s390_local_got_tls_type (input_bfd) [r_symndx];
   2983 	  else if (h != NULL)
   2984 	    {
   2985 	      tls_type = elf_s390_hash_entry(h)->tls_type;
   2986 	      if (!bfd_link_pic (info) && h->dynindx == -1 && tls_type >= GOT_TLS_IE)
   2987 		r_type = R_390_TLS_LE64;
   2988 	    }
   2989 	  if (r_type == R_390_TLS_GD64 && tls_type >= GOT_TLS_IE)
   2990 	    r_type = R_390_TLS_IE64;
   2991 
   2992 	  if (r_type == R_390_TLS_LE64)
   2993 	    {
   2994 	      /* This relocation gets optimized away by the local exec
   2995 		 access optimization.  */
   2996 	      BFD_ASSERT (! unresolved_reloc);
   2997 	      bfd_put_64 (output_bfd, -tpoff (info, relocation),
   2998 			  contents + rel->r_offset);
   2999 	      continue;
   3000 	    }
   3001 
   3002 	  if (htab->elf.sgot == NULL)
   3003 	    abort ();
   3004 
   3005 	  if (h != NULL)
   3006 	    off = h->got.offset;
   3007 	  else
   3008 	    {
   3009 	      if (local_got_offsets == NULL)
   3010 		abort ();
   3011 
   3012 	      off = local_got_offsets[r_symndx];
   3013 	    }
   3014 
   3015 	emit_tls_relocs:
   3016 
   3017 	  if ((off & 1) != 0)
   3018 	    off &= ~1;
   3019 	  else
   3020 	    {
   3021 	      Elf_Internal_Rela outrel;
   3022 	      bfd_byte *loc;
   3023 	      int dr_type, indx;
   3024 
   3025 	      if (htab->elf.srelgot == NULL)
   3026 		abort ();
   3027 
   3028 	      outrel.r_offset = (htab->elf.sgot->output_section->vma
   3029 				 + htab->elf.sgot->output_offset + off);
   3030 
   3031 	      indx = h && h->dynindx != -1 ? h->dynindx : 0;
   3032 	      if (r_type == R_390_TLS_GD64)
   3033 		dr_type = R_390_TLS_DTPMOD;
   3034 	      else
   3035 		dr_type = R_390_TLS_TPOFF;
   3036 	      if (dr_type == R_390_TLS_TPOFF && indx == 0)
   3037 		outrel.r_addend = relocation - dtpoff_base (info);
   3038 	      else
   3039 		outrel.r_addend = 0;
   3040 	      outrel.r_info = ELF64_R_INFO (indx, dr_type);
   3041 	      loc = htab->elf.srelgot->contents;
   3042 	      loc += htab->elf.srelgot->reloc_count++
   3043 		* sizeof (Elf64_External_Rela);
   3044 	      bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
   3045 
   3046 	      if (r_type == R_390_TLS_GD64)
   3047 		{
   3048 		  if (indx == 0)
   3049 		    {
   3050 	    	      BFD_ASSERT (! unresolved_reloc);
   3051 		      bfd_put_64 (output_bfd,
   3052 				  relocation - dtpoff_base (info),
   3053 				  htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
   3054 		    }
   3055 		  else
   3056 		    {
   3057 		      outrel.r_info = ELF64_R_INFO (indx, R_390_TLS_DTPOFF);
   3058 		      outrel.r_offset += GOT_ENTRY_SIZE;
   3059 		      outrel.r_addend = 0;
   3060 		      htab->elf.srelgot->reloc_count++;
   3061 		      loc += sizeof (Elf64_External_Rela);
   3062 		      bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
   3063 		    }
   3064 		}
   3065 
   3066 	      if (h != NULL)
   3067 		h->got.offset |= 1;
   3068 	      else
   3069 		local_got_offsets[r_symndx] |= 1;
   3070 	    }
   3071 
   3072 	  if (off >= (bfd_vma) -2)
   3073 	    abort ();
   3074 	  if (r_type == ELF64_R_TYPE (rel->r_info))
   3075 	    {
   3076 	      relocation = htab->elf.sgot->output_offset + off;
   3077 	      if (r_type == R_390_TLS_IE64 || r_type == R_390_TLS_IEENT)
   3078 		relocation += htab->elf.sgot->output_section->vma;
   3079 	      unresolved_reloc = FALSE;
   3080 	    }
   3081 	  else
   3082 	    {
   3083 	      bfd_put_64 (output_bfd, htab->elf.sgot->output_offset + off,
   3084 			  contents + rel->r_offset);
   3085 	      continue;
   3086 	    }
   3087 	  break;
   3088 
   3089 	case R_390_TLS_GOTIE12:
   3090 	case R_390_TLS_GOTIE20:
   3091 	case R_390_TLS_IEENT:
   3092 	  if (h == NULL)
   3093 	    {
   3094 	      if (local_got_offsets == NULL)
   3095 		abort();
   3096 	      off = local_got_offsets[r_symndx];
   3097 	      if (bfd_link_pic (info))
   3098 		goto emit_tls_relocs;
   3099 	    }
   3100 	  else
   3101 	    {
   3102 	      off = h->got.offset;
   3103 	      tls_type = elf_s390_hash_entry(h)->tls_type;
   3104 	      if (bfd_link_pic (info) || h->dynindx != -1 || tls_type < GOT_TLS_IE)
   3105 		goto emit_tls_relocs;
   3106 	    }
   3107 
   3108 	  if (htab->elf.sgot == NULL)
   3109 	    abort ();
   3110 
   3111 	  BFD_ASSERT (! unresolved_reloc);
   3112 	  bfd_put_64 (output_bfd, -tpoff (info, relocation),
   3113 		      htab->elf.sgot->contents + off);
   3114 	  relocation = htab->elf.sgot->output_offset + off;
   3115 	  if (r_type == R_390_TLS_IEENT)
   3116 	    relocation += htab->elf.sgot->output_section->vma;
   3117 	  unresolved_reloc = FALSE;
   3118 	  break;
   3119 
   3120 	case R_390_TLS_LDM64:
   3121 	  if (! bfd_link_pic (info))
   3122 	    /* The literal pool entry this relocation refers to gets ignored
   3123 	       by the optimized code of the local exec model. Do nothing
   3124 	       and the value will turn out zero.  */
   3125 	    continue;
   3126 
   3127 	  if (htab->elf.sgot == NULL)
   3128 	    abort ();
   3129 
   3130 	  off = htab->tls_ldm_got.offset;
   3131 	  if (off & 1)
   3132 	    off &= ~1;
   3133 	  else
   3134 	    {
   3135 	      Elf_Internal_Rela outrel;
   3136 	      bfd_byte *loc;
   3137 
   3138 	      if (htab->elf.srelgot == NULL)
   3139 		abort ();
   3140 
   3141 	      outrel.r_offset = (htab->elf.sgot->output_section->vma
   3142 				 + htab->elf.sgot->output_offset + off);
   3143 
   3144 	      bfd_put_64 (output_bfd, 0,
   3145 			  htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
   3146 	      outrel.r_info = ELF64_R_INFO (0, R_390_TLS_DTPMOD);
   3147 	      outrel.r_addend = 0;
   3148 	      loc = htab->elf.srelgot->contents;
   3149 	      loc += htab->elf.srelgot->reloc_count++
   3150 		* sizeof (Elf64_External_Rela);
   3151 	      bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
   3152 	      htab->tls_ldm_got.offset |= 1;
   3153 	    }
   3154 	  relocation = htab->elf.sgot->output_offset + off;
   3155 	  unresolved_reloc = FALSE;
   3156 	  break;
   3157 
   3158 	case R_390_TLS_LE64:
   3159 	  if (bfd_link_dll (info))
   3160 	    {
   3161 	      /* Linking a shared library with non-fpic code requires
   3162 		 a R_390_TLS_TPOFF relocation.  */
   3163 	      Elf_Internal_Rela outrel;
   3164 	      asection *sreloc;
   3165 	      bfd_byte *loc;
   3166 	      int indx;
   3167 
   3168 	      outrel.r_offset = rel->r_offset
   3169 				+ input_section->output_section->vma
   3170 				+ input_section->output_offset;
   3171 	      if (h != NULL && h->dynindx != -1)
   3172 		indx = h->dynindx;
   3173 	      else
   3174 		indx = 0;
   3175 	      outrel.r_info = ELF64_R_INFO (indx, R_390_TLS_TPOFF);
   3176 	      if (indx == 0)
   3177 		outrel.r_addend = relocation - dtpoff_base (info);
   3178 	      else
   3179 		outrel.r_addend = 0;
   3180 	      sreloc = elf_section_data (input_section)->sreloc;
   3181 	      if (sreloc == NULL)
   3182 		abort ();
   3183 	      loc = sreloc->contents;
   3184 	      loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
   3185 	      bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
   3186 	    }
   3187 	  else
   3188 	    {
   3189 	      BFD_ASSERT (! unresolved_reloc);
   3190 	      bfd_put_64 (output_bfd, -tpoff (info, relocation),
   3191 			  contents + rel->r_offset);
   3192 	    }
   3193 	  continue;
   3194 
   3195 	case R_390_TLS_LDO64:
   3196 	  if (bfd_link_pic (info) || (input_section->flags & SEC_DEBUGGING))
   3197 	    relocation -= dtpoff_base (info);
   3198 	  else
   3199 	    /* When converting LDO to LE, we must negate.  */
   3200 	    relocation = -tpoff (info, relocation);
   3201 	  break;
   3202 
   3203 	  /* Relocations for tls instructions.  */
   3204 	case R_390_TLS_LOAD:
   3205 	case R_390_TLS_GDCALL:
   3206 	case R_390_TLS_LDCALL:
   3207 	  tls_type = GOT_UNKNOWN;
   3208 	  if (h == NULL && local_got_offsets)
   3209 	    tls_type = elf_s390_local_got_tls_type (input_bfd) [r_symndx];
   3210 	  else if (h != NULL)
   3211 	    tls_type = elf_s390_hash_entry(h)->tls_type;
   3212 
   3213 	  if (tls_type == GOT_TLS_GD)
   3214 	    continue;
   3215 
   3216 	  if (r_type == R_390_TLS_LOAD)
   3217 	    {
   3218 	      if (!bfd_link_pic (info) && (h == NULL || h->dynindx == -1))
   3219 		{
   3220 		  /* IE->LE transition. Four valid cases:
   3221 		     lg %rx,(0,%ry)    -> sllg %rx,%ry,0
   3222 		     lg %rx,(%ry,0)    -> sllg %rx,%ry,0
   3223 		     lg %rx,(%ry,%r12) -> sllg %rx,%ry,0
   3224 		     lg %rx,(%r12,%ry) -> sllg %rx,%ry,0  */
   3225 		  unsigned int insn0, insn1, ry;
   3226 
   3227 		  insn0 = bfd_get_32 (input_bfd, contents + rel->r_offset);
   3228 		  insn1 = bfd_get_16 (input_bfd, contents + rel->r_offset + 4);
   3229 		  if (insn1 != 0x0004)
   3230 		    invalid_tls_insn (input_bfd, input_section, rel);
   3231 		  ry = 0;
   3232 		  if ((insn0 & 0xff00f000) == 0xe3000000)
   3233 		    /* lg %rx,0(%ry,0) -> sllg %rx,%ry,0  */
   3234 		    ry = (insn0 & 0x000f0000);
   3235 		  else if ((insn0 & 0xff0f0000) == 0xe3000000)
   3236 		    /* lg %rx,0(0,%ry) -> sllg %rx,%ry,0  */
   3237 		    ry = (insn0 & 0x0000f000) << 4;
   3238 		  else if ((insn0 & 0xff00f000) == 0xe300c000)
   3239 		    /* lg %rx,0(%ry,%r12) -> sllg %rx,%ry,0  */
   3240 		    ry = (insn0 & 0x000f0000);
   3241 		  else if ((insn0 & 0xff0f0000) == 0xe30c0000)
   3242 		    /* lg %rx,0(%r12,%ry) -> sllg %rx,%ry,0  */
   3243 		    ry = (insn0 & 0x0000f000) << 4;
   3244 		  else
   3245 		    invalid_tls_insn (input_bfd, input_section, rel);
   3246 		  insn0 = 0xeb000000 | (insn0 & 0x00f00000) | ry;
   3247 		  insn1 = 0x000d;
   3248 		  bfd_put_32 (output_bfd, insn0, contents + rel->r_offset);
   3249 		  bfd_put_16 (output_bfd, insn1, contents + rel->r_offset + 4);
   3250 		}
   3251 	    }
   3252 	  else if (r_type == R_390_TLS_GDCALL)
   3253 	    {
   3254 	      unsigned int insn0, insn1;
   3255 
   3256 	      insn0 = bfd_get_32 (input_bfd, contents + rel->r_offset);
   3257 	      insn1 = bfd_get_16 (input_bfd, contents + rel->r_offset + 4);
   3258 	      if ((insn0 & 0xffff0000) != 0xc0e50000)
   3259 		invalid_tls_insn (input_bfd, input_section, rel);
   3260 	      if (!bfd_link_pic (info) && (h == NULL || h->dynindx == -1))
   3261 		{
   3262 		  /* GD->LE transition.
   3263 		     brasl %r14,__tls_get_addr@plt -> brcl 0,. */
   3264 		  insn0 = 0xc0040000;
   3265 		  insn1 = 0x0000;
   3266 		}
   3267 	      else
   3268 		{
   3269 		  /* GD->IE transition.
   3270 		     brasl %r14,__tls_get_addr@plt -> lg %r2,0(%r2,%r12)  */
   3271 		  insn0 = 0xe322c000;
   3272 		  insn1 = 0x0004;
   3273 		}
   3274 	      bfd_put_32 (output_bfd, insn0, contents + rel->r_offset);
   3275 	      bfd_put_16 (output_bfd, insn1, contents + rel->r_offset + 4);
   3276 	    }
   3277 	  else if (r_type == R_390_TLS_LDCALL)
   3278 	    {
   3279 	      if (!bfd_link_pic (info))
   3280 		{
   3281 		  unsigned int insn0, insn1;
   3282 
   3283 		  insn0 = bfd_get_32 (input_bfd, contents + rel->r_offset);
   3284 		  insn1 = bfd_get_16 (input_bfd, contents + rel->r_offset + 4);
   3285 		  if ((insn0 & 0xffff0000) != 0xc0e50000)
   3286 		    invalid_tls_insn (input_bfd, input_section, rel);
   3287 		  /* LD->LE transition.
   3288 		     brasl %r14,__tls_get_addr@plt -> brcl 0,. */
   3289 		  insn0 = 0xc0040000;
   3290 		  insn1 = 0x0000;
   3291 		  bfd_put_32 (output_bfd, insn0, contents + rel->r_offset);
   3292 		  bfd_put_16 (output_bfd, insn1, contents + rel->r_offset + 4);
   3293 		}
   3294 	    }
   3295 	  continue;
   3296 
   3297 	default:
   3298 	  break;
   3299 	}
   3300 
   3301       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
   3302 	 because such sections are not SEC_ALLOC and thus ld.so will
   3303 	 not process them.  */
   3304       if (unresolved_reloc
   3305 	  && !((input_section->flags & SEC_DEBUGGING) != 0
   3306 	       && h->def_dynamic)
   3307 	  && _bfd_elf_section_offset (output_bfd, info, input_section,
   3308 				      rel->r_offset) != (bfd_vma) -1)
   3309 	(*_bfd_error_handler)
   3310 	  (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
   3311 	   input_bfd,
   3312 	   input_section,
   3313 	   (long) rel->r_offset,
   3314 	   howto->name,
   3315 	   h->root.root.string);
   3316 
   3317     do_relocation:
   3318 
   3319       /* When applying a 24 bit reloc we need to start one byte
   3320 	 earlier.  Otherwise the 32 bit get/put bfd operations might
   3321 	 access a byte after the actual section.  */
   3322       if (r_type == R_390_PC24DBL
   3323 	  || r_type == R_390_PLT24DBL)
   3324 	rel->r_offset--;
   3325 
   3326       if (r_type == R_390_20
   3327 	  || r_type == R_390_GOT20
   3328 	  || r_type == R_390_GOTPLT20
   3329 	  || r_type == R_390_TLS_GOTIE20)
   3330 	{
   3331 	  relocation += rel->r_addend;
   3332 	  relocation = (relocation&0xfff) << 8 | (relocation&0xff000) >> 12;
   3333 	  r = _bfd_final_link_relocate (howto, input_bfd, input_section,
   3334 					contents, rel->r_offset,
   3335 					relocation, 0);
   3336 	}
   3337       else
   3338 	r = _bfd_final_link_relocate (howto, input_bfd, input_section,
   3339 				      contents, rel->r_offset,
   3340 				      relocation, rel->r_addend);
   3341 
   3342       if (r != bfd_reloc_ok)
   3343 	{
   3344 	  const char *name;
   3345 
   3346 	  if (h != NULL)
   3347 	    name = h->root.root.string;
   3348 	  else
   3349 	    {
   3350 	      name = bfd_elf_string_from_elf_section (input_bfd,
   3351 						      symtab_hdr->sh_link,
   3352 						      sym->st_name);
   3353 	      if (name == NULL)
   3354 		return FALSE;
   3355 	      if (*name == '\0')
   3356 		name = bfd_section_name (input_bfd, sec);
   3357 	    }
   3358 
   3359 	  if (r == bfd_reloc_overflow)
   3360 	    (*info->callbacks->reloc_overflow)
   3361 	      (info, (h ? &h->root : NULL), name, howto->name,
   3362 	       (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
   3363 	  else
   3364 	    {
   3365 	      (*_bfd_error_handler)
   3366 		(_("%B(%A+0x%lx): reloc against `%s': error %d"),
   3367 		 input_bfd, input_section,
   3368 		 (long) rel->r_offset, name, (int) r);
   3369 	      return FALSE;
   3370 	    }
   3371 	}
   3372     }
   3373 
   3374   return TRUE;
   3375 }
   3376 
   3377 /* Generate the PLT slots together with the dynamic relocations needed
   3378    for IFUNC symbols.  */
   3379 
   3380 static void
   3381 elf_s390_finish_ifunc_symbol (bfd *output_bfd,
   3382 			      struct bfd_link_info *info,
   3383 			      struct elf_link_hash_entry *h,
   3384 			      struct elf_s390_link_hash_table *htab,
   3385 			      bfd_vma plt_offset,
   3386 			      bfd_vma resolver_address)
   3387 {
   3388   bfd_vma plt_index;
   3389   bfd_vma got_offset;
   3390   Elf_Internal_Rela rela;
   3391   bfd_byte *loc;
   3392   asection *plt, *gotplt, *relplt;
   3393 
   3394   if (htab->elf.iplt == NULL
   3395       || htab->elf.igotplt == NULL
   3396       || htab->elf.irelplt == NULL)
   3397     abort ();
   3398 
   3399   /* Index of the PLT slot within iplt section.  */
   3400   plt_index = plt_offset / PLT_ENTRY_SIZE;
   3401   plt = htab->elf.iplt;
   3402   /* Offset into the igot.plt section.  */
   3403   got_offset = plt_index * GOT_ENTRY_SIZE;
   3404   gotplt = htab->elf.igotplt;
   3405   relplt = htab->elf.irelplt;
   3406 
   3407   /* Fill in the blueprint of a PLT.  */
   3408   memcpy (plt->contents + plt_offset, elf_s390x_plt_entry,
   3409 	  PLT_ENTRY_SIZE);
   3410 
   3411   /* Fixup the relative address to the GOT entry */
   3412   bfd_put_32 (output_bfd,
   3413 	      (gotplt->output_section->vma +
   3414 	       gotplt->output_offset + got_offset
   3415 	       - (plt->output_section->vma +
   3416 		  plt->output_offset +
   3417 		  plt_offset))/2,
   3418 	      plt->contents + plt_offset + 2);
   3419   /* Fixup the relative branch to PLT 0 */
   3420   bfd_put_32 (output_bfd, - (plt->output_offset +
   3421 			     (PLT_ENTRY_SIZE * plt_index) + 22)/2,
   3422 	      plt->contents + plt_offset + 24);
   3423   /* Fixup offset into .rela.plt section.  */
   3424   bfd_put_32 (output_bfd, relplt->output_offset +
   3425 	      plt_index * sizeof (Elf64_External_Rela),
   3426 	      plt->contents + plt_offset + 28);
   3427 
   3428   /* Fill in the entry in the global offset table.
   3429      Points to instruction after GOT offset.  */
   3430   bfd_put_64 (output_bfd,
   3431 	      (plt->output_section->vma
   3432 	       + plt->output_offset
   3433 	       + plt_offset
   3434 	       + 14),
   3435 	      gotplt->contents + got_offset);
   3436 
   3437   /* Fill in the entry in the .rela.plt section.  */
   3438   rela.r_offset = (gotplt->output_section->vma
   3439 		   + gotplt->output_offset
   3440 		   + got_offset);
   3441 
   3442   if (!h
   3443       || h->dynindx == -1
   3444       || ((bfd_link_executable (info)
   3445 	   || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
   3446 	  && h->def_regular))
   3447     {
   3448       /* The symbol can be locally resolved.  */
   3449       rela.r_info = ELF64_R_INFO (0, R_390_IRELATIVE);
   3450       rela.r_addend = resolver_address;
   3451     }
   3452   else
   3453     {
   3454       rela.r_info = ELF64_R_INFO (h->dynindx, R_390_JMP_SLOT);
   3455       rela.r_addend = 0;
   3456     }
   3457 
   3458   loc = relplt->contents + plt_index * sizeof (Elf64_External_Rela);
   3459   bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
   3460 }
   3461 
   3462 
   3463 /* Finish up dynamic symbol handling.  We set the contents of various
   3464    dynamic sections here.  */
   3465 
   3466 static bfd_boolean
   3467 elf_s390_finish_dynamic_symbol (bfd *output_bfd,
   3468 				struct bfd_link_info *info,
   3469 				struct elf_link_hash_entry *h,
   3470 				Elf_Internal_Sym *sym)
   3471 {
   3472   struct elf_s390_link_hash_table *htab;
   3473   struct elf_s390_link_hash_entry *eh = (struct elf_s390_link_hash_entry*)h;
   3474 
   3475   htab = elf_s390_hash_table (info);
   3476   if (htab == NULL)
   3477     return FALSE;
   3478 
   3479   if (h->plt.offset != (bfd_vma) -1)
   3480     {
   3481       bfd_vma plt_index;
   3482       bfd_vma got_offset;
   3483       Elf_Internal_Rela rela;
   3484       bfd_byte *loc;
   3485 
   3486       /* This symbol has an entry in the procedure linkage table.  Set
   3487 	 it up.  */
   3488       if (s390_is_ifunc_symbol_p (h) && h->def_regular)
   3489 	{
   3490 	  elf_s390_finish_ifunc_symbol (output_bfd, info, h,
   3491 	    htab, h->plt.offset,
   3492 	    eh->ifunc_resolver_address +
   3493 	    eh->ifunc_resolver_section->output_offset +
   3494 	    eh->ifunc_resolver_section->output_section->vma);
   3495 
   3496 	  /* Do not return yet.  Handling of explicit GOT slots of
   3497 	     IFUNC symbols is below.  */
   3498 	}
   3499       else
   3500 	{
   3501 	  if (h->dynindx == -1
   3502 	      || htab->elf.splt == NULL
   3503 	      || htab->elf.sgotplt == NULL
   3504 	      || htab->elf.srelplt == NULL)
   3505 	    abort ();
   3506 
   3507 	  /* Calc. index no.
   3508 	     Current offset - size first entry / entry size.  */
   3509 	  plt_index = (h->plt.offset - PLT_FIRST_ENTRY_SIZE) / PLT_ENTRY_SIZE;
   3510 
   3511 	  /* Offset in GOT is PLT index plus GOT headers(3) times 8,
   3512 	     addr & GOT addr.  */
   3513 	  got_offset = (plt_index + 3) * GOT_ENTRY_SIZE;
   3514 
   3515 	  /* Fill in the blueprint of a PLT.  */
   3516 	  memcpy (htab->elf.splt->contents + h->plt.offset, elf_s390x_plt_entry,
   3517 		  PLT_ENTRY_SIZE);
   3518 
   3519 	  /* Fixup the relative address to the GOT entry */
   3520 	  bfd_put_32 (output_bfd,
   3521 		      (htab->elf.sgotplt->output_section->vma +
   3522 		       htab->elf.sgotplt->output_offset + got_offset
   3523 		       - (htab->elf.splt->output_section->vma +
   3524 			  htab->elf.splt->output_offset +
   3525 			  h->plt.offset))/2,
   3526 		      htab->elf.splt->contents + h->plt.offset + 2);
   3527 	  /* Fixup the relative branch to PLT 0 */
   3528 	  bfd_put_32 (output_bfd, - (PLT_FIRST_ENTRY_SIZE +
   3529 				     (PLT_ENTRY_SIZE * plt_index) + 22)/2,
   3530 		      htab->elf.splt->contents + h->plt.offset + 24);
   3531 	  /* Fixup offset into .rela.plt section.  */
   3532 	  bfd_put_32 (output_bfd, plt_index * sizeof (Elf64_External_Rela),
   3533 		      htab->elf.splt->contents + h->plt.offset + 28);
   3534 
   3535 	  /* Fill in the entry in the global offset table.
   3536 	     Points to instruction after GOT offset.  */
   3537 	  bfd_put_64 (output_bfd,
   3538 		      (htab->elf.splt->output_section->vma
   3539 		       + htab->elf.splt->output_offset
   3540 		       + h->plt.offset
   3541 		       + 14),
   3542 		      htab->elf.sgotplt->contents + got_offset);
   3543 
   3544 	  /* Fill in the entry in the .rela.plt section.  */
   3545 	  rela.r_offset = (htab->elf.sgotplt->output_section->vma
   3546 			   + htab->elf.sgotplt->output_offset
   3547 			   + got_offset);
   3548 	  rela.r_info = ELF64_R_INFO (h->dynindx, R_390_JMP_SLOT);
   3549 	  rela.r_addend = 0;
   3550 	  loc = htab->elf.srelplt->contents + plt_index *
   3551 	    sizeof (Elf64_External_Rela);
   3552 	  bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
   3553 
   3554 	  if (!h->def_regular)
   3555 	    {
   3556 	      /* Mark the symbol as undefined, rather than as defined in
   3557 		 the .plt section.  Leave the value alone.  This is a clue
   3558 		 for the dynamic linker, to make function pointer
   3559 		 comparisons work between an application and shared
   3560 		 library.  */
   3561 	      sym->st_shndx = SHN_UNDEF;
   3562 	    }
   3563 	}
   3564     }
   3565 
   3566   if (h->got.offset != (bfd_vma) -1
   3567       && elf_s390_hash_entry(h)->tls_type != GOT_TLS_GD
   3568       && elf_s390_hash_entry(h)->tls_type != GOT_TLS_IE
   3569       && elf_s390_hash_entry(h)->tls_type != GOT_TLS_IE_NLT)
   3570     {
   3571       Elf_Internal_Rela rela;
   3572       bfd_byte *loc;
   3573 
   3574       /* This symbol has an entry in the global offset table.  Set it
   3575 	 up.  */
   3576       if (htab->elf.sgot == NULL || htab->elf.srelgot == NULL)
   3577 	abort ();
   3578 
   3579       rela.r_offset = (htab->elf.sgot->output_section->vma
   3580 		       + htab->elf.sgot->output_offset
   3581 		       + (h->got.offset &~ (bfd_vma) 1));
   3582 
   3583       if (h->def_regular && s390_is_ifunc_symbol_p (h))
   3584 	{
   3585 	  if (bfd_link_pic (info))
   3586 	    {
   3587 	      /* An explicit GOT slot usage needs GLOB_DAT.  If the
   3588 		 symbol references local the implicit got.iplt slot
   3589 		 will be used and the IRELATIVE reloc has been created
   3590 		 above.  */
   3591 	      goto do_glob_dat;
   3592 	    }
   3593 	  else
   3594 	    {
   3595 	      /* For non-shared objects explicit GOT slots must be
   3596 		 filled with the PLT slot address for pointer
   3597 		 equality reasons.  */
   3598 	      bfd_put_64 (output_bfd, (htab->elf.iplt->output_section->vma
   3599 				       + htab->elf.iplt->output_offset
   3600 				       + h->plt.offset),
   3601 			  htab->elf.sgot->contents + h->got.offset);
   3602 	      return TRUE;
   3603 	    }
   3604 	}
   3605       else if (bfd_link_pic (info)
   3606 	  && SYMBOL_REFERENCES_LOCAL (info, h))
   3607 	{
   3608 	  /* If this is a static link, or it is a -Bsymbolic link and
   3609 	     the symbol is defined locally or was forced to be local
   3610 	     because of a version file, we just want to emit a
   3611 	     RELATIVE reloc.  The entry in the global offset table
   3612 	     will already have been initialized in the
   3613 	     relocate_section function.  */
   3614 	  if (!h->def_regular)
   3615 	    return FALSE;
   3616 	  BFD_ASSERT((h->got.offset & 1) != 0);
   3617 	  rela.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
   3618 	  rela.r_addend = (h->root.u.def.value
   3619 			   + h->root.u.def.section->output_section->vma
   3620 			   + h->root.u.def.section->output_offset);
   3621 	}
   3622       else
   3623 	{
   3624 	  BFD_ASSERT((h->got.offset & 1) == 0);
   3625 do_glob_dat:
   3626 	  bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgot->contents + h->got.offset);
   3627 	  rela.r_info = ELF64_R_INFO (h->dynindx, R_390_GLOB_DAT);
   3628 	  rela.r_addend = 0;
   3629 	}
   3630 
   3631       loc = htab->elf.srelgot->contents;
   3632       loc += htab->elf.srelgot->reloc_count++ * sizeof (Elf64_External_Rela);
   3633       bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
   3634     }
   3635 
   3636   if (h->needs_copy)
   3637     {
   3638       Elf_Internal_Rela rela;
   3639       bfd_byte *loc;
   3640 
   3641       /* This symbols needs a copy reloc.  Set it up.  */
   3642 
   3643       if (h->dynindx == -1
   3644 	  || (h->root.type != bfd_link_hash_defined
   3645 	      && h->root.type != bfd_link_hash_defweak)
   3646 	  || htab->srelbss == NULL)
   3647 	abort ();
   3648 
   3649       rela.r_offset = (h->root.u.def.value
   3650 		       + h->root.u.def.section->output_section->vma
   3651 		       + h->root.u.def.section->output_offset);
   3652       rela.r_info = ELF64_R_INFO (h->dynindx, R_390_COPY);
   3653       rela.r_addend = 0;
   3654       loc = htab->srelbss->contents;
   3655       loc += htab->srelbss->reloc_count++ * sizeof (Elf64_External_Rela);
   3656       bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
   3657     }
   3658 
   3659   /* Mark some specially defined symbols as absolute.  */
   3660   if (h == htab->elf.hdynamic
   3661       || h == htab->elf.hgot
   3662       || h == htab->elf.hplt)
   3663     sym->st_shndx = SHN_ABS;
   3664 
   3665   return TRUE;
   3666 }
   3667 
   3668 /* Used to decide how to sort relocs in an optimal manner for the
   3669    dynamic linker, before writing them out.  */
   3670 
   3671 static enum elf_reloc_type_class
   3672 elf_s390_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
   3673 			   const asection *rel_sec ATTRIBUTE_UNUSED,
   3674 			   const Elf_Internal_Rela *rela)
   3675 {
   3676   bfd *abfd = info->output_bfd;
   3677   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
   3678   struct elf_s390_link_hash_table *htab = elf_s390_hash_table (info);
   3679   unsigned long r_symndx = ELF64_R_SYM (rela->r_info);
   3680   Elf_Internal_Sym sym;
   3681 
   3682   if (htab->elf.dynsym == NULL
   3683       || !bed->s->swap_symbol_in (abfd,
   3684 				  (htab->elf.dynsym->contents
   3685 				   + r_symndx * bed->s->sizeof_sym),
   3686 				  0, &sym))
   3687     abort ();
   3688 
   3689   /* Check relocation against STT_GNU_IFUNC symbol.  */
   3690   if (ELF_ST_TYPE (sym.st_info) == STT_GNU_IFUNC)
   3691     return reloc_class_ifunc;
   3692 
   3693   switch ((int) ELF64_R_TYPE (rela->r_info))
   3694     {
   3695     case R_390_RELATIVE:
   3696       return reloc_class_relative;
   3697     case R_390_JMP_SLOT:
   3698       return reloc_class_plt;
   3699     case R_390_COPY:
   3700       return reloc_class_copy;
   3701     default:
   3702       return reloc_class_normal;
   3703     }
   3704 }
   3705 
   3706 /* Finish up the dynamic sections.  */
   3707 
   3708 static bfd_boolean
   3709 elf_s390_finish_dynamic_sections (bfd *output_bfd,
   3710 				  struct bfd_link_info *info)
   3711 {
   3712   struct elf_s390_link_hash_table *htab;
   3713   bfd *dynobj;
   3714   asection *sdyn;
   3715   bfd *ibfd;
   3716   unsigned int i;
   3717 
   3718   htab = elf_s390_hash_table (info);
   3719   if (htab == NULL)
   3720     return FALSE;
   3721 
   3722   dynobj = htab->elf.dynobj;
   3723   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
   3724 
   3725   if (htab->elf.dynamic_sections_created)
   3726     {
   3727       Elf64_External_Dyn *dyncon, *dynconend;
   3728 
   3729       if (sdyn == NULL || htab->elf.sgot == NULL)
   3730 	abort ();
   3731 
   3732       dyncon = (Elf64_External_Dyn *) sdyn->contents;
   3733       dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
   3734       for (; dyncon < dynconend; dyncon++)
   3735 	{
   3736 	  Elf_Internal_Dyn dyn;
   3737 	  asection *s;
   3738 
   3739 	  bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
   3740 
   3741 	  switch (dyn.d_tag)
   3742 	    {
   3743 	    default:
   3744 	      continue;
   3745 
   3746 	    case DT_PLTGOT:
   3747 	      s = htab->elf.sgotplt;
   3748 	      dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
   3749 	      break;
   3750 
   3751 	    case DT_JMPREL:
   3752 	      s = htab->elf.srelplt;
   3753 	      dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
   3754 	      break;
   3755 
   3756 	    case DT_PLTRELSZ:
   3757 	      dyn.d_un.d_val = htab->elf.srelplt->size + htab->elf.irelplt->size;
   3758 	      break;
   3759 
   3760 	    case DT_RELASZ:
   3761 	      /* The procedure linkage table relocs (DT_JMPREL) should
   3762 		 not be included in the overall relocs (DT_RELA).
   3763 		 Therefore, we override the DT_RELASZ entry here to
   3764 		 make it not include the JMPREL relocs.  Since the
   3765 		 linker script arranges for .rela.plt to follow all
   3766 		 other relocation sections, we don't have to worry
   3767 		 about changing the DT_RELA entry.  */
   3768 	      dyn.d_un.d_val -= htab->elf.srelplt->size + htab->elf.irelplt->size;
   3769 	      break;
   3770 	    }
   3771 
   3772 	  bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
   3773 	}
   3774 
   3775       /* Fill in the special first entry in the procedure linkage table.  */
   3776       if (htab->elf.splt && htab->elf.splt->size > 0)
   3777 	{
   3778 	  /* fill in blueprint for plt 0 entry */
   3779 	  memcpy (htab->elf.splt->contents, elf_s390x_first_plt_entry,
   3780 		  PLT_FIRST_ENTRY_SIZE);
   3781 	  /* Fixup relative address to start of GOT */
   3782 	  bfd_put_32 (output_bfd,
   3783 		      (htab->elf.sgotplt->output_section->vma
   3784 		       + htab->elf.sgotplt->output_offset
   3785 		       - htab->elf.splt->output_section->vma
   3786 		       - htab->elf.splt->output_offset - 6)/2,
   3787 		      htab->elf.splt->contents + 8);
   3788 	}
   3789       if (elf_section_data (htab->elf.splt->output_section) != NULL)
   3790 	elf_section_data (htab->elf.splt->output_section)->this_hdr.sh_entsize
   3791 	  = PLT_ENTRY_SIZE;
   3792     }
   3793 
   3794   if (htab->elf.sgotplt)
   3795     {
   3796       /* Fill in the first three entries in the global offset table.  */
   3797       if (htab->elf.sgotplt->size > 0)
   3798 	{
   3799 	  bfd_put_64 (output_bfd,
   3800 		      (sdyn == NULL ? (bfd_vma) 0
   3801 		       : sdyn->output_section->vma + sdyn->output_offset),
   3802 		      htab->elf.sgotplt->contents);
   3803 	  /* One entry for shared object struct ptr.  */
   3804 	  bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents + 8);
   3805 	  /* One entry for _dl_runtime_resolve.  */
   3806 	  bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents + 16);
   3807 	}
   3808 
   3809       elf_section_data (htab->elf.sgot->output_section)
   3810 	->this_hdr.sh_entsize = 8;
   3811     }
   3812 
   3813   /* Finish dynamic symbol for local IFUNC symbols.  */
   3814   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
   3815     {
   3816       struct plt_entry *local_plt;
   3817       Elf_Internal_Sym *isym;
   3818       Elf_Internal_Shdr *symtab_hdr;
   3819 
   3820       symtab_hdr = &elf_symtab_hdr (ibfd);
   3821 
   3822       local_plt = elf_s390_local_plt (ibfd);
   3823       if (local_plt != NULL)
   3824 	for (i = 0; i < symtab_hdr->sh_info; i++)
   3825 	  {
   3826 	    if (local_plt[i].plt.offset != (bfd_vma) -1)
   3827 	      {
   3828 		asection *sec = local_plt[i].sec;
   3829 		isym = bfd_sym_from_r_symndx (&htab->sym_cache, ibfd, i);
   3830 		if (isym == NULL)
   3831 		  return FALSE;
   3832 
   3833 		if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
   3834 		  elf_s390_finish_ifunc_symbol (output_bfd, info, NULL, htab,
   3835 						local_plt[i].plt.offset,
   3836 						isym->st_value
   3837 						+ sec->output_section->vma
   3838 						+ sec->output_offset);
   3839 
   3840 	      }
   3841 	  }
   3842     }
   3843 
   3844   return TRUE;
   3845 }
   3846 
   3847 /* Return address for Ith PLT stub in section PLT, for relocation REL
   3848    or (bfd_vma) -1 if it should not be included.  */
   3849 
   3850 static bfd_vma
   3851 elf_s390_plt_sym_val (bfd_vma i, const asection *plt,
   3852 		      const arelent *rel ATTRIBUTE_UNUSED)
   3853 {
   3854   return plt->vma + PLT_FIRST_ENTRY_SIZE + i * PLT_ENTRY_SIZE;
   3855 }
   3856 
   3857 /* Merge backend specific data from an object file to the output
   3858    object file when linking.  */
   3859 
   3860 static bfd_boolean
   3861 elf64_s390_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
   3862 {
   3863   if (!is_s390_elf (ibfd) || !is_s390_elf (obfd))
   3864     return TRUE;
   3865 
   3866   if (!elf_s390_merge_obj_attributes (ibfd, obfd))
   3867     return FALSE;
   3868 
   3869   return TRUE;
   3870 }
   3871 
   3872 /* Why was the hash table entry size definition changed from
   3873    ARCH_SIZE/8 to 4? This breaks the 64 bit dynamic linker and
   3874    this is the only reason for the s390_elf64_size_info structure.  */
   3875 
   3876 const struct elf_size_info s390_elf64_size_info =
   3877 {
   3878   sizeof (Elf64_External_Ehdr),
   3879   sizeof (Elf64_External_Phdr),
   3880   sizeof (Elf64_External_Shdr),
   3881   sizeof (Elf64_External_Rel),
   3882   sizeof (Elf64_External_Rela),
   3883   sizeof (Elf64_External_Sym),
   3884   sizeof (Elf64_External_Dyn),
   3885   sizeof (Elf_External_Note),
   3886   8,		/* hash-table entry size.  */
   3887   1,		/* internal relocations per external relocations.  */
   3888   64,		/* arch_size.  */
   3889   3,		/* log_file_align.  */
   3890   ELFCLASS64, EV_CURRENT,
   3891   bfd_elf64_write_out_phdrs,
   3892   bfd_elf64_write_shdrs_and_ehdr,
   3893   bfd_elf64_checksum_contents,
   3894   bfd_elf64_write_relocs,
   3895   bfd_elf64_swap_symbol_in,
   3896   bfd_elf64_swap_symbol_out,
   3897   bfd_elf64_slurp_reloc_table,
   3898   bfd_elf64_slurp_symbol_table,
   3899   bfd_elf64_swap_dyn_in,
   3900   bfd_elf64_swap_dyn_out,
   3901   bfd_elf64_swap_reloc_in,
   3902   bfd_elf64_swap_reloc_out,
   3903   bfd_elf64_swap_reloca_in,
   3904   bfd_elf64_swap_reloca_out
   3905 };
   3906 
   3907 #define TARGET_BIG_SYM	s390_elf64_vec
   3908 #define TARGET_BIG_NAME	"elf64-s390"
   3909 #define ELF_ARCH	bfd_arch_s390
   3910 #define ELF_TARGET_ID	S390_ELF_DATA
   3911 #define ELF_MACHINE_CODE EM_S390
   3912 #define ELF_MACHINE_ALT1 EM_S390_OLD
   3913 #define ELF_MAXPAGESIZE 0x1000
   3914 
   3915 #define elf_backend_size_info		s390_elf64_size_info
   3916 
   3917 #define elf_backend_can_gc_sections	1
   3918 #define elf_backend_can_refcount	1
   3919 #define elf_backend_want_got_plt	1
   3920 #define elf_backend_plt_readonly	1
   3921 #define elf_backend_want_plt_sym	0
   3922 #define elf_backend_got_header_size	24
   3923 #define elf_backend_rela_normal		1
   3924 
   3925 #define elf_info_to_howto		elf_s390_info_to_howto
   3926 
   3927 #define bfd_elf64_bfd_is_local_label_name     elf_s390_is_local_label_name
   3928 #define bfd_elf64_bfd_link_hash_table_create  elf_s390_link_hash_table_create
   3929 #define bfd_elf64_bfd_reloc_type_lookup	      elf_s390_reloc_type_lookup
   3930 #define bfd_elf64_bfd_reloc_name_lookup       elf_s390_reloc_name_lookup
   3931 #define bfd_elf64_bfd_merge_private_bfd_data  elf64_s390_merge_private_bfd_data
   3932 
   3933 #define elf_backend_adjust_dynamic_symbol     elf_s390_adjust_dynamic_symbol
   3934 #define elf_backend_check_relocs	      elf_s390_check_relocs
   3935 #define elf_backend_copy_indirect_symbol      elf_s390_copy_indirect_symbol
   3936 #define elf_backend_create_dynamic_sections   elf_s390_create_dynamic_sections
   3937 #define elf_backend_finish_dynamic_sections   elf_s390_finish_dynamic_sections
   3938 #define elf_backend_finish_dynamic_symbol     elf_s390_finish_dynamic_symbol
   3939 #define elf_backend_gc_mark_hook	      elf_s390_gc_mark_hook
   3940 #define elf_backend_gc_sweep_hook	      elf_s390_gc_sweep_hook
   3941 #define elf_backend_reloc_type_class	      elf_s390_reloc_type_class
   3942 #define elf_backend_relocate_section	      elf_s390_relocate_section
   3943 #define elf_backend_size_dynamic_sections     elf_s390_size_dynamic_sections
   3944 #define elf_backend_init_index_section	      _bfd_elf_init_1_index_section
   3945 #define elf_backend_plt_sym_val		      elf_s390_plt_sym_val
   3946 #define elf_backend_add_symbol_hook           elf_s390_add_symbol_hook
   3947 #define elf_backend_sort_relocs_p             elf_s390_elf_sort_relocs_p
   3948 
   3949 #define bfd_elf64_mkobject		elf_s390_mkobject
   3950 #define elf_backend_object_p		elf_s390_object_p
   3951 
   3952 #include "elf64-target.h"
   3953