* elf-m10300.c (_bfd_mn10300_elf_adjust_dynamic_symbol): Don't error
[external/binutils.git] / bfd / elf64-s390.c
1 /* IBM S/390-specific support for 64-bit ELF
2    Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
3    2010, 2011, 2012 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   /* We must allocate the symbol in our .dynbss section, which will
1634      become part of the .bss section of the executable.  There will be
1635      an entry for this symbol in the .dynsym section.  The dynamic
1636      object will contain position independent code, so all references
1637      from the dynamic object to this symbol will go through the global
1638      offset table.  The dynamic linker will use the .dynsym entry to
1639      determine the address it must put in the global offset table, so
1640      both the dynamic object and the regular object will refer to the
1641      same memory location for the variable.  */
1642
1643   htab = elf_s390_hash_table (info);
1644   if (htab == NULL)
1645     return FALSE;
1646
1647   /* We must generate a R_390_COPY reloc to tell the dynamic linker to
1648      copy the initial value out of the dynamic object and into the
1649      runtime process image.  */
1650   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
1651     {
1652       htab->srelbss->size += sizeof (Elf64_External_Rela);
1653       h->needs_copy = 1;
1654     }
1655
1656   s = htab->sdynbss;
1657
1658   return _bfd_elf_adjust_dynamic_copy (h, s);
1659 }
1660
1661 /* Allocate space in .plt, .got and associated reloc sections for
1662    dynamic relocs.  */
1663
1664 static bfd_boolean
1665 allocate_dynrelocs (struct elf_link_hash_entry *h,
1666                     void * inf)
1667 {
1668   struct bfd_link_info *info;
1669   struct elf_s390_link_hash_table *htab;
1670   struct elf_s390_link_hash_entry *eh;
1671   struct elf_s390_dyn_relocs *p;
1672
1673   if (h->root.type == bfd_link_hash_indirect)
1674     return TRUE;
1675
1676   info = (struct bfd_link_info *) inf;
1677   htab = elf_s390_hash_table (info);
1678   if (htab == NULL)
1679     return FALSE;
1680
1681   if (htab->elf.dynamic_sections_created
1682       && h->plt.refcount > 0)
1683     {
1684       /* Make sure this symbol is output as a dynamic symbol.
1685          Undefined weak syms won't yet be marked as dynamic.  */
1686       if (h->dynindx == -1
1687           && !h->forced_local)
1688         {
1689           if (! bfd_elf_link_record_dynamic_symbol (info, h))
1690             return FALSE;
1691         }
1692
1693       if (info->shared
1694           || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
1695         {
1696           asection *s = htab->splt;
1697
1698           /* If this is the first .plt entry, make room for the special
1699              first entry.  */
1700           if (s->size == 0)
1701             s->size += PLT_FIRST_ENTRY_SIZE;
1702
1703           h->plt.offset = s->size;
1704
1705           /* If this symbol is not defined in a regular file, and we are
1706              not generating a shared library, then set the symbol to this
1707              location in the .plt.  This is required to make function
1708              pointers compare as equal between the normal executable and
1709              the shared library.  */
1710           if (! info->shared
1711               && !h->def_regular)
1712             {
1713               h->root.u.def.section = s;
1714               h->root.u.def.value = h->plt.offset;
1715             }
1716
1717           /* Make room for this entry.  */
1718           s->size += PLT_ENTRY_SIZE;
1719
1720           /* We also need to make an entry in the .got.plt section, which
1721              will be placed in the .got section by the linker script.  */
1722           htab->sgotplt->size += GOT_ENTRY_SIZE;
1723
1724           /* We also need to make an entry in the .rela.plt section.  */
1725           htab->srelplt->size += sizeof (Elf64_External_Rela);
1726         }
1727       else
1728         {
1729           h->plt.offset = (bfd_vma) -1;
1730           h->needs_plt = 0;
1731           elf_s390_adjust_gotplt((struct elf_s390_link_hash_entry *) h);
1732         }
1733     }
1734   else
1735     {
1736       h->plt.offset = (bfd_vma) -1;
1737       h->needs_plt = 0;
1738       elf_s390_adjust_gotplt((struct elf_s390_link_hash_entry *) h);
1739     }
1740
1741   /* If R_390_TLS_{IE64,GOTIE64,GOTIE12,IEENT} symbol is now local to
1742      the binary, we can optimize a bit. IE64 and GOTIE64 get converted
1743      to R_390_TLS_LE64 requiring no TLS entry. For GOTIE12 and IEENT
1744      we can save the dynamic TLS relocation.  */
1745   if (h->got.refcount > 0
1746       && !info->shared
1747       && h->dynindx == -1
1748       && elf_s390_hash_entry(h)->tls_type >= GOT_TLS_IE)
1749     {
1750       if (elf_s390_hash_entry(h)->tls_type == GOT_TLS_IE_NLT)
1751         /* For the GOTIE access without a literal pool entry the offset has
1752            to be stored somewhere. The immediate value in the instruction
1753            is not bit enough so the value is stored in the got.  */
1754         {
1755           h->got.offset = htab->sgot->size;
1756           htab->sgot->size += GOT_ENTRY_SIZE;
1757         }
1758       else
1759         h->got.offset = (bfd_vma) -1;
1760     }
1761   else if (h->got.refcount > 0)
1762     {
1763       asection *s;
1764       bfd_boolean dyn;
1765       int tls_type = elf_s390_hash_entry(h)->tls_type;
1766
1767       /* Make sure this symbol is output as a dynamic symbol.
1768          Undefined weak syms won't yet be marked as dynamic.  */
1769       if (h->dynindx == -1
1770           && !h->forced_local)
1771         {
1772           if (! bfd_elf_link_record_dynamic_symbol (info, h))
1773             return FALSE;
1774         }
1775
1776       s = htab->sgot;
1777       h->got.offset = s->size;
1778       s->size += GOT_ENTRY_SIZE;
1779       /* R_390_TLS_GD64 needs 2 consecutive GOT slots.  */
1780       if (tls_type == GOT_TLS_GD)
1781         s->size += GOT_ENTRY_SIZE;
1782       dyn = htab->elf.dynamic_sections_created;
1783       /* R_390_TLS_IE64 needs one dynamic relocation,
1784          R_390_TLS_GD64 needs one if local symbol and two if global.  */
1785       if ((tls_type == GOT_TLS_GD && h->dynindx == -1)
1786           || tls_type >= GOT_TLS_IE)
1787         htab->srelgot->size += sizeof (Elf64_External_Rela);
1788       else if (tls_type == GOT_TLS_GD)
1789         htab->srelgot->size += 2 * sizeof (Elf64_External_Rela);
1790       else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
1791                 || h->root.type != bfd_link_hash_undefweak)
1792                && (info->shared
1793                    || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
1794         htab->srelgot->size += sizeof (Elf64_External_Rela);
1795     }
1796   else
1797     h->got.offset = (bfd_vma) -1;
1798
1799   eh = (struct elf_s390_link_hash_entry *) h;
1800   if (eh->dyn_relocs == NULL)
1801     return TRUE;
1802
1803   /* In the shared -Bsymbolic case, discard space allocated for
1804      dynamic pc-relative relocs against symbols which turn out to be
1805      defined in regular objects.  For the normal shared case, discard
1806      space for pc-relative relocs that have become local due to symbol
1807      visibility changes.  */
1808
1809   if (info->shared)
1810     {
1811       if (SYMBOL_CALLS_LOCAL (info, h))
1812         {
1813           struct elf_s390_dyn_relocs **pp;
1814
1815           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
1816             {
1817               p->count -= p->pc_count;
1818               p->pc_count = 0;
1819               if (p->count == 0)
1820                 *pp = p->next;
1821               else
1822                 pp = &p->next;
1823             }
1824         }
1825
1826       /* Also discard relocs on undefined weak syms with non-default
1827          visibility.  */
1828       if (eh->dyn_relocs != NULL
1829           && h->root.type == bfd_link_hash_undefweak)
1830         {
1831           if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
1832             eh->dyn_relocs = NULL;
1833
1834           /* Make sure undefined weak symbols are output as a dynamic
1835              symbol in PIEs.  */
1836           else if (h->dynindx == -1
1837                    && !h->forced_local)
1838             {
1839               if (! bfd_elf_link_record_dynamic_symbol (info, h))
1840                 return FALSE;
1841             }
1842         }
1843     }
1844   else if (ELIMINATE_COPY_RELOCS)
1845     {
1846       /* For the non-shared case, discard space for relocs against
1847          symbols which turn out to need copy relocs or are not
1848          dynamic.  */
1849
1850       if (!h->non_got_ref
1851           && ((h->def_dynamic
1852                && !h->def_regular)
1853               || (htab->elf.dynamic_sections_created
1854                   && (h->root.type == bfd_link_hash_undefweak
1855                       || h->root.type == bfd_link_hash_undefined))))
1856         {
1857           /* Make sure this symbol is output as a dynamic symbol.
1858              Undefined weak syms won't yet be marked as dynamic.  */
1859           if (h->dynindx == -1
1860               && !h->forced_local)
1861             {
1862               if (! bfd_elf_link_record_dynamic_symbol (info, h))
1863                 return FALSE;
1864             }
1865
1866           /* If that succeeded, we know we'll be keeping all the
1867              relocs.  */
1868           if (h->dynindx != -1)
1869             goto keep;
1870         }
1871
1872       eh->dyn_relocs = NULL;
1873
1874     keep: ;
1875     }
1876
1877   /* Finally, allocate space.  */
1878   for (p = eh->dyn_relocs; p != NULL; p = p->next)
1879     {
1880       asection *sreloc = elf_section_data (p->sec)->sreloc;
1881       sreloc->size += p->count * sizeof (Elf64_External_Rela);
1882     }
1883
1884   return TRUE;
1885 }
1886
1887 /* Find any dynamic relocs that apply to read-only sections.  */
1888
1889 static bfd_boolean
1890 readonly_dynrelocs (h, inf)
1891      struct elf_link_hash_entry *h;
1892      PTR inf;
1893 {
1894   struct elf_s390_link_hash_entry *eh;
1895   struct elf_s390_dyn_relocs *p;
1896
1897   eh = (struct elf_s390_link_hash_entry *) h;
1898   for (p = eh->dyn_relocs; p != NULL; p = p->next)
1899     {
1900       asection *s = p->sec->output_section;
1901
1902       if (s != NULL && (s->flags & SEC_READONLY) != 0)
1903         {
1904           struct bfd_link_info *info = (struct bfd_link_info *) inf;
1905
1906           info->flags |= DF_TEXTREL;
1907
1908           /* Not an error, just cut short the traversal.  */
1909           return FALSE;
1910         }
1911     }
1912   return TRUE;
1913 }
1914
1915 /* Set the sizes of the dynamic sections.  */
1916
1917 static bfd_boolean
1918 elf_s390_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
1919                                 struct bfd_link_info *info)
1920 {
1921   struct elf_s390_link_hash_table *htab;
1922   bfd *dynobj;
1923   asection *s;
1924   bfd_boolean relocs;
1925   bfd *ibfd;
1926
1927   htab = elf_s390_hash_table (info);
1928   if (htab == NULL)
1929     return FALSE;
1930
1931   dynobj = htab->elf.dynobj;
1932   if (dynobj == NULL)
1933     abort ();
1934
1935   if (htab->elf.dynamic_sections_created)
1936     {
1937       /* Set the contents of the .interp section to the interpreter.  */
1938       if (info->executable)
1939         {
1940           s = bfd_get_section_by_name (dynobj, ".interp");
1941           if (s == NULL)
1942             abort ();
1943           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
1944           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1945         }
1946     }
1947
1948   /* Set up .got offsets for local syms, and space for local dynamic
1949      relocs.  */
1950   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
1951     {
1952       bfd_signed_vma *local_got;
1953       bfd_signed_vma *end_local_got;
1954       char *local_tls_type;
1955       bfd_size_type locsymcount;
1956       Elf_Internal_Shdr *symtab_hdr;
1957       asection *srela;
1958
1959       if (! is_s390_elf (ibfd))
1960         continue;
1961
1962       for (s = ibfd->sections; s != NULL; s = s->next)
1963         {
1964           struct elf_s390_dyn_relocs *p;
1965
1966           for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
1967             {
1968               if (!bfd_is_abs_section (p->sec)
1969                   && bfd_is_abs_section (p->sec->output_section))
1970                 {
1971                   /* Input section has been discarded, either because
1972                      it is a copy of a linkonce section or due to
1973                      linker script /DISCARD/, so we'll be discarding
1974                      the relocs too.  */
1975                 }
1976               else if (p->count != 0)
1977                 {
1978                   srela = elf_section_data (p->sec)->sreloc;
1979                   srela->size += p->count * sizeof (Elf64_External_Rela);
1980                   if ((p->sec->output_section->flags & SEC_READONLY) != 0)
1981                     info->flags |= DF_TEXTREL;
1982                 }
1983             }
1984         }
1985
1986       local_got = elf_local_got_refcounts (ibfd);
1987       if (!local_got)
1988         continue;
1989
1990       symtab_hdr = &elf_symtab_hdr (ibfd);
1991       locsymcount = symtab_hdr->sh_info;
1992       end_local_got = local_got + locsymcount;
1993       local_tls_type = elf_s390_local_got_tls_type (ibfd);
1994       s = htab->sgot;
1995       srela = htab->srelgot;
1996       for (; local_got < end_local_got; ++local_got, ++local_tls_type)
1997         {
1998           if (*local_got > 0)
1999             {
2000               *local_got = s->size;
2001               s->size += GOT_ENTRY_SIZE;
2002               if (*local_tls_type == GOT_TLS_GD)
2003                 s->size += GOT_ENTRY_SIZE;
2004               if (info->shared)
2005                 srela->size += sizeof (Elf64_External_Rela);
2006             }
2007           else
2008             *local_got = (bfd_vma) -1;
2009         }
2010     }
2011
2012   if (htab->tls_ldm_got.refcount > 0)
2013     {
2014       /* Allocate 2 got entries and 1 dynamic reloc for R_390_TLS_LDM64
2015          relocs.  */
2016       htab->tls_ldm_got.offset = htab->sgot->size;
2017       htab->sgot->size += 2 * GOT_ENTRY_SIZE;
2018       htab->srelgot->size += sizeof (Elf64_External_Rela);
2019     }
2020   else
2021     htab->tls_ldm_got.offset = -1;
2022
2023   /* Allocate global sym .plt and .got entries, and space for global
2024      sym dynamic relocs.  */
2025   elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, (PTR) info);
2026
2027   /* We now have determined the sizes of the various dynamic sections.
2028      Allocate memory for them.  */
2029   relocs = FALSE;
2030   for (s = dynobj->sections; s != NULL; s = s->next)
2031     {
2032       if ((s->flags & SEC_LINKER_CREATED) == 0)
2033         continue;
2034
2035       if (s == htab->splt
2036           || s == htab->sgot
2037           || s == htab->sgotplt
2038           || s == htab->sdynbss)
2039         {
2040           /* Strip this section if we don't need it; see the
2041              comment below.  */
2042         }
2043       else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
2044         {
2045           if (s->size != 0 && s != htab->srelplt)
2046             relocs = TRUE;
2047
2048           /* We use the reloc_count field as a counter if we need
2049              to copy relocs into the output file.  */
2050           s->reloc_count = 0;
2051         }
2052       else
2053         {
2054           /* It's not one of our sections, so don't allocate space.  */
2055           continue;
2056         }
2057
2058       if (s->size == 0)
2059         {
2060           /* If we don't need this section, strip it from the
2061              output file.  This is to handle .rela.bss and
2062              .rela.plt.  We must create it in
2063              create_dynamic_sections, because it must be created
2064              before the linker maps input sections to output
2065              sections.  The linker does that before
2066              adjust_dynamic_symbol is called, and it is that
2067              function which decides whether anything needs to go
2068              into these sections.  */
2069
2070           s->flags |= SEC_EXCLUDE;
2071           continue;
2072         }
2073
2074       if ((s->flags & SEC_HAS_CONTENTS) == 0)
2075         continue;
2076
2077       /* Allocate memory for the section contents.  We use bfd_zalloc
2078          here in case unused entries are not reclaimed before the
2079          section's contents are written out.  This should not happen,
2080          but this way if it does, we get a R_390_NONE reloc instead
2081          of garbage.  */
2082       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
2083       if (s->contents == NULL)
2084         return FALSE;
2085     }
2086
2087   if (htab->elf.dynamic_sections_created)
2088     {
2089       /* Add some entries to the .dynamic section.  We fill in the
2090          values later, in elf_s390_finish_dynamic_sections, but we
2091          must add the entries now so that we get the correct size for
2092          the .dynamic section.  The DT_DEBUG entry is filled in by the
2093          dynamic linker and used by the debugger.  */
2094 #define add_dynamic_entry(TAG, VAL) \
2095   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2096
2097       if (info->executable)
2098         {
2099           if (!add_dynamic_entry (DT_DEBUG, 0))
2100             return FALSE;
2101         }
2102
2103       if (htab->splt->size != 0)
2104         {
2105           if (!add_dynamic_entry (DT_PLTGOT, 0)
2106               || !add_dynamic_entry (DT_PLTRELSZ, 0)
2107               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
2108               || !add_dynamic_entry (DT_JMPREL, 0))
2109             return FALSE;
2110         }
2111
2112       if (relocs)
2113         {
2114           if (!add_dynamic_entry (DT_RELA, 0)
2115               || !add_dynamic_entry (DT_RELASZ, 0)
2116               || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
2117             return FALSE;
2118
2119           /* If any dynamic relocs apply to a read-only section,
2120              then we need a DT_TEXTREL entry.  */
2121           if ((info->flags & DF_TEXTREL) == 0)
2122             elf_link_hash_traverse (&htab->elf, readonly_dynrelocs,
2123                                     (PTR) info);
2124
2125           if ((info->flags & DF_TEXTREL) != 0)
2126             {
2127               if (!add_dynamic_entry (DT_TEXTREL, 0))
2128                 return FALSE;
2129             }
2130         }
2131     }
2132 #undef add_dynamic_entry
2133
2134   return TRUE;
2135 }
2136
2137 /* Return the base VMA address which should be subtracted from real addresses
2138    when resolving @dtpoff relocation.
2139    This is PT_TLS segment p_vaddr.  */
2140
2141 static bfd_vma
2142 dtpoff_base (info)
2143      struct bfd_link_info *info;
2144 {
2145   /* If tls_sec is NULL, we should have signalled an error already.  */
2146   if (elf_hash_table (info)->tls_sec == NULL)
2147     return 0;
2148   return elf_hash_table (info)->tls_sec->vma;
2149 }
2150
2151 /* Return the relocation value for @tpoff relocation
2152    if STT_TLS virtual address is ADDRESS.  */
2153
2154 static bfd_vma
2155 tpoff (info, address)
2156      struct bfd_link_info *info;
2157      bfd_vma address;
2158 {
2159   struct elf_link_hash_table *htab = elf_hash_table (info);
2160
2161   /* If tls_sec is NULL, we should have signalled an error already.  */
2162   if (htab->tls_sec == NULL)
2163     return 0;
2164   return htab->tls_size + htab->tls_sec->vma - address;
2165 }
2166
2167 /* Complain if TLS instruction relocation is against an invalid
2168    instruction.  */
2169
2170 static void
2171 invalid_tls_insn (input_bfd, input_section, rel)
2172      bfd *input_bfd;
2173      asection *input_section;
2174      Elf_Internal_Rela *rel;
2175 {
2176   reloc_howto_type *howto;
2177
2178   howto = elf_howto_table + ELF64_R_TYPE (rel->r_info);
2179   (*_bfd_error_handler)
2180     (_("%B(%A+0x%lx): invalid instruction for TLS relocation %s"),
2181      input_bfd,
2182      input_section,
2183      (long) rel->r_offset,
2184      howto->name);
2185   bfd_set_error (bfd_error_bad_value);
2186 }
2187
2188 /* Relocate a 390 ELF section.  */
2189
2190 static bfd_boolean
2191 elf_s390_relocate_section (bfd *output_bfd,
2192                            struct bfd_link_info *info,
2193                            bfd *input_bfd,
2194                            asection *input_section,
2195                            bfd_byte *contents,
2196                            Elf_Internal_Rela *relocs,
2197                            Elf_Internal_Sym *local_syms,
2198                            asection **local_sections)
2199 {
2200   struct elf_s390_link_hash_table *htab;
2201   Elf_Internal_Shdr *symtab_hdr;
2202   struct elf_link_hash_entry **sym_hashes;
2203   bfd_vma *local_got_offsets;
2204   Elf_Internal_Rela *rel;
2205   Elf_Internal_Rela *relend;
2206
2207   BFD_ASSERT (is_s390_elf (input_bfd));
2208
2209   htab = elf_s390_hash_table (info);
2210   if (htab == NULL)
2211     return FALSE;
2212
2213   symtab_hdr = &elf_symtab_hdr (input_bfd);
2214   sym_hashes = elf_sym_hashes (input_bfd);
2215   local_got_offsets = elf_local_got_offsets (input_bfd);
2216
2217   rel = relocs;
2218   relend = relocs + input_section->reloc_count;
2219   for (; rel < relend; rel++)
2220     {
2221       unsigned int r_type;
2222       reloc_howto_type *howto;
2223       unsigned long r_symndx;
2224       struct elf_link_hash_entry *h;
2225       Elf_Internal_Sym *sym;
2226       asection *sec;
2227       bfd_vma off;
2228       bfd_vma relocation;
2229       bfd_boolean unresolved_reloc;
2230       bfd_reloc_status_type r;
2231       int tls_type;
2232
2233       r_type = ELF64_R_TYPE (rel->r_info);
2234       if (r_type == (int) R_390_GNU_VTINHERIT
2235           || r_type == (int) R_390_GNU_VTENTRY)
2236         continue;
2237       if (r_type >= (int) R_390_max)
2238         {
2239           bfd_set_error (bfd_error_bad_value);
2240           return FALSE;
2241         }
2242
2243       howto = elf_howto_table + r_type;
2244       r_symndx = ELF64_R_SYM (rel->r_info);
2245
2246       h = NULL;
2247       sym = NULL;
2248       sec = NULL;
2249       unresolved_reloc = FALSE;
2250       if (r_symndx < symtab_hdr->sh_info)
2251         {
2252           sym = local_syms + r_symndx;
2253           sec = local_sections[r_symndx];
2254           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
2255         }
2256       else
2257         {
2258           bfd_boolean warned ATTRIBUTE_UNUSED;
2259
2260           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2261                                    r_symndx, symtab_hdr, sym_hashes,
2262                                    h, sec, relocation,
2263                                    unresolved_reloc, warned);
2264         }
2265
2266       if (sec != NULL && elf_discarded_section (sec))
2267         RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
2268                                          rel, relend, howto, contents);
2269
2270       if (info->relocatable)
2271         continue;
2272
2273       switch (r_type)
2274         {
2275         case R_390_GOTPLT12:
2276         case R_390_GOTPLT16:
2277         case R_390_GOTPLT20:
2278         case R_390_GOTPLT32:
2279         case R_390_GOTPLT64:
2280         case R_390_GOTPLTENT:
2281           /* There are three cases for a GOTPLT relocation. 1) The
2282              relocation is against the jump slot entry of a plt that
2283              will get emitted to the output file. 2) The relocation
2284              is against the jump slot of a plt entry that has been
2285              removed. elf_s390_adjust_gotplt has created a GOT entry
2286              as replacement. 3) The relocation is against a local symbol.
2287              Cases 2) and 3) are the same as the GOT relocation code
2288              so we just have to test for case 1 and fall through for
2289              the other two.  */
2290           if (h != NULL && h->plt.offset != (bfd_vma) -1)
2291             {
2292               bfd_vma plt_index;
2293
2294               /* Calc. index no.
2295                  Current offset - size first entry / entry size.  */
2296               plt_index = (h->plt.offset - PLT_FIRST_ENTRY_SIZE) /
2297                 PLT_ENTRY_SIZE;
2298
2299               /* Offset in GOT is PLT index plus GOT headers(3) times 4,
2300                  addr & GOT addr.  */
2301               relocation = (plt_index + 3) * GOT_ENTRY_SIZE;
2302               unresolved_reloc = FALSE;
2303
2304               if (r_type == R_390_GOTPLTENT)
2305                 relocation += htab->sgot->output_section->vma;
2306               break;
2307             }
2308           /* Fall through.  */
2309
2310         case R_390_GOT12:
2311         case R_390_GOT16:
2312         case R_390_GOT20:
2313         case R_390_GOT32:
2314         case R_390_GOT64:
2315         case R_390_GOTENT:
2316           /* Relocation is to the entry for this symbol in the global
2317              offset table.  */
2318           if (htab->sgot == NULL)
2319             abort ();
2320
2321           if (h != NULL)
2322             {
2323               bfd_boolean dyn;
2324
2325               off = h->got.offset;
2326               dyn = htab->elf.dynamic_sections_created;
2327               if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
2328                   || (info->shared
2329                       && SYMBOL_REFERENCES_LOCAL (info, h))
2330                   || (ELF_ST_VISIBILITY (h->other)
2331                       && h->root.type == bfd_link_hash_undefweak))
2332                 {
2333                   /* This is actually a static link, or it is a
2334                      -Bsymbolic link and the symbol is defined
2335                      locally, or the symbol was forced to be local
2336                      because of a version file.  We must initialize
2337                      this entry in the global offset table.  Since the
2338                      offset must always be a multiple of 2, we use the
2339                      least significant bit to record whether we have
2340                      initialized it already.
2341
2342                      When doing a dynamic link, we create a .rel.got
2343                      relocation entry to initialize the value.  This
2344                      is done in the finish_dynamic_symbol routine.  */
2345                   if ((off & 1) != 0)
2346                     off &= ~1;
2347                   else
2348                     {
2349                       bfd_put_64 (output_bfd, relocation,
2350                                   htab->sgot->contents + off);
2351                       h->got.offset |= 1;
2352                     }
2353                 }
2354               else
2355                 unresolved_reloc = FALSE;
2356             }
2357           else
2358             {
2359               if (local_got_offsets == NULL)
2360                 abort ();
2361
2362               off = local_got_offsets[r_symndx];
2363
2364               /* The offset must always be a multiple of 8.  We use
2365                  the least significant bit to record whether we have
2366                  already generated the necessary reloc.  */
2367               if ((off & 1) != 0)
2368                 off &= ~1;
2369               else
2370                 {
2371                   bfd_put_64 (output_bfd, relocation,
2372                               htab->sgot->contents + off);
2373
2374                   if (info->shared)
2375                     {
2376                       asection *s;
2377                       Elf_Internal_Rela outrel;
2378                       bfd_byte *loc;
2379
2380                       s = htab->srelgot;
2381                       if (s == NULL)
2382                         abort ();
2383
2384                       outrel.r_offset = (htab->sgot->output_section->vma
2385                                          + htab->sgot->output_offset
2386                                          + off);
2387                       outrel.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
2388                       outrel.r_addend = relocation;
2389                       loc = s->contents;
2390                       loc += s->reloc_count++ * sizeof (Elf64_External_Rela);
2391                       bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2392                     }
2393
2394                   local_got_offsets[r_symndx] |= 1;
2395                 }
2396             }
2397
2398           if (off >= (bfd_vma) -2)
2399             abort ();
2400
2401           relocation = htab->sgot->output_offset + off;
2402
2403           /* For @GOTENT the relocation is against the offset between
2404              the instruction and the symbols entry in the GOT and not
2405              between the start of the GOT and the symbols entry. We
2406              add the vma of the GOT to get the correct value.  */
2407           if (   r_type == R_390_GOTENT
2408               || r_type == R_390_GOTPLTENT)
2409             relocation += htab->sgot->output_section->vma;
2410
2411           break;
2412
2413         case R_390_GOTOFF16:
2414         case R_390_GOTOFF32:
2415         case R_390_GOTOFF64:
2416           /* Relocation is relative to the start of the global offset
2417              table.  */
2418
2419           /* Note that sgot->output_offset is not involved in this
2420              calculation.  We always want the start of .got.  If we
2421              defined _GLOBAL_OFFSET_TABLE in a different way, as is
2422              permitted by the ABI, we might have to change this
2423              calculation.  */
2424           relocation -= htab->sgot->output_section->vma;
2425           break;
2426
2427         case R_390_GOTPC:
2428         case R_390_GOTPCDBL:
2429           /* Use global offset table as symbol value.  */
2430           relocation = htab->sgot->output_section->vma;
2431           unresolved_reloc = FALSE;
2432           break;
2433
2434         case R_390_PLT16DBL:
2435         case R_390_PLT32:
2436         case R_390_PLT32DBL:
2437         case R_390_PLT64:
2438           /* Relocation is to the entry for this symbol in the
2439              procedure linkage table.  */
2440
2441           /* Resolve a PLT32 reloc against a local symbol directly,
2442              without using the procedure linkage table.  */
2443           if (h == NULL)
2444             break;
2445
2446           if (h->plt.offset == (bfd_vma) -1
2447               || htab->splt == NULL)
2448             {
2449               /* We didn't make a PLT entry for this symbol.  This
2450                  happens when statically linking PIC code, or when
2451                  using -Bsymbolic.  */
2452               break;
2453             }
2454
2455           relocation = (htab->splt->output_section->vma
2456                         + htab->splt->output_offset
2457                         + h->plt.offset);
2458           unresolved_reloc = FALSE;
2459           break;
2460
2461         case R_390_PLTOFF16:
2462         case R_390_PLTOFF32:
2463         case R_390_PLTOFF64:
2464           /* Relocation is to the entry for this symbol in the
2465              procedure linkage table relative to the start of the GOT.  */
2466
2467           /* For local symbols or if we didn't make a PLT entry for
2468              this symbol resolve the symbol directly.  */
2469           if (   h == NULL
2470               || h->plt.offset == (bfd_vma) -1
2471               || htab->splt == NULL)
2472             {
2473               relocation -= htab->sgot->output_section->vma;
2474               break;
2475             }
2476
2477           relocation = (htab->splt->output_section->vma
2478                         + htab->splt->output_offset
2479                         + h->plt.offset
2480                         - htab->sgot->output_section->vma);
2481           unresolved_reloc = FALSE;
2482           break;
2483
2484         case R_390_8:
2485         case R_390_16:
2486         case R_390_32:
2487         case R_390_64:
2488         case R_390_PC16:
2489         case R_390_PC16DBL:
2490         case R_390_PC32:
2491         case R_390_PC32DBL:
2492         case R_390_PC64:
2493           if ((input_section->flags & SEC_ALLOC) == 0)
2494             break;
2495
2496           if ((info->shared
2497                && (h == NULL
2498                    || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2499                    || h->root.type != bfd_link_hash_undefweak)
2500                && ((r_type != R_390_PC16
2501                     && r_type != R_390_PC16DBL
2502                     && r_type != R_390_PC32
2503                     && r_type != R_390_PC32DBL
2504                     && r_type != R_390_PC64)
2505                    || !SYMBOL_CALLS_LOCAL (info, h)))
2506               || (ELIMINATE_COPY_RELOCS
2507                   && !info->shared
2508                   && h != NULL
2509                   && h->dynindx != -1
2510                   && !h->non_got_ref
2511                   && ((h->def_dynamic
2512                        && !h->def_regular)
2513                       || h->root.type == bfd_link_hash_undefweak
2514                       || h->root.type == bfd_link_hash_undefined)))
2515             {
2516               Elf_Internal_Rela outrel;
2517               bfd_boolean skip, relocate;
2518               asection *sreloc;
2519               bfd_byte *loc;
2520
2521               /* When generating a shared object, these relocations
2522                  are copied into the output file to be resolved at run
2523                  time.  */
2524               skip = FALSE;
2525               relocate = FALSE;
2526
2527               outrel.r_offset =
2528                 _bfd_elf_section_offset (output_bfd, info, input_section,
2529                                          rel->r_offset);
2530               if (outrel.r_offset == (bfd_vma) -1)
2531                 skip = TRUE;
2532               else if (outrel.r_offset == (bfd_vma) -2)
2533                 skip = TRUE, relocate = TRUE;
2534
2535               outrel.r_offset += (input_section->output_section->vma
2536                                   + input_section->output_offset);
2537
2538               if (skip)
2539                 memset (&outrel, 0, sizeof outrel);
2540               else if (h != NULL
2541                        && h->dynindx != -1
2542                        && (r_type == R_390_PC16
2543                            || r_type == R_390_PC16DBL
2544                            || r_type == R_390_PC32
2545                            || r_type == R_390_PC32DBL
2546                            || r_type == R_390_PC64
2547                            || !info->shared
2548                            || !SYMBOLIC_BIND (info, h)
2549                            || !h->def_regular))
2550                 {
2551                   outrel.r_info = ELF64_R_INFO (h->dynindx, r_type);
2552                   outrel.r_addend = rel->r_addend;
2553                 }
2554               else
2555                 {
2556                   /* This symbol is local, or marked to become local.  */
2557                   outrel.r_addend = relocation + rel->r_addend;
2558                   if (r_type == R_390_64)
2559                     {
2560                       relocate = TRUE;
2561                       outrel.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
2562                     }
2563                   else
2564                     {
2565                       long sindx;
2566
2567                       if (bfd_is_abs_section (sec))
2568                         sindx = 0;
2569                       else if (sec == NULL || sec->owner == NULL)
2570                         {
2571                           bfd_set_error(bfd_error_bad_value);
2572                           return FALSE;
2573                         }
2574                       else
2575                         {
2576                           asection *osec;
2577
2578                           osec = sec->output_section;
2579                           sindx = elf_section_data (osec)->dynindx;
2580
2581                           if (sindx == 0)
2582                             {
2583                               osec = htab->elf.text_index_section;
2584                               sindx = elf_section_data (osec)->dynindx;
2585                             }
2586                           BFD_ASSERT (sindx != 0);
2587
2588                           /* We are turning this relocation into one
2589                              against a section symbol, so subtract out
2590                              the output section's address but not the
2591                              offset of the input section in the output
2592                              section.  */
2593                           outrel.r_addend -= osec->vma;
2594                         }
2595                       outrel.r_info = ELF64_R_INFO (sindx, r_type);
2596                     }
2597                 }
2598
2599               sreloc = elf_section_data (input_section)->sreloc;
2600               if (sreloc == NULL)
2601                 abort ();
2602
2603               loc = sreloc->contents;
2604               loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
2605               bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2606
2607               /* If this reloc is against an external symbol, we do
2608                  not want to fiddle with the addend.  Otherwise, we
2609                  need to include the symbol value so that it becomes
2610                  an addend for the dynamic reloc.  */
2611               if (! relocate)
2612                 continue;
2613             }
2614
2615           break;
2616
2617           /* Relocations for tls literal pool entries.  */
2618         case R_390_TLS_IE64:
2619           if (info->shared)
2620             {
2621               Elf_Internal_Rela outrel;
2622               asection *sreloc;
2623               bfd_byte *loc;
2624
2625               outrel.r_offset = rel->r_offset
2626                                 + input_section->output_section->vma
2627                                 + input_section->output_offset;
2628               outrel.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
2629               sreloc = elf_section_data (input_section)->sreloc;
2630               if (sreloc == NULL)
2631                 abort ();
2632               loc = sreloc->contents;
2633               loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
2634               bfd_elf64_swap_reloc_out (output_bfd, &outrel, loc);
2635             }
2636           /* Fall through.  */
2637
2638         case R_390_TLS_GD64:
2639         case R_390_TLS_GOTIE64:
2640           r_type = elf_s390_tls_transition (info, r_type, h == NULL);
2641           tls_type = GOT_UNKNOWN;
2642           if (h == NULL && local_got_offsets)
2643             tls_type = elf_s390_local_got_tls_type (input_bfd) [r_symndx];
2644           else if (h != NULL)
2645             {
2646               tls_type = elf_s390_hash_entry(h)->tls_type;
2647               if (!info->shared && h->dynindx == -1 && tls_type >= GOT_TLS_IE)
2648                 r_type = R_390_TLS_LE64;
2649             }
2650           if (r_type == R_390_TLS_GD64 && tls_type >= GOT_TLS_IE)
2651             r_type = R_390_TLS_IE64;
2652
2653           if (r_type == R_390_TLS_LE64)
2654             {
2655               /* This relocation gets optimized away by the local exec
2656                  access optimization.  */
2657               BFD_ASSERT (! unresolved_reloc);
2658               bfd_put_64 (output_bfd, -tpoff (info, relocation),
2659                           contents + rel->r_offset);
2660               continue;
2661             }
2662
2663           if (htab->sgot == NULL)
2664             abort ();
2665
2666           if (h != NULL)
2667             off = h->got.offset;
2668           else
2669             {
2670               if (local_got_offsets == NULL)
2671                 abort ();
2672
2673               off = local_got_offsets[r_symndx];
2674             }
2675
2676         emit_tls_relocs:
2677
2678           if ((off & 1) != 0)
2679             off &= ~1;
2680           else
2681             {
2682               Elf_Internal_Rela outrel;
2683               bfd_byte *loc;
2684               int dr_type, indx;
2685
2686               if (htab->srelgot == NULL)
2687                 abort ();
2688
2689               outrel.r_offset = (htab->sgot->output_section->vma
2690                                  + htab->sgot->output_offset + off);
2691
2692               indx = h && h->dynindx != -1 ? h->dynindx : 0;
2693               if (r_type == R_390_TLS_GD64)
2694                 dr_type = R_390_TLS_DTPMOD;
2695               else
2696                 dr_type = R_390_TLS_TPOFF;
2697               if (dr_type == R_390_TLS_TPOFF && indx == 0)
2698                 outrel.r_addend = relocation - dtpoff_base (info);
2699               else
2700                 outrel.r_addend = 0;
2701               outrel.r_info = ELF64_R_INFO (indx, dr_type);
2702               loc = htab->srelgot->contents;
2703               loc += htab->srelgot->reloc_count++
2704                 * sizeof (Elf64_External_Rela);
2705               bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2706
2707               if (r_type == R_390_TLS_GD64)
2708                 {
2709                   if (indx == 0)
2710                     {
2711                       BFD_ASSERT (! unresolved_reloc);
2712                       bfd_put_64 (output_bfd,
2713                                   relocation - dtpoff_base (info),
2714                                   htab->sgot->contents + off + GOT_ENTRY_SIZE);
2715                     }
2716                   else
2717                     {
2718                       outrel.r_info = ELF64_R_INFO (indx, R_390_TLS_DTPOFF);
2719                       outrel.r_offset += GOT_ENTRY_SIZE;
2720                       outrel.r_addend = 0;
2721                       htab->srelgot->reloc_count++;
2722                       loc += sizeof (Elf64_External_Rela);
2723                       bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2724                     }
2725                 }
2726
2727               if (h != NULL)
2728                 h->got.offset |= 1;
2729               else
2730                 local_got_offsets[r_symndx] |= 1;
2731             }
2732
2733           if (off >= (bfd_vma) -2)
2734             abort ();
2735           if (r_type == ELF64_R_TYPE (rel->r_info))
2736             {
2737               relocation = htab->sgot->output_offset + off;
2738               if (r_type == R_390_TLS_IE64 || r_type == R_390_TLS_IEENT)
2739                 relocation += htab->sgot->output_section->vma;
2740               unresolved_reloc = FALSE;
2741             }
2742           else
2743             {
2744               bfd_put_64 (output_bfd, htab->sgot->output_offset + off,
2745                           contents + rel->r_offset);
2746               continue;
2747             }
2748           break;
2749
2750         case R_390_TLS_GOTIE12:
2751         case R_390_TLS_GOTIE20:
2752         case R_390_TLS_IEENT:
2753           if (h == NULL)
2754             {
2755               if (local_got_offsets == NULL)
2756                 abort();
2757               off = local_got_offsets[r_symndx];
2758               if (info->shared)
2759                 goto emit_tls_relocs;
2760             }
2761           else
2762             {
2763               off = h->got.offset;
2764               tls_type = elf_s390_hash_entry(h)->tls_type;
2765               if (info->shared || h->dynindx != -1 || tls_type < GOT_TLS_IE)
2766                 goto emit_tls_relocs;
2767             }
2768
2769           if (htab->sgot == NULL)
2770             abort ();
2771
2772           BFD_ASSERT (! unresolved_reloc);
2773           bfd_put_64 (output_bfd, -tpoff (info, relocation),
2774                       htab->sgot->contents + off);
2775           relocation = htab->sgot->output_offset + off;
2776           if (r_type == R_390_TLS_IEENT)
2777             relocation += htab->sgot->output_section->vma;
2778           unresolved_reloc = FALSE;
2779           break;
2780
2781         case R_390_TLS_LDM64:
2782           if (! info->shared)
2783             /* The literal pool entry this relocation refers to gets ignored
2784                by the optimized code of the local exec model. Do nothing
2785                and the value will turn out zero.  */
2786             continue;
2787
2788           if (htab->sgot == NULL)
2789             abort ();
2790
2791           off = htab->tls_ldm_got.offset;
2792           if (off & 1)
2793             off &= ~1;
2794           else
2795             {
2796               Elf_Internal_Rela outrel;
2797               bfd_byte *loc;
2798
2799               if (htab->srelgot == NULL)
2800                 abort ();
2801
2802               outrel.r_offset = (htab->sgot->output_section->vma
2803                                  + htab->sgot->output_offset + off);
2804
2805               bfd_put_64 (output_bfd, 0,
2806                           htab->sgot->contents + off + GOT_ENTRY_SIZE);
2807               outrel.r_info = ELF64_R_INFO (0, R_390_TLS_DTPMOD);
2808               outrel.r_addend = 0;
2809               loc = htab->srelgot->contents;
2810               loc += htab->srelgot->reloc_count++
2811                 * sizeof (Elf64_External_Rela);
2812               bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2813               htab->tls_ldm_got.offset |= 1;
2814             }
2815           relocation = htab->sgot->output_offset + off;
2816           unresolved_reloc = FALSE;
2817           break;
2818
2819         case R_390_TLS_LE64:
2820           if (info->shared)
2821             {
2822               /* Linking a shared library with non-fpic code requires
2823                  a R_390_TLS_TPOFF relocation.  */
2824               Elf_Internal_Rela outrel;
2825               asection *sreloc;
2826               bfd_byte *loc;
2827               int indx;
2828
2829               outrel.r_offset = rel->r_offset
2830                                 + input_section->output_section->vma
2831                                 + input_section->output_offset;
2832               if (h != NULL && h->dynindx != -1)
2833                 indx = h->dynindx;
2834               else
2835                 indx = 0;
2836               outrel.r_info = ELF64_R_INFO (indx, R_390_TLS_TPOFF);
2837               if (indx == 0)
2838                 outrel.r_addend = relocation - dtpoff_base (info);
2839               else
2840                 outrel.r_addend = 0;
2841               sreloc = elf_section_data (input_section)->sreloc;
2842               if (sreloc == NULL)
2843                 abort ();
2844               loc = sreloc->contents;
2845               loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
2846               bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2847             }
2848           else
2849             {
2850               BFD_ASSERT (! unresolved_reloc);
2851               bfd_put_64 (output_bfd, -tpoff (info, relocation),
2852                           contents + rel->r_offset);
2853             }
2854           continue;
2855
2856         case R_390_TLS_LDO64:
2857           if (info->shared || (input_section->flags & SEC_DEBUGGING))
2858             relocation -= dtpoff_base (info);
2859           else
2860             /* When converting LDO to LE, we must negate.  */
2861             relocation = -tpoff (info, relocation);
2862           break;
2863
2864           /* Relocations for tls instructions.  */
2865         case R_390_TLS_LOAD:
2866         case R_390_TLS_GDCALL:
2867         case R_390_TLS_LDCALL:
2868           tls_type = GOT_UNKNOWN;
2869           if (h == NULL && local_got_offsets)
2870             tls_type = elf_s390_local_got_tls_type (input_bfd) [r_symndx];
2871           else if (h != NULL)
2872             tls_type = elf_s390_hash_entry(h)->tls_type;
2873
2874           if (tls_type == GOT_TLS_GD)
2875             continue;
2876
2877           if (r_type == R_390_TLS_LOAD)
2878             {
2879               if (!info->shared && (h == NULL || h->dynindx == -1))
2880                 {
2881                   /* IE->LE transition. Four valid cases:
2882                      lg %rx,(0,%ry)    -> sllg %rx,%ry,0
2883                      lg %rx,(%ry,0)    -> sllg %rx,%ry,0
2884                      lg %rx,(%ry,%r12) -> sllg %rx,%ry,0
2885                      lg %rx,(%r12,%ry) -> sllg %rx,%ry,0  */
2886                   unsigned int insn0, insn1, ry;
2887
2888                   insn0 = bfd_get_32 (input_bfd, contents + rel->r_offset);
2889                   insn1 = bfd_get_16 (input_bfd, contents + rel->r_offset + 4);
2890                   if (insn1 != 0x0004)
2891                     invalid_tls_insn (input_bfd, input_section, rel);
2892                   ry = 0;
2893                   if ((insn0 & 0xff00f000) == 0xe3000000)
2894                     /* lg %rx,0(%ry,0) -> sllg %rx,%ry,0  */
2895                     ry = (insn0 & 0x000f0000);
2896                   else if ((insn0 & 0xff0f0000) == 0xe3000000)
2897                     /* lg %rx,0(0,%ry) -> sllg %rx,%ry,0  */
2898                     ry = (insn0 & 0x0000f000) << 4;
2899                   else if ((insn0 & 0xff00f000) == 0xe300c000)
2900                     /* lg %rx,0(%ry,%r12) -> sllg %rx,%ry,0  */
2901                     ry = (insn0 & 0x000f0000);
2902                   else if ((insn0 & 0xff0f0000) == 0xe30c0000)
2903                     /* lg %rx,0(%r12,%ry) -> sllg %rx,%ry,0  */
2904                     ry = (insn0 & 0x0000f000) << 4;
2905                   else
2906                     invalid_tls_insn (input_bfd, input_section, rel);
2907                   insn0 = 0xeb000000 | (insn0 & 0x00f00000) | ry;
2908                   insn1 = 0x000d;
2909                   bfd_put_32 (output_bfd, insn0, contents + rel->r_offset);
2910                   bfd_put_16 (output_bfd, insn1, contents + rel->r_offset + 4);
2911                 }
2912             }
2913           else if (r_type == R_390_TLS_GDCALL)
2914             {
2915               unsigned int insn0, insn1;
2916
2917               insn0 = bfd_get_32 (input_bfd, contents + rel->r_offset);
2918               insn1 = bfd_get_16 (input_bfd, contents + rel->r_offset + 4);
2919               if ((insn0 & 0xffff0000) != 0xc0e50000)
2920                 invalid_tls_insn (input_bfd, input_section, rel);
2921               if (!info->shared && (h == NULL || h->dynindx == -1))
2922                 {
2923                   /* GD->LE transition.
2924                      brasl %r14,__tls_get_addr@plt -> brcl 0,. */
2925                   insn0 = 0xc0040000;
2926                   insn1 = 0x0000;
2927                 }
2928               else
2929                 {
2930                   /* GD->IE transition.
2931                      brasl %r14,__tls_get_addr@plt -> lg %r2,0(%r2,%r12)  */
2932                   insn0 = 0xe322c000;
2933                   insn1 = 0x0004;
2934                 }
2935               bfd_put_32 (output_bfd, insn0, contents + rel->r_offset);
2936               bfd_put_16 (output_bfd, insn1, contents + rel->r_offset + 4);
2937             }
2938           else if (r_type == R_390_TLS_LDCALL)
2939             {
2940               if (!info->shared)
2941                 {
2942                   unsigned int insn0, insn1;
2943
2944                   insn0 = bfd_get_32 (input_bfd, contents + rel->r_offset);
2945                   insn1 = bfd_get_16 (input_bfd, contents + rel->r_offset + 4);
2946                   if ((insn0 & 0xffff0000) != 0xc0e50000)
2947                     invalid_tls_insn (input_bfd, input_section, rel);
2948                   /* LD->LE transition.
2949                      brasl %r14,__tls_get_addr@plt -> brcl 0,. */
2950                   insn0 = 0xc0040000;
2951                   insn1 = 0x0000;
2952                   bfd_put_32 (output_bfd, insn0, contents + rel->r_offset);
2953                   bfd_put_16 (output_bfd, insn1, contents + rel->r_offset + 4);
2954                 }
2955             }
2956           continue;
2957
2958         default:
2959           break;
2960         }
2961
2962       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
2963          because such sections are not SEC_ALLOC and thus ld.so will
2964          not process them.  */
2965       if (unresolved_reloc
2966           && !((input_section->flags & SEC_DEBUGGING) != 0
2967                && h->def_dynamic)
2968           && _bfd_elf_section_offset (output_bfd, info, input_section,
2969                                       rel->r_offset) != (bfd_vma) -1)
2970         (*_bfd_error_handler)
2971           (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
2972            input_bfd,
2973            input_section,
2974            (long) rel->r_offset,
2975            howto->name,
2976            h->root.root.string);
2977
2978       if (r_type == R_390_20
2979           || r_type == R_390_GOT20
2980           || r_type == R_390_GOTPLT20
2981           || r_type == R_390_TLS_GOTIE20)
2982         {
2983           relocation += rel->r_addend;
2984           relocation = (relocation&0xfff) << 8 | (relocation&0xff000) >> 12;
2985           r = _bfd_final_link_relocate (howto, input_bfd, input_section,
2986                                         contents, rel->r_offset,
2987                                         relocation, 0);
2988         }
2989       else
2990         r = _bfd_final_link_relocate (howto, input_bfd, input_section,
2991                                       contents, rel->r_offset,
2992                                       relocation, rel->r_addend);
2993
2994       if (r != bfd_reloc_ok)
2995         {
2996           const char *name;
2997
2998           if (h != NULL)
2999             name = h->root.root.string;
3000           else
3001             {
3002               name = bfd_elf_string_from_elf_section (input_bfd,
3003                                                       symtab_hdr->sh_link,
3004                                                       sym->st_name);
3005               if (name == NULL)
3006                 return FALSE;
3007               if (*name == '\0')
3008                 name = bfd_section_name (input_bfd, sec);
3009             }
3010
3011           if (r == bfd_reloc_overflow)
3012             {
3013
3014               if (! ((*info->callbacks->reloc_overflow)
3015                      (info, (h ? &h->root : NULL), name, howto->name,
3016                       (bfd_vma) 0, input_bfd, input_section,
3017                       rel->r_offset)))
3018                 return FALSE;
3019             }
3020           else
3021             {
3022               (*_bfd_error_handler)
3023                 (_("%B(%A+0x%lx): reloc against `%s': error %d"),
3024                  input_bfd, input_section,
3025                  (long) rel->r_offset, name, (int) r);
3026               return FALSE;
3027             }
3028         }
3029     }
3030
3031   return TRUE;
3032 }
3033
3034 /* Finish up dynamic symbol handling.  We set the contents of various
3035    dynamic sections here.  */
3036
3037 static bfd_boolean
3038 elf_s390_finish_dynamic_symbol (bfd *output_bfd,
3039                                 struct bfd_link_info *info,
3040                                 struct elf_link_hash_entry *h,
3041                                 Elf_Internal_Sym *sym)
3042 {
3043   struct elf_s390_link_hash_table *htab;
3044
3045   htab = elf_s390_hash_table (info);
3046   if (htab == NULL)
3047     return FALSE;
3048
3049   if (h->plt.offset != (bfd_vma) -1)
3050     {
3051       bfd_vma plt_index;
3052       bfd_vma got_offset;
3053       Elf_Internal_Rela rela;
3054       bfd_byte *loc;
3055
3056       /* This symbol has an entry in the procedure linkage table.  Set
3057          it up.  */
3058
3059       if (h->dynindx == -1
3060           || htab->splt == NULL
3061           || htab->sgotplt == NULL
3062           || htab->srelplt == NULL)
3063         abort ();
3064
3065       /* Calc. index no.
3066          Current offset - size first entry / entry size.  */
3067       plt_index = (h->plt.offset - PLT_FIRST_ENTRY_SIZE) / PLT_ENTRY_SIZE;
3068
3069       /* Offset in GOT is PLT index plus GOT headers(3) times 8,
3070          addr & GOT addr.  */
3071       got_offset = (plt_index + 3) * GOT_ENTRY_SIZE;
3072
3073       /* Fill in the blueprint of a PLT.  */
3074       bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD0,
3075                   htab->splt->contents + h->plt.offset);
3076       bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD1,
3077                   htab->splt->contents + h->plt.offset + 4);
3078       bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD2,
3079                   htab->splt->contents + h->plt.offset + 8);
3080       bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD3,
3081                   htab->splt->contents + h->plt.offset + 12);
3082       bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD4,
3083                   htab->splt->contents + h->plt.offset + 16);
3084       bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD5,
3085                   htab->splt->contents + h->plt.offset + 20);
3086       bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD6,
3087                   htab->splt->contents + h->plt.offset + 24);
3088       bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD7,
3089                   htab->splt->contents + h->plt.offset + 28);
3090       /* Fixup the relative address to the GOT entry */
3091       bfd_put_32 (output_bfd,
3092                   (htab->sgotplt->output_section->vma +
3093                    htab->sgotplt->output_offset + got_offset
3094                    - (htab->splt->output_section->vma + h->plt.offset))/2,
3095                   htab->splt->contents + h->plt.offset + 2);
3096       /* Fixup the relative branch to PLT 0 */
3097       bfd_put_32 (output_bfd, - (PLT_FIRST_ENTRY_SIZE +
3098                                  (PLT_ENTRY_SIZE * plt_index) + 22)/2,
3099                   htab->splt->contents + h->plt.offset + 24);
3100       /* Fixup offset into symbol table */
3101       bfd_put_32 (output_bfd, plt_index * sizeof (Elf64_External_Rela),
3102                   htab->splt->contents + h->plt.offset + 28);
3103
3104       /* Fill in the entry in the global offset table.
3105          Points to instruction after GOT offset.  */
3106       bfd_put_64 (output_bfd,
3107                   (htab->splt->output_section->vma
3108                    + htab->splt->output_offset
3109                    + h->plt.offset
3110                    + 14),
3111                   htab->sgotplt->contents + got_offset);
3112
3113       /* Fill in the entry in the .rela.plt section.  */
3114       rela.r_offset = (htab->sgotplt->output_section->vma
3115                        + htab->sgotplt->output_offset
3116                        + got_offset);
3117       rela.r_info = ELF64_R_INFO (h->dynindx, R_390_JMP_SLOT);
3118       rela.r_addend = 0;
3119       loc = htab->srelplt->contents + plt_index * sizeof (Elf64_External_Rela);
3120       bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
3121
3122       if (!h->def_regular)
3123         {
3124           /* Mark the symbol as undefined, rather than as defined in
3125              the .plt section.  Leave the value alone.  This is a clue
3126              for the dynamic linker, to make function pointer
3127              comparisons work between an application and shared
3128              library.  */
3129           sym->st_shndx = SHN_UNDEF;
3130         }
3131     }
3132
3133   if (h->got.offset != (bfd_vma) -1
3134       && elf_s390_hash_entry(h)->tls_type != GOT_TLS_GD
3135       && elf_s390_hash_entry(h)->tls_type != GOT_TLS_IE
3136       && elf_s390_hash_entry(h)->tls_type != GOT_TLS_IE_NLT)
3137     {
3138       Elf_Internal_Rela rela;
3139       bfd_byte *loc;
3140
3141       /* This symbol has an entry in the global offset table.  Set it
3142          up.  */
3143       if (htab->sgot == NULL || htab->srelgot == NULL)
3144         abort ();
3145
3146       rela.r_offset = (htab->sgot->output_section->vma
3147                        + htab->sgot->output_offset
3148                        + (h->got.offset &~ (bfd_vma) 1));
3149
3150       /* If this is a static link, or it is a -Bsymbolic link and the
3151          symbol is defined locally or was forced to be local because
3152          of a version file, we just want to emit a RELATIVE reloc.
3153          The entry in the global offset table will already have been
3154          initialized in the relocate_section function.  */
3155       if (info->shared
3156           && SYMBOL_REFERENCES_LOCAL (info, h))
3157         {
3158           if (!h->def_regular)
3159             return FALSE;
3160           BFD_ASSERT((h->got.offset & 1) != 0);
3161           rela.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
3162           rela.r_addend = (h->root.u.def.value
3163                            + h->root.u.def.section->output_section->vma
3164                            + h->root.u.def.section->output_offset);
3165         }
3166       else
3167         {
3168           BFD_ASSERT((h->got.offset & 1) == 0);
3169           bfd_put_64 (output_bfd, (bfd_vma) 0, htab->sgot->contents + h->got.offset);
3170           rela.r_info = ELF64_R_INFO (h->dynindx, R_390_GLOB_DAT);
3171           rela.r_addend = 0;
3172         }
3173
3174       loc = htab->srelgot->contents;
3175       loc += htab->srelgot->reloc_count++ * sizeof (Elf64_External_Rela);
3176       bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
3177     }
3178
3179   if (h->needs_copy)
3180     {
3181       Elf_Internal_Rela rela;
3182       bfd_byte *loc;
3183
3184       /* This symbols needs a copy reloc.  Set it up.  */
3185
3186       if (h->dynindx == -1
3187           || (h->root.type != bfd_link_hash_defined
3188               && h->root.type != bfd_link_hash_defweak)
3189           || htab->srelbss == NULL)
3190         abort ();
3191
3192       rela.r_offset = (h->root.u.def.value
3193                        + h->root.u.def.section->output_section->vma
3194                        + h->root.u.def.section->output_offset);
3195       rela.r_info = ELF64_R_INFO (h->dynindx, R_390_COPY);
3196       rela.r_addend = 0;
3197       loc = htab->srelbss->contents;
3198       loc += htab->srelbss->reloc_count++ * sizeof (Elf64_External_Rela);
3199       bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
3200     }
3201
3202   /* Mark some specially defined symbols as absolute.  */
3203   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
3204       || h == htab->elf.hgot
3205       || h == htab->elf.hplt)
3206     sym->st_shndx = SHN_ABS;
3207
3208   return TRUE;
3209 }
3210
3211 /* Used to decide how to sort relocs in an optimal manner for the
3212    dynamic linker, before writing them out.  */
3213
3214 static enum elf_reloc_type_class
3215 elf_s390_reloc_type_class (rela)
3216      const Elf_Internal_Rela *rela;
3217 {
3218   switch ((int) ELF64_R_TYPE (rela->r_info))
3219     {
3220     case R_390_RELATIVE:
3221       return reloc_class_relative;
3222     case R_390_JMP_SLOT:
3223       return reloc_class_plt;
3224     case R_390_COPY:
3225       return reloc_class_copy;
3226     default:
3227       return reloc_class_normal;
3228     }
3229 }
3230
3231 /* Finish up the dynamic sections.  */
3232
3233 static bfd_boolean
3234 elf_s390_finish_dynamic_sections (bfd *output_bfd,
3235                                   struct bfd_link_info *info)
3236 {
3237   struct elf_s390_link_hash_table *htab;
3238   bfd *dynobj;
3239   asection *sdyn;
3240
3241   htab = elf_s390_hash_table (info);
3242   if (htab == NULL)
3243     return FALSE;
3244
3245   dynobj = htab->elf.dynobj;
3246   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
3247
3248   if (htab->elf.dynamic_sections_created)
3249     {
3250       Elf64_External_Dyn *dyncon, *dynconend;
3251
3252       if (sdyn == NULL || htab->sgot == NULL)
3253         abort ();
3254
3255       dyncon = (Elf64_External_Dyn *) sdyn->contents;
3256       dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
3257       for (; dyncon < dynconend; dyncon++)
3258         {
3259           Elf_Internal_Dyn dyn;
3260           asection *s;
3261
3262           bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
3263
3264           switch (dyn.d_tag)
3265             {
3266             default:
3267               continue;
3268
3269             case DT_PLTGOT:
3270               dyn.d_un.d_ptr = htab->sgot->output_section->vma;
3271               break;
3272
3273             case DT_JMPREL:
3274               dyn.d_un.d_ptr = htab->srelplt->output_section->vma;
3275               break;
3276
3277             case DT_PLTRELSZ:
3278               s = htab->srelplt->output_section;
3279               dyn.d_un.d_val = s->size;
3280               break;
3281
3282             case DT_RELASZ:
3283               /* The procedure linkage table relocs (DT_JMPREL) should
3284                  not be included in the overall relocs (DT_RELA).
3285                  Therefore, we override the DT_RELASZ entry here to
3286                  make it not include the JMPREL relocs.  Since the
3287                  linker script arranges for .rela.plt to follow all
3288                  other relocation sections, we don't have to worry
3289                  about changing the DT_RELA entry.  */
3290               s = htab->srelplt->output_section;
3291               dyn.d_un.d_val -= s->size;
3292               break;
3293             }
3294
3295           bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
3296         }
3297
3298       /* Fill in the special first entry in the procedure linkage table.  */
3299       if (htab->splt && htab->splt->size > 0)
3300         {
3301           /* fill in blueprint for plt 0 entry */
3302           bfd_put_32 (output_bfd, (bfd_vma) PLT_FIRST_ENTRY_WORD0,
3303                       htab->splt->contents );
3304           bfd_put_32 (output_bfd, (bfd_vma) PLT_FIRST_ENTRY_WORD1,
3305                       htab->splt->contents +4 );
3306           bfd_put_32 (output_bfd, (bfd_vma) PLT_FIRST_ENTRY_WORD3,
3307                       htab->splt->contents +12 );
3308           bfd_put_32 (output_bfd, (bfd_vma) PLT_FIRST_ENTRY_WORD4,
3309                       htab->splt->contents +16 );
3310           bfd_put_32 (output_bfd, (bfd_vma) PLT_FIRST_ENTRY_WORD5,
3311                       htab->splt->contents +20 );
3312           bfd_put_32 (output_bfd, (bfd_vma) PLT_FIRST_ENTRY_WORD6,
3313                       htab->splt->contents + 24);
3314           bfd_put_32 (output_bfd, (bfd_vma) PLT_FIRST_ENTRY_WORD7,
3315                       htab->splt->contents + 28 );
3316           /* Fixup relative address to start of GOT */
3317           bfd_put_32 (output_bfd,
3318                       (htab->sgotplt->output_section->vma +
3319                        htab->sgotplt->output_offset
3320                        - htab->splt->output_section->vma - 6)/2,
3321                       htab->splt->contents + 8);
3322         }
3323       elf_section_data (htab->splt->output_section)
3324         ->this_hdr.sh_entsize = PLT_ENTRY_SIZE;
3325     }
3326
3327   if (htab->sgotplt)
3328     {
3329       /* Fill in the first three entries in the global offset table.  */
3330       if (htab->sgotplt->size > 0)
3331         {
3332           bfd_put_64 (output_bfd,
3333                       (sdyn == NULL ? (bfd_vma) 0
3334                        : sdyn->output_section->vma + sdyn->output_offset),
3335                       htab->sgotplt->contents);
3336           /* One entry for shared object struct ptr.  */
3337           bfd_put_64 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + 8);
3338           /* One entry for _dl_runtime_resolve.  */
3339           bfd_put_64 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + 12);
3340         }
3341
3342       elf_section_data (htab->sgot->output_section)
3343         ->this_hdr.sh_entsize = 8;
3344     }
3345   return TRUE;
3346 }
3347
3348 /* Return address for Ith PLT stub in section PLT, for relocation REL
3349    or (bfd_vma) -1 if it should not be included.  */
3350
3351 static bfd_vma
3352 elf_s390_plt_sym_val (bfd_vma i, const asection *plt,
3353                       const arelent *rel ATTRIBUTE_UNUSED)
3354 {
3355   return plt->vma + PLT_FIRST_ENTRY_SIZE + i * PLT_ENTRY_SIZE;
3356 }
3357
3358
3359 /* Why was the hash table entry size definition changed from
3360    ARCH_SIZE/8 to 4? This breaks the 64 bit dynamic linker and
3361    this is the only reason for the s390_elf64_size_info structure.  */
3362
3363 const struct elf_size_info s390_elf64_size_info =
3364 {
3365   sizeof (Elf64_External_Ehdr),
3366   sizeof (Elf64_External_Phdr),
3367   sizeof (Elf64_External_Shdr),
3368   sizeof (Elf64_External_Rel),
3369   sizeof (Elf64_External_Rela),
3370   sizeof (Elf64_External_Sym),
3371   sizeof (Elf64_External_Dyn),
3372   sizeof (Elf_External_Note),
3373   8,            /* hash-table entry size.  */
3374   1,            /* internal relocations per external relocations.  */
3375   64,           /* arch_size.  */
3376   3,            /* log_file_align.  */
3377   ELFCLASS64, EV_CURRENT,
3378   bfd_elf64_write_out_phdrs,
3379   bfd_elf64_write_shdrs_and_ehdr,
3380   bfd_elf64_checksum_contents,
3381   bfd_elf64_write_relocs,
3382   bfd_elf64_swap_symbol_in,
3383   bfd_elf64_swap_symbol_out,
3384   bfd_elf64_slurp_reloc_table,
3385   bfd_elf64_slurp_symbol_table,
3386   bfd_elf64_swap_dyn_in,
3387   bfd_elf64_swap_dyn_out,
3388   bfd_elf64_swap_reloc_in,
3389   bfd_elf64_swap_reloc_out,
3390   bfd_elf64_swap_reloca_in,
3391   bfd_elf64_swap_reloca_out
3392 };
3393
3394 #define TARGET_BIG_SYM  bfd_elf64_s390_vec
3395 #define TARGET_BIG_NAME "elf64-s390"
3396 #define ELF_ARCH        bfd_arch_s390
3397 #define ELF_TARGET_ID   S390_ELF_DATA
3398 #define ELF_MACHINE_CODE EM_S390
3399 #define ELF_MACHINE_ALT1 EM_S390_OLD
3400 #define ELF_MAXPAGESIZE 0x1000
3401
3402 #define elf_backend_size_info           s390_elf64_size_info
3403
3404 #define elf_backend_can_gc_sections     1
3405 #define elf_backend_can_refcount        1
3406 #define elf_backend_want_got_plt        1
3407 #define elf_backend_plt_readonly        1
3408 #define elf_backend_want_plt_sym        0
3409 #define elf_backend_got_header_size     24
3410 #define elf_backend_rela_normal         1
3411
3412 #define elf_info_to_howto               elf_s390_info_to_howto
3413
3414 #define bfd_elf64_bfd_is_local_label_name     elf_s390_is_local_label_name
3415 #define bfd_elf64_bfd_link_hash_table_create  elf_s390_link_hash_table_create
3416 #define bfd_elf64_bfd_reloc_type_lookup       elf_s390_reloc_type_lookup
3417 #define bfd_elf64_bfd_reloc_name_lookup elf_s390_reloc_name_lookup
3418
3419 #define elf_backend_adjust_dynamic_symbol     elf_s390_adjust_dynamic_symbol
3420 #define elf_backend_check_relocs              elf_s390_check_relocs
3421 #define elf_backend_copy_indirect_symbol      elf_s390_copy_indirect_symbol
3422 #define elf_backend_create_dynamic_sections   elf_s390_create_dynamic_sections
3423 #define elf_backend_finish_dynamic_sections   elf_s390_finish_dynamic_sections
3424 #define elf_backend_finish_dynamic_symbol     elf_s390_finish_dynamic_symbol
3425 #define elf_backend_gc_mark_hook              elf_s390_gc_mark_hook
3426 #define elf_backend_gc_sweep_hook             elf_s390_gc_sweep_hook
3427 #define elf_backend_reloc_type_class          elf_s390_reloc_type_class
3428 #define elf_backend_relocate_section          elf_s390_relocate_section
3429 #define elf_backend_size_dynamic_sections     elf_s390_size_dynamic_sections
3430 #define elf_backend_init_index_section        _bfd_elf_init_1_index_section
3431 #define elf_backend_reloc_type_class          elf_s390_reloc_type_class
3432 #define elf_backend_plt_sym_val               elf_s390_plt_sym_val
3433
3434 #define bfd_elf64_mkobject              elf_s390_mkobject
3435 #define elf_backend_object_p            elf_s390_object_p
3436
3437 #include "elf64-target.h"