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