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