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