gdb/riscv: Remove CSR feature file
[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
3084d7a2 1922 return _bfd_elf_add_dynamic_tags (output_bfd, info, relocs);
a85d7ed0
NC
1923}
1924
69fc87f1
MS
1925/* Return the base VMA address which should be subtracted from real addresses
1926 when resolving @dtpoff relocation.
1927 This is PT_TLS segment p_vaddr. */
1928
1929static bfd_vma
2c3fc389 1930dtpoff_base (struct bfd_link_info *info)
69fc87f1 1931{
e1918d23
AM
1932 /* If tls_sec is NULL, we should have signalled an error already. */
1933 if (elf_hash_table (info)->tls_sec == NULL)
69fc87f1 1934 return 0;
e1918d23 1935 return elf_hash_table (info)->tls_sec->vma;
69fc87f1
MS
1936}
1937
1938/* Return the relocation value for @tpoff relocation
1939 if STT_TLS virtual address is ADDRESS. */
1940
1941static bfd_vma
2c3fc389 1942tpoff (struct bfd_link_info *info, bfd_vma address)
69fc87f1 1943{
e1918d23 1944 struct elf_link_hash_table *htab = elf_hash_table (info);
69fc87f1 1945
e1918d23
AM
1946 /* If tls_sec is NULL, we should have signalled an error already. */
1947 if (htab->tls_sec == NULL)
69fc87f1 1948 return 0;
e1918d23 1949 return htab->tls_size + htab->tls_sec->vma - address;
69fc87f1
MS
1950}
1951
1952/* Complain if TLS instruction relocation is against an invalid
1953 instruction. */
1954
1955static void
2c3fc389
NC
1956invalid_tls_insn (bfd *input_bfd,
1957 asection *input_section,
1958 Elf_Internal_Rela *rel)
69fc87f1
MS
1959{
1960 reloc_howto_type *howto;
1961
1962 howto = elf_howto_table + ELF64_R_TYPE (rel->r_info);
4eca0228 1963 _bfd_error_handler
695344c0 1964 /* xgettext:c-format */
2dcf00ce 1965 (_("%pB(%pA+%#" PRIx64 "): invalid instruction for TLS relocation %s"),
d003868e
AM
1966 input_bfd,
1967 input_section,
2dcf00ce 1968 (uint64_t) rel->r_offset,
69fc87f1 1969 howto->name);
77df2968 1970 bfd_set_error (bfd_error_bad_value);
69fc87f1
MS
1971}
1972
a85d7ed0
NC
1973/* Relocate a 390 ELF section. */
1974
b34976b6 1975static bfd_boolean
4dfe6ac6
NC
1976elf_s390_relocate_section (bfd *output_bfd,
1977 struct bfd_link_info *info,
1978 bfd *input_bfd,
1979 asection *input_section,
1980 bfd_byte *contents,
1981 Elf_Internal_Rela *relocs,
1982 Elf_Internal_Sym *local_syms,
1983 asection **local_sections)
a85d7ed0 1984{
0451c93c 1985 struct elf_s390_link_hash_table *htab;
a85d7ed0
NC
1986 Elf_Internal_Shdr *symtab_hdr;
1987 struct elf_link_hash_entry **sym_hashes;
1988 bfd_vma *local_got_offsets;
a85d7ed0
NC
1989 Elf_Internal_Rela *rel;
1990 Elf_Internal_Rela *relend;
1991
7af5d5c4
AM
1992 if (!is_s390_elf (input_bfd))
1993 {
1994 bfd_set_error (bfd_error_wrong_format);
1995 return FALSE;
1996 }
0ffa91dd 1997
0451c93c 1998 htab = elf_s390_hash_table (info);
4dfe6ac6
NC
1999 if (htab == NULL)
2000 return FALSE;
2001
0ffa91dd 2002 symtab_hdr = &elf_symtab_hdr (input_bfd);
a85d7ed0
NC
2003 sym_hashes = elf_sym_hashes (input_bfd);
2004 local_got_offsets = elf_local_got_offsets (input_bfd);
2005
a85d7ed0
NC
2006 rel = relocs;
2007 relend = relocs + input_section->reloc_count;
2008 for (; rel < relend; rel++)
2009 {
5236c819 2010 unsigned int r_type;
a85d7ed0
NC
2011 reloc_howto_type *howto;
2012 unsigned long r_symndx;
2013 struct elf_link_hash_entry *h;
2014 Elf_Internal_Sym *sym;
2015 asection *sec;
0451c93c 2016 bfd_vma off;
a85d7ed0 2017 bfd_vma relocation;
b34976b6 2018 bfd_boolean unresolved_reloc;
a85d7ed0 2019 bfd_reloc_status_type r;
69fc87f1 2020 int tls_type;
b27bb18f 2021 bfd_boolean resolved_to_zero;
a85d7ed0
NC
2022
2023 r_type = ELF64_R_TYPE (rel->r_info);
0451c93c 2024 if (r_type == (int) R_390_GNU_VTINHERIT
947216bf
AM
2025 || r_type == (int) R_390_GNU_VTENTRY)
2026 continue;
5236c819 2027 if (r_type >= (int) R_390_max)
a85d7ed0
NC
2028 {
2029 bfd_set_error (bfd_error_bad_value);
b34976b6 2030 return FALSE;
a85d7ed0 2031 }
a85d7ed0 2032
b491616a 2033 howto = elf_howto_table + r_type;
a85d7ed0 2034 r_symndx = ELF64_R_SYM (rel->r_info);
5236c819 2035
a85d7ed0
NC
2036 h = NULL;
2037 sym = NULL;
2038 sec = NULL;
b34976b6 2039 unresolved_reloc = FALSE;
a85d7ed0
NC
2040 if (r_symndx < symtab_hdr->sh_info)
2041 {
2042 sym = local_syms + r_symndx;
2043 sec = local_sections[r_symndx];
470b557a
AK
2044
2045 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
2046 {
2047 struct plt_entry *local_plt = elf_s390_local_plt (input_bfd);
2048 if (local_plt == NULL)
2049 return FALSE;
2050
2051 /* Address of the PLT slot. */
2052 relocation = (htab->elf.iplt->output_section->vma
2053 + htab->elf.iplt->output_offset
2054 + local_plt[r_symndx].plt.offset);
2055
2056 switch (r_type)
2057 {
31db78f6
AK
2058 case R_390_PLTOFF16:
2059 case R_390_PLTOFF32:
2060 case R_390_PLTOFF64:
afca762f 2061 relocation -= s390_got_pointer (info);
31db78f6 2062 break;
470b557a
AK
2063 case R_390_GOTPLT12:
2064 case R_390_GOTPLT16:
2065 case R_390_GOTPLT20:
2066 case R_390_GOTPLT32:
2067 case R_390_GOTPLT64:
2068 case R_390_GOTPLTENT:
2069 case R_390_GOT12:
2070 case R_390_GOT16:
2071 case R_390_GOT20:
2072 case R_390_GOT32:
2073 case R_390_GOT64:
2074 case R_390_GOTENT:
2075 {
2076 /* Write the PLT slot address into the GOT slot. */
2077 bfd_put_64 (output_bfd, relocation,
2078 htab->elf.sgot->contents +
2079 local_got_offsets[r_symndx]);
2080 relocation = (local_got_offsets[r_symndx] +
afca762f 2081 s390_got_offset (info));
470b557a
AK
2082
2083 if (r_type == R_390_GOTENT || r_type == R_390_GOTPLTENT)
afca762f 2084 relocation += s390_got_pointer (info);
470b557a
AK
2085 break;
2086 }
2087 default:
2088 break;
2089 }
2090 /* The output section is needed later in
2091 finish_dynamic_section when creating the dynamic
2092 relocation. */
2093 local_plt[r_symndx].sec = sec;
2094 goto do_relocation;
2095 }
2096 else
2097 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
a85d7ed0
NC
2098 }
2099 else
2100 {
560e09e9 2101 bfd_boolean warned ATTRIBUTE_UNUSED;
62d887d4 2102 bfd_boolean ignored ATTRIBUTE_UNUSED;
0451c93c 2103
b2a8e766
AM
2104 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2105 r_symndx, symtab_hdr, sym_hashes,
2106 h, sec, relocation,
62d887d4 2107 unresolved_reloc, warned, ignored);
a85d7ed0
NC
2108 }
2109
dbaa2011 2110 if (sec != NULL && discarded_section (sec))
e4067dbb 2111 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
545fd46b 2112 rel, 1, relend, howto, 0, contents);
ab96bf03 2113
0e1862bb 2114 if (bfd_link_relocatable (info))
ab96bf03
AM
2115 continue;
2116
b27bb18f
L
2117 resolved_to_zero = (h != NULL
2118 && UNDEFWEAK_NO_DYNAMIC_RELOC (info, h));
2119
a85d7ed0
NC
2120 switch (r_type)
2121 {
5236c819
MS
2122 case R_390_GOTPLT12:
2123 case R_390_GOTPLT16:
bd1ea41b 2124 case R_390_GOTPLT20:
5236c819
MS
2125 case R_390_GOTPLT32:
2126 case R_390_GOTPLT64:
2127 case R_390_GOTPLTENT:
2128 /* There are three cases for a GOTPLT relocation. 1) The
2129 relocation is against the jump slot entry of a plt that
2130 will get emitted to the output file. 2) The relocation
2131 is against the jump slot of a plt entry that has been
2132 removed. elf_s390_adjust_gotplt has created a GOT entry
2133 as replacement. 3) The relocation is against a local symbol.
2134 Cases 2) and 3) are the same as the GOT relocation code
2135 so we just have to test for case 1 and fall through for
2136 the other two. */
2137 if (h != NULL && h->plt.offset != (bfd_vma) -1)
2138 {
2139 bfd_vma plt_index;
2140
470b557a
AK
2141 if (s390_is_ifunc_symbol_p (h))
2142 {
afca762f
AK
2143 /* Entry indices of .iplt and .igot.plt match
2144 1:1. No magic PLT first entry here. */
470b557a 2145 plt_index = h->plt.offset / PLT_ENTRY_SIZE;
afca762f
AK
2146 relocation = (plt_index * GOT_ENTRY_SIZE
2147 + s390_gotplt_offset (info)
2148 + htab->elf.igotplt->output_offset);
470b557a
AK
2149 }
2150 else
2151 {
afca762f
AK
2152 plt_index = ((h->plt.offset - PLT_FIRST_ENTRY_SIZE)
2153 / PLT_ENTRY_SIZE);
2154
2155 relocation = (plt_index * GOT_ENTRY_SIZE
2156 + s390_gotplt_offset (info));
470b557a 2157 }
afca762f
AK
2158 if (r_type == R_390_GOTPLTENT)
2159 relocation += s390_got_pointer (info);
5236c819 2160 unresolved_reloc = FALSE;
5236c819
MS
2161 break;
2162 }
2163 /* Fall through. */
2164
947216bf
AM
2165 case R_390_GOT12:
2166 case R_390_GOT16:
bd1ea41b 2167 case R_390_GOT20:
947216bf
AM
2168 case R_390_GOT32:
2169 case R_390_GOT64:
2170 case R_390_GOTENT:
2171 /* Relocation is to the entry for this symbol in the global
2172 offset table. */
afca762f 2173 if (htab->elf.sgot == NULL)
0451c93c 2174 abort ();
a85d7ed0 2175
947216bf
AM
2176 if (h != NULL)
2177 {
b34976b6 2178 bfd_boolean dyn;
a85d7ed0 2179
947216bf 2180 off = h->got.offset;
0451c93c 2181 dyn = htab->elf.dynamic_sections_created;
470b557a
AK
2182
2183 if (s390_is_ifunc_symbol_p (h))
2184 {
2185 BFD_ASSERT (h->plt.offset != (bfd_vma) -1);
2186 if (off == (bfd_vma)-1)
2187 {
2188 /* No explicit GOT usage so redirect to the
2189 got.iplt slot. */
afca762f
AK
2190 relocation = (s390_gotplt_offset (info)
2191 + htab->elf.igotplt->output_offset
2192 + (h->plt.offset / PLT_ENTRY_SIZE
2193 * GOT_ENTRY_SIZE));
2194
2195 /* For @GOTENT the relocation is against the offset between
2196 the instruction and the symbols entry in the GOT and not
2197 between the start of the GOT and the symbols entry. We
2198 add the vma of the GOT to get the correct value. */
2199 if (r_type == R_390_GOTENT || r_type == R_390_GOTPLTENT)
2200 relocation += s390_got_pointer (info);
2201
2202 break;
470b557a
AK
2203 }
2204 else
2205 {
2206 /* Explicit GOT slots must contain the address
2207 of the PLT slot. This will be handled in
2208 finish_dynamic_symbol. */
2209 }
2210 }
0e1862bb
L
2211 else if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
2212 bfd_link_pic (info),
2213 h)
2214 || (bfd_link_pic (info)
470b557a 2215 && SYMBOL_REFERENCES_LOCAL (info, h))
10e7c045 2216 || resolved_to_zero)
947216bf 2217 {
e6213e09
AK
2218 Elf_Internal_Sym *isym;
2219 asection *sym_sec;
2220
947216bf
AM
2221 /* This is actually a static link, or it is a
2222 -Bsymbolic link and the symbol is defined
2223 locally, or the symbol was forced to be local
2224 because of a version file. We must initialize
2225 this entry in the global offset table. Since the
2226 offset must always be a multiple of 2, we use the
2227 least significant bit to record whether we have
2228 initialized it already.
2229
2230 When doing a dynamic link, we create a .rel.got
2231 relocation entry to initialize the value. This
2232 is done in the finish_dynamic_symbol routine. */
2233 if ((off & 1) != 0)
2234 off &= ~1;
2235 else
2236 {
a85d7ed0 2237 bfd_put_64 (output_bfd, relocation,
afca762f 2238 htab->elf.sgot->contents + off);
947216bf
AM
2239 h->got.offset |= 1;
2240 }
a63cc5f7 2241
e6213e09
AK
2242 /* When turning a GOT slot dereference into a direct
2243 reference using larl we have to make sure that
2244 the symbol is 1. properly aligned and 2. it is no
2245 ABS symbol or will become one. */
a63cc5f7 2246 if ((h->def_regular
0e1862bb 2247 && bfd_link_pic (info)
a63cc5f7
AK
2248 && SYMBOL_REFERENCES_LOCAL (info, h))
2249 /* lgrl rx,sym@GOTENT -> larl rx, sym */
2250 && ((r_type == R_390_GOTENT
2251 && (bfd_get_16 (input_bfd,
2252 contents + rel->r_offset - 2)
2253 & 0xff0f) == 0xc408)
2254 /* lg rx, sym@GOT(r12) -> larl rx, sym */
2255 || (r_type == R_390_GOT20
2256 && (bfd_get_32 (input_bfd,
2257 contents + rel->r_offset - 2)
2258 & 0xff00f000) == 0xe300c000
2259 && bfd_get_8 (input_bfd,
e6213e09
AK
2260 contents + rel->r_offset + 3) == 0x04))
2261 && (isym = bfd_sym_from_r_symndx (&htab->sym_cache,
2262 input_bfd, r_symndx))
2263 && isym->st_shndx != SHN_ABS
2264 && h != htab->elf.hdynamic
2265 && h != htab->elf.hgot
2266 && h != htab->elf.hplt
2267 && !(isym->st_value & 1)
2268 && (sym_sec = bfd_section_from_elf_index (input_bfd,
2269 isym->st_shndx))
2270 && sym_sec->alignment_power)
a63cc5f7
AK
2271 {
2272 unsigned short new_insn =
2273 (0xc000 | (bfd_get_8 (input_bfd,
2274 contents + rel->r_offset - 1) & 0xf0));
2275 bfd_put_16 (output_bfd, new_insn,
2276 contents + rel->r_offset - 2);
2277 r_type = R_390_PC32DBL;
2278 rel->r_addend = 2;
2279 howto = elf_howto_table + r_type;
2280 relocation = h->root.u.def.value
2281 + h->root.u.def.section->output_section->vma
2282 + h->root.u.def.section->output_offset;
2283 goto do_relocation;
2284 }
947216bf 2285 }
0451c93c 2286 else
b34976b6 2287 unresolved_reloc = FALSE;
947216bf
AM
2288 }
2289 else
2290 {
0451c93c
MS
2291 if (local_got_offsets == NULL)
2292 abort ();
a85d7ed0 2293
947216bf 2294 off = local_got_offsets[r_symndx];
a85d7ed0 2295
947216bf
AM
2296 /* The offset must always be a multiple of 8. We use
2297 the least significant bit to record whether we have
2298 already generated the necessary reloc. */
2299 if ((off & 1) != 0)
2300 off &= ~1;
2301 else
2302 {
2303 bfd_put_64 (output_bfd, relocation,
f41345a7 2304 htab->elf.sgot->contents + off);
a85d7ed0 2305
0e1862bb 2306 if (bfd_link_pic (info))
947216bf
AM
2307 {
2308 asection *s;
2309 Elf_Internal_Rela outrel;
2310 bfd_byte *loc;
a85d7ed0 2311
f41345a7 2312 s = htab->elf.srelgot;
947216bf 2313 if (s == NULL)
0451c93c 2314 abort ();
a85d7ed0 2315
f41345a7
AK
2316 outrel.r_offset = (htab->elf.sgot->output_section->vma
2317 + htab->elf.sgot->output_offset
947216bf
AM
2318 + off);
2319 outrel.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
a85d7ed0 2320 outrel.r_addend = relocation;
947216bf
AM
2321 loc = s->contents;
2322 loc += s->reloc_count++ * sizeof (Elf64_External_Rela);
2323 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2324 }
a85d7ed0 2325
947216bf
AM
2326 local_got_offsets[r_symndx] |= 1;
2327 }
2328 }
a85d7ed0 2329
0451c93c
MS
2330 if (off >= (bfd_vma) -2)
2331 abort ();
2332
afca762f 2333 relocation = s390_got_offset (info) + off;
0451c93c 2334
ae9a127f
NC
2335 /* For @GOTENT the relocation is against the offset between
2336 the instruction and the symbols entry in the GOT and not
2337 between the start of the GOT and the symbols entry. We
2338 add the vma of the GOT to get the correct value. */
5236c819
MS
2339 if ( r_type == R_390_GOTENT
2340 || r_type == R_390_GOTPLTENT)
afca762f 2341 relocation += s390_got_pointer (info);
a85d7ed0 2342
947216bf 2343 break;
99c79b2e 2344
5236c819
MS
2345 case R_390_GOTOFF16:
2346 case R_390_GOTOFF32:
2347 case R_390_GOTOFF64:
947216bf
AM
2348 /* Relocation is relative to the start of the global offset
2349 table. */
a85d7ed0 2350
d47b13e0
AK
2351 if (h != NULL
2352 && s390_is_ifunc_symbol_p (h)
2353 && h->def_regular
2354 && !bfd_link_executable (info))
2355 {
2356 relocation = (htab->elf.iplt->output_section->vma
2357 + htab->elf.iplt->output_offset
2358 + h->plt.offset
afca762f 2359 - s390_got_pointer (info));
d47b13e0
AK
2360 goto do_relocation;
2361 }
2362
afca762f 2363 relocation -= s390_got_pointer (info);
947216bf 2364 break;
a85d7ed0 2365
947216bf 2366 case R_390_GOTPC:
a85d7ed0 2367 case R_390_GOTPCDBL:
947216bf 2368 /* Use global offset table as symbol value. */
afca762f 2369 relocation = s390_got_pointer (info);
b34976b6 2370 unresolved_reloc = FALSE;
947216bf 2371 break;
a85d7ed0 2372
fb798c50 2373 case R_390_PLT12DBL:
947216bf 2374 case R_390_PLT16DBL:
fb798c50 2375 case R_390_PLT24DBL:
947216bf
AM
2376 case R_390_PLT32:
2377 case R_390_PLT32DBL:
2378 case R_390_PLT64:
2379 /* Relocation is to the entry for this symbol in the
2380 procedure linkage table. */
a85d7ed0 2381
947216bf
AM
2382 /* Resolve a PLT32 reloc against a local symbol directly,
2383 without using the procedure linkage table. */
2384 if (h == NULL)
2385 break;
a85d7ed0 2386
947216bf 2387 if (h->plt.offset == (bfd_vma) -1
31db78f6 2388 || (htab->elf.splt == NULL && !s390_is_ifunc_symbol_p (h)))
947216bf
AM
2389 {
2390 /* We didn't make a PLT entry for this symbol. This
2391 happens when statically linking PIC code, or when
2392 using -Bsymbolic. */
2393 break;
2394 }
470b557a
AK
2395 if (s390_is_ifunc_symbol_p (h))
2396 relocation = (htab->elf.iplt->output_section->vma
2397 + htab->elf.iplt->output_offset
2398 + h->plt.offset);
2399 else
2400 relocation = (htab->elf.splt->output_section->vma
2401 + htab->elf.splt->output_offset
2402 + h->plt.offset);
b34976b6 2403 unresolved_reloc = FALSE;
26e41594 2404 break;
5236c819
MS
2405
2406 case R_390_PLTOFF16:
2407 case R_390_PLTOFF32:
2408 case R_390_PLTOFF64:
26e41594
AM
2409 /* Relocation is to the entry for this symbol in the
2410 procedure linkage table relative to the start of the GOT. */
5236c819
MS
2411
2412 /* For local symbols or if we didn't make a PLT entry for
2413 this symbol resolve the symbol directly. */
31db78f6 2414 if (h == NULL
5236c819 2415 || h->plt.offset == (bfd_vma) -1
31db78f6 2416 || (htab->elf.splt == NULL && !s390_is_ifunc_symbol_p (h)))
5236c819 2417 {
afca762f 2418 relocation -= s390_got_pointer (info);
5236c819
MS
2419 break;
2420 }
2421
470b557a
AK
2422 if (s390_is_ifunc_symbol_p (h))
2423 relocation = (htab->elf.iplt->output_section->vma
2424 + htab->elf.iplt->output_offset
2425 + h->plt.offset
afca762f 2426 - s390_got_pointer (info));
470b557a
AK
2427 else
2428 relocation = (htab->elf.splt->output_section->vma
2429 + htab->elf.splt->output_offset
2430 + h->plt.offset
afca762f 2431 - s390_got_pointer (info));
5236c819 2432 unresolved_reloc = FALSE;
947216bf
AM
2433 break;
2434
947216bf 2435 case R_390_PC16:
fb798c50 2436 case R_390_PC12DBL:
947216bf 2437 case R_390_PC16DBL:
fb798c50 2438 case R_390_PC24DBL:
947216bf 2439 case R_390_PC32:
a85d7ed0 2440 case R_390_PC32DBL:
947216bf 2441 case R_390_PC64:
431e5de3
AK
2442 if (h != NULL
2443 && bfd_link_pie (info)
2444 && !h->def_regular)
2445 {
871b3ab2 2446 _bfd_error_handler (_("%pB: `%s' non-PLT reloc for symbol defined "
431e5de3
AK
2447 "in shared library and accessed "
2448 "from executable "
2449 "(rebuild file with -fPIC ?)"),
2450 input_bfd, h->root.root.string);
2451 bfd_set_error (bfd_error_bad_value);
2452 return FALSE;
2453 }
99ba5125
AK
2454 /* The target of these relocs are instruction operands
2455 residing in read-only sections. We cannot emit a runtime
2456 reloc for it. */
2457 if (h != NULL
2458 && s390_is_ifunc_symbol_p (h)
2459 && h->def_regular
2460 && bfd_link_pic (info))
2461 {
2462 relocation = (htab->elf.iplt->output_section->vma
2463 + htab->elf.iplt->output_offset
2464 + h->plt.offset);
2465 goto do_relocation;
2466 }
1a0670f3 2467 /* Fall through. */
99ba5125
AK
2468
2469 case R_390_8:
2470 case R_390_16:
2471 case R_390_32:
2472 case R_390_64:
470b557a 2473
f657f8c4
NC
2474 if ((input_section->flags & SEC_ALLOC) == 0)
2475 break;
2476
470b557a
AK
2477 if (h != NULL
2478 && s390_is_ifunc_symbol_p (h)
2479 && h->def_regular)
2480 {
d7ab4911 2481 if (!bfd_link_pic (info))
470b557a 2482 {
d7ab4911
AK
2483 /* For a non-shared object the symbol will not
2484 change. Hence we can write the address of the
2485 target IPLT slot now. */
470b557a
AK
2486 relocation = (htab->elf.iplt->output_section->vma
2487 + htab->elf.iplt->output_offset
2488 + h ->plt.offset);
2489 goto do_relocation;
2490 }
2491 else
2492 {
2493 /* For shared objects a runtime relocation is needed. */
2494
2495 Elf_Internal_Rela outrel;
2496 asection *sreloc;
2497
2498 /* Need a dynamic relocation to get the real function
2499 address. */
2500 outrel.r_offset = _bfd_elf_section_offset (output_bfd,
2501 info,
2502 input_section,
2503 rel->r_offset);
2504 if (outrel.r_offset == (bfd_vma) -1
2505 || outrel.r_offset == (bfd_vma) -2)
2506 abort ();
2507
2508 outrel.r_offset += (input_section->output_section->vma
2509 + input_section->output_offset);
2510
2511 if (h->dynindx == -1
2512 || h->forced_local
0e1862bb 2513 || bfd_link_executable (info))
470b557a
AK
2514 {
2515 /* This symbol is resolved locally. */
2516 outrel.r_info = ELF64_R_INFO (0, R_390_IRELATIVE);
2517 outrel.r_addend = (h->root.u.def.value
2518 + h->root.u.def.section->output_section->vma
2519 + h->root.u.def.section->output_offset);
2520 }
2521 else
2522 {
2523 outrel.r_info = ELF64_R_INFO (h->dynindx, r_type);
2524 outrel.r_addend = 0;
2525 }
2526
2527 sreloc = htab->elf.irelifunc;
2528 elf_append_rela (output_bfd, sreloc, &outrel);
2529
2530 /* If this reloc is against an external symbol, we
2531 do not want to fiddle with the addend. Otherwise,
2532 we need to include the symbol value so that it
2533 becomes an addend for the dynamic reloc. For an
2534 internal symbol, we have updated addend. */
2535 continue;
2536 }
2537 }
2538
0e1862bb 2539 if ((bfd_link_pic (info)
82058a73 2540 && (h == NULL
b27bb18f
L
2541 || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2542 && !resolved_to_zero)
82058a73 2543 || h->root.type != bfd_link_hash_undefweak)
0451c93c 2544 && ((r_type != R_390_PC16
fb798c50 2545 && r_type != R_390_PC12DBL
0451c93c 2546 && r_type != R_390_PC16DBL
fb798c50 2547 && r_type != R_390_PC24DBL
0451c93c
MS
2548 && r_type != R_390_PC32
2549 && r_type != R_390_PC32DBL
2550 && r_type != R_390_PC64)
8c21ca21 2551 || !SYMBOL_CALLS_LOCAL (info, h)))
64285810 2552 || (ELIMINATE_COPY_RELOCS
0e1862bb 2553 && !bfd_link_pic (info)
0451c93c
MS
2554 && h != NULL
2555 && h->dynindx != -1
f5385ebf
AM
2556 && !h->non_got_ref
2557 && ((h->def_dynamic
2558 && !h->def_regular)
0451c93c
MS
2559 || h->root.type == bfd_link_hash_undefweak
2560 || h->root.type == bfd_link_hash_undefined)))
947216bf
AM
2561 {
2562 Elf_Internal_Rela outrel;
b34976b6 2563 bfd_boolean skip, relocate;
0451c93c 2564 asection *sreloc;
947216bf 2565 bfd_byte *loc;
a85d7ed0 2566
947216bf
AM
2567 /* When generating a shared object, these relocations
2568 are copied into the output file to be resolved at run
2569 time. */
b34976b6
AM
2570 skip = FALSE;
2571 relocate = FALSE;
a85d7ed0 2572
c629eae0
JJ
2573 outrel.r_offset =
2574 _bfd_elf_section_offset (output_bfd, info, input_section,
2575 rel->r_offset);
2576 if (outrel.r_offset == (bfd_vma) -1)
b34976b6 2577 skip = TRUE;
0bb2d96a 2578 else if (outrel.r_offset == (bfd_vma) -2)
b34976b6 2579 skip = TRUE, relocate = TRUE;
a85d7ed0 2580
947216bf
AM
2581 outrel.r_offset += (input_section->output_section->vma
2582 + input_section->output_offset);
a85d7ed0 2583
947216bf 2584 if (skip)
0bb2d96a 2585 memset (&outrel, 0, sizeof outrel);
947216bf 2586 else if (h != NULL
0451c93c
MS
2587 && h->dynindx != -1
2588 && (r_type == R_390_PC16
fb798c50 2589 || r_type == R_390_PC12DBL
0451c93c 2590 || r_type == R_390_PC16DBL
fb798c50 2591 || r_type == R_390_PC24DBL
0451c93c
MS
2592 || r_type == R_390_PC32
2593 || r_type == R_390_PC32DBL
2594 || r_type == R_390_PC64
0e1862bb 2595 || !bfd_link_pic (info)
8c21ca21 2596 || !SYMBOLIC_BIND (info, h)
f5385ebf 2597 || !h->def_regular))
947216bf
AM
2598 {
2599 outrel.r_info = ELF64_R_INFO (h->dynindx, r_type);
27018c3f 2600 outrel.r_addend = rel->r_addend;
947216bf
AM
2601 }
2602 else
2603 {
0451c93c 2604 /* This symbol is local, or marked to become local. */
90ced0dd 2605 outrel.r_addend = relocation + rel->r_addend;
b5727d75
MS
2606 if (r_type == R_390_64)
2607 {
2608 relocate = TRUE;
2609 outrel.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
b5727d75
MS
2610 }
2611 else
2612 {
2613 long sindx;
2614
90ced0dd 2615 if (bfd_is_abs_section (sec))
b5727d75
MS
2616 sindx = 0;
2617 else if (sec == NULL || sec->owner == NULL)
2618 {
2619 bfd_set_error(bfd_error_bad_value);
2620 return FALSE;
2621 }
2622 else
2623 {
2624 asection *osec;
2625
2626 osec = sec->output_section;
2627 sindx = elf_section_data (osec)->dynindx;
74541ad4
AM
2628
2629 if (sindx == 0)
2630 {
2631 osec = htab->elf.text_index_section;
2632 sindx = elf_section_data (osec)->dynindx;
2633 }
2634 BFD_ASSERT (sindx != 0);
90ced0dd
MS
2635
2636 /* We are turning this relocation into one
2637 against a section symbol, so subtract out
2638 the output section's address but not the
2639 offset of the input section in the output
2640 section. */
90ced0dd 2641 outrel.r_addend -= osec->vma;
b5727d75
MS
2642 }
2643 outrel.r_info = ELF64_R_INFO (sindx, r_type);
b5727d75 2644 }
0451c93c 2645 }
a85d7ed0 2646
0451c93c
MS
2647 sreloc = elf_section_data (input_section)->sreloc;
2648 if (sreloc == NULL)
2649 abort ();
2650
947216bf
AM
2651 loc = sreloc->contents;
2652 loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
2653 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
a85d7ed0 2654
947216bf
AM
2655 /* If this reloc is against an external symbol, we do
2656 not want to fiddle with the addend. Otherwise, we
2657 need to include the symbol value so that it becomes
2658 an addend for the dynamic reloc. */
2659 if (! relocate)
2660 continue;
2661 }
a85d7ed0 2662
947216bf 2663 break;
a85d7ed0 2664
69fc87f1
MS
2665 /* Relocations for tls literal pool entries. */
2666 case R_390_TLS_IE64:
0e1862bb 2667 if (bfd_link_pic (info))
69fc87f1
MS
2668 {
2669 Elf_Internal_Rela outrel;
2670 asection *sreloc;
2671 bfd_byte *loc;
2672
2673 outrel.r_offset = rel->r_offset
2674 + input_section->output_section->vma
2675 + input_section->output_offset;
2676 outrel.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
2677 sreloc = elf_section_data (input_section)->sreloc;
2678 if (sreloc == NULL)
2679 abort ();
2680 loc = sreloc->contents;
2681 loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
2682 bfd_elf64_swap_reloc_out (output_bfd, &outrel, loc);
2683 }
ae9a127f 2684 /* Fall through. */
69fc87f1
MS
2685
2686 case R_390_TLS_GD64:
2687 case R_390_TLS_GOTIE64:
2688 r_type = elf_s390_tls_transition (info, r_type, h == NULL);
2689 tls_type = GOT_UNKNOWN;
2690 if (h == NULL && local_got_offsets)
2691 tls_type = elf_s390_local_got_tls_type (input_bfd) [r_symndx];
2692 else if (h != NULL)
2693 {
2694 tls_type = elf_s390_hash_entry(h)->tls_type;
0e1862bb 2695 if (!bfd_link_pic (info) && h->dynindx == -1 && tls_type >= GOT_TLS_IE)
69fc87f1
MS
2696 r_type = R_390_TLS_LE64;
2697 }
2698 if (r_type == R_390_TLS_GD64 && tls_type >= GOT_TLS_IE)
2699 r_type = R_390_TLS_IE64;
2700
2701 if (r_type == R_390_TLS_LE64)
2702 {
2703 /* This relocation gets optimized away by the local exec
2704 access optimization. */
2705 BFD_ASSERT (! unresolved_reloc);
2706 bfd_put_64 (output_bfd, -tpoff (info, relocation),
2707 contents + rel->r_offset);
2708 continue;
2709 }
2710
f41345a7 2711 if (htab->elf.sgot == NULL)
69fc87f1
MS
2712 abort ();
2713
2714 if (h != NULL)
2715 off = h->got.offset;
2716 else
2717 {
2718 if (local_got_offsets == NULL)
2719 abort ();
2720
2721 off = local_got_offsets[r_symndx];
2722 }
2723
2724 emit_tls_relocs:
2725
2726 if ((off & 1) != 0)
2727 off &= ~1;
26e41594 2728 else
69fc87f1
MS
2729 {
2730 Elf_Internal_Rela outrel;
2731 bfd_byte *loc;
2732 int dr_type, indx;
2733
f41345a7 2734 if (htab->elf.srelgot == NULL)
69fc87f1
MS
2735 abort ();
2736
f41345a7
AK
2737 outrel.r_offset = (htab->elf.sgot->output_section->vma
2738 + htab->elf.sgot->output_offset + off);
69fc87f1
MS
2739
2740 indx = h && h->dynindx != -1 ? h->dynindx : 0;
2741 if (r_type == R_390_TLS_GD64)
2742 dr_type = R_390_TLS_DTPMOD;
2743 else
2744 dr_type = R_390_TLS_TPOFF;
2745 if (dr_type == R_390_TLS_TPOFF && indx == 0)
2746 outrel.r_addend = relocation - dtpoff_base (info);
2747 else
2748 outrel.r_addend = 0;
2749 outrel.r_info = ELF64_R_INFO (indx, dr_type);
f41345a7
AK
2750 loc = htab->elf.srelgot->contents;
2751 loc += htab->elf.srelgot->reloc_count++
69fc87f1
MS
2752 * sizeof (Elf64_External_Rela);
2753 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2754
2755 if (r_type == R_390_TLS_GD64)
2756 {
2757 if (indx == 0)
2758 {
07d6d2b8 2759 BFD_ASSERT (! unresolved_reloc);
69fc87f1
MS
2760 bfd_put_64 (output_bfd,
2761 relocation - dtpoff_base (info),
f41345a7 2762 htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
69fc87f1
MS
2763 }
2764 else
2765 {
2766 outrel.r_info = ELF64_R_INFO (indx, R_390_TLS_DTPOFF);
2767 outrel.r_offset += GOT_ENTRY_SIZE;
2768 outrel.r_addend = 0;
f41345a7 2769 htab->elf.srelgot->reloc_count++;
69fc87f1
MS
2770 loc += sizeof (Elf64_External_Rela);
2771 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2772 }
2773 }
2774
2775 if (h != NULL)
2776 h->got.offset |= 1;
2777 else
2778 local_got_offsets[r_symndx] |= 1;
2779 }
2780
2781 if (off >= (bfd_vma) -2)
2782 abort ();
2783 if (r_type == ELF64_R_TYPE (rel->r_info))
2784 {
f41345a7 2785 relocation = htab->elf.sgot->output_offset + off;
69fc87f1 2786 if (r_type == R_390_TLS_IE64 || r_type == R_390_TLS_IEENT)
f41345a7 2787 relocation += htab->elf.sgot->output_section->vma;
69fc87f1
MS
2788 unresolved_reloc = FALSE;
2789 }
2790 else
2791 {
f41345a7 2792 bfd_put_64 (output_bfd, htab->elf.sgot->output_offset + off,
69fc87f1
MS
2793 contents + rel->r_offset);
2794 continue;
2795 }
2796 break;
2797
2798 case R_390_TLS_GOTIE12:
bd1ea41b 2799 case R_390_TLS_GOTIE20:
69fc87f1
MS
2800 case R_390_TLS_IEENT:
2801 if (h == NULL)
2802 {
2803 if (local_got_offsets == NULL)
2804 abort();
2805 off = local_got_offsets[r_symndx];
0e1862bb 2806 if (bfd_link_pic (info))
69fc87f1
MS
2807 goto emit_tls_relocs;
2808 }
2809 else
2810 {
2811 off = h->got.offset;
2812 tls_type = elf_s390_hash_entry(h)->tls_type;
0e1862bb 2813 if (bfd_link_pic (info) || h->dynindx != -1 || tls_type < GOT_TLS_IE)
69fc87f1
MS
2814 goto emit_tls_relocs;
2815 }
2816
f41345a7 2817 if (htab->elf.sgot == NULL)
69fc87f1
MS
2818 abort ();
2819
2820 BFD_ASSERT (! unresolved_reloc);
2821 bfd_put_64 (output_bfd, -tpoff (info, relocation),
f41345a7
AK
2822 htab->elf.sgot->contents + off);
2823 relocation = htab->elf.sgot->output_offset + off;
69fc87f1 2824 if (r_type == R_390_TLS_IEENT)
f41345a7 2825 relocation += htab->elf.sgot->output_section->vma;
69fc87f1
MS
2826 unresolved_reloc = FALSE;
2827 break;
2828
2829 case R_390_TLS_LDM64:
0e1862bb 2830 if (! bfd_link_pic (info))
69fc87f1
MS
2831 /* The literal pool entry this relocation refers to gets ignored
2832 by the optimized code of the local exec model. Do nothing
2833 and the value will turn out zero. */
2834 continue;
2835
f41345a7 2836 if (htab->elf.sgot == NULL)
69fc87f1
MS
2837 abort ();
2838
2839 off = htab->tls_ldm_got.offset;
2840 if (off & 1)
2841 off &= ~1;
2842 else
2843 {
2844 Elf_Internal_Rela outrel;
2845 bfd_byte *loc;
2846
f41345a7 2847 if (htab->elf.srelgot == NULL)
69fc87f1
MS
2848 abort ();
2849
f41345a7
AK
2850 outrel.r_offset = (htab->elf.sgot->output_section->vma
2851 + htab->elf.sgot->output_offset + off);
69fc87f1
MS
2852
2853 bfd_put_64 (output_bfd, 0,
f41345a7 2854 htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
69fc87f1
MS
2855 outrel.r_info = ELF64_R_INFO (0, R_390_TLS_DTPMOD);
2856 outrel.r_addend = 0;
f41345a7
AK
2857 loc = htab->elf.srelgot->contents;
2858 loc += htab->elf.srelgot->reloc_count++
69fc87f1
MS
2859 * sizeof (Elf64_External_Rela);
2860 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2861 htab->tls_ldm_got.offset |= 1;
2862 }
f41345a7 2863 relocation = htab->elf.sgot->output_offset + off;
26e41594 2864 unresolved_reloc = FALSE;
69fc87f1
MS
2865 break;
2866
2867 case R_390_TLS_LE64:
3cbc1e5e 2868 if (bfd_link_dll (info))
69fc87f1
MS
2869 {
2870 /* Linking a shared library with non-fpic code requires
2871 a R_390_TLS_TPOFF relocation. */
2872 Elf_Internal_Rela outrel;
2873 asection *sreloc;
2874 bfd_byte *loc;
2875 int indx;
2876
2877 outrel.r_offset = rel->r_offset
2878 + input_section->output_section->vma
2879 + input_section->output_offset;
2880 if (h != NULL && h->dynindx != -1)
2881 indx = h->dynindx;
2882 else
2883 indx = 0;
2884 outrel.r_info = ELF64_R_INFO (indx, R_390_TLS_TPOFF);
2885 if (indx == 0)
2886 outrel.r_addend = relocation - dtpoff_base (info);
2887 else
2888 outrel.r_addend = 0;
2889 sreloc = elf_section_data (input_section)->sreloc;
2890 if (sreloc == NULL)
2891 abort ();
2892 loc = sreloc->contents;
2893 loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
2894 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2895 }
2896 else
2897 {
2898 BFD_ASSERT (! unresolved_reloc);
2899 bfd_put_64 (output_bfd, -tpoff (info, relocation),
2900 contents + rel->r_offset);
2901 }
2902 continue;
2903
2904 case R_390_TLS_LDO64:
0e1862bb 2905 if (bfd_link_pic (info) || (input_section->flags & SEC_DEBUGGING))
69fc87f1
MS
2906 relocation -= dtpoff_base (info);
2907 else
2908 /* When converting LDO to LE, we must negate. */
2909 relocation = -tpoff (info, relocation);
2910 break;
2911
2912 /* Relocations for tls instructions. */
2913 case R_390_TLS_LOAD:
2914 case R_390_TLS_GDCALL:
2915 case R_390_TLS_LDCALL:
2916 tls_type = GOT_UNKNOWN;
2917 if (h == NULL && local_got_offsets)
2918 tls_type = elf_s390_local_got_tls_type (input_bfd) [r_symndx];
2919 else if (h != NULL)
2920 tls_type = elf_s390_hash_entry(h)->tls_type;
2921
2922 if (tls_type == GOT_TLS_GD)
2923 continue;
2924
2925 if (r_type == R_390_TLS_LOAD)
2926 {
0e1862bb 2927 if (!bfd_link_pic (info) && (h == NULL || h->dynindx == -1))
69fc87f1
MS
2928 {
2929 /* IE->LE transition. Four valid cases:
2930 lg %rx,(0,%ry) -> sllg %rx,%ry,0
2931 lg %rx,(%ry,0) -> sllg %rx,%ry,0
2932 lg %rx,(%ry,%r12) -> sllg %rx,%ry,0
2933 lg %rx,(%r12,%ry) -> sllg %rx,%ry,0 */
2934 unsigned int insn0, insn1, ry;
2935
2936 insn0 = bfd_get_32 (input_bfd, contents + rel->r_offset);
2937 insn1 = bfd_get_16 (input_bfd, contents + rel->r_offset + 4);
2938 if (insn1 != 0x0004)
3704e358
AK
2939 {
2940 invalid_tls_insn (input_bfd, input_section, rel);
2941 return FALSE;
2942 }
69fc87f1
MS
2943 if ((insn0 & 0xff00f000) == 0xe3000000)
2944 /* lg %rx,0(%ry,0) -> sllg %rx,%ry,0 */
2945 ry = (insn0 & 0x000f0000);
2946 else if ((insn0 & 0xff0f0000) == 0xe3000000)
2947 /* lg %rx,0(0,%ry) -> sllg %rx,%ry,0 */
2948 ry = (insn0 & 0x0000f000) << 4;
2949 else if ((insn0 & 0xff00f000) == 0xe300c000)
2950 /* lg %rx,0(%ry,%r12) -> sllg %rx,%ry,0 */
2951 ry = (insn0 & 0x000f0000);
2952 else if ((insn0 & 0xff0f0000) == 0xe30c0000)
2953 /* lg %rx,0(%r12,%ry) -> sllg %rx,%ry,0 */
2954 ry = (insn0 & 0x0000f000) << 4;
2955 else
3704e358
AK
2956 {
2957 invalid_tls_insn (input_bfd, input_section, rel);
2958 return FALSE;
2959 }
69fc87f1
MS
2960 insn0 = 0xeb000000 | (insn0 & 0x00f00000) | ry;
2961 insn1 = 0x000d;
2962 bfd_put_32 (output_bfd, insn0, contents + rel->r_offset);
2963 bfd_put_16 (output_bfd, insn1, contents + rel->r_offset + 4);
2964 }
2965 }
2966 else if (r_type == R_390_TLS_GDCALL)
2967 {
2968 unsigned int insn0, insn1;
2969
2970 insn0 = bfd_get_32 (input_bfd, contents + rel->r_offset);
2971 insn1 = bfd_get_16 (input_bfd, contents + rel->r_offset + 4);
2972 if ((insn0 & 0xffff0000) != 0xc0e50000)
3704e358
AK
2973 {
2974 invalid_tls_insn (input_bfd, input_section, rel);
2975 return FALSE;
2976 }
0e1862bb 2977 if (!bfd_link_pic (info) && (h == NULL || h->dynindx == -1))
69fc87f1
MS
2978 {
2979 /* GD->LE transition.
2980 brasl %r14,__tls_get_addr@plt -> brcl 0,. */
2981 insn0 = 0xc0040000;
2982 insn1 = 0x0000;
2983 }
2984 else
2985 {
2986 /* GD->IE transition.
2987 brasl %r14,__tls_get_addr@plt -> lg %r2,0(%r2,%r12) */
2988 insn0 = 0xe322c000;
2989 insn1 = 0x0004;
2990 }
2991 bfd_put_32 (output_bfd, insn0, contents + rel->r_offset);
2992 bfd_put_16 (output_bfd, insn1, contents + rel->r_offset + 4);
2993 }
2994 else if (r_type == R_390_TLS_LDCALL)
2995 {
0e1862bb 2996 if (!bfd_link_pic (info))
69fc87f1
MS
2997 {
2998 unsigned int insn0, insn1;
2999
3000 insn0 = bfd_get_32 (input_bfd, contents + rel->r_offset);
3001 insn1 = bfd_get_16 (input_bfd, contents + rel->r_offset + 4);
3002 if ((insn0 & 0xffff0000) != 0xc0e50000)
3704e358
AK
3003 {
3004 invalid_tls_insn (input_bfd, input_section, rel);
3005 return FALSE;
3006 }
69fc87f1
MS
3007 /* LD->LE transition.
3008 brasl %r14,__tls_get_addr@plt -> brcl 0,. */
3009 insn0 = 0xc0040000;
3010 insn1 = 0x0000;
3011 bfd_put_32 (output_bfd, insn0, contents + rel->r_offset);
3012 bfd_put_16 (output_bfd, insn1, contents + rel->r_offset + 4);
3013 }
3014 }
3015 continue;
3016
947216bf
AM
3017 default:
3018 break;
3019 }
a85d7ed0 3020
239e1f3a
AM
3021 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
3022 because such sections are not SEC_ALLOC and thus ld.so will
3023 not process them. */
0451c93c 3024 if (unresolved_reloc
239e1f3a 3025 && !((input_section->flags & SEC_DEBUGGING) != 0
1d5316ab
AM
3026 && h->def_dynamic)
3027 && _bfd_elf_section_offset (output_bfd, info, input_section,
3028 rel->r_offset) != (bfd_vma) -1)
4eca0228 3029 _bfd_error_handler
695344c0 3030 /* xgettext:c-format */
2dcf00ce
AM
3031 (_("%pB(%pA+%#" PRIx64 "): "
3032 "unresolvable %s relocation against symbol `%s'"),
d003868e
AM
3033 input_bfd,
3034 input_section,
2dcf00ce 3035 (uint64_t) rel->r_offset,
843fe662 3036 howto->name,
0451c93c
MS
3037 h->root.root.string);
3038
470b557a
AK
3039 do_relocation:
3040
fb798c50
AK
3041 /* When applying a 24 bit reloc we need to start one byte
3042 earlier. Otherwise the 32 bit get/put bfd operations might
3043 access a byte after the actual section. */
3044 if (r_type == R_390_PC24DBL
3045 || r_type == R_390_PLT24DBL)
3046 rel->r_offset--;
3047
bd1ea41b
MS
3048 if (r_type == R_390_20
3049 || r_type == R_390_GOT20
3050 || r_type == R_390_GOTPLT20
3051 || r_type == R_390_TLS_GOTIE20)
3052 {
3053 relocation += rel->r_addend;
3054 relocation = (relocation&0xfff) << 8 | (relocation&0xff000) >> 12;
3055 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3056 contents, rel->r_offset,
3057 relocation, 0);
3058 }
3059 else
3060 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
a85d7ed0
NC
3061 contents, rel->r_offset,
3062 relocation, rel->r_addend);
3063
3064 if (r != bfd_reloc_ok)
3065 {
0451c93c 3066 const char *name;
ec338859 3067
0451c93c
MS
3068 if (h != NULL)
3069 name = h->root.root.string;
3070 else
a85d7ed0 3071 {
0451c93c
MS
3072 name = bfd_elf_string_from_elf_section (input_bfd,
3073 symtab_hdr->sh_link,
3074 sym->st_name);
3075 if (name == NULL)
b34976b6 3076 return FALSE;
0451c93c 3077 if (*name == '\0')
fd361982 3078 name = bfd_section_name (sec);
0451c93c 3079 }
ec338859 3080
0451c93c 3081 if (r == bfd_reloc_overflow)
1a72702b
AM
3082 (*info->callbacks->reloc_overflow)
3083 (info, (h ? &h->root : NULL), name, howto->name,
3084 (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
0451c93c
MS
3085 else
3086 {
4eca0228 3087 _bfd_error_handler
695344c0 3088 /* xgettext:c-format */
2dcf00ce 3089 (_("%pB(%pA+%#" PRIx64 "): reloc against `%s': error %d"),
d003868e 3090 input_bfd, input_section,
2dcf00ce 3091 (uint64_t) rel->r_offset, name, (int) r);
b34976b6 3092 return FALSE;
a85d7ed0
NC
3093 }
3094 }
3095 }
3096
b34976b6 3097 return TRUE;
a85d7ed0
NC
3098}
3099
470b557a
AK
3100/* Generate the PLT slots together with the dynamic relocations needed
3101 for IFUNC symbols. */
3102
3103static void
3104elf_s390_finish_ifunc_symbol (bfd *output_bfd,
3105 struct bfd_link_info *info,
3106 struct elf_link_hash_entry *h,
3107 struct elf_s390_link_hash_table *htab,
3108 bfd_vma plt_offset,
3109 bfd_vma resolver_address)
3110{
3111 bfd_vma plt_index;
3112 bfd_vma got_offset;
3113 Elf_Internal_Rela rela;
3114 bfd_byte *loc;
3115 asection *plt, *gotplt, *relplt;
3116
3117 if (htab->elf.iplt == NULL
3118 || htab->elf.igotplt == NULL
3119 || htab->elf.irelplt == NULL)
3120 abort ();
3121
3122 /* Index of the PLT slot within iplt section. */
3123 plt_index = plt_offset / PLT_ENTRY_SIZE;
3124 plt = htab->elf.iplt;
3125 /* Offset into the igot.plt section. */
3126 got_offset = plt_index * GOT_ENTRY_SIZE;
3127 gotplt = htab->elf.igotplt;
3128 relplt = htab->elf.irelplt;
3129
3130 /* Fill in the blueprint of a PLT. */
3131 memcpy (plt->contents + plt_offset, elf_s390x_plt_entry,
3132 PLT_ENTRY_SIZE);
3133
3134 /* Fixup the relative address to the GOT entry */
3135 bfd_put_32 (output_bfd,
3136 (gotplt->output_section->vma +
3137 gotplt->output_offset + got_offset
3138 - (plt->output_section->vma +
3139 plt->output_offset +
3140 plt_offset))/2,
3141 plt->contents + plt_offset + 2);
3142 /* Fixup the relative branch to PLT 0 */
3143 bfd_put_32 (output_bfd, - (plt->output_offset +
3144 (PLT_ENTRY_SIZE * plt_index) + 22)/2,
3145 plt->contents + plt_offset + 24);
3146 /* Fixup offset into .rela.plt section. */
3147 bfd_put_32 (output_bfd, relplt->output_offset +
3148 plt_index * sizeof (Elf64_External_Rela),
3149 plt->contents + plt_offset + 28);
3150
3151 /* Fill in the entry in the global offset table.
3152 Points to instruction after GOT offset. */
3153 bfd_put_64 (output_bfd,
3154 (plt->output_section->vma
3155 + plt->output_offset
3156 + plt_offset
3157 + 14),
3158 gotplt->contents + got_offset);
3159
3160 /* Fill in the entry in the .rela.plt section. */
3161 rela.r_offset = (gotplt->output_section->vma
3162 + gotplt->output_offset
3163 + got_offset);
3164
3165 if (!h
3166 || h->dynindx == -1
0e1862bb 3167 || ((bfd_link_executable (info)
470b557a
AK
3168 || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
3169 && h->def_regular))
3170 {
3171 /* The symbol can be locally resolved. */
3172 rela.r_info = ELF64_R_INFO (0, R_390_IRELATIVE);
3173 rela.r_addend = resolver_address;
3174 }
3175 else
3176 {
3177 rela.r_info = ELF64_R_INFO (h->dynindx, R_390_JMP_SLOT);
3178 rela.r_addend = 0;
3179 }
3180
3181 loc = relplt->contents + plt_index * sizeof (Elf64_External_Rela);
3182 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
3183}
3184
3185
a85d7ed0
NC
3186/* Finish up dynamic symbol handling. We set the contents of various
3187 dynamic sections here. */
3188
b34976b6 3189static bfd_boolean
4dfe6ac6
NC
3190elf_s390_finish_dynamic_symbol (bfd *output_bfd,
3191 struct bfd_link_info *info,
3192 struct elf_link_hash_entry *h,
3193 Elf_Internal_Sym *sym)
a85d7ed0 3194{
0451c93c 3195 struct elf_s390_link_hash_table *htab;
470b557a 3196 struct elf_s390_link_hash_entry *eh = (struct elf_s390_link_hash_entry*)h;
a85d7ed0 3197
0451c93c 3198 htab = elf_s390_hash_table (info);
4dfe6ac6
NC
3199 if (htab == NULL)
3200 return FALSE;
a85d7ed0
NC
3201
3202 if (h->plt.offset != (bfd_vma) -1)
3203 {
a85d7ed0 3204 bfd_vma plt_index;
afca762f 3205 bfd_vma gotplt_offset;
0451c93c 3206 Elf_Internal_Rela rela;
947216bf 3207 bfd_byte *loc;
a85d7ed0
NC
3208
3209 /* This symbol has an entry in the procedure linkage table. Set
947216bf 3210 it up. */
0a511368 3211 if (s390_is_ifunc_symbol_p (h) && h->def_regular)
470b557a 3212 {
0a511368
AK
3213 elf_s390_finish_ifunc_symbol (output_bfd, info, h,
3214 htab, h->plt.offset,
3215 eh->ifunc_resolver_address +
3216 eh->ifunc_resolver_section->output_offset +
3217 eh->ifunc_resolver_section->output_section->vma);
3218
3219 /* Do not return yet. Handling of explicit GOT slots of
3220 IFUNC symbols is below. */
470b557a
AK
3221 }
3222 else
3223 {
3224 if (h->dynindx == -1
3225 || htab->elf.splt == NULL
3226 || htab->elf.sgotplt == NULL
3227 || htab->elf.srelplt == NULL)
3228 abort ();
a85d7ed0 3229
470b557a
AK
3230 /* Calc. index no.
3231 Current offset - size first entry / entry size. */
3232 plt_index = (h->plt.offset - PLT_FIRST_ENTRY_SIZE) / PLT_ENTRY_SIZE;
a85d7ed0 3233
afca762f
AK
3234 /* The slots in the .got.plt correspond to the PLT slots in
3235 the same order. */
3236 gotplt_offset = plt_index * GOT_ENTRY_SIZE;
3237
3238 /* If .got.plt comes first it needs to contain the 3 header
3239 entries. */
3240 if (!s390_gotplt_after_got_p (info))
3241 gotplt_offset += 3 * GOT_ENTRY_SIZE;
a85d7ed0 3242
470b557a
AK
3243 /* Fill in the blueprint of a PLT. */
3244 memcpy (htab->elf.splt->contents + h->plt.offset, elf_s390x_plt_entry,
3245 PLT_ENTRY_SIZE);
3246
afca762f
AK
3247 /* The first instruction in the PLT entry is a LARL loading
3248 the address of the GOT slot. We write the 4 byte
3249 immediate operand of the LARL instruction here. */
470b557a
AK
3250 bfd_put_32 (output_bfd,
3251 (htab->elf.sgotplt->output_section->vma +
afca762f 3252 htab->elf.sgotplt->output_offset + gotplt_offset
470b557a
AK
3253 - (htab->elf.splt->output_section->vma +
3254 htab->elf.splt->output_offset +
3255 h->plt.offset))/2,
3256 htab->elf.splt->contents + h->plt.offset + 2);
3257 /* Fixup the relative branch to PLT 0 */
3258 bfd_put_32 (output_bfd, - (PLT_FIRST_ENTRY_SIZE +
3259 (PLT_ENTRY_SIZE * plt_index) + 22)/2,
3260 htab->elf.splt->contents + h->plt.offset + 24);
3261 /* Fixup offset into .rela.plt section. */
3262 bfd_put_32 (output_bfd, plt_index * sizeof (Elf64_External_Rela),
3263 htab->elf.splt->contents + h->plt.offset + 28);
3264
3265 /* Fill in the entry in the global offset table.
3266 Points to instruction after GOT offset. */
3267 bfd_put_64 (output_bfd,
3268 (htab->elf.splt->output_section->vma
3269 + htab->elf.splt->output_offset
3270 + h->plt.offset
3271 + 14),
afca762f 3272 htab->elf.sgotplt->contents + gotplt_offset);
470b557a
AK
3273
3274 /* Fill in the entry in the .rela.plt section. */
3275 rela.r_offset = (htab->elf.sgotplt->output_section->vma
3276 + htab->elf.sgotplt->output_offset
afca762f 3277 + gotplt_offset);
470b557a
AK
3278 rela.r_info = ELF64_R_INFO (h->dynindx, R_390_JMP_SLOT);
3279 rela.r_addend = 0;
3280 loc = htab->elf.srelplt->contents + plt_index *
3281 sizeof (Elf64_External_Rela);
3282 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
3283
3284 if (!h->def_regular)
3285 {
3286 /* Mark the symbol as undefined, rather than as defined in
3287 the .plt section. Leave the value alone. This is a clue
3288 for the dynamic linker, to make function pointer
3289 comparisons work between an application and shared
3290 library. */
3291 sym->st_shndx = SHN_UNDEF;
3292 }
a85d7ed0
NC
3293 }
3294 }
3295
69fc87f1
MS
3296 if (h->got.offset != (bfd_vma) -1
3297 && elf_s390_hash_entry(h)->tls_type != GOT_TLS_GD
3298 && elf_s390_hash_entry(h)->tls_type != GOT_TLS_IE
3299 && elf_s390_hash_entry(h)->tls_type != GOT_TLS_IE_NLT)
a85d7ed0 3300 {
a85d7ed0 3301 Elf_Internal_Rela rela;
947216bf 3302 bfd_byte *loc;
a85d7ed0
NC
3303
3304 /* This symbol has an entry in the global offset table. Set it
947216bf 3305 up. */
f41345a7 3306 if (htab->elf.sgot == NULL || htab->elf.srelgot == NULL)
0451c93c 3307 abort ();
a85d7ed0 3308
f41345a7
AK
3309 rela.r_offset = (htab->elf.sgot->output_section->vma
3310 + htab->elf.sgot->output_offset
dc810e39 3311 + (h->got.offset &~ (bfd_vma) 1));
a85d7ed0 3312
470b557a
AK
3313 if (h->def_regular && s390_is_ifunc_symbol_p (h))
3314 {
0e1862bb 3315 if (bfd_link_pic (info))
470b557a
AK
3316 {
3317 /* An explicit GOT slot usage needs GLOB_DAT. If the
3318 symbol references local the implicit got.iplt slot
3319 will be used and the IRELATIVE reloc has been created
3320 above. */
3321 goto do_glob_dat;
3322 }
3323 else
3324 {
3325 /* For non-shared objects explicit GOT slots must be
3326 filled with the PLT slot address for pointer
3327 equality reasons. */
3328 bfd_put_64 (output_bfd, (htab->elf.iplt->output_section->vma
3329 + htab->elf.iplt->output_offset
3330 + h->plt.offset),
3331 htab->elf.sgot->contents + h->got.offset);
3332 return TRUE;
3333 }
3334 }
0e1862bb 3335 else if (bfd_link_pic (info)
ceada896 3336 && SYMBOL_REFERENCES_LOCAL (info, h))
947216bf 3337 {
10e7c045
AK
3338 if (UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
3339 return TRUE;
3340
470b557a
AK
3341 /* If this is a static link, or it is a -Bsymbolic link and
3342 the symbol is defined locally or was forced to be local
3343 because of a version file, we just want to emit a
3344 RELATIVE reloc. The entry in the global offset table
3345 will already have been initialized in the
3346 relocate_section function. */
8170f769 3347 if (!(h->def_regular || ELF_COMMON_DEF_P (h)))
8c21ca21 3348 return FALSE;
0451c93c 3349 BFD_ASSERT((h->got.offset & 1) != 0);
947216bf
AM
3350 rela.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
3351 rela.r_addend = (h->root.u.def.value
3352 + h->root.u.def.section->output_section->vma
3353 + h->root.u.def.section->output_offset);
3354 }
a85d7ed0
NC
3355 else
3356 {
3357 BFD_ASSERT((h->got.offset & 1) == 0);
ceada896 3358 do_glob_dat:
f41345a7 3359 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgot->contents + h->got.offset);
a85d7ed0 3360 rela.r_info = ELF64_R_INFO (h->dynindx, R_390_GLOB_DAT);
947216bf
AM
3361 rela.r_addend = 0;
3362 }
a85d7ed0 3363
f41345a7
AK
3364 loc = htab->elf.srelgot->contents;
3365 loc += htab->elf.srelgot->reloc_count++ * sizeof (Elf64_External_Rela);
0451c93c 3366 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
a85d7ed0
NC
3367 }
3368
f5385ebf 3369 if (h->needs_copy)
a85d7ed0 3370 {
a85d7ed0 3371 Elf_Internal_Rela rela;
5474d94f 3372 asection *s;
947216bf 3373 bfd_byte *loc;
a85d7ed0
NC
3374
3375 /* This symbols needs a copy reloc. Set it up. */
3376
0451c93c
MS
3377 if (h->dynindx == -1
3378 || (h->root.type != bfd_link_hash_defined
3379 && h->root.type != bfd_link_hash_defweak)
9d19e4fd 3380 || htab->elf.srelbss == NULL)
0451c93c 3381 abort ();
a85d7ed0
NC
3382
3383 rela.r_offset = (h->root.u.def.value
3384 + h->root.u.def.section->output_section->vma
3385 + h->root.u.def.section->output_offset);
3386 rela.r_info = ELF64_R_INFO (h->dynindx, R_390_COPY);
3387 rela.r_addend = 0;
afbf7e8e 3388 if (h->root.u.def.section == htab->elf.sdynrelro)
5474d94f
AM
3389 s = htab->elf.sreldynrelro;
3390 else
3391 s = htab->elf.srelbss;
3392 loc = s->contents + s->reloc_count++ * sizeof (Elf64_External_Rela);
0451c93c 3393 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
a85d7ed0
NC
3394 }
3395
3396 /* Mark some specially defined symbols as absolute. */
9637f6ef 3397 if (h == htab->elf.hdynamic
22edb2f1
RS
3398 || h == htab->elf.hgot
3399 || h == htab->elf.hplt)
a85d7ed0
NC
3400 sym->st_shndx = SHN_ABS;
3401
b34976b6 3402 return TRUE;
a85d7ed0
NC
3403}
3404
0451c93c
MS
3405/* Used to decide how to sort relocs in an optimal manner for the
3406 dynamic linker, before writing them out. */
3407
3408static enum elf_reloc_type_class
7e612e98
AM
3409elf_s390_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
3410 const asection *rel_sec ATTRIBUTE_UNUSED,
3411 const Elf_Internal_Rela *rela)
0451c93c 3412{
0f042c67
AK
3413 bfd *abfd = info->output_bfd;
3414 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
3415 struct elf_s390_link_hash_table *htab = elf_s390_hash_table (info);
3416 unsigned long r_symndx = ELF64_R_SYM (rela->r_info);
3417 Elf_Internal_Sym sym;
3418
3419 if (htab->elf.dynsym == NULL
3420 || !bed->s->swap_symbol_in (abfd,
3421 (htab->elf.dynsym->contents
3422 + r_symndx * bed->s->sizeof_sym),
3423 0, &sym))
3424 abort ();
3425
3426 /* Check relocation against STT_GNU_IFUNC symbol. */
3427 if (ELF_ST_TYPE (sym.st_info) == STT_GNU_IFUNC)
3428 return reloc_class_ifunc;
3429
0451c93c
MS
3430 switch ((int) ELF64_R_TYPE (rela->r_info))
3431 {
3432 case R_390_RELATIVE:
3433 return reloc_class_relative;
3434 case R_390_JMP_SLOT:
3435 return reloc_class_plt;
3436 case R_390_COPY:
3437 return reloc_class_copy;
3438 default:
3439 return reloc_class_normal;
3440 }
3441}
3442
a85d7ed0
NC
3443/* Finish up the dynamic sections. */
3444
b34976b6 3445static bfd_boolean
4dfe6ac6
NC
3446elf_s390_finish_dynamic_sections (bfd *output_bfd,
3447 struct bfd_link_info *info)
a85d7ed0 3448{
0451c93c 3449 struct elf_s390_link_hash_table *htab;
a85d7ed0
NC
3450 bfd *dynobj;
3451 asection *sdyn;
470b557a
AK
3452 bfd *ibfd;
3453 unsigned int i;
a85d7ed0 3454
0451c93c 3455 htab = elf_s390_hash_table (info);
4dfe6ac6
NC
3456 if (htab == NULL)
3457 return FALSE;
3458
0451c93c 3459 dynobj = htab->elf.dynobj;
3d4d4302 3460 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
a85d7ed0 3461
0451c93c 3462 if (htab->elf.dynamic_sections_created)
a85d7ed0 3463 {
a85d7ed0
NC
3464 Elf64_External_Dyn *dyncon, *dynconend;
3465
f41345a7 3466 if (sdyn == NULL || htab->elf.sgot == NULL)
0451c93c 3467 abort ();
a85d7ed0
NC
3468
3469 dyncon = (Elf64_External_Dyn *) sdyn->contents;
eea6121a 3470 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
a85d7ed0
NC
3471 for (; dyncon < dynconend; dyncon++)
3472 {
3473 Elf_Internal_Dyn dyn;
a85d7ed0 3474 asection *s;
ec338859 3475
a85d7ed0 3476 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
ec338859 3477
a85d7ed0
NC
3478 switch (dyn.d_tag)
3479 {
3480 default:
0451c93c 3481 continue;
ec338859 3482
a85d7ed0 3483 case DT_PLTGOT:
afca762f
AK
3484 /* DT_PLTGOT matches _GLOBAL_OFFSET_TABLE_ */
3485 dyn.d_un.d_ptr = s390_got_pointer (info);
0451c93c 3486 break;
ec338859 3487
a85d7ed0 3488 case DT_JMPREL:
4ade44b7
AM
3489 s = htab->elf.srelplt;
3490 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
a85d7ed0 3491 break;
ec338859 3492
a85d7ed0 3493 case DT_PLTRELSZ:
79c12fae
AK
3494 dyn.d_un.d_val = htab->elf.srelplt->size;
3495 if (htab->elf.irelplt)
3496 dyn.d_un.d_val += htab->elf.irelplt->size;
a85d7ed0 3497 break;
ec338859 3498
a85d7ed0
NC
3499 case DT_RELASZ:
3500 /* The procedure linkage table relocs (DT_JMPREL) should
3501 not be included in the overall relocs (DT_RELA).
3502 Therefore, we override the DT_RELASZ entry here to
3503 make it not include the JMPREL relocs. Since the
3504 linker script arranges for .rela.plt to follow all
3505 other relocation sections, we don't have to worry
3506 about changing the DT_RELA entry. */
79c12fae
AK
3507 dyn.d_un.d_val -= htab->elf.srelplt->size;
3508 if (htab->elf.irelplt)
3509 dyn.d_un.d_val -= htab->elf.irelplt->size;
a85d7ed0
NC
3510 break;
3511 }
0451c93c
MS
3512
3513 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
a85d7ed0
NC
3514 }
3515
3516 /* Fill in the special first entry in the procedure linkage table. */
f41345a7 3517 if (htab->elf.splt && htab->elf.splt->size > 0)
a85d7ed0
NC
3518 {
3519 /* fill in blueprint for plt 0 entry */
f41345a7 3520 memcpy (htab->elf.splt->contents, elf_s390x_first_plt_entry,
9aa17453 3521 PLT_FIRST_ENTRY_SIZE);
afca762f
AK
3522 /* The second instruction in the first PLT entry is a LARL
3523 loading the GOT pointer. Fill in the LARL immediate
3524 address. */
a85d7ed0 3525 bfd_put_32 (output_bfd,
afca762f 3526 (s390_got_pointer (info)
161db279
AK
3527 - htab->elf.splt->output_section->vma
3528 - htab->elf.splt->output_offset - 6)/2,
f41345a7 3529 htab->elf.splt->contents + 8);
a85d7ed0 3530 }
387f8054
MR
3531 if (elf_section_data (htab->elf.splt->output_section) != NULL)
3532 elf_section_data (htab->elf.splt->output_section)->this_hdr.sh_entsize
3533 = PLT_ENTRY_SIZE;
a85d7ed0
NC
3534 }
3535
afca762f 3536 if (htab->elf.hgot && htab->elf.hgot->root.u.def.section)
a85d7ed0 3537 {
0451c93c 3538 /* Fill in the first three entries in the global offset table. */
afca762f 3539 if (htab->elf.hgot->root.u.def.section->size > 0)
0451c93c
MS
3540 {
3541 bfd_put_64 (output_bfd,
3542 (sdyn == NULL ? (bfd_vma) 0
3543 : sdyn->output_section->vma + sdyn->output_offset),
afca762f 3544 htab->elf.hgot->root.u.def.section->contents);
0451c93c 3545 /* One entry for shared object struct ptr. */
afca762f
AK
3546 bfd_put_64 (output_bfd, (bfd_vma) 0,
3547 htab->elf.hgot->root.u.def.section->contents + 8);
0451c93c 3548 /* One entry for _dl_runtime_resolve. */
afca762f
AK
3549 bfd_put_64 (output_bfd, (bfd_vma) 0,
3550 htab->elf.hgot->root.u.def.section->contents + 16);
0451c93c 3551 }
f41345a7 3552 elf_section_data (htab->elf.sgot->output_section)
0451c93c
MS
3553 ->this_hdr.sh_entsize = 8;
3554 }
470b557a
AK
3555
3556 /* Finish dynamic symbol for local IFUNC symbols. */
c72f2fb2 3557 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
470b557a
AK
3558 {
3559 struct plt_entry *local_plt;
3560 Elf_Internal_Sym *isym;
3561 Elf_Internal_Shdr *symtab_hdr;
3562
3563 symtab_hdr = &elf_symtab_hdr (ibfd);
3564
1ef692ea
AK
3565 if (!is_s390_elf (ibfd))
3566 continue;
3567
470b557a
AK
3568 local_plt = elf_s390_local_plt (ibfd);
3569 if (local_plt != NULL)
3570 for (i = 0; i < symtab_hdr->sh_info; i++)
3571 {
3572 if (local_plt[i].plt.offset != (bfd_vma) -1)
3573 {
3574 asection *sec = local_plt[i].sec;
3575 isym = bfd_sym_from_r_symndx (&htab->sym_cache, ibfd, i);
3576 if (isym == NULL)
3577 return FALSE;
3578
3579 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
3580 elf_s390_finish_ifunc_symbol (output_bfd, info, NULL, htab,
3581 local_plt[i].plt.offset,
3582 isym->st_value
3583 + sec->output_section->vma
3584 + sec->output_offset);
3585
3586 }
3587 }
3588 }
3589
b34976b6 3590 return TRUE;
a85d7ed0 3591}
e3e9290d
AA
3592\f
3593/* Support for core dump NOTE sections. */
a85d7ed0 3594
e3e9290d
AA
3595static bfd_boolean
3596elf_s390_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
3597{
3598 int offset;
3599 size_t size;
3600
3601 switch (note->descsz)
3602 {
3603 default:
3604 return FALSE;
3605
3606 case 336: /* sizeof(struct elf_prstatus) on s390x */
3607 /* pr_cursig */
3608 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
3609
3610 /* pr_pid */
3611 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 32);
3612
3613 /* pr_reg */
3614 offset = 112;
3615 size = 216;
3616 break;
3617 }
3618
3619 /* Make a ".reg/999" section. */
3620 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
3621 size, note->descpos + offset);
3622}
3623
3624static bfd_boolean
3625elf_s390_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
3626{
3627 switch (note->descsz)
3628 {
3629 default:
3630 return FALSE;
3631
3632 case 136: /* sizeof(struct elf_prpsinfo) on s390x */
3633 elf_tdata (abfd)->core->pid
3634 = bfd_get_32 (abfd, note->descdata + 24);
3635 elf_tdata (abfd)->core->program
3636 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
3637 elf_tdata (abfd)->core->command
3638 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
3639 }
3640
3641 /* Note that for some reason, a spurious space is tacked
3642 onto the end of the args in some (at least one anyway)
3643 implementations, so strip it off if it exists. */
3644
3645 {
3646 char *command = elf_tdata (abfd)->core->command;
3647 int n = strlen (command);
3648
3649 if (0 < n && command[n - 1] == ' ')
3650 command[n - 1] = '\0';
3651 }
3652
3653 return TRUE;
3654}
3655
3656static char *
3657elf_s390_write_core_note (bfd *abfd, char *buf, int *bufsiz,
3658 int note_type, ...)
3659{
3660 va_list ap;
3661
3662 switch (note_type)
3663 {
3664 default:
3665 return NULL;
3666
3667 case NT_PRPSINFO:
3668 {
602f1657 3669 char data[136] ATTRIBUTE_NONSTRING = { 0 };
e3e9290d
AA
3670 const char *fname, *psargs;
3671
3672 va_start (ap, note_type);
3673 fname = va_arg (ap, const char *);
3674 psargs = va_arg (ap, const char *);
3675 va_end (ap);
3676
3677 strncpy (data + 40, fname, 16);
898ade12 3678#if GCC_VERSION == 8000 || GCC_VERSION == 8001
95da9854 3679 DIAGNOSTIC_PUSH;
be3e27bb 3680 /* GCC 8.0 and 8.1 warn about 80 equals destination size with
95da9854
L
3681 -Wstringop-truncation:
3682 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85643
3683 */
95da9854
L
3684 DIAGNOSTIC_IGNORE_STRINGOP_TRUNCATION;
3685#endif
e3e9290d 3686 strncpy (data + 56, psargs, 80);
898ade12 3687#if GCC_VERSION == 8000 || GCC_VERSION == 8001
95da9854 3688 DIAGNOSTIC_POP;
fe75810f 3689#endif
e3e9290d
AA
3690 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
3691 &data, sizeof (data));
3692 }
3693
3694 case NT_PRSTATUS:
3695 {
3696 char data[336] = { 0 };
3697 long pid;
3698 int cursig;
3699 const void *gregs;
3700
3701 va_start (ap, note_type);
3702 pid = va_arg (ap, long);
3703 cursig = va_arg (ap, int);
3704 gregs = va_arg (ap, const void *);
3705 va_end (ap);
3706
3707 bfd_put_16 (abfd, cursig, data + 12);
3708 bfd_put_32 (abfd, pid, data + 32);
3709 memcpy (data + 112, gregs, 216);
3710 return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
3711 &data, sizeof (data));
3712 }
3713 }
3714 /* NOTREACHED */
3715}
3716\f
4c45e5c9
JJ
3717/* Return address for Ith PLT stub in section PLT, for relocation REL
3718 or (bfd_vma) -1 if it should not be included. */
3719
3720static bfd_vma
3721elf_s390_plt_sym_val (bfd_vma i, const asection *plt,
3722 const arelent *rel ATTRIBUTE_UNUSED)
3723{
3724 return plt->vma + PLT_FIRST_ENTRY_SIZE + i * PLT_ENTRY_SIZE;
3725}
3726
643f7afb
AK
3727/* Merge backend specific data from an object file to the output
3728 object file when linking. */
3729
3730static bfd_boolean
50e03d47 3731elf64_s390_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
643f7afb 3732{
50e03d47 3733 if (!is_s390_elf (ibfd) || !is_s390_elf (info->output_bfd))
643f7afb
AK
3734 return TRUE;
3735
50e03d47 3736 return elf_s390_merge_obj_attributes (ibfd, info);
643f7afb
AK
3737}
3738
b4cbbe8f
AK
3739/* We may add a PT_S390_PGSTE program header. */
3740
3741static int
3742elf_s390_additional_program_headers (bfd *abfd ATTRIBUTE_UNUSED,
3743 struct bfd_link_info *info)
3744{
3745 struct elf_s390_link_hash_table *htab;
3746
93ec5e23
AK
3747 if (info)
3748 {
3749 htab = elf_s390_hash_table (info);
3750 if (htab)
3751 return htab->params->pgste;
3752 }
3753 return 0;
b4cbbe8f
AK
3754}
3755
3756
3757/* Add the PT_S390_PGSTE program header. */
3758
3759static bfd_boolean
93ec5e23 3760elf_s390_modify_segment_map (bfd *abfd, struct bfd_link_info *info)
b4cbbe8f
AK
3761{
3762 struct elf_s390_link_hash_table *htab;
3763 struct elf_segment_map *m, *pm = NULL;
3764
93ec5e23
AK
3765 if (!abfd || !info)
3766 return TRUE;
3767
b4cbbe8f 3768 htab = elf_s390_hash_table (info);
93ec5e23 3769 if (!htab || !htab->params->pgste)
b4cbbe8f
AK
3770 return TRUE;
3771
3772 /* If there is already a PT_S390_PGSTE header, avoid adding
3773 another. */
3774 m = elf_seg_map (abfd);
3775 while (m && m->p_type != PT_S390_PGSTE)
3776 {
3777 pm = m;
3778 m = m->next;
3779 }
3780
3781 if (m)
3782 return TRUE;
3783
3784 m = (struct elf_segment_map *)
3785 bfd_zalloc (abfd, sizeof (struct elf_segment_map));
3786 if (m == NULL)
3787 return FALSE;
3788 m->p_type = PT_S390_PGSTE;
3789 m->count = 0;
3790 m->next = NULL;
3791 if (pm)
3792 pm->next = m;
3793
3794 return TRUE;
3795}
3796
3797bfd_boolean
3798bfd_elf_s390_set_options (struct bfd_link_info *info,
3799 struct s390_elf_params *params)
3800{
3801 struct elf_s390_link_hash_table *htab;
3802
93ec5e23
AK
3803 if (info)
3804 {
3805 htab = elf_s390_hash_table (info);
3806 if (htab)
3807 htab->params = params;
3808 }
b4cbbe8f
AK
3809
3810 return TRUE;
3811}
3812
3813
ae9a127f
NC
3814/* Why was the hash table entry size definition changed from
3815 ARCH_SIZE/8 to 4? This breaks the 64 bit dynamic linker and
3816 this is the only reason for the s390_elf64_size_info structure. */
a85d7ed0
NC
3817
3818const struct elf_size_info s390_elf64_size_info =
3819{
3820 sizeof (Elf64_External_Ehdr),
3821 sizeof (Elf64_External_Phdr),
3822 sizeof (Elf64_External_Shdr),
3823 sizeof (Elf64_External_Rel),
3824 sizeof (Elf64_External_Rela),
3825 sizeof (Elf64_External_Sym),
3826 sizeof (Elf64_External_Dyn),
3827 sizeof (Elf_External_Note),
ae9a127f
NC
3828 8, /* hash-table entry size. */
3829 1, /* internal relocations per external relocations. */
3830 64, /* arch_size. */
45d6a902 3831 3, /* log_file_align. */
a85d7ed0
NC
3832 ELFCLASS64, EV_CURRENT,
3833 bfd_elf64_write_out_phdrs,
3834 bfd_elf64_write_shdrs_and_ehdr,
1489a3a0 3835 bfd_elf64_checksum_contents,
a85d7ed0 3836 bfd_elf64_write_relocs,
73ff0d56 3837 bfd_elf64_swap_symbol_in,
a85d7ed0
NC
3838 bfd_elf64_swap_symbol_out,
3839 bfd_elf64_slurp_reloc_table,
3840 bfd_elf64_slurp_symbol_table,
3841 bfd_elf64_swap_dyn_in,
3842 bfd_elf64_swap_dyn_out,
947216bf
AM
3843 bfd_elf64_swap_reloc_in,
3844 bfd_elf64_swap_reloc_out,
3845 bfd_elf64_swap_reloca_in,
3846 bfd_elf64_swap_reloca_out
a85d7ed0
NC
3847};
3848
6d00b590 3849#define TARGET_BIG_SYM s390_elf64_vec
a85d7ed0
NC
3850#define TARGET_BIG_NAME "elf64-s390"
3851#define ELF_ARCH bfd_arch_s390
ae95ffa6 3852#define ELF_TARGET_ID S390_ELF_DATA
a85d7ed0
NC
3853#define ELF_MACHINE_CODE EM_S390
3854#define ELF_MACHINE_ALT1 EM_S390_OLD
3855#define ELF_MAXPAGESIZE 0x1000
3856
3857#define elf_backend_size_info s390_elf64_size_info
3858
3859#define elf_backend_can_gc_sections 1
51b64d56 3860#define elf_backend_can_refcount 1
a85d7ed0
NC
3861#define elf_backend_want_got_plt 1
3862#define elf_backend_plt_readonly 1
3863#define elf_backend_want_plt_sym 0
3864#define elf_backend_got_header_size 24
5474d94f 3865#define elf_backend_want_dynrelro 1
b491616a 3866#define elf_backend_rela_normal 1
a85d7ed0
NC
3867
3868#define elf_info_to_howto elf_s390_info_to_howto
3869
a85d7ed0
NC
3870#define bfd_elf64_bfd_is_local_label_name elf_s390_is_local_label_name
3871#define bfd_elf64_bfd_link_hash_table_create elf_s390_link_hash_table_create
3872#define bfd_elf64_bfd_reloc_type_lookup elf_s390_reloc_type_lookup
07d6d2b8 3873#define bfd_elf64_bfd_reloc_name_lookup elf_s390_reloc_name_lookup
643f7afb 3874#define bfd_elf64_bfd_merge_private_bfd_data elf64_s390_merge_private_bfd_data
a85d7ed0
NC
3875
3876#define elf_backend_adjust_dynamic_symbol elf_s390_adjust_dynamic_symbol
3877#define elf_backend_check_relocs elf_s390_check_relocs
0451c93c 3878#define elf_backend_copy_indirect_symbol elf_s390_copy_indirect_symbol
9d19e4fd 3879#define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections
a85d7ed0
NC
3880#define elf_backend_finish_dynamic_sections elf_s390_finish_dynamic_sections
3881#define elf_backend_finish_dynamic_symbol elf_s390_finish_dynamic_symbol
3882#define elf_backend_gc_mark_hook elf_s390_gc_mark_hook
0451c93c 3883#define elf_backend_reloc_type_class elf_s390_reloc_type_class
a85d7ed0
NC
3884#define elf_backend_relocate_section elf_s390_relocate_section
3885#define elf_backend_size_dynamic_sections elf_s390_size_dynamic_sections
74541ad4 3886#define elf_backend_init_index_section _bfd_elf_init_1_index_section
e3e9290d
AA
3887#define elf_backend_grok_prstatus elf_s390_grok_prstatus
3888#define elf_backend_grok_psinfo elf_s390_grok_psinfo
3889#define elf_backend_write_core_note elf_s390_write_core_note
4c45e5c9 3890#define elf_backend_plt_sym_val elf_s390_plt_sym_val
07d6d2b8 3891#define elf_backend_sort_relocs_p elf_s390_elf_sort_relocs_p
b4cbbe8f
AK
3892#define elf_backend_additional_program_headers elf_s390_additional_program_headers
3893#define elf_backend_modify_segment_map elf_s390_modify_segment_map
a85d7ed0 3894
69fc87f1
MS
3895#define bfd_elf64_mkobject elf_s390_mkobject
3896#define elf_backend_object_p elf_s390_object_p
a85d7ed0
NC
3897
3898#include "elf64-target.h"
This page took 1.317182 seconds and 4 git commands to generate.