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