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