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