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