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