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