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