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