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