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