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