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