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