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