2012-11-05 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
[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_malloc (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   ret->elf.sgot = NULL;
715   ret->elf.sgotplt = NULL;
716   ret->elf.srelgot = NULL;
717   ret->elf.splt = NULL;
718   ret->elf.srelplt = NULL;
719   ret->sdynbss = NULL;
720   ret->srelbss = NULL;
721   ret->tls_ldm_got.refcount = 0;
722   ret->sym_cache.abfd = NULL;
723
724   return &ret->elf.root;
725 }
726
727 /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
728    shortcuts to them in our hash table.  */
729
730 static bfd_boolean
731 create_got_section (bfd *dynobj,
732                     struct bfd_link_info *info)
733 {
734   struct elf_s390_link_hash_table *htab;
735
736   if (! _bfd_elf_create_got_section (dynobj, info))
737     return FALSE;
738
739   htab = elf_s390_hash_table (info);
740   if (htab == NULL)
741     return FALSE;
742
743   htab->elf.sgot = bfd_get_linker_section (dynobj, ".got");
744   htab->elf.sgotplt = bfd_get_linker_section (dynobj, ".got.plt");
745   htab->elf.srelgot = bfd_get_linker_section (dynobj, ".rela.got");
746   if (!htab->elf.sgot || !htab->elf.sgotplt || !htab->elf.srelgot)
747     abort ();
748   return TRUE;
749 }
750
751 /* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
752    .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
753    hash table.  */
754
755 static bfd_boolean
756 elf_s390_create_dynamic_sections (bfd *dynobj,
757                                   struct bfd_link_info *info)
758 {
759   struct elf_s390_link_hash_table *htab;
760
761   htab = elf_s390_hash_table (info);
762   if (htab == NULL)
763     return FALSE;
764
765   if (!htab->elf.sgot && !create_got_section (dynobj, info))
766     return FALSE;
767
768   if (!_bfd_elf_create_dynamic_sections (dynobj, info))
769     return FALSE;
770
771   htab->elf.splt = bfd_get_linker_section (dynobj, ".plt");
772   htab->elf.srelplt = bfd_get_linker_section (dynobj, ".rela.plt");
773   htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss");
774   if (!info->shared)
775     htab->srelbss = bfd_get_linker_section (dynobj, ".rela.bss");
776
777   if (!htab->elf.splt || !htab->elf.srelplt || !htab->sdynbss
778       || (!info->shared && !htab->srelbss))
779     abort ();
780
781   return TRUE;
782 }
783
784 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
785
786 static void
787 elf_s390_copy_indirect_symbol (struct bfd_link_info *info,
788                                struct elf_link_hash_entry *dir,
789                                struct elf_link_hash_entry *ind)
790 {
791   struct elf_s390_link_hash_entry *edir, *eind;
792
793   edir = (struct elf_s390_link_hash_entry *) dir;
794   eind = (struct elf_s390_link_hash_entry *) ind;
795
796   if (eind->dyn_relocs != NULL)
797     {
798       if (edir->dyn_relocs != NULL)
799         {
800           struct elf_dyn_relocs **pp;
801           struct elf_dyn_relocs *p;
802
803           /* Add reloc counts against the indirect sym to the direct sym
804              list.  Merge any entries against the same section.  */
805           for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
806             {
807               struct elf_dyn_relocs *q;
808
809               for (q = edir->dyn_relocs; q != NULL; q = q->next)
810                 if (q->sec == p->sec)
811                   {
812                     q->pc_count += p->pc_count;
813                     q->count += p->count;
814                     *pp = p->next;
815                     break;
816                   }
817               if (q == NULL)
818                 pp = &p->next;
819             }
820           *pp = edir->dyn_relocs;
821         }
822
823       edir->dyn_relocs = eind->dyn_relocs;
824       eind->dyn_relocs = NULL;
825     }
826
827   if (ind->root.type == bfd_link_hash_indirect
828       && dir->got.refcount <= 0)
829     {
830       edir->tls_type = eind->tls_type;
831       eind->tls_type = GOT_UNKNOWN;
832     }
833
834   if (ELIMINATE_COPY_RELOCS
835       && ind->root.type != bfd_link_hash_indirect
836       && dir->dynamic_adjusted)
837     {
838       /* If called to transfer flags for a weakdef during processing
839          of elf_adjust_dynamic_symbol, don't copy non_got_ref.
840          We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
841       dir->ref_dynamic |= ind->ref_dynamic;
842       dir->ref_regular |= ind->ref_regular;
843       dir->ref_regular_nonweak |= ind->ref_regular_nonweak;
844       dir->needs_plt |= ind->needs_plt;
845     }
846   else
847     _bfd_elf_link_hash_copy_indirect (info, dir, ind);
848 }
849
850 static int
851 elf_s390_tls_transition (struct bfd_link_info *info,
852                          int r_type,
853                          int is_local)
854 {
855   if (info->shared)
856     return r_type;
857
858   switch (r_type)
859     {
860     case R_390_TLS_GD64:
861     case R_390_TLS_IE64:
862       if (is_local)
863         return R_390_TLS_LE64;
864       return R_390_TLS_IE64;
865     case R_390_TLS_GOTIE64:
866       if (is_local)
867         return R_390_TLS_LE64;
868       return R_390_TLS_GOTIE64;
869     case R_390_TLS_LDM64:
870       return R_390_TLS_LE64;
871     }
872
873   return r_type;
874 }
875
876 /* Look through the relocs for a section during the first phase, and
877    allocate space in the global offset table or procedure linkage
878    table.  */
879
880 static bfd_boolean
881 elf_s390_check_relocs (bfd *abfd,
882                        struct bfd_link_info *info,
883                        asection *sec,
884                        const Elf_Internal_Rela *relocs)
885 {
886   struct elf_s390_link_hash_table *htab;
887   Elf_Internal_Shdr *symtab_hdr;
888   struct elf_link_hash_entry **sym_hashes;
889   const Elf_Internal_Rela *rel;
890   const Elf_Internal_Rela *rel_end;
891   asection *sreloc;
892   bfd_signed_vma *local_got_refcounts;
893   int tls_type, old_tls_type;
894
895   if (info->relocatable)
896     return TRUE;
897
898   BFD_ASSERT (is_s390_elf (abfd));
899
900   htab = elf_s390_hash_table (info);
901   if (htab == NULL)
902     return FALSE;
903
904   symtab_hdr = &elf_symtab_hdr (abfd);
905   sym_hashes = elf_sym_hashes (abfd);
906   local_got_refcounts = elf_local_got_refcounts (abfd);
907
908   sreloc = NULL;
909
910   rel_end = relocs + sec->reloc_count;
911   for (rel = relocs; rel < rel_end; rel++)
912     {
913       unsigned int r_type;
914       unsigned long r_symndx;
915       struct elf_link_hash_entry *h;
916       Elf_Internal_Sym *isym;
917
918       r_symndx = ELF64_R_SYM (rel->r_info);
919
920       if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
921         {
922           (*_bfd_error_handler) (_("%B: bad symbol index: %d"),
923                                  abfd,
924                                  r_symndx);
925           return FALSE;
926         }
927
928       if (r_symndx < symtab_hdr->sh_info)
929         {
930           /* A local symbol.  */
931           isym = bfd_sym_from_r_symndx (&htab->sym_cache,
932                                         abfd, r_symndx);
933           if (isym == NULL)
934             return FALSE;
935
936           if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
937             {
938               struct plt_entry *plt;
939
940               if (htab->elf.dynobj == NULL)
941                 htab->elf.dynobj = abfd;
942
943               if (!s390_elf_create_ifunc_sections (htab->elf.dynobj, info))
944                 return FALSE;
945
946               if (local_got_refcounts == NULL)
947                 {
948                   if (!elf_s390_allocate_local_syminfo (abfd, symtab_hdr))
949                     return FALSE;
950                   local_got_refcounts = elf_local_got_refcounts (abfd);
951                 }
952               plt = elf_s390_local_plt (abfd);
953               plt[r_symndx].plt.refcount++;
954             }
955           h = NULL;
956         }
957       else
958         {
959           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
960           while (h->root.type == bfd_link_hash_indirect
961                  || h->root.type == bfd_link_hash_warning)
962             h = (struct elf_link_hash_entry *) h->root.u.i.link;
963         }
964
965       /* Create got section and local_got_refcounts array if they
966          are needed.  */
967       r_type = elf_s390_tls_transition (info,
968                                         ELF64_R_TYPE (rel->r_info),
969                                         h == NULL);
970       switch (r_type)
971         {
972         case R_390_GOT12:
973         case R_390_GOT16:
974         case R_390_GOT20:
975         case R_390_GOT32:
976         case R_390_GOT64:
977         case R_390_GOTENT:
978         case R_390_GOTPLT12:
979         case R_390_GOTPLT16:
980         case R_390_GOTPLT20:
981         case R_390_GOTPLT32:
982         case R_390_GOTPLT64:
983         case R_390_GOTPLTENT:
984         case R_390_TLS_GD64:
985         case R_390_TLS_GOTIE12:
986         case R_390_TLS_GOTIE20:
987         case R_390_TLS_GOTIE64:
988         case R_390_TLS_IEENT:
989         case R_390_TLS_IE64:
990         case R_390_TLS_LDM64:
991           if (h == NULL
992               && local_got_refcounts == NULL)
993             {
994               if (!elf_s390_allocate_local_syminfo (abfd, symtab_hdr))
995                 return FALSE;
996               local_got_refcounts = elf_local_got_refcounts (abfd);
997             }
998
999           /* Fall through.  */
1000         case R_390_GOTOFF16:
1001         case R_390_GOTOFF32:
1002         case R_390_GOTOFF64:
1003         case R_390_GOTPC:
1004         case R_390_GOTPCDBL:
1005           if (htab->elf.sgot == NULL)
1006             {
1007               if (htab->elf.dynobj == NULL)
1008                 htab->elf.dynobj = abfd;
1009               if (!create_got_section (htab->elf.dynobj, info))
1010                 return FALSE;
1011             }
1012         }
1013
1014       if (h != NULL)
1015         {
1016           if (htab->elf.dynobj == NULL)
1017             htab->elf.dynobj = abfd;
1018           if (!s390_elf_create_ifunc_sections (htab->elf.dynobj, info))
1019             return FALSE;
1020
1021           /* Make sure an IFUNC symbol defined in a non-shared object
1022              always gets a PLT slot.  */
1023           if (s390_is_ifunc_symbol_p (h) && h->def_regular)
1024             {
1025               /* The symbol is called by the dynamic loader in order
1026                  to resolve the relocation.  So it is in fact also
1027                  referenced.  */
1028               h->ref_regular = 1;
1029               h->needs_plt = 1;
1030             }
1031         }
1032
1033       switch (r_type)
1034         {
1035         case R_390_GOTOFF16:
1036         case R_390_GOTOFF32:
1037         case R_390_GOTOFF64:
1038         case R_390_GOTPC:
1039         case R_390_GOTPCDBL:
1040           /* These relocs do not need a GOT slot.  They just load the
1041              GOT pointer itself or address something else relative to
1042              the GOT.  Since the GOT pointer has been set up above we
1043              are done.  */
1044           break;
1045
1046         case R_390_PLT16DBL:
1047         case R_390_PLT32:
1048         case R_390_PLT32DBL:
1049         case R_390_PLT64:
1050         case R_390_PLTOFF16:
1051         case R_390_PLTOFF32:
1052         case R_390_PLTOFF64:
1053           /* This symbol requires a procedure linkage table entry.  We
1054              actually build the entry in adjust_dynamic_symbol,
1055              because this might be a case of linking PIC code which is
1056              never referenced by a dynamic object, in which case we
1057              don't need to generate a procedure linkage table entry
1058              after all.  */
1059
1060           /* If this is a local symbol, we resolve it directly without
1061              creating a procedure linkage table entry.  */
1062           if (h != NULL)
1063             {
1064               h->needs_plt = 1;
1065               h->plt.refcount += 1;
1066             }
1067           break;
1068
1069         case R_390_GOTPLT12:
1070         case R_390_GOTPLT16:
1071         case R_390_GOTPLT20:
1072         case R_390_GOTPLT32:
1073         case R_390_GOTPLT64:
1074         case R_390_GOTPLTENT:
1075           /* This symbol requires either a procedure linkage table entry
1076              or an entry in the local got. We actually build the entry
1077              in adjust_dynamic_symbol because whether this is really a
1078              global reference can change and with it the fact if we have
1079              to create a plt entry or a local got entry. To be able to
1080              make a once global symbol a local one we have to keep track
1081              of the number of gotplt references that exist for this
1082              symbol.  */
1083           if (h != NULL)
1084             {
1085               ((struct elf_s390_link_hash_entry *) h)->gotplt_refcount++;
1086               h->needs_plt = 1;
1087               h->plt.refcount += 1;
1088             }
1089           else
1090             local_got_refcounts[r_symndx] += 1;
1091           break;
1092
1093         case R_390_TLS_LDM64:
1094           htab->tls_ldm_got.refcount += 1;
1095           break;
1096
1097         case R_390_TLS_IE64:
1098         case R_390_TLS_GOTIE12:
1099         case R_390_TLS_GOTIE20:
1100         case R_390_TLS_GOTIE64:
1101         case R_390_TLS_IEENT:
1102           if (info->shared)
1103             info->flags |= DF_STATIC_TLS;
1104           /* Fall through */
1105
1106         case R_390_GOT12:
1107         case R_390_GOT16:
1108         case R_390_GOT20:
1109         case R_390_GOT32:
1110         case R_390_GOT64:
1111         case R_390_GOTENT:
1112         case R_390_TLS_GD64:
1113           /* This symbol requires a global offset table entry.  */
1114           switch (r_type)
1115             {
1116             default:
1117             case R_390_GOT12:
1118             case R_390_GOT16:
1119             case R_390_GOT20:
1120             case R_390_GOT32:
1121             case R_390_GOTENT:
1122               tls_type = GOT_NORMAL;
1123               break;
1124             case R_390_TLS_GD64:
1125               tls_type = GOT_TLS_GD;
1126               break;
1127             case R_390_TLS_IE64:
1128             case R_390_TLS_GOTIE64:
1129               tls_type = GOT_TLS_IE;
1130               break;
1131             case R_390_TLS_GOTIE12:
1132             case R_390_TLS_GOTIE20:
1133             case R_390_TLS_IEENT:
1134               tls_type = GOT_TLS_IE_NLT;
1135               break;
1136             }
1137
1138           if (h != NULL)
1139             {
1140               h->got.refcount += 1;
1141               old_tls_type = elf_s390_hash_entry(h)->tls_type;
1142             }
1143           else
1144             {
1145               local_got_refcounts[r_symndx] += 1;
1146               old_tls_type = elf_s390_local_got_tls_type (abfd) [r_symndx];
1147             }
1148           /* If a TLS symbol is accessed using IE at least once,
1149              there is no point to use dynamic model for it.  */
1150           if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN)
1151             {
1152               if (old_tls_type == GOT_NORMAL || tls_type == GOT_NORMAL)
1153                 {
1154                   (*_bfd_error_handler)
1155                     (_("%B: `%s' accessed both as normal and thread local symbol"),
1156                      abfd, h->root.root.string);
1157                   return FALSE;
1158                 }
1159               if (old_tls_type > tls_type)
1160                 tls_type = old_tls_type;
1161             }
1162
1163           if (old_tls_type != tls_type)
1164             {
1165               if (h != NULL)
1166                 elf_s390_hash_entry (h)->tls_type = tls_type;
1167               else
1168                 elf_s390_local_got_tls_type (abfd) [r_symndx] = tls_type;
1169             }
1170
1171           if (r_type != R_390_TLS_IE64)
1172             break;
1173           /* Fall through */
1174
1175         case R_390_TLS_LE64:
1176           if (!info->shared)
1177             break;
1178           info->flags |= DF_STATIC_TLS;
1179           /* Fall through */
1180
1181         case R_390_8:
1182         case R_390_16:
1183         case R_390_32:
1184         case R_390_64:
1185         case R_390_PC16:
1186         case R_390_PC16DBL:
1187         case R_390_PC32:
1188         case R_390_PC32DBL:
1189         case R_390_PC64:
1190           if (h != NULL)
1191             {
1192               /* If this reloc is in a read-only section, we might
1193                  need a copy reloc.  We can't check reliably at this
1194                  stage whether the section is read-only, as input
1195                  sections have not yet been mapped to output sections.
1196                  Tentatively set the flag for now, and correct in
1197                  adjust_dynamic_symbol.  */
1198               h->non_got_ref = 1;
1199
1200               if (!info->shared)
1201                 {
1202                   /* We may need a .plt entry if the function this reloc
1203                      refers to is in a shared lib.  */
1204                   h->plt.refcount += 1;
1205                 }
1206             }
1207
1208           /* If we are creating a shared library, and this is a reloc
1209              against a global symbol, or a non PC relative reloc
1210              against a local symbol, then we need to copy the reloc
1211              into the shared library.  However, if we are linking with
1212              -Bsymbolic, we do not need to copy a reloc against a
1213              global symbol which is defined in an object we are
1214              including in the link (i.e., DEF_REGULAR is set).  At
1215              this point we have not seen all the input files, so it is
1216              possible that DEF_REGULAR is not set now but will be set
1217              later (it is never cleared).  In case of a weak definition,
1218              DEF_REGULAR may be cleared later by a strong definition in
1219              a shared library. We account for that possibility below by
1220              storing information in the relocs_copied field of the hash
1221              table entry.  A similar situation occurs when creating
1222              shared libraries and symbol visibility changes render the
1223              symbol local.
1224
1225              If on the other hand, we are creating an executable, we
1226              may need to keep relocations for symbols satisfied by a
1227              dynamic library if we manage to avoid copy relocs for the
1228              symbol.  */
1229           if ((info->shared
1230                && (sec->flags & SEC_ALLOC) != 0
1231                && ((ELF64_R_TYPE (rel->r_info) != R_390_PC16
1232                     && ELF64_R_TYPE (rel->r_info) != R_390_PC16DBL
1233                     && ELF64_R_TYPE (rel->r_info) != R_390_PC32
1234                     && ELF64_R_TYPE (rel->r_info) != R_390_PC32DBL
1235                     && ELF64_R_TYPE (rel->r_info) != R_390_PC64)
1236                    || (h != NULL
1237                        && (! SYMBOLIC_BIND (info, h)
1238                            || h->root.type == bfd_link_hash_defweak
1239                            || !h->def_regular))))
1240               || (ELIMINATE_COPY_RELOCS
1241                   && !info->shared
1242                   && (sec->flags & SEC_ALLOC) != 0
1243                   && h != NULL
1244                   && (h->root.type == bfd_link_hash_defweak
1245                       || !h->def_regular)))
1246             {
1247               struct elf_dyn_relocs *p;
1248               struct elf_dyn_relocs **head;
1249
1250               /* We must copy these reloc types into the output file.
1251                  Create a reloc section in dynobj and make room for
1252                  this reloc.  */
1253               if (sreloc == NULL)
1254                 {
1255                   if (htab->elf.dynobj == NULL)
1256                     htab->elf.dynobj = abfd;
1257
1258                   sreloc = _bfd_elf_make_dynamic_reloc_section
1259                     (sec, htab->elf.dynobj, 3, abfd, /*rela?*/ TRUE);
1260
1261                   if (sreloc == NULL)
1262                     return FALSE;
1263                 }
1264
1265               /* If this is a global symbol, we count the number of
1266                  relocations we need for this symbol.  */
1267               if (h != NULL)
1268                 {
1269                   head = &((struct elf_s390_link_hash_entry *) h)->dyn_relocs;
1270                 }
1271               else
1272                 {
1273                   /* Track dynamic relocs needed for local syms too.
1274                      We really need local syms available to do this
1275                      easily.  Oh well.  */
1276                   asection *s;
1277                   void *vpp;
1278
1279                   isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1280                                                 abfd, r_symndx);
1281                   if (isym == NULL)
1282                     return FALSE;
1283
1284                   s = bfd_section_from_elf_index (abfd, isym->st_shndx);
1285                   if (s == NULL)
1286                     s = sec;
1287
1288                   vpp = &elf_section_data (s)->local_dynrel;
1289                   head = (struct elf_dyn_relocs **) vpp;
1290                 }
1291
1292               p = *head;
1293               if (p == NULL || p->sec != sec)
1294                 {
1295                   bfd_size_type amt = sizeof *p;
1296                   p = ((struct elf_dyn_relocs *)
1297                        bfd_alloc (htab->elf.dynobj, amt));
1298                   if (p == NULL)
1299                     return FALSE;
1300                   p->next = *head;
1301                   *head = p;
1302                   p->sec = sec;
1303                   p->count = 0;
1304                   p->pc_count = 0;
1305                 }
1306
1307               p->count += 1;
1308               if (ELF64_R_TYPE (rel->r_info) == R_390_PC16
1309                   || ELF64_R_TYPE (rel->r_info) == R_390_PC16DBL
1310                   || ELF64_R_TYPE (rel->r_info) == R_390_PC32
1311                   || ELF64_R_TYPE (rel->r_info) == R_390_PC32DBL
1312                   || ELF64_R_TYPE (rel->r_info) == R_390_PC64)
1313                 p->pc_count += 1;
1314             }
1315           break;
1316
1317           /* This relocation describes the C++ object vtable hierarchy.
1318              Reconstruct it for later use during GC.  */
1319         case R_390_GNU_VTINHERIT:
1320           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1321             return FALSE;
1322           break;
1323
1324           /* This relocation describes which C++ vtable entries are actually
1325              used.  Record for later use during GC.  */
1326         case R_390_GNU_VTENTRY:
1327           BFD_ASSERT (h != NULL);
1328           if (h != NULL
1329               && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
1330             return FALSE;
1331           break;
1332
1333         default:
1334           break;
1335         }
1336     }
1337
1338   return TRUE;
1339 }
1340
1341 /* Return the section that should be marked against GC for a given
1342    relocation.  */
1343
1344 static asection *
1345 elf_s390_gc_mark_hook (asection *sec,
1346                        struct bfd_link_info *info,
1347                        Elf_Internal_Rela *rel,
1348                        struct elf_link_hash_entry *h,
1349                        Elf_Internal_Sym *sym)
1350 {
1351   if (h != NULL)
1352     switch (ELF64_R_TYPE (rel->r_info))
1353       {
1354       case R_390_GNU_VTINHERIT:
1355       case R_390_GNU_VTENTRY:
1356         return NULL;
1357       }
1358
1359   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
1360 }
1361
1362 /* Update the got entry reference counts for the section being removed.  */
1363
1364 static bfd_boolean
1365 elf_s390_gc_sweep_hook (bfd *abfd,
1366                         struct bfd_link_info *info,
1367                         asection *sec,
1368                         const Elf_Internal_Rela *relocs)
1369 {
1370   struct elf_s390_link_hash_table *htab;
1371   Elf_Internal_Shdr *symtab_hdr;
1372   struct elf_link_hash_entry **sym_hashes;
1373   bfd_signed_vma *local_got_refcounts;
1374   const Elf_Internal_Rela *rel, *relend;
1375
1376   if (info->relocatable)
1377     return TRUE;
1378
1379   htab = elf_s390_hash_table (info);
1380   if (htab == NULL)
1381     return FALSE;
1382
1383   elf_section_data (sec)->local_dynrel = NULL;
1384
1385   symtab_hdr = &elf_symtab_hdr (abfd);
1386   sym_hashes = elf_sym_hashes (abfd);
1387   local_got_refcounts = elf_local_got_refcounts (abfd);
1388
1389   relend = relocs + sec->reloc_count;
1390   for (rel = relocs; rel < relend; rel++)
1391     {
1392       unsigned long r_symndx;
1393       unsigned int r_type;
1394       struct elf_link_hash_entry *h = NULL;
1395
1396       r_symndx = ELF64_R_SYM (rel->r_info);
1397       if (r_symndx >= symtab_hdr->sh_info)
1398         {
1399           struct elf_s390_link_hash_entry *eh;
1400           struct elf_dyn_relocs **pp;
1401           struct elf_dyn_relocs *p;
1402
1403           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1404           while (h->root.type == bfd_link_hash_indirect
1405                  || h->root.type == bfd_link_hash_warning)
1406             h = (struct elf_link_hash_entry *) h->root.u.i.link;
1407           eh = (struct elf_s390_link_hash_entry *) h;
1408
1409           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
1410             if (p->sec == sec)
1411               {
1412                 /* Everything must go for SEC.  */
1413                 *pp = p->next;
1414                 break;
1415               }
1416         }
1417       else
1418         {
1419           Elf_Internal_Sym *isym;
1420
1421           /* A local symbol.  */
1422           isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1423                                         abfd, r_symndx);
1424           if (isym == NULL)
1425             return FALSE;
1426
1427           if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
1428             {
1429               struct plt_entry *plt = elf_s390_local_plt (abfd);
1430               if (plt[r_symndx].plt.refcount > 0)
1431                 plt[r_symndx].plt.refcount--;
1432             }
1433         }
1434
1435       r_type = ELF64_R_TYPE (rel->r_info);
1436       r_type = elf_s390_tls_transition (info, r_type, h != NULL);
1437       switch (r_type)
1438         {
1439         case R_390_TLS_LDM64:
1440           if (htab->tls_ldm_got.refcount > 0)
1441             htab->tls_ldm_got.refcount -= 1;
1442           break;
1443
1444         case R_390_TLS_GD64:
1445         case R_390_TLS_IE64:
1446         case R_390_TLS_GOTIE12:
1447         case R_390_TLS_GOTIE20:
1448         case R_390_TLS_GOTIE64:
1449         case R_390_TLS_IEENT:
1450         case R_390_GOT12:
1451         case R_390_GOT16:
1452         case R_390_GOT20:
1453         case R_390_GOT32:
1454         case R_390_GOT64:
1455         case R_390_GOTOFF16:
1456         case R_390_GOTOFF32:
1457         case R_390_GOTOFF64:
1458         case R_390_GOTPC:
1459         case R_390_GOTPCDBL:
1460         case R_390_GOTENT:
1461           if (h != NULL)
1462             {
1463               if (h->got.refcount > 0)
1464                 h->got.refcount -= 1;
1465             }
1466           else if (local_got_refcounts != NULL)
1467             {
1468               if (local_got_refcounts[r_symndx] > 0)
1469                 local_got_refcounts[r_symndx] -= 1;
1470             }
1471           break;
1472
1473         case R_390_8:
1474         case R_390_12:
1475         case R_390_16:
1476         case R_390_20:
1477         case R_390_32:
1478         case R_390_64:
1479         case R_390_PC16:
1480         case R_390_PC16DBL:
1481         case R_390_PC32:
1482         case R_390_PC32DBL:
1483         case R_390_PC64:
1484           if (info->shared)
1485             break;
1486           /* Fall through */
1487
1488         case R_390_PLT16DBL:
1489         case R_390_PLT32:
1490         case R_390_PLT32DBL:
1491         case R_390_PLT64:
1492         case R_390_PLTOFF16:
1493         case R_390_PLTOFF32:
1494         case R_390_PLTOFF64:
1495           if (h != NULL)
1496             {
1497               if (h->plt.refcount > 0)
1498                 h->plt.refcount -= 1;
1499             }
1500           break;
1501
1502         case R_390_GOTPLT12:
1503         case R_390_GOTPLT16:
1504         case R_390_GOTPLT20:
1505         case R_390_GOTPLT32:
1506         case R_390_GOTPLT64:
1507         case R_390_GOTPLTENT:
1508           if (h != NULL)
1509             {
1510               if (h->plt.refcount > 0)
1511                 {
1512                   ((struct elf_s390_link_hash_entry *) h)->gotplt_refcount--;
1513                   h->plt.refcount -= 1;
1514                 }
1515             }
1516           else if (local_got_refcounts != NULL)
1517             {
1518               if (local_got_refcounts[r_symndx] > 0)
1519                 local_got_refcounts[r_symndx] -= 1;
1520             }
1521           break;
1522
1523         default:
1524           break;
1525         }
1526     }
1527
1528   return TRUE;
1529 }
1530
1531 /* Make sure we emit a GOT entry if the symbol was supposed to have a PLT
1532    entry but we found we will not create any.  Called when we find we will
1533    not have any PLT for this symbol, by for example
1534    elf_s390_adjust_dynamic_symbol when we're doing a proper dynamic link,
1535    or elf_s390_size_dynamic_sections if no dynamic sections will be
1536    created (we're only linking static objects).  */
1537
1538 static void
1539 elf_s390_adjust_gotplt (struct elf_s390_link_hash_entry *h)
1540 {
1541   if (h->elf.root.type == bfd_link_hash_warning)
1542     h = (struct elf_s390_link_hash_entry *) h->elf.root.u.i.link;
1543
1544   if (h->gotplt_refcount <= 0)
1545     return;
1546
1547   /* We simply add the number of gotplt references to the number
1548    * of got references for this symbol.  */
1549   h->elf.got.refcount += h->gotplt_refcount;
1550   h->gotplt_refcount = -1;
1551 }
1552
1553 /* Adjust a symbol defined by a dynamic object and referenced by a
1554    regular object.  The current definition is in some section of the
1555    dynamic object, but we're not including those sections.  We have to
1556    change the definition to something the rest of the link can
1557    understand.  */
1558
1559 static bfd_boolean
1560 elf_s390_adjust_dynamic_symbol (struct bfd_link_info *info,
1561                                 struct elf_link_hash_entry *h)
1562 {
1563   struct elf_s390_link_hash_table *htab;
1564   asection *s;
1565
1566   /* STT_GNU_IFUNC symbol must go through PLT. */
1567   if (s390_is_ifunc_symbol_p (h))
1568     return TRUE;
1569
1570   /* If this is a function, put it in the procedure linkage table.  We
1571      will fill in the contents of the procedure linkage table later
1572      (although we could actually do it here).  */
1573   if (h->type == STT_FUNC
1574       || h->needs_plt)
1575     {
1576       if (h->plt.refcount <= 0
1577           || SYMBOL_CALLS_LOCAL (info, h)
1578           || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
1579               && h->root.type == bfd_link_hash_undefweak))
1580         {
1581           /* This case can occur if we saw a PLT32 reloc in an input
1582              file, but the symbol was never referred to by a dynamic
1583              object, or if all references were garbage collected.  In
1584              such a case, we don't actually need to build a procedure
1585              linkage table, and we can just do a PC32 reloc instead.  */
1586           h->plt.offset = (bfd_vma) -1;
1587           h->needs_plt = 0;
1588           elf_s390_adjust_gotplt((struct elf_s390_link_hash_entry *) h);
1589         }
1590
1591       return TRUE;
1592     }
1593   else
1594     /* It's possible that we incorrectly decided a .plt reloc was
1595        needed for an R_390_PC32 reloc to a non-function sym in
1596        check_relocs.  We can't decide accurately between function and
1597        non-function syms in check-relocs;  Objects loaded later in
1598        the link may change h->type.  So fix it now.  */
1599     h->plt.offset = (bfd_vma) -1;
1600
1601   /* If this is a weak symbol, and there is a real definition, the
1602      processor independent code will have arranged for us to see the
1603      real definition first, and we can just use the same value.  */
1604   if (h->u.weakdef != NULL)
1605     {
1606       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
1607                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
1608       h->root.u.def.section = h->u.weakdef->root.u.def.section;
1609       h->root.u.def.value = h->u.weakdef->root.u.def.value;
1610       if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
1611         h->non_got_ref = h->u.weakdef->non_got_ref;
1612       return TRUE;
1613     }
1614
1615   /* This is a reference to a symbol defined by a dynamic object which
1616      is not a function.  */
1617
1618   /* If we are creating a shared library, we must presume that the
1619      only references to the symbol are via the global offset table.
1620      For such cases we need not do anything here; the relocations will
1621      be handled correctly by relocate_section.  */
1622   if (info->shared)
1623     return TRUE;
1624
1625   /* If there are no references to this symbol that do not use the
1626      GOT, we don't need to generate a copy reloc.  */
1627   if (!h->non_got_ref)
1628     return TRUE;
1629
1630   /* If -z nocopyreloc was given, we won't generate them either.  */
1631   if (info->nocopyreloc)
1632     {
1633       h->non_got_ref = 0;
1634       return TRUE;
1635     }
1636
1637   if (ELIMINATE_COPY_RELOCS)
1638     {
1639       struct elf_s390_link_hash_entry * eh;
1640       struct elf_dyn_relocs *p;
1641
1642       eh = (struct elf_s390_link_hash_entry *) h;
1643       for (p = eh->dyn_relocs; p != NULL; p = p->next)
1644         {
1645           s = p->sec->output_section;
1646           if (s != NULL && (s->flags & SEC_READONLY) != 0)
1647             break;
1648         }
1649
1650       /* If we didn't find any dynamic relocs in read-only sections, then
1651          we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
1652       if (p == NULL)
1653         {
1654           h->non_got_ref = 0;
1655           return TRUE;
1656         }
1657     }
1658
1659   /* We must allocate the symbol in our .dynbss section, which will
1660      become part of the .bss section of the executable.  There will be
1661      an entry for this symbol in the .dynsym section.  The dynamic
1662      object will contain position independent code, so all references
1663      from the dynamic object to this symbol will go through the global
1664      offset table.  The dynamic linker will use the .dynsym entry to
1665      determine the address it must put in the global offset table, so
1666      both the dynamic object and the regular object will refer to the
1667      same memory location for the variable.  */
1668
1669   htab = elf_s390_hash_table (info);
1670   if (htab == NULL)
1671     return FALSE;
1672
1673   /* We must generate a R_390_COPY reloc to tell the dynamic linker to
1674      copy the initial value out of the dynamic object and into the
1675      runtime process image.  */
1676   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
1677     {
1678       htab->srelbss->size += sizeof (Elf64_External_Rela);
1679       h->needs_copy = 1;
1680     }
1681
1682   s = htab->sdynbss;
1683
1684   return _bfd_elf_adjust_dynamic_copy (h, s);
1685 }
1686
1687 /* Allocate space in .plt, .got and associated reloc sections for
1688    dynamic relocs.  */
1689
1690 static bfd_boolean
1691 allocate_dynrelocs (struct elf_link_hash_entry *h,
1692                     void * inf)
1693 {
1694   struct bfd_link_info *info;
1695   struct elf_s390_link_hash_table *htab;
1696   struct elf_s390_link_hash_entry *eh = (struct elf_s390_link_hash_entry *)h;
1697   struct elf_dyn_relocs *p;
1698
1699   if (h->root.type == bfd_link_hash_indirect)
1700     return TRUE;
1701
1702   info = (struct bfd_link_info *) inf;
1703   htab = elf_s390_hash_table (info);
1704   if (htab == NULL)
1705     return FALSE;
1706
1707   /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it
1708      here if it is defined and referenced in a non-shared object.  */
1709   if (s390_is_ifunc_symbol_p (h) && h->def_regular)
1710     return s390_elf_allocate_ifunc_dyn_relocs (info, h,
1711                                                &eh->dyn_relocs);
1712   else if (htab->elf.dynamic_sections_created
1713            && h->plt.refcount > 0)
1714     {
1715       /* Make sure this symbol is output as a dynamic symbol.
1716          Undefined weak syms won't yet be marked as dynamic.  */
1717       if (h->dynindx == -1
1718           && !h->forced_local)
1719         {
1720           if (! bfd_elf_link_record_dynamic_symbol (info, h))
1721             return FALSE;
1722         }
1723
1724       if (info->shared
1725           || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
1726         {
1727           asection *s = htab->elf.splt;
1728
1729           /* If this is the first .plt entry, make room for the special
1730              first entry.  */
1731           if (s->size == 0)
1732             s->size += PLT_FIRST_ENTRY_SIZE;
1733
1734           h->plt.offset = s->size;
1735
1736           /* If this symbol is not defined in a regular file, and we are
1737              not generating a shared library, then set the symbol to this
1738              location in the .plt.  This is required to make function
1739              pointers compare as equal between the normal executable and
1740              the shared library.  */
1741           if (! info->shared
1742               && !h->def_regular)
1743             {
1744               h->root.u.def.section = s;
1745               h->root.u.def.value = h->plt.offset;
1746             }
1747
1748           /* Make room for this entry.  */
1749           s->size += PLT_ENTRY_SIZE;
1750
1751           /* We also need to make an entry in the .got.plt section, which
1752              will be placed in the .got section by the linker script.  */
1753           htab->elf.sgotplt->size += GOT_ENTRY_SIZE;
1754
1755           /* We also need to make an entry in the .rela.plt section.  */
1756           htab->elf.srelplt->size += sizeof (Elf64_External_Rela);
1757         }
1758       else
1759         {
1760           h->plt.offset = (bfd_vma) -1;
1761           h->needs_plt = 0;
1762           elf_s390_adjust_gotplt((struct elf_s390_link_hash_entry *) h);
1763         }
1764     }
1765   else
1766     {
1767       h->plt.offset = (bfd_vma) -1;
1768       h->needs_plt = 0;
1769       elf_s390_adjust_gotplt((struct elf_s390_link_hash_entry *) h);
1770     }
1771
1772   /* If R_390_TLS_{IE64,GOTIE64,GOTIE12,IEENT} symbol is now local to
1773      the binary, we can optimize a bit. IE64 and GOTIE64 get converted
1774      to R_390_TLS_LE64 requiring no TLS entry. For GOTIE12 and IEENT
1775      we can save the dynamic TLS relocation.  */
1776   if (h->got.refcount > 0
1777       && !info->shared
1778       && h->dynindx == -1
1779       && elf_s390_hash_entry(h)->tls_type >= GOT_TLS_IE)
1780     {
1781       if (elf_s390_hash_entry(h)->tls_type == GOT_TLS_IE_NLT)
1782         /* For the GOTIE access without a literal pool entry the offset has
1783            to be stored somewhere. The immediate value in the instruction
1784            is not bit enough so the value is stored in the got.  */
1785         {
1786           h->got.offset = htab->elf.sgot->size;
1787           htab->elf.sgot->size += GOT_ENTRY_SIZE;
1788         }
1789       else
1790         h->got.offset = (bfd_vma) -1;
1791     }
1792   else if (h->got.refcount > 0)
1793     {
1794       asection *s;
1795       bfd_boolean dyn;
1796       int tls_type = elf_s390_hash_entry(h)->tls_type;
1797
1798       /* Make sure this symbol is output as a dynamic symbol.
1799          Undefined weak syms won't yet be marked as dynamic.  */
1800       if (h->dynindx == -1
1801           && !h->forced_local)
1802         {
1803           if (! bfd_elf_link_record_dynamic_symbol (info, h))
1804             return FALSE;
1805         }
1806
1807       s = htab->elf.sgot;
1808       h->got.offset = s->size;
1809       s->size += GOT_ENTRY_SIZE;
1810       /* R_390_TLS_GD64 needs 2 consecutive GOT slots.  */
1811       if (tls_type == GOT_TLS_GD)
1812         s->size += GOT_ENTRY_SIZE;
1813       dyn = htab->elf.dynamic_sections_created;
1814       /* R_390_TLS_IE64 needs one dynamic relocation,
1815          R_390_TLS_GD64 needs one if local symbol and two if global.  */
1816       if ((tls_type == GOT_TLS_GD && h->dynindx == -1)
1817           || tls_type >= GOT_TLS_IE)
1818         htab->elf.srelgot->size += sizeof (Elf64_External_Rela);
1819       else if (tls_type == GOT_TLS_GD)
1820         htab->elf.srelgot->size += 2 * sizeof (Elf64_External_Rela);
1821       else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
1822                 || h->root.type != bfd_link_hash_undefweak)
1823                && (info->shared
1824                    || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
1825         htab->elf.srelgot->size += sizeof (Elf64_External_Rela);
1826     }
1827   else
1828     h->got.offset = (bfd_vma) -1;
1829
1830   if (eh->dyn_relocs == NULL)
1831     return TRUE;
1832
1833   /* In the shared -Bsymbolic case, discard space allocated for
1834      dynamic pc-relative relocs against symbols which turn out to be
1835      defined in regular objects.  For the normal shared case, discard
1836      space for pc-relative relocs that have become local due to symbol
1837      visibility changes.  */
1838
1839   if (info->shared)
1840     {
1841       if (SYMBOL_CALLS_LOCAL (info, h))
1842         {
1843           struct elf_dyn_relocs **pp;
1844
1845           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
1846             {
1847               p->count -= p->pc_count;
1848               p->pc_count = 0;
1849               if (p->count == 0)
1850                 *pp = p->next;
1851               else
1852                 pp = &p->next;
1853             }
1854         }
1855
1856       /* Also discard relocs on undefined weak syms with non-default
1857          visibility.  */
1858       if (eh->dyn_relocs != NULL
1859           && h->root.type == bfd_link_hash_undefweak)
1860         {
1861           if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
1862             eh->dyn_relocs = NULL;
1863
1864           /* Make sure undefined weak symbols are output as a dynamic
1865              symbol in PIEs.  */
1866           else if (h->dynindx == -1
1867                    && !h->forced_local)
1868             {
1869               if (! bfd_elf_link_record_dynamic_symbol (info, h))
1870                 return FALSE;
1871             }
1872         }
1873     }
1874   else if (ELIMINATE_COPY_RELOCS)
1875     {
1876       /* For the non-shared case, discard space for relocs against
1877          symbols which turn out to need copy relocs or are not
1878          dynamic.  */
1879
1880       if (!h->non_got_ref
1881           && ((h->def_dynamic
1882                && !h->def_regular)
1883               || (htab->elf.dynamic_sections_created
1884                   && (h->root.type == bfd_link_hash_undefweak
1885                       || h->root.type == bfd_link_hash_undefined))))
1886         {
1887           /* Make sure this symbol is output as a dynamic symbol.
1888              Undefined weak syms won't yet be marked as dynamic.  */
1889           if (h->dynindx == -1
1890               && !h->forced_local)
1891             {
1892               if (! bfd_elf_link_record_dynamic_symbol (info, h))
1893                 return FALSE;
1894             }
1895
1896           /* If that succeeded, we know we'll be keeping all the
1897              relocs.  */
1898           if (h->dynindx != -1)
1899             goto keep;
1900         }
1901
1902       eh->dyn_relocs = NULL;
1903
1904     keep: ;
1905     }
1906
1907   /* Finally, allocate space.  */
1908   for (p = eh->dyn_relocs; p != NULL; p = p->next)
1909     {
1910       asection *sreloc = elf_section_data (p->sec)->sreloc;
1911       sreloc->size += p->count * sizeof (Elf64_External_Rela);
1912     }
1913
1914   return TRUE;
1915 }
1916
1917 /* Find any dynamic relocs that apply to read-only sections.  */
1918
1919 static bfd_boolean
1920 readonly_dynrelocs (struct elf_link_hash_entry *h, void * inf)
1921 {
1922   struct elf_s390_link_hash_entry *eh;
1923   struct elf_dyn_relocs *p;
1924
1925   eh = (struct elf_s390_link_hash_entry *) h;
1926   for (p = eh->dyn_relocs; p != NULL; p = p->next)
1927     {
1928       asection *s = p->sec->output_section;
1929
1930       if (s != NULL && (s->flags & SEC_READONLY) != 0)
1931         {
1932           struct bfd_link_info *info = (struct bfd_link_info *) inf;
1933
1934           info->flags |= DF_TEXTREL;
1935
1936           /* Not an error, just cut short the traversal.  */
1937           return FALSE;
1938         }
1939     }
1940   return TRUE;
1941 }
1942
1943 /* Set the sizes of the dynamic sections.  */
1944
1945 static bfd_boolean
1946 elf_s390_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
1947                                 struct bfd_link_info *info)
1948 {
1949   struct elf_s390_link_hash_table *htab;
1950   bfd *dynobj;
1951   asection *s;
1952   bfd_boolean relocs;
1953   bfd *ibfd;
1954
1955   htab = elf_s390_hash_table (info);
1956   if (htab == NULL)
1957     return FALSE;
1958
1959   dynobj = htab->elf.dynobj;
1960   if (dynobj == NULL)
1961     abort ();
1962
1963   if (htab->elf.dynamic_sections_created)
1964     {
1965       /* Set the contents of the .interp section to the interpreter.  */
1966       if (info->executable)
1967         {
1968           s = bfd_get_linker_section (dynobj, ".interp");
1969           if (s == NULL)
1970             abort ();
1971           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
1972           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1973         }
1974     }
1975
1976   /* Set up .got offsets for local syms, and space for local dynamic
1977      relocs.  */
1978   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
1979     {
1980       bfd_signed_vma *local_got;
1981       bfd_signed_vma *end_local_got;
1982       char *local_tls_type;
1983       bfd_size_type locsymcount;
1984       Elf_Internal_Shdr *symtab_hdr;
1985       asection *srela;
1986       struct plt_entry *local_plt;
1987       unsigned int i;
1988
1989       if (! is_s390_elf (ibfd))
1990         continue;
1991
1992       for (s = ibfd->sections; s != NULL; s = s->next)
1993         {
1994           struct elf_dyn_relocs *p;
1995
1996           for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
1997             {
1998               if (!bfd_is_abs_section (p->sec)
1999                   && bfd_is_abs_section (p->sec->output_section))
2000                 {
2001                   /* Input section has been discarded, either because
2002                      it is a copy of a linkonce section or due to
2003                      linker script /DISCARD/, so we'll be discarding
2004                      the relocs too.  */
2005                 }
2006               else if (p->count != 0)
2007                 {
2008                   srela = elf_section_data (p->sec)->sreloc;
2009                   srela->size += p->count * sizeof (Elf64_External_Rela);
2010                   if ((p->sec->output_section->flags & SEC_READONLY) != 0)
2011                     info->flags |= DF_TEXTREL;
2012                 }
2013             }
2014         }
2015
2016       local_got = elf_local_got_refcounts (ibfd);
2017       if (!local_got)
2018         continue;
2019
2020       symtab_hdr = &elf_symtab_hdr (ibfd);
2021       locsymcount = symtab_hdr->sh_info;
2022       end_local_got = local_got + locsymcount;
2023       local_tls_type = elf_s390_local_got_tls_type (ibfd);
2024       s = htab->elf.sgot;
2025       srela = htab->elf.srelgot;
2026       for (; local_got < end_local_got; ++local_got, ++local_tls_type)
2027         {
2028           if (*local_got > 0)
2029             {
2030               *local_got = s->size;
2031               s->size += GOT_ENTRY_SIZE;
2032               if (*local_tls_type == GOT_TLS_GD)
2033                 s->size += GOT_ENTRY_SIZE;
2034               if (info->shared)
2035                 srela->size += sizeof (Elf64_External_Rela);
2036             }
2037           else
2038             *local_got = (bfd_vma) -1;
2039         }
2040
2041       local_plt = elf_s390_local_plt (ibfd);
2042       for (i = 0; i < symtab_hdr->sh_info; i++)
2043         {
2044           if (local_plt[i].plt.refcount > 0)
2045             {
2046               local_plt[i].plt.offset = htab->elf.iplt->size;
2047               htab->elf.iplt->size += PLT_ENTRY_SIZE;
2048               htab->elf.igotplt->size += GOT_ENTRY_SIZE;
2049               htab->elf.irelplt->size += sizeof (Elf64_External_Rela);
2050             }
2051           else
2052             local_plt[i].plt.offset = (bfd_vma) -1;
2053         }
2054     }
2055
2056   if (htab->tls_ldm_got.refcount > 0)
2057     {
2058       /* Allocate 2 got entries and 1 dynamic reloc for R_390_TLS_LDM64
2059          relocs.  */
2060       htab->tls_ldm_got.offset = htab->elf.sgot->size;
2061       htab->elf.sgot->size += 2 * GOT_ENTRY_SIZE;
2062       htab->elf.srelgot->size += sizeof (Elf64_External_Rela);
2063     }
2064   else
2065     htab->tls_ldm_got.offset = -1;
2066
2067   /* Allocate global sym .plt and .got entries, and space for global
2068      sym dynamic relocs.  */
2069   elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
2070
2071   /* We now have determined the sizes of the various dynamic sections.
2072      Allocate memory for them.  */
2073   relocs = FALSE;
2074   for (s = dynobj->sections; s != NULL; s = s->next)
2075     {
2076       if ((s->flags & SEC_LINKER_CREATED) == 0)
2077         continue;
2078
2079       if (s == htab->elf.splt
2080           || s == htab->elf.sgot
2081           || s == htab->elf.sgotplt
2082           || s == htab->sdynbss
2083           || s == htab->elf.iplt
2084           || s == htab->elf.igotplt
2085           || s == htab->irelifunc)
2086         {
2087           /* Strip this section if we don't need it; see the
2088              comment below.  */
2089         }
2090       else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
2091         {
2092           if (s->size != 0 && s != htab->elf.srelplt)
2093             relocs = TRUE;
2094
2095           /* We use the reloc_count field as a counter if we need
2096              to copy relocs into the output file.  */
2097           s->reloc_count = 0;
2098         }
2099       else
2100         {
2101           /* It's not one of our sections, so don't allocate space.  */
2102           continue;
2103         }
2104
2105       if (s->size == 0)
2106         {
2107           /* If we don't need this section, strip it from the
2108              output file.  This is to handle .rela.bss and
2109              .rela.plt.  We must create it in
2110              create_dynamic_sections, because it must be created
2111              before the linker maps input sections to output
2112              sections.  The linker does that before
2113              adjust_dynamic_symbol is called, and it is that
2114              function which decides whether anything needs to go
2115              into these sections.  */
2116
2117           s->flags |= SEC_EXCLUDE;
2118           continue;
2119         }
2120
2121       if ((s->flags & SEC_HAS_CONTENTS) == 0)
2122         continue;
2123
2124       /* Allocate memory for the section contents.  We use bfd_zalloc
2125          here in case unused entries are not reclaimed before the
2126          section's contents are written out.  This should not happen,
2127          but this way if it does, we get a R_390_NONE reloc instead
2128          of garbage.  */
2129       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
2130       if (s->contents == NULL)
2131         return FALSE;
2132     }
2133
2134   if (htab->elf.dynamic_sections_created)
2135     {
2136       /* Add some entries to the .dynamic section.  We fill in the
2137          values later, in elf_s390_finish_dynamic_sections, but we
2138          must add the entries now so that we get the correct size for
2139          the .dynamic section.  The DT_DEBUG entry is filled in by the
2140          dynamic linker and used by the debugger.  */
2141 #define add_dynamic_entry(TAG, VAL) \
2142   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2143
2144       if (info->executable)
2145         {
2146           if (!add_dynamic_entry (DT_DEBUG, 0))
2147             return FALSE;
2148         }
2149
2150       if (htab->elf.splt->size != 0)
2151         {
2152           if (!add_dynamic_entry (DT_PLTGOT, 0)
2153               || !add_dynamic_entry (DT_PLTRELSZ, 0)
2154               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
2155               || !add_dynamic_entry (DT_JMPREL, 0))
2156             return FALSE;
2157         }
2158
2159       if (relocs)
2160         {
2161           if (!add_dynamic_entry (DT_RELA, 0)
2162               || !add_dynamic_entry (DT_RELASZ, 0)
2163               || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
2164             return FALSE;
2165
2166           /* If any dynamic relocs apply to a read-only section,
2167              then we need a DT_TEXTREL entry.  */
2168           if ((info->flags & DF_TEXTREL) == 0)
2169             elf_link_hash_traverse (&htab->elf, readonly_dynrelocs,
2170                                     info);
2171
2172           if ((info->flags & DF_TEXTREL) != 0)
2173             {
2174               if (!add_dynamic_entry (DT_TEXTREL, 0))
2175                 return FALSE;
2176             }
2177         }
2178     }
2179 #undef add_dynamic_entry
2180
2181   return TRUE;
2182 }
2183
2184 /* Return the base VMA address which should be subtracted from real addresses
2185    when resolving @dtpoff relocation.
2186    This is PT_TLS segment p_vaddr.  */
2187
2188 static bfd_vma
2189 dtpoff_base (struct bfd_link_info *info)
2190 {
2191   /* If tls_sec is NULL, we should have signalled an error already.  */
2192   if (elf_hash_table (info)->tls_sec == NULL)
2193     return 0;
2194   return elf_hash_table (info)->tls_sec->vma;
2195 }
2196
2197 /* Return the relocation value for @tpoff relocation
2198    if STT_TLS virtual address is ADDRESS.  */
2199
2200 static bfd_vma
2201 tpoff (struct bfd_link_info *info, bfd_vma address)
2202 {
2203   struct elf_link_hash_table *htab = elf_hash_table (info);
2204
2205   /* If tls_sec is NULL, we should have signalled an error already.  */
2206   if (htab->tls_sec == NULL)
2207     return 0;
2208   return htab->tls_size + htab->tls_sec->vma - address;
2209 }
2210
2211 /* Complain if TLS instruction relocation is against an invalid
2212    instruction.  */
2213
2214 static void
2215 invalid_tls_insn (bfd *input_bfd,
2216                   asection *input_section,
2217                   Elf_Internal_Rela *rel)
2218 {
2219   reloc_howto_type *howto;
2220
2221   howto = elf_howto_table + ELF64_R_TYPE (rel->r_info);
2222   (*_bfd_error_handler)
2223     (_("%B(%A+0x%lx): invalid instruction for TLS relocation %s"),
2224      input_bfd,
2225      input_section,
2226      (long) rel->r_offset,
2227      howto->name);
2228   bfd_set_error (bfd_error_bad_value);
2229 }
2230
2231 /* Relocate a 390 ELF section.  */
2232
2233 static bfd_boolean
2234 elf_s390_relocate_section (bfd *output_bfd,
2235                            struct bfd_link_info *info,
2236                            bfd *input_bfd,
2237                            asection *input_section,
2238                            bfd_byte *contents,
2239                            Elf_Internal_Rela *relocs,
2240                            Elf_Internal_Sym *local_syms,
2241                            asection **local_sections)
2242 {
2243   struct elf_s390_link_hash_table *htab;
2244   Elf_Internal_Shdr *symtab_hdr;
2245   struct elf_link_hash_entry **sym_hashes;
2246   bfd_vma *local_got_offsets;
2247   Elf_Internal_Rela *rel;
2248   Elf_Internal_Rela *relend;
2249
2250   BFD_ASSERT (is_s390_elf (input_bfd));
2251
2252   htab = elf_s390_hash_table (info);
2253   if (htab == NULL)
2254     return FALSE;
2255
2256   symtab_hdr = &elf_symtab_hdr (input_bfd);
2257   sym_hashes = elf_sym_hashes (input_bfd);
2258   local_got_offsets = elf_local_got_offsets (input_bfd);
2259
2260   rel = relocs;
2261   relend = relocs + input_section->reloc_count;
2262   for (; rel < relend; rel++)
2263     {
2264       unsigned int r_type;
2265       reloc_howto_type *howto;
2266       unsigned long r_symndx;
2267       struct elf_link_hash_entry *h;
2268       Elf_Internal_Sym *sym;
2269       asection *sec;
2270       bfd_vma off;
2271       bfd_vma relocation;
2272       bfd_boolean unresolved_reloc;
2273       bfd_reloc_status_type r;
2274       int tls_type;
2275       asection *base_got = htab->elf.sgot;
2276
2277       r_type = ELF64_R_TYPE (rel->r_info);
2278       if (r_type == (int) R_390_GNU_VTINHERIT
2279           || r_type == (int) R_390_GNU_VTENTRY)
2280         continue;
2281       if (r_type >= (int) R_390_max)
2282         {
2283           bfd_set_error (bfd_error_bad_value);
2284           return FALSE;
2285         }
2286
2287       howto = elf_howto_table + r_type;
2288       r_symndx = ELF64_R_SYM (rel->r_info);
2289
2290       h = NULL;
2291       sym = NULL;
2292       sec = NULL;
2293       unresolved_reloc = FALSE;
2294       if (r_symndx < symtab_hdr->sh_info)
2295         {
2296           sym = local_syms + r_symndx;
2297           sec = local_sections[r_symndx];
2298
2299           if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
2300             {
2301               struct plt_entry *local_plt = elf_s390_local_plt (input_bfd);
2302               if (local_plt == NULL)
2303                 return FALSE;
2304
2305               /* Address of the PLT slot.  */
2306               relocation = (htab->elf.iplt->output_section->vma
2307                             + htab->elf.iplt->output_offset
2308                             + local_plt[r_symndx].plt.offset);
2309
2310               switch (r_type)
2311                 {
2312                 case R_390_PLTOFF16:
2313                 case R_390_PLTOFF32:
2314                 case R_390_PLTOFF64:
2315                   relocation -= htab->elf.sgot->output_section->vma;
2316                   break;
2317                 case R_390_GOTPLT12:
2318                 case R_390_GOTPLT16:
2319                 case R_390_GOTPLT20:
2320                 case R_390_GOTPLT32:
2321                 case R_390_GOTPLT64:
2322                 case R_390_GOTPLTENT:
2323                 case R_390_GOT12:
2324                 case R_390_GOT16:
2325                 case R_390_GOT20:
2326                 case R_390_GOT32:
2327                 case R_390_GOT64:
2328                 case R_390_GOTENT:
2329                   {
2330                     /* Write the PLT slot address into the GOT slot.  */
2331                     bfd_put_64 (output_bfd, relocation,
2332                                 htab->elf.sgot->contents +
2333                                 local_got_offsets[r_symndx]);
2334                     relocation = (local_got_offsets[r_symndx] +
2335                                   htab->elf.sgot->output_offset);
2336
2337                     if (r_type == R_390_GOTENT || r_type == R_390_GOTPLTENT)
2338                       relocation += htab->elf.sgot->output_section->vma;
2339                     break;
2340                   }
2341                 default:
2342                   break;
2343                 }
2344               /* The output section is needed later in
2345                  finish_dynamic_section when creating the dynamic
2346                  relocation.  */
2347               local_plt[r_symndx].sec = sec;
2348               goto do_relocation;
2349             }
2350           else
2351             relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
2352         }
2353       else
2354         {
2355           bfd_boolean warned ATTRIBUTE_UNUSED;
2356
2357           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2358                                    r_symndx, symtab_hdr, sym_hashes,
2359                                    h, sec, relocation,
2360                                    unresolved_reloc, warned);
2361         }
2362
2363       if (sec != NULL && discarded_section (sec))
2364         RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
2365                                          rel, 1, relend, howto, 0, contents);
2366
2367       if (info->relocatable)
2368         continue;
2369
2370       switch (r_type)
2371         {
2372         case R_390_GOTPLT12:
2373         case R_390_GOTPLT16:
2374         case R_390_GOTPLT20:
2375         case R_390_GOTPLT32:
2376         case R_390_GOTPLT64:
2377         case R_390_GOTPLTENT:
2378           /* There are three cases for a GOTPLT relocation. 1) The
2379              relocation is against the jump slot entry of a plt that
2380              will get emitted to the output file. 2) The relocation
2381              is against the jump slot of a plt entry that has been
2382              removed. elf_s390_adjust_gotplt has created a GOT entry
2383              as replacement. 3) The relocation is against a local symbol.
2384              Cases 2) and 3) are the same as the GOT relocation code
2385              so we just have to test for case 1 and fall through for
2386              the other two.  */
2387           if (h != NULL && h->plt.offset != (bfd_vma) -1)
2388             {
2389               bfd_vma plt_index;
2390
2391               if (s390_is_ifunc_symbol_p (h))
2392                 {
2393                   plt_index = h->plt.offset / PLT_ENTRY_SIZE;
2394                   relocation = (plt_index * GOT_ENTRY_SIZE +
2395                                 htab->elf.igotplt->output_offset);
2396                   if (r_type == R_390_GOTPLTENT)
2397                     relocation += htab->elf.igotplt->output_section->vma;
2398                 }
2399               else
2400                 {
2401                   /* Calc. index no.
2402                      Current offset - size first entry / entry size.  */
2403                   plt_index = (h->plt.offset - PLT_FIRST_ENTRY_SIZE) /
2404                     PLT_ENTRY_SIZE;
2405
2406                   /* Offset in GOT is PLT index plus GOT headers(3)
2407                      times 4, addr & GOT addr.  */
2408                   relocation = (plt_index + 3) * GOT_ENTRY_SIZE;
2409                   if (r_type == R_390_GOTPLTENT)
2410                     relocation += htab->elf.sgot->output_section->vma;
2411                 }
2412               unresolved_reloc = FALSE;
2413               break;
2414             }
2415           /* Fall through.  */
2416
2417         case R_390_GOT12:
2418         case R_390_GOT16:
2419         case R_390_GOT20:
2420         case R_390_GOT32:
2421         case R_390_GOT64:
2422         case R_390_GOTENT:
2423           /* Relocation is to the entry for this symbol in the global
2424              offset table.  */
2425           if (base_got == NULL)
2426             abort ();
2427
2428           if (h != NULL)
2429             {
2430               bfd_boolean dyn;
2431
2432               off = h->got.offset;
2433               dyn = htab->elf.dynamic_sections_created;
2434
2435               if (s390_is_ifunc_symbol_p (h))
2436                 {
2437                   BFD_ASSERT (h->plt.offset != (bfd_vma) -1);
2438                   if (off == (bfd_vma)-1)
2439                     {
2440                       /* No explicit GOT usage so redirect to the
2441                          got.iplt slot.  */
2442                       base_got = htab->elf.igotplt;
2443                       off = h->plt.offset / PLT_ENTRY_SIZE * GOT_ENTRY_SIZE;
2444                     }
2445                   else
2446                     {
2447                       /* Explicit GOT slots must contain the address
2448                          of the PLT slot. This will be handled in
2449                          finish_dynamic_symbol.  */
2450                     }
2451                 }
2452               else if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
2453                        || (info->shared
2454                            && SYMBOL_REFERENCES_LOCAL (info, h))
2455                        || (ELF_ST_VISIBILITY (h->other)
2456                            && h->root.type == bfd_link_hash_undefweak))
2457                 {
2458                   /* This is actually a static link, or it is a
2459                      -Bsymbolic link and the symbol is defined
2460                      locally, or the symbol was forced to be local
2461                      because of a version file.  We must initialize
2462                      this entry in the global offset table.  Since the
2463                      offset must always be a multiple of 2, we use the
2464                      least significant bit to record whether we have
2465                      initialized it already.
2466
2467                      When doing a dynamic link, we create a .rel.got
2468                      relocation entry to initialize the value.  This
2469                      is done in the finish_dynamic_symbol routine.  */
2470                   if ((off & 1) != 0)
2471                     off &= ~1;
2472                   else
2473                     {
2474                       bfd_put_64 (output_bfd, relocation,
2475                                   base_got->contents + off);
2476                       h->got.offset |= 1;
2477                     }
2478                 }
2479               else
2480                 unresolved_reloc = FALSE;
2481             }
2482           else
2483             {
2484               if (local_got_offsets == NULL)
2485                 abort ();
2486
2487               off = local_got_offsets[r_symndx];
2488
2489               /* The offset must always be a multiple of 8.  We use
2490                  the least significant bit to record whether we have
2491                  already generated the necessary reloc.  */
2492               if ((off & 1) != 0)
2493                 off &= ~1;
2494               else
2495                 {
2496                   bfd_put_64 (output_bfd, relocation,
2497                               htab->elf.sgot->contents + off);
2498
2499                   if (info->shared)
2500                     {
2501                       asection *s;
2502                       Elf_Internal_Rela outrel;
2503                       bfd_byte *loc;
2504
2505                       s = htab->elf.srelgot;
2506                       if (s == NULL)
2507                         abort ();
2508
2509                       outrel.r_offset = (htab->elf.sgot->output_section->vma
2510                                          + htab->elf.sgot->output_offset
2511                                          + off);
2512                       outrel.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
2513                       outrel.r_addend = relocation;
2514                       loc = s->contents;
2515                       loc += s->reloc_count++ * sizeof (Elf64_External_Rela);
2516                       bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2517                     }
2518
2519                   local_got_offsets[r_symndx] |= 1;
2520                 }
2521             }
2522
2523           if (off >= (bfd_vma) -2)
2524             abort ();
2525
2526           relocation = base_got->output_offset + off;
2527
2528           /* For @GOTENT the relocation is against the offset between
2529              the instruction and the symbols entry in the GOT and not
2530              between the start of the GOT and the symbols entry. We
2531              add the vma of the GOT to get the correct value.  */
2532           if (   r_type == R_390_GOTENT
2533               || r_type == R_390_GOTPLTENT)
2534             relocation += base_got->output_section->vma;
2535
2536           break;
2537
2538         case R_390_GOTOFF16:
2539         case R_390_GOTOFF32:
2540         case R_390_GOTOFF64:
2541           /* Relocation is relative to the start of the global offset
2542              table.  */
2543
2544           /* Note that sgot->output_offset is not involved in this
2545              calculation.  We always want the start of .got.  If we
2546              defined _GLOBAL_OFFSET_TABLE in a different way, as is
2547              permitted by the ABI, we might have to change this
2548              calculation.  */
2549           relocation -= htab->elf.sgot->output_section->vma;
2550           break;
2551
2552         case R_390_GOTPC:
2553         case R_390_GOTPCDBL:
2554           /* Use global offset table as symbol value.  */
2555           relocation = htab->elf.sgot->output_section->vma;
2556           unresolved_reloc = FALSE;
2557           break;
2558
2559         case R_390_PLT16DBL:
2560         case R_390_PLT32:
2561         case R_390_PLT32DBL:
2562         case R_390_PLT64:
2563           /* Relocation is to the entry for this symbol in the
2564              procedure linkage table.  */
2565
2566           /* Resolve a PLT32 reloc against a local symbol directly,
2567              without using the procedure linkage table.  */
2568           if (h == NULL)
2569             break;
2570
2571           if (h->plt.offset == (bfd_vma) -1
2572               || (htab->elf.splt == NULL && !s390_is_ifunc_symbol_p (h)))
2573             {
2574               /* We didn't make a PLT entry for this symbol.  This
2575                  happens when statically linking PIC code, or when
2576                  using -Bsymbolic.  */
2577               break;
2578             }
2579           if (s390_is_ifunc_symbol_p (h))
2580             relocation = (htab->elf.iplt->output_section->vma
2581                           + htab->elf.iplt->output_offset
2582                           + h->plt.offset);
2583           else
2584             relocation = (htab->elf.splt->output_section->vma
2585                           + htab->elf.splt->output_offset
2586                           + h->plt.offset);
2587           unresolved_reloc = FALSE;
2588           break;
2589
2590         case R_390_PLTOFF16:
2591         case R_390_PLTOFF32:
2592         case R_390_PLTOFF64:
2593           /* Relocation is to the entry for this symbol in the
2594              procedure linkage table relative to the start of the GOT.  */
2595
2596           /* For local symbols or if we didn't make a PLT entry for
2597              this symbol resolve the symbol directly.  */
2598           if (h == NULL
2599               || h->plt.offset == (bfd_vma) -1
2600               || (htab->elf.splt == NULL && !s390_is_ifunc_symbol_p (h)))
2601             {
2602               relocation -= htab->elf.sgot->output_section->vma;
2603               break;
2604             }
2605
2606           if (s390_is_ifunc_symbol_p (h))
2607             relocation = (htab->elf.iplt->output_section->vma
2608                           + htab->elf.iplt->output_offset
2609                           + h->plt.offset
2610                           - htab->elf.sgot->output_section->vma);
2611           else
2612             relocation = (htab->elf.splt->output_section->vma
2613                           + htab->elf.splt->output_offset
2614                           + h->plt.offset
2615                           - htab->elf.sgot->output_section->vma);
2616           unresolved_reloc = FALSE;
2617           break;
2618
2619         case R_390_8:
2620         case R_390_16:
2621         case R_390_32:
2622         case R_390_64:
2623         case R_390_PC16:
2624         case R_390_PC16DBL:
2625         case R_390_PC32:
2626         case R_390_PC32DBL:
2627         case R_390_PC64:
2628
2629           if (h != NULL
2630               && s390_is_ifunc_symbol_p (h)
2631               && h->def_regular)
2632             {
2633               if (!info->shared || !h->non_got_ref)
2634                 {
2635                   /* For a non-shared object STT_GNU_IFUNC symbol must
2636                      go through PLT.  */
2637                   relocation = (htab->elf.iplt->output_section->vma
2638                                 + htab->elf.iplt->output_offset
2639                                 + h ->plt.offset);
2640                   goto do_relocation;
2641                 }
2642               else
2643                 {
2644                   /* For shared objects a runtime relocation is needed.  */
2645
2646                   Elf_Internal_Rela outrel;
2647                   asection *sreloc;
2648
2649                   /* Need a dynamic relocation to get the real function
2650                      address.  */
2651                   outrel.r_offset = _bfd_elf_section_offset (output_bfd,
2652                                                              info,
2653                                                              input_section,
2654                                                              rel->r_offset);
2655                   if (outrel.r_offset == (bfd_vma) -1
2656                       || outrel.r_offset == (bfd_vma) -2)
2657                     abort ();
2658
2659                   outrel.r_offset += (input_section->output_section->vma
2660                                       + input_section->output_offset);
2661
2662                   if (h->dynindx == -1
2663                       || h->forced_local
2664                       || info->executable)
2665                     {
2666                       /* This symbol is resolved locally.  */
2667                       outrel.r_info = ELF64_R_INFO (0, R_390_IRELATIVE);
2668                       outrel.r_addend = (h->root.u.def.value
2669                                          + h->root.u.def.section->output_section->vma
2670                                          + h->root.u.def.section->output_offset);
2671                     }
2672                   else
2673                     {
2674                       outrel.r_info = ELF64_R_INFO (h->dynindx, r_type);
2675                       outrel.r_addend = 0;
2676                     }
2677
2678                   sreloc = htab->elf.irelifunc;
2679                   elf_append_rela (output_bfd, sreloc, &outrel);
2680
2681                   /* If this reloc is against an external symbol, we
2682                      do not want to fiddle with the addend.  Otherwise,
2683                      we need to include the symbol value so that it
2684                      becomes an addend for the dynamic reloc.  For an
2685                      internal symbol, we have updated addend.  */
2686                   continue;
2687                 }
2688             }
2689
2690           if ((input_section->flags & SEC_ALLOC) == 0)
2691             break;
2692
2693           if ((info->shared
2694                && (h == NULL
2695                    || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2696                    || h->root.type != bfd_link_hash_undefweak)
2697                && ((r_type != R_390_PC16
2698                     && r_type != R_390_PC16DBL
2699                     && r_type != R_390_PC32
2700                     && r_type != R_390_PC32DBL
2701                     && r_type != R_390_PC64)
2702                    || !SYMBOL_CALLS_LOCAL (info, h)))
2703               || (ELIMINATE_COPY_RELOCS
2704                   && !info->shared
2705                   && h != NULL
2706                   && h->dynindx != -1
2707                   && !h->non_got_ref
2708                   && ((h->def_dynamic
2709                        && !h->def_regular)
2710                       || h->root.type == bfd_link_hash_undefweak
2711                       || h->root.type == bfd_link_hash_undefined)))
2712             {
2713               Elf_Internal_Rela outrel;
2714               bfd_boolean skip, relocate;
2715               asection *sreloc;
2716               bfd_byte *loc;
2717
2718               /* When generating a shared object, these relocations
2719                  are copied into the output file to be resolved at run
2720                  time.  */
2721               skip = FALSE;
2722               relocate = FALSE;
2723
2724               outrel.r_offset =
2725                 _bfd_elf_section_offset (output_bfd, info, input_section,
2726                                          rel->r_offset);
2727               if (outrel.r_offset == (bfd_vma) -1)
2728                 skip = TRUE;
2729               else if (outrel.r_offset == (bfd_vma) -2)
2730                 skip = TRUE, relocate = TRUE;
2731
2732               outrel.r_offset += (input_section->output_section->vma
2733                                   + input_section->output_offset);
2734
2735               if (skip)
2736                 memset (&outrel, 0, sizeof outrel);
2737               else if (h != NULL
2738                        && h->dynindx != -1
2739                        && (r_type == R_390_PC16
2740                            || r_type == R_390_PC16DBL
2741                            || r_type == R_390_PC32
2742                            || r_type == R_390_PC32DBL
2743                            || r_type == R_390_PC64
2744                            || !info->shared
2745                            || !SYMBOLIC_BIND (info, h)
2746                            || !h->def_regular))
2747                 {
2748                   outrel.r_info = ELF64_R_INFO (h->dynindx, r_type);
2749                   outrel.r_addend = rel->r_addend;
2750                 }
2751               else
2752                 {
2753                   /* This symbol is local, or marked to become local.  */
2754                   outrel.r_addend = relocation + rel->r_addend;
2755                   if (r_type == R_390_64)
2756                     {
2757                       relocate = TRUE;
2758                       outrel.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
2759                     }
2760                   else
2761                     {
2762                       long sindx;
2763
2764                       if (bfd_is_abs_section (sec))
2765                         sindx = 0;
2766                       else if (sec == NULL || sec->owner == NULL)
2767                         {
2768                           bfd_set_error(bfd_error_bad_value);
2769                           return FALSE;
2770                         }
2771                       else
2772                         {
2773                           asection *osec;
2774
2775                           osec = sec->output_section;
2776                           sindx = elf_section_data (osec)->dynindx;
2777
2778                           if (sindx == 0)
2779                             {
2780                               osec = htab->elf.text_index_section;
2781                               sindx = elf_section_data (osec)->dynindx;
2782                             }
2783                           BFD_ASSERT (sindx != 0);
2784
2785                           /* We are turning this relocation into one
2786                              against a section symbol, so subtract out
2787                              the output section's address but not the
2788                              offset of the input section in the output
2789                              section.  */
2790                           outrel.r_addend -= osec->vma;
2791                         }
2792                       outrel.r_info = ELF64_R_INFO (sindx, r_type);
2793                     }
2794                 }
2795
2796               sreloc = elf_section_data (input_section)->sreloc;
2797               if (sreloc == NULL)
2798                 abort ();
2799
2800               loc = sreloc->contents;
2801               loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
2802               bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2803
2804               /* If this reloc is against an external symbol, we do
2805                  not want to fiddle with the addend.  Otherwise, we
2806                  need to include the symbol value so that it becomes
2807                  an addend for the dynamic reloc.  */
2808               if (! relocate)
2809                 continue;
2810             }
2811
2812           break;
2813
2814           /* Relocations for tls literal pool entries.  */
2815         case R_390_TLS_IE64:
2816           if (info->shared)
2817             {
2818               Elf_Internal_Rela outrel;
2819               asection *sreloc;
2820               bfd_byte *loc;
2821
2822               outrel.r_offset = rel->r_offset
2823                                 + input_section->output_section->vma
2824                                 + input_section->output_offset;
2825               outrel.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
2826               sreloc = elf_section_data (input_section)->sreloc;
2827               if (sreloc == NULL)
2828                 abort ();
2829               loc = sreloc->contents;
2830               loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
2831               bfd_elf64_swap_reloc_out (output_bfd, &outrel, loc);
2832             }
2833           /* Fall through.  */
2834
2835         case R_390_TLS_GD64:
2836         case R_390_TLS_GOTIE64:
2837           r_type = elf_s390_tls_transition (info, r_type, h == NULL);
2838           tls_type = GOT_UNKNOWN;
2839           if (h == NULL && local_got_offsets)
2840             tls_type = elf_s390_local_got_tls_type (input_bfd) [r_symndx];
2841           else if (h != NULL)
2842             {
2843               tls_type = elf_s390_hash_entry(h)->tls_type;
2844               if (!info->shared && h->dynindx == -1 && tls_type >= GOT_TLS_IE)
2845                 r_type = R_390_TLS_LE64;
2846             }
2847           if (r_type == R_390_TLS_GD64 && tls_type >= GOT_TLS_IE)
2848             r_type = R_390_TLS_IE64;
2849
2850           if (r_type == R_390_TLS_LE64)
2851             {
2852               /* This relocation gets optimized away by the local exec
2853                  access optimization.  */
2854               BFD_ASSERT (! unresolved_reloc);
2855               bfd_put_64 (output_bfd, -tpoff (info, relocation),
2856                           contents + rel->r_offset);
2857               continue;
2858             }
2859
2860           if (htab->elf.sgot == NULL)
2861             abort ();
2862
2863           if (h != NULL)
2864             off = h->got.offset;
2865           else
2866             {
2867               if (local_got_offsets == NULL)
2868                 abort ();
2869
2870               off = local_got_offsets[r_symndx];
2871             }
2872
2873         emit_tls_relocs:
2874
2875           if ((off & 1) != 0)
2876             off &= ~1;
2877           else
2878             {
2879               Elf_Internal_Rela outrel;
2880               bfd_byte *loc;
2881               int dr_type, indx;
2882
2883               if (htab->elf.srelgot == NULL)
2884                 abort ();
2885
2886               outrel.r_offset = (htab->elf.sgot->output_section->vma
2887                                  + htab->elf.sgot->output_offset + off);
2888
2889               indx = h && h->dynindx != -1 ? h->dynindx : 0;
2890               if (r_type == R_390_TLS_GD64)
2891                 dr_type = R_390_TLS_DTPMOD;
2892               else
2893                 dr_type = R_390_TLS_TPOFF;
2894               if (dr_type == R_390_TLS_TPOFF && indx == 0)
2895                 outrel.r_addend = relocation - dtpoff_base (info);
2896               else
2897                 outrel.r_addend = 0;
2898               outrel.r_info = ELF64_R_INFO (indx, dr_type);
2899               loc = htab->elf.srelgot->contents;
2900               loc += htab->elf.srelgot->reloc_count++
2901                 * sizeof (Elf64_External_Rela);
2902               bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2903
2904               if (r_type == R_390_TLS_GD64)
2905                 {
2906                   if (indx == 0)
2907                     {
2908                       BFD_ASSERT (! unresolved_reloc);
2909                       bfd_put_64 (output_bfd,
2910                                   relocation - dtpoff_base (info),
2911                                   htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
2912                     }
2913                   else
2914                     {
2915                       outrel.r_info = ELF64_R_INFO (indx, R_390_TLS_DTPOFF);
2916                       outrel.r_offset += GOT_ENTRY_SIZE;
2917                       outrel.r_addend = 0;
2918                       htab->elf.srelgot->reloc_count++;
2919                       loc += sizeof (Elf64_External_Rela);
2920                       bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2921                     }
2922                 }
2923
2924               if (h != NULL)
2925                 h->got.offset |= 1;
2926               else
2927                 local_got_offsets[r_symndx] |= 1;
2928             }
2929
2930           if (off >= (bfd_vma) -2)
2931             abort ();
2932           if (r_type == ELF64_R_TYPE (rel->r_info))
2933             {
2934               relocation = htab->elf.sgot->output_offset + off;
2935               if (r_type == R_390_TLS_IE64 || r_type == R_390_TLS_IEENT)
2936                 relocation += htab->elf.sgot->output_section->vma;
2937               unresolved_reloc = FALSE;
2938             }
2939           else
2940             {
2941               bfd_put_64 (output_bfd, htab->elf.sgot->output_offset + off,
2942                           contents + rel->r_offset);
2943               continue;
2944             }
2945           break;
2946
2947         case R_390_TLS_GOTIE12:
2948         case R_390_TLS_GOTIE20:
2949         case R_390_TLS_IEENT:
2950           if (h == NULL)
2951             {
2952               if (local_got_offsets == NULL)
2953                 abort();
2954               off = local_got_offsets[r_symndx];
2955               if (info->shared)
2956                 goto emit_tls_relocs;
2957             }
2958           else
2959             {
2960               off = h->got.offset;
2961               tls_type = elf_s390_hash_entry(h)->tls_type;
2962               if (info->shared || h->dynindx != -1 || tls_type < GOT_TLS_IE)
2963                 goto emit_tls_relocs;
2964             }
2965
2966           if (htab->elf.sgot == NULL)
2967             abort ();
2968
2969           BFD_ASSERT (! unresolved_reloc);
2970           bfd_put_64 (output_bfd, -tpoff (info, relocation),
2971                       htab->elf.sgot->contents + off);
2972           relocation = htab->elf.sgot->output_offset + off;
2973           if (r_type == R_390_TLS_IEENT)
2974             relocation += htab->elf.sgot->output_section->vma;
2975           unresolved_reloc = FALSE;
2976           break;
2977
2978         case R_390_TLS_LDM64:
2979           if (! info->shared)
2980             /* The literal pool entry this relocation refers to gets ignored
2981                by the optimized code of the local exec model. Do nothing
2982                and the value will turn out zero.  */
2983             continue;
2984
2985           if (htab->elf.sgot == NULL)
2986             abort ();
2987
2988           off = htab->tls_ldm_got.offset;
2989           if (off & 1)
2990             off &= ~1;
2991           else
2992             {
2993               Elf_Internal_Rela outrel;
2994               bfd_byte *loc;
2995
2996               if (htab->elf.srelgot == NULL)
2997                 abort ();
2998
2999               outrel.r_offset = (htab->elf.sgot->output_section->vma
3000                                  + htab->elf.sgot->output_offset + off);
3001
3002               bfd_put_64 (output_bfd, 0,
3003                           htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
3004               outrel.r_info = ELF64_R_INFO (0, R_390_TLS_DTPMOD);
3005               outrel.r_addend = 0;
3006               loc = htab->elf.srelgot->contents;
3007               loc += htab->elf.srelgot->reloc_count++
3008                 * sizeof (Elf64_External_Rela);
3009               bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
3010               htab->tls_ldm_got.offset |= 1;
3011             }
3012           relocation = htab->elf.sgot->output_offset + off;
3013           unresolved_reloc = FALSE;
3014           break;
3015
3016         case R_390_TLS_LE64:
3017           if (info->shared)
3018             {
3019               /* Linking a shared library with non-fpic code requires
3020                  a R_390_TLS_TPOFF relocation.  */
3021               Elf_Internal_Rela outrel;
3022               asection *sreloc;
3023               bfd_byte *loc;
3024               int indx;
3025
3026               outrel.r_offset = rel->r_offset
3027                                 + input_section->output_section->vma
3028                                 + input_section->output_offset;
3029               if (h != NULL && h->dynindx != -1)
3030                 indx = h->dynindx;
3031               else
3032                 indx = 0;
3033               outrel.r_info = ELF64_R_INFO (indx, R_390_TLS_TPOFF);
3034               if (indx == 0)
3035                 outrel.r_addend = relocation - dtpoff_base (info);
3036               else
3037                 outrel.r_addend = 0;
3038               sreloc = elf_section_data (input_section)->sreloc;
3039               if (sreloc == NULL)
3040                 abort ();
3041               loc = sreloc->contents;
3042               loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
3043               bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
3044             }
3045           else
3046             {
3047               BFD_ASSERT (! unresolved_reloc);
3048               bfd_put_64 (output_bfd, -tpoff (info, relocation),
3049                           contents + rel->r_offset);
3050             }
3051           continue;
3052
3053         case R_390_TLS_LDO64:
3054           if (info->shared || (input_section->flags & SEC_DEBUGGING))
3055             relocation -= dtpoff_base (info);
3056           else
3057             /* When converting LDO to LE, we must negate.  */
3058             relocation = -tpoff (info, relocation);
3059           break;
3060
3061           /* Relocations for tls instructions.  */
3062         case R_390_TLS_LOAD:
3063         case R_390_TLS_GDCALL:
3064         case R_390_TLS_LDCALL:
3065           tls_type = GOT_UNKNOWN;
3066           if (h == NULL && local_got_offsets)
3067             tls_type = elf_s390_local_got_tls_type (input_bfd) [r_symndx];
3068           else if (h != NULL)
3069             tls_type = elf_s390_hash_entry(h)->tls_type;
3070
3071           if (tls_type == GOT_TLS_GD)
3072             continue;
3073
3074           if (r_type == R_390_TLS_LOAD)
3075             {
3076               if (!info->shared && (h == NULL || h->dynindx == -1))
3077                 {
3078                   /* IE->LE transition. Four valid cases:
3079                      lg %rx,(0,%ry)    -> sllg %rx,%ry,0
3080                      lg %rx,(%ry,0)    -> sllg %rx,%ry,0
3081                      lg %rx,(%ry,%r12) -> sllg %rx,%ry,0
3082                      lg %rx,(%r12,%ry) -> sllg %rx,%ry,0  */
3083                   unsigned int insn0, insn1, ry;
3084
3085                   insn0 = bfd_get_32 (input_bfd, contents + rel->r_offset);
3086                   insn1 = bfd_get_16 (input_bfd, contents + rel->r_offset + 4);
3087                   if (insn1 != 0x0004)
3088                     invalid_tls_insn (input_bfd, input_section, rel);
3089                   ry = 0;
3090                   if ((insn0 & 0xff00f000) == 0xe3000000)
3091                     /* lg %rx,0(%ry,0) -> sllg %rx,%ry,0  */
3092                     ry = (insn0 & 0x000f0000);
3093                   else if ((insn0 & 0xff0f0000) == 0xe3000000)
3094                     /* lg %rx,0(0,%ry) -> sllg %rx,%ry,0  */
3095                     ry = (insn0 & 0x0000f000) << 4;
3096                   else if ((insn0 & 0xff00f000) == 0xe300c000)
3097                     /* lg %rx,0(%ry,%r12) -> sllg %rx,%ry,0  */
3098                     ry = (insn0 & 0x000f0000);
3099                   else if ((insn0 & 0xff0f0000) == 0xe30c0000)
3100                     /* lg %rx,0(%r12,%ry) -> sllg %rx,%ry,0  */
3101                     ry = (insn0 & 0x0000f000) << 4;
3102                   else
3103                     invalid_tls_insn (input_bfd, input_section, rel);
3104                   insn0 = 0xeb000000 | (insn0 & 0x00f00000) | ry;
3105                   insn1 = 0x000d;
3106                   bfd_put_32 (output_bfd, insn0, contents + rel->r_offset);
3107                   bfd_put_16 (output_bfd, insn1, contents + rel->r_offset + 4);
3108                 }
3109             }
3110           else if (r_type == R_390_TLS_GDCALL)
3111             {
3112               unsigned int insn0, insn1;
3113
3114               insn0 = bfd_get_32 (input_bfd, contents + rel->r_offset);
3115               insn1 = bfd_get_16 (input_bfd, contents + rel->r_offset + 4);
3116               if ((insn0 & 0xffff0000) != 0xc0e50000)
3117                 invalid_tls_insn (input_bfd, input_section, rel);
3118               if (!info->shared && (h == NULL || h->dynindx == -1))
3119                 {
3120                   /* GD->LE transition.
3121                      brasl %r14,__tls_get_addr@plt -> brcl 0,. */
3122                   insn0 = 0xc0040000;
3123                   insn1 = 0x0000;
3124                 }
3125               else
3126                 {
3127                   /* GD->IE transition.
3128                      brasl %r14,__tls_get_addr@plt -> lg %r2,0(%r2,%r12)  */
3129                   insn0 = 0xe322c000;
3130                   insn1 = 0x0004;
3131                 }
3132               bfd_put_32 (output_bfd, insn0, contents + rel->r_offset);
3133               bfd_put_16 (output_bfd, insn1, contents + rel->r_offset + 4);
3134             }
3135           else if (r_type == R_390_TLS_LDCALL)
3136             {
3137               if (!info->shared)
3138                 {
3139                   unsigned int insn0, insn1;
3140
3141                   insn0 = bfd_get_32 (input_bfd, contents + rel->r_offset);
3142                   insn1 = bfd_get_16 (input_bfd, contents + rel->r_offset + 4);
3143                   if ((insn0 & 0xffff0000) != 0xc0e50000)
3144                     invalid_tls_insn (input_bfd, input_section, rel);
3145                   /* LD->LE transition.
3146                      brasl %r14,__tls_get_addr@plt -> brcl 0,. */
3147                   insn0 = 0xc0040000;
3148                   insn1 = 0x0000;
3149                   bfd_put_32 (output_bfd, insn0, contents + rel->r_offset);
3150                   bfd_put_16 (output_bfd, insn1, contents + rel->r_offset + 4);
3151                 }
3152             }
3153           continue;
3154
3155         default:
3156           break;
3157         }
3158
3159       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
3160          because such sections are not SEC_ALLOC and thus ld.so will
3161          not process them.  */
3162       if (unresolved_reloc
3163           && !((input_section->flags & SEC_DEBUGGING) != 0
3164                && h->def_dynamic)
3165           && _bfd_elf_section_offset (output_bfd, info, input_section,
3166                                       rel->r_offset) != (bfd_vma) -1)
3167         (*_bfd_error_handler)
3168           (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
3169            input_bfd,
3170            input_section,
3171            (long) rel->r_offset,
3172            howto->name,
3173            h->root.root.string);
3174
3175     do_relocation:
3176
3177       if (r_type == R_390_20
3178           || r_type == R_390_GOT20
3179           || r_type == R_390_GOTPLT20
3180           || r_type == R_390_TLS_GOTIE20)
3181         {
3182           relocation += rel->r_addend;
3183           relocation = (relocation&0xfff) << 8 | (relocation&0xff000) >> 12;
3184           r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3185                                         contents, rel->r_offset,
3186                                         relocation, 0);
3187         }
3188       else
3189         r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3190                                       contents, rel->r_offset,
3191                                       relocation, rel->r_addend);
3192
3193       if (r != bfd_reloc_ok)
3194         {
3195           const char *name;
3196
3197           if (h != NULL)
3198             name = h->root.root.string;
3199           else
3200             {
3201               name = bfd_elf_string_from_elf_section (input_bfd,
3202                                                       symtab_hdr->sh_link,
3203                                                       sym->st_name);
3204               if (name == NULL)
3205                 return FALSE;
3206               if (*name == '\0')
3207                 name = bfd_section_name (input_bfd, sec);
3208             }
3209
3210           if (r == bfd_reloc_overflow)
3211             {
3212
3213               if (! ((*info->callbacks->reloc_overflow)
3214                      (info, (h ? &h->root : NULL), name, howto->name,
3215                       (bfd_vma) 0, input_bfd, input_section,
3216                       rel->r_offset)))
3217                 return FALSE;
3218             }
3219           else
3220             {
3221               (*_bfd_error_handler)
3222                 (_("%B(%A+0x%lx): reloc against `%s': error %d"),
3223                  input_bfd, input_section,
3224                  (long) rel->r_offset, name, (int) r);
3225               return FALSE;
3226             }
3227         }
3228     }
3229
3230   return TRUE;
3231 }
3232
3233 /* Generate the PLT slots together with the dynamic relocations needed
3234    for IFUNC symbols.  */
3235
3236 static void
3237 elf_s390_finish_ifunc_symbol (bfd *output_bfd,
3238                               struct bfd_link_info *info,
3239                               struct elf_link_hash_entry *h,
3240                               struct elf_s390_link_hash_table *htab,
3241                               bfd_vma plt_offset,
3242                               bfd_vma resolver_address)
3243 {
3244   bfd_vma plt_index;
3245   bfd_vma got_offset;
3246   Elf_Internal_Rela rela;
3247   bfd_byte *loc;
3248   asection *plt, *gotplt, *relplt;
3249
3250   if (htab->elf.iplt == NULL
3251       || htab->elf.igotplt == NULL
3252       || htab->elf.irelplt == NULL)
3253     abort ();
3254
3255   /* Index of the PLT slot within iplt section.  */
3256   plt_index = plt_offset / PLT_ENTRY_SIZE;
3257   plt = htab->elf.iplt;
3258   /* Offset into the igot.plt section.  */
3259   got_offset = plt_index * GOT_ENTRY_SIZE;
3260   gotplt = htab->elf.igotplt;
3261   relplt = htab->elf.irelplt;
3262
3263   /* Fill in the blueprint of a PLT.  */
3264   memcpy (plt->contents + plt_offset, elf_s390x_plt_entry,
3265           PLT_ENTRY_SIZE);
3266
3267   /* Fixup the relative address to the GOT entry */
3268   bfd_put_32 (output_bfd,
3269               (gotplt->output_section->vma +
3270                gotplt->output_offset + got_offset
3271                - (plt->output_section->vma +
3272                   plt->output_offset +
3273                   plt_offset))/2,
3274               plt->contents + plt_offset + 2);
3275   /* Fixup the relative branch to PLT 0 */
3276   bfd_put_32 (output_bfd, - (plt->output_offset +
3277                              (PLT_ENTRY_SIZE * plt_index) + 22)/2,
3278               plt->contents + plt_offset + 24);
3279   /* Fixup offset into .rela.plt section.  */
3280   bfd_put_32 (output_bfd, relplt->output_offset +
3281               plt_index * sizeof (Elf64_External_Rela),
3282               plt->contents + plt_offset + 28);
3283
3284   /* Fill in the entry in the global offset table.
3285      Points to instruction after GOT offset.  */
3286   bfd_put_64 (output_bfd,
3287               (plt->output_section->vma
3288                + plt->output_offset
3289                + plt_offset
3290                + 14),
3291               gotplt->contents + got_offset);
3292
3293   /* Fill in the entry in the .rela.plt section.  */
3294   rela.r_offset = (gotplt->output_section->vma
3295                    + gotplt->output_offset
3296                    + got_offset);
3297
3298   if (!h
3299       || h->dynindx == -1
3300       || ((info->executable
3301            || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
3302           && h->def_regular))
3303     {
3304       /* The symbol can be locally resolved.  */
3305       rela.r_info = ELF64_R_INFO (0, R_390_IRELATIVE);
3306       rela.r_addend = resolver_address;
3307     }
3308   else
3309     {
3310       rela.r_info = ELF64_R_INFO (h->dynindx, R_390_JMP_SLOT);
3311       rela.r_addend = 0;
3312     }
3313
3314   loc = relplt->contents + plt_index * sizeof (Elf64_External_Rela);
3315   bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
3316 }
3317
3318
3319 /* Finish up dynamic symbol handling.  We set the contents of various
3320    dynamic sections here.  */
3321
3322 static bfd_boolean
3323 elf_s390_finish_dynamic_symbol (bfd *output_bfd,
3324                                 struct bfd_link_info *info,
3325                                 struct elf_link_hash_entry *h,
3326                                 Elf_Internal_Sym *sym)
3327 {
3328   struct elf_s390_link_hash_table *htab;
3329   struct elf_s390_link_hash_entry *eh = (struct elf_s390_link_hash_entry*)h;
3330
3331   htab = elf_s390_hash_table (info);
3332   if (htab == NULL)
3333     return FALSE;
3334
3335   if (h->plt.offset != (bfd_vma) -1)
3336     {
3337       bfd_vma plt_index;
3338       bfd_vma got_offset;
3339       Elf_Internal_Rela rela;
3340       bfd_byte *loc;
3341
3342       /* This symbol has an entry in the procedure linkage table.  Set
3343          it up.  */
3344       if (s390_is_ifunc_symbol_p (h))
3345         {
3346           /* If we can resolve the IFUNC symbol locally we generate an
3347              IRELATIVE reloc.  */
3348           elf_s390_finish_ifunc_symbol (output_bfd, info, h, htab, h->plt.offset,
3349                                         eh->ifunc_resolver_address +
3350                                         eh->ifunc_resolver_section->output_offset +
3351                                         eh->ifunc_resolver_section->output_section->vma);
3352                                  ;
3353           /* Fallthrough.  Handling of explicit GOT slots of IFUNC
3354              symbols is below.  */
3355         }
3356       else
3357         {
3358           if (h->dynindx == -1
3359               || htab->elf.splt == NULL
3360               || htab->elf.sgotplt == NULL
3361               || htab->elf.srelplt == NULL)
3362             abort ();
3363
3364           /* Calc. index no.
3365              Current offset - size first entry / entry size.  */
3366           plt_index = (h->plt.offset - PLT_FIRST_ENTRY_SIZE) / PLT_ENTRY_SIZE;
3367
3368           /* Offset in GOT is PLT index plus GOT headers(3) times 8,
3369              addr & GOT addr.  */
3370           got_offset = (plt_index + 3) * GOT_ENTRY_SIZE;
3371
3372           /* Fill in the blueprint of a PLT.  */
3373           memcpy (htab->elf.splt->contents + h->plt.offset, elf_s390x_plt_entry,
3374                   PLT_ENTRY_SIZE);
3375
3376           /* Fixup the relative address to the GOT entry */
3377           bfd_put_32 (output_bfd,
3378                       (htab->elf.sgotplt->output_section->vma +
3379                        htab->elf.sgotplt->output_offset + got_offset
3380                        - (htab->elf.splt->output_section->vma +
3381                           htab->elf.splt->output_offset +
3382                           h->plt.offset))/2,
3383                       htab->elf.splt->contents + h->plt.offset + 2);
3384           /* Fixup the relative branch to PLT 0 */
3385           bfd_put_32 (output_bfd, - (PLT_FIRST_ENTRY_SIZE +
3386                                      (PLT_ENTRY_SIZE * plt_index) + 22)/2,
3387                       htab->elf.splt->contents + h->plt.offset + 24);
3388           /* Fixup offset into .rela.plt section.  */
3389           bfd_put_32 (output_bfd, plt_index * sizeof (Elf64_External_Rela),
3390                       htab->elf.splt->contents + h->plt.offset + 28);
3391
3392           /* Fill in the entry in the global offset table.
3393              Points to instruction after GOT offset.  */
3394           bfd_put_64 (output_bfd,
3395                       (htab->elf.splt->output_section->vma
3396                        + htab->elf.splt->output_offset
3397                        + h->plt.offset
3398                        + 14),
3399                       htab->elf.sgotplt->contents + got_offset);
3400
3401           /* Fill in the entry in the .rela.plt section.  */
3402           rela.r_offset = (htab->elf.sgotplt->output_section->vma
3403                            + htab->elf.sgotplt->output_offset
3404                            + got_offset);
3405           rela.r_info = ELF64_R_INFO (h->dynindx, R_390_JMP_SLOT);
3406           rela.r_addend = 0;
3407           loc = htab->elf.srelplt->contents + plt_index *
3408             sizeof (Elf64_External_Rela);
3409           bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
3410
3411           if (!h->def_regular)
3412             {
3413               /* Mark the symbol as undefined, rather than as defined in
3414                  the .plt section.  Leave the value alone.  This is a clue
3415                  for the dynamic linker, to make function pointer
3416                  comparisons work between an application and shared
3417                  library.  */
3418               sym->st_shndx = SHN_UNDEF;
3419             }
3420         }
3421     }
3422
3423   if (h->got.offset != (bfd_vma) -1
3424       && elf_s390_hash_entry(h)->tls_type != GOT_TLS_GD
3425       && elf_s390_hash_entry(h)->tls_type != GOT_TLS_IE
3426       && elf_s390_hash_entry(h)->tls_type != GOT_TLS_IE_NLT)
3427     {
3428       Elf_Internal_Rela rela;
3429       bfd_byte *loc;
3430
3431       /* This symbol has an entry in the global offset table.  Set it
3432          up.  */
3433       if (htab->elf.sgot == NULL || htab->elf.srelgot == NULL)
3434         abort ();
3435
3436       rela.r_offset = (htab->elf.sgot->output_section->vma
3437                        + htab->elf.sgot->output_offset
3438                        + (h->got.offset &~ (bfd_vma) 1));
3439
3440       if (h->def_regular && s390_is_ifunc_symbol_p (h))
3441         {
3442           if (info->shared)
3443             {
3444               /* An explicit GOT slot usage needs GLOB_DAT.  If the
3445                  symbol references local the implicit got.iplt slot
3446                  will be used and the IRELATIVE reloc has been created
3447                  above.  */
3448               goto do_glob_dat;
3449             }
3450           else
3451             {
3452               /* For non-shared objects explicit GOT slots must be
3453                  filled with the PLT slot address for pointer
3454                  equality reasons.  */
3455               bfd_put_64 (output_bfd, (htab->elf.iplt->output_section->vma
3456                                        + htab->elf.iplt->output_offset
3457                                        + h->plt.offset),
3458                           htab->elf.sgot->contents + h->got.offset);
3459               return TRUE;
3460             }
3461         }
3462       else if (info->shared
3463           && SYMBOL_REFERENCES_LOCAL (info, h))
3464         {
3465           /* If this is a static link, or it is a -Bsymbolic link and
3466              the symbol is defined locally or was forced to be local
3467              because of a version file, we just want to emit a
3468              RELATIVE reloc.  The entry in the global offset table
3469              will already have been initialized in the
3470              relocate_section function.  */
3471           if (!h->def_regular)
3472             return FALSE;
3473           BFD_ASSERT((h->got.offset & 1) != 0);
3474           rela.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
3475           rela.r_addend = (h->root.u.def.value
3476                            + h->root.u.def.section->output_section->vma
3477                            + h->root.u.def.section->output_offset);
3478         }
3479       else
3480         {
3481           BFD_ASSERT((h->got.offset & 1) == 0);
3482 do_glob_dat:
3483           bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgot->contents + h->got.offset);
3484           rela.r_info = ELF64_R_INFO (h->dynindx, R_390_GLOB_DAT);
3485           rela.r_addend = 0;
3486         }
3487
3488       loc = htab->elf.srelgot->contents;
3489       loc += htab->elf.srelgot->reloc_count++ * sizeof (Elf64_External_Rela);
3490       bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
3491     }
3492
3493   if (h->needs_copy)
3494     {
3495       Elf_Internal_Rela rela;
3496       bfd_byte *loc;
3497
3498       /* This symbols needs a copy reloc.  Set it up.  */
3499
3500       if (h->dynindx == -1
3501           || (h->root.type != bfd_link_hash_defined
3502               && h->root.type != bfd_link_hash_defweak)
3503           || htab->srelbss == NULL)
3504         abort ();
3505
3506       rela.r_offset = (h->root.u.def.value
3507                        + h->root.u.def.section->output_section->vma
3508                        + h->root.u.def.section->output_offset);
3509       rela.r_info = ELF64_R_INFO (h->dynindx, R_390_COPY);
3510       rela.r_addend = 0;
3511       loc = htab->srelbss->contents;
3512       loc += htab->srelbss->reloc_count++ * sizeof (Elf64_External_Rela);
3513       bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
3514     }
3515
3516   /* Mark some specially defined symbols as absolute.  */
3517   if (h == htab->elf.hdynamic
3518       || h == htab->elf.hgot
3519       || h == htab->elf.hplt)
3520     sym->st_shndx = SHN_ABS;
3521
3522   return TRUE;
3523 }
3524
3525 /* Used to decide how to sort relocs in an optimal manner for the
3526    dynamic linker, before writing them out.  */
3527
3528 static enum elf_reloc_type_class
3529 elf_s390_reloc_type_class (const Elf_Internal_Rela *rela)
3530 {
3531   switch ((int) ELF64_R_TYPE (rela->r_info))
3532     {
3533     case R_390_RELATIVE:
3534       return reloc_class_relative;
3535     case R_390_JMP_SLOT:
3536       return reloc_class_plt;
3537     case R_390_COPY:
3538       return reloc_class_copy;
3539     default:
3540       return reloc_class_normal;
3541     }
3542 }
3543
3544 /* Finish up the dynamic sections.  */
3545
3546 static bfd_boolean
3547 elf_s390_finish_dynamic_sections (bfd *output_bfd,
3548                                   struct bfd_link_info *info)
3549 {
3550   struct elf_s390_link_hash_table *htab;
3551   bfd *dynobj;
3552   asection *sdyn;
3553   bfd *ibfd;
3554   unsigned int i;
3555
3556   htab = elf_s390_hash_table (info);
3557   if (htab == NULL)
3558     return FALSE;
3559
3560   dynobj = htab->elf.dynobj;
3561   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
3562
3563   if (htab->elf.dynamic_sections_created)
3564     {
3565       Elf64_External_Dyn *dyncon, *dynconend;
3566
3567       if (sdyn == NULL || htab->elf.sgot == NULL)
3568         abort ();
3569
3570       dyncon = (Elf64_External_Dyn *) sdyn->contents;
3571       dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
3572       for (; dyncon < dynconend; dyncon++)
3573         {
3574           Elf_Internal_Dyn dyn;
3575           asection *s;
3576
3577           bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
3578
3579           switch (dyn.d_tag)
3580             {
3581             default:
3582               continue;
3583
3584             case DT_PLTGOT:
3585               dyn.d_un.d_ptr = htab->elf.sgot->output_section->vma;
3586               break;
3587
3588             case DT_JMPREL:
3589               dyn.d_un.d_ptr = htab->elf.srelplt->output_section->vma;
3590               break;
3591
3592             case DT_PLTRELSZ:
3593               s = htab->elf.srelplt->output_section;
3594               dyn.d_un.d_val = s->size;
3595               break;
3596
3597             case DT_RELASZ:
3598               /* The procedure linkage table relocs (DT_JMPREL) should
3599                  not be included in the overall relocs (DT_RELA).
3600                  Therefore, we override the DT_RELASZ entry here to
3601                  make it not include the JMPREL relocs.  Since the
3602                  linker script arranges for .rela.plt to follow all
3603                  other relocation sections, we don't have to worry
3604                  about changing the DT_RELA entry.  */
3605               s = htab->elf.srelplt->output_section;
3606               dyn.d_un.d_val -= s->size;
3607               break;
3608             }
3609
3610           bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
3611         }
3612
3613       /* Fill in the special first entry in the procedure linkage table.  */
3614       if (htab->elf.splt && htab->elf.splt->size > 0)
3615         {
3616           /* fill in blueprint for plt 0 entry */
3617           memcpy (htab->elf.splt->contents, elf_s390x_first_plt_entry,
3618                   PLT_FIRST_ENTRY_SIZE);
3619           /* Fixup relative address to start of GOT */
3620           bfd_put_32 (output_bfd,
3621                       (htab->elf.sgotplt->output_section->vma +
3622                        htab->elf.sgotplt->output_offset
3623                        - htab->elf.splt->output_section->vma - 6)/2,
3624                       htab->elf.splt->contents + 8);
3625         }
3626       elf_section_data (htab->elf.splt->output_section)
3627         ->this_hdr.sh_entsize = PLT_ENTRY_SIZE;
3628     }
3629
3630   if (htab->elf.sgotplt)
3631     {
3632       /* Fill in the first three entries in the global offset table.  */
3633       if (htab->elf.sgotplt->size > 0)
3634         {
3635           bfd_put_64 (output_bfd,
3636                       (sdyn == NULL ? (bfd_vma) 0
3637                        : sdyn->output_section->vma + sdyn->output_offset),
3638                       htab->elf.sgotplt->contents);
3639           /* One entry for shared object struct ptr.  */
3640           bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents + 8);
3641           /* One entry for _dl_runtime_resolve.  */
3642           bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents + 12);
3643         }
3644
3645       elf_section_data (htab->elf.sgot->output_section)
3646         ->this_hdr.sh_entsize = 8;
3647     }
3648
3649   /* Finish dynamic symbol for local IFUNC symbols.  */
3650   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
3651     {
3652       struct plt_entry *local_plt;
3653       Elf_Internal_Sym *isym;
3654       Elf_Internal_Shdr *symtab_hdr;
3655
3656       symtab_hdr = &elf_symtab_hdr (ibfd);
3657
3658       local_plt = elf_s390_local_plt (ibfd);
3659       if (local_plt != NULL)
3660         for (i = 0; i < symtab_hdr->sh_info; i++)
3661           {
3662             if (local_plt[i].plt.offset != (bfd_vma) -1)
3663               {
3664                 asection *sec = local_plt[i].sec;
3665                 isym = bfd_sym_from_r_symndx (&htab->sym_cache, ibfd, i);
3666                 if (isym == NULL)
3667                   return FALSE;
3668
3669                 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
3670                   elf_s390_finish_ifunc_symbol (output_bfd, info, NULL, htab,
3671                                                 local_plt[i].plt.offset,
3672                                                 isym->st_value
3673                                                 + sec->output_section->vma
3674                                                 + sec->output_offset);
3675
3676               }
3677           }
3678     }
3679
3680   return TRUE;
3681 }
3682
3683 /* Return address for Ith PLT stub in section PLT, for relocation REL
3684    or (bfd_vma) -1 if it should not be included.  */
3685
3686 static bfd_vma
3687 elf_s390_plt_sym_val (bfd_vma i, const asection *plt,
3688                       const arelent *rel ATTRIBUTE_UNUSED)
3689 {
3690   return plt->vma + PLT_FIRST_ENTRY_SIZE + i * PLT_ENTRY_SIZE;
3691 }
3692
3693 /* Why was the hash table entry size definition changed from
3694    ARCH_SIZE/8 to 4? This breaks the 64 bit dynamic linker and
3695    this is the only reason for the s390_elf64_size_info structure.  */
3696
3697 const struct elf_size_info s390_elf64_size_info =
3698 {
3699   sizeof (Elf64_External_Ehdr),
3700   sizeof (Elf64_External_Phdr),
3701   sizeof (Elf64_External_Shdr),
3702   sizeof (Elf64_External_Rel),
3703   sizeof (Elf64_External_Rela),
3704   sizeof (Elf64_External_Sym),
3705   sizeof (Elf64_External_Dyn),
3706   sizeof (Elf_External_Note),
3707   8,            /* hash-table entry size.  */
3708   1,            /* internal relocations per external relocations.  */
3709   64,           /* arch_size.  */
3710   3,            /* log_file_align.  */
3711   ELFCLASS64, EV_CURRENT,
3712   bfd_elf64_write_out_phdrs,
3713   bfd_elf64_write_shdrs_and_ehdr,
3714   bfd_elf64_checksum_contents,
3715   bfd_elf64_write_relocs,
3716   bfd_elf64_swap_symbol_in,
3717   bfd_elf64_swap_symbol_out,
3718   bfd_elf64_slurp_reloc_table,
3719   bfd_elf64_slurp_symbol_table,
3720   bfd_elf64_swap_dyn_in,
3721   bfd_elf64_swap_dyn_out,
3722   bfd_elf64_swap_reloc_in,
3723   bfd_elf64_swap_reloc_out,
3724   bfd_elf64_swap_reloca_in,
3725   bfd_elf64_swap_reloca_out
3726 };
3727
3728 #define TARGET_BIG_SYM  bfd_elf64_s390_vec
3729 #define TARGET_BIG_NAME "elf64-s390"
3730 #define ELF_ARCH        bfd_arch_s390
3731 #define ELF_TARGET_ID   S390_ELF_DATA
3732 #define ELF_MACHINE_CODE EM_S390
3733 #define ELF_MACHINE_ALT1 EM_S390_OLD
3734 #define ELF_MAXPAGESIZE 0x1000
3735
3736 #define elf_backend_size_info           s390_elf64_size_info
3737
3738 #define elf_backend_can_gc_sections     1
3739 #define elf_backend_can_refcount        1
3740 #define elf_backend_want_got_plt        1
3741 #define elf_backend_plt_readonly        1
3742 #define elf_backend_want_plt_sym        0
3743 #define elf_backend_got_header_size     24
3744 #define elf_backend_rela_normal         1
3745
3746 #define elf_info_to_howto               elf_s390_info_to_howto
3747
3748 #define bfd_elf64_bfd_is_local_label_name     elf_s390_is_local_label_name
3749 #define bfd_elf64_bfd_link_hash_table_create  elf_s390_link_hash_table_create
3750 #define bfd_elf64_bfd_reloc_type_lookup       elf_s390_reloc_type_lookup
3751 #define bfd_elf64_bfd_reloc_name_lookup elf_s390_reloc_name_lookup
3752
3753 #define elf_backend_adjust_dynamic_symbol     elf_s390_adjust_dynamic_symbol
3754 #define elf_backend_check_relocs              elf_s390_check_relocs
3755 #define elf_backend_copy_indirect_symbol      elf_s390_copy_indirect_symbol
3756 #define elf_backend_create_dynamic_sections   elf_s390_create_dynamic_sections
3757 #define elf_backend_finish_dynamic_sections   elf_s390_finish_dynamic_sections
3758 #define elf_backend_finish_dynamic_symbol     elf_s390_finish_dynamic_symbol
3759 #define elf_backend_gc_mark_hook              elf_s390_gc_mark_hook
3760 #define elf_backend_gc_sweep_hook             elf_s390_gc_sweep_hook
3761 #define elf_backend_reloc_type_class          elf_s390_reloc_type_class
3762 #define elf_backend_relocate_section          elf_s390_relocate_section
3763 #define elf_backend_size_dynamic_sections     elf_s390_size_dynamic_sections
3764 #define elf_backend_init_index_section        _bfd_elf_init_1_index_section
3765 #define elf_backend_reloc_type_class          elf_s390_reloc_type_class
3766 #define elf_backend_plt_sym_val               elf_s390_plt_sym_val
3767 #define elf_backend_add_symbol_hook           elf_s390_add_symbol_hook
3768
3769 #define bfd_elf64_mkobject              elf_s390_mkobject
3770 #define elf_backend_object_p            elf_s390_object_p
3771
3772 /* Enable ELF64 archive functions.  */
3773 #define bfd_elf64_archive_functions
3774 extern bfd_boolean bfd_elf64_archive_slurp_armap (bfd *);
3775 extern bfd_boolean bfd_elf64_archive_write_armap (bfd *, unsigned int, struct orl *, unsigned int, int);
3776
3777 #define bfd_elf64_archive_slurp_extended_name_table     _bfd_archive_coff_slurp_extended_name_table
3778 #define bfd_elf64_archive_construct_extended_name_table _bfd_archive_coff_construct_extended_name_table
3779 #define bfd_elf64_archive_truncate_arname               _bfd_archive_coff_truncate_arname
3780 #define bfd_elf64_archive_read_ar_hdr                   _bfd_archive_coff_read_ar_hdr
3781 #define bfd_elf64_archive_write_ar_hdr                  _bfd_archive_coff_write_ar_hdr
3782 #define bfd_elf64_archive_openr_next_archived_file      _bfd_archive_coff_openr_next_archived_file
3783 #define bfd_elf64_archive_get_elt_at_index              _bfd_archive_coff_get_elt_at_index
3784 #define bfd_elf64_archive_generic_stat_arch_elt         _bfd_archive_coff_generic_stat_arch_elt
3785 #define bfd_elf64_archive_update_armap_timestamp        _bfd_archive_coff_update_armap_timestamp
3786
3787 #include "elf64-target.h"