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