b14b479cbf02c20cae0d53cc8a8ef217b1e19c16
[external/binutils.git] / bfd / elf64-s390.c
1 /* IBM S/390-specific support for 64-bit ELF
2    Copyright (C) 2000-2016 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_GOTPC:
1044         case R_390_GOTPCDBL:
1045           /* These relocs do not need a GOT slot.  They just load the
1046              GOT pointer itself or address something else relative to
1047              the GOT.  Since the GOT pointer has been set up above we
1048              are done.  */
1049           break;
1050         case R_390_GOTOFF16:
1051         case R_390_GOTOFF32:
1052         case R_390_GOTOFF64:
1053           if (h == NULL || !s390_is_ifunc_symbol_p (h) || !h->def_regular)
1054             break;
1055
1056         case R_390_PLT12DBL:
1057         case R_390_PLT16DBL:
1058         case R_390_PLT24DBL:
1059         case R_390_PLT32:
1060         case R_390_PLT32DBL:
1061         case R_390_PLT64:
1062         case R_390_PLTOFF16:
1063         case R_390_PLTOFF32:
1064         case R_390_PLTOFF64:
1065           /* This symbol requires a procedure linkage table entry.  We
1066              actually build the entry in adjust_dynamic_symbol,
1067              because this might be a case of linking PIC code which is
1068              never referenced by a dynamic object, in which case we
1069              don't need to generate a procedure linkage table entry
1070              after all.  */
1071
1072           /* If this is a local symbol, we resolve it directly without
1073              creating a procedure linkage table entry.  */
1074           if (h != NULL)
1075             {
1076               h->needs_plt = 1;
1077               h->plt.refcount += 1;
1078             }
1079           break;
1080
1081         case R_390_GOTPLT12:
1082         case R_390_GOTPLT16:
1083         case R_390_GOTPLT20:
1084         case R_390_GOTPLT32:
1085         case R_390_GOTPLT64:
1086         case R_390_GOTPLTENT:
1087           /* This symbol requires either a procedure linkage table entry
1088              or an entry in the local got. We actually build the entry
1089              in adjust_dynamic_symbol because whether this is really a
1090              global reference can change and with it the fact if we have
1091              to create a plt entry or a local got entry. To be able to
1092              make a once global symbol a local one we have to keep track
1093              of the number of gotplt references that exist for this
1094              symbol.  */
1095           if (h != NULL)
1096             {
1097               ((struct elf_s390_link_hash_entry *) h)->gotplt_refcount++;
1098               h->needs_plt = 1;
1099               h->plt.refcount += 1;
1100             }
1101           else
1102             local_got_refcounts[r_symndx] += 1;
1103           break;
1104
1105         case R_390_TLS_LDM64:
1106           htab->tls_ldm_got.refcount += 1;
1107           break;
1108
1109         case R_390_TLS_IE64:
1110         case R_390_TLS_GOTIE12:
1111         case R_390_TLS_GOTIE20:
1112         case R_390_TLS_GOTIE64:
1113         case R_390_TLS_IEENT:
1114           if (bfd_link_pic (info))
1115             info->flags |= DF_STATIC_TLS;
1116           /* Fall through */
1117
1118         case R_390_GOT12:
1119         case R_390_GOT16:
1120         case R_390_GOT20:
1121         case R_390_GOT32:
1122         case R_390_GOT64:
1123         case R_390_GOTENT:
1124         case R_390_TLS_GD64:
1125           /* This symbol requires a global offset table entry.  */
1126           switch (r_type)
1127             {
1128             default:
1129             case R_390_GOT12:
1130             case R_390_GOT16:
1131             case R_390_GOT20:
1132             case R_390_GOT32:
1133             case R_390_GOTENT:
1134               tls_type = GOT_NORMAL;
1135               break;
1136             case R_390_TLS_GD64:
1137               tls_type = GOT_TLS_GD;
1138               break;
1139             case R_390_TLS_IE64:
1140             case R_390_TLS_GOTIE64:
1141               tls_type = GOT_TLS_IE;
1142               break;
1143             case R_390_TLS_GOTIE12:
1144             case R_390_TLS_GOTIE20:
1145             case R_390_TLS_IEENT:
1146               tls_type = GOT_TLS_IE_NLT;
1147               break;
1148             }
1149
1150           if (h != NULL)
1151             {
1152               h->got.refcount += 1;
1153               old_tls_type = elf_s390_hash_entry(h)->tls_type;
1154             }
1155           else
1156             {
1157               local_got_refcounts[r_symndx] += 1;
1158               old_tls_type = elf_s390_local_got_tls_type (abfd) [r_symndx];
1159             }
1160           /* If a TLS symbol is accessed using IE at least once,
1161              there is no point to use dynamic model for it.  */
1162           if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN)
1163             {
1164               if (old_tls_type == GOT_NORMAL || tls_type == GOT_NORMAL)
1165                 {
1166                   (*_bfd_error_handler)
1167                     (_("%B: `%s' accessed both as normal and thread local symbol"),
1168                      abfd, h->root.root.string);
1169                   return FALSE;
1170                 }
1171               if (old_tls_type > tls_type)
1172                 tls_type = old_tls_type;
1173             }
1174
1175           if (old_tls_type != tls_type)
1176             {
1177               if (h != NULL)
1178                 elf_s390_hash_entry (h)->tls_type = tls_type;
1179               else
1180                 elf_s390_local_got_tls_type (abfd) [r_symndx] = tls_type;
1181             }
1182
1183           if (r_type != R_390_TLS_IE64)
1184             break;
1185           /* Fall through */
1186
1187         case R_390_TLS_LE64:
1188           /* For static linking and executables this reloc will be
1189              calculated at linktime otherwise a TLS_TPOFF runtime
1190              reloc will be generated.  */
1191           if (r_type == R_390_TLS_LE64 && bfd_link_pie (info))
1192             break;
1193
1194           if (!bfd_link_pic (info))
1195             break;
1196           info->flags |= DF_STATIC_TLS;
1197           /* Fall through */
1198
1199         case R_390_8:
1200         case R_390_16:
1201         case R_390_32:
1202         case R_390_64:
1203         case R_390_PC12DBL:
1204         case R_390_PC16:
1205         case R_390_PC16DBL:
1206         case R_390_PC24DBL:
1207         case R_390_PC32:
1208         case R_390_PC32DBL:
1209         case R_390_PC64:
1210           if (h != NULL && bfd_link_executable (info))
1211             {
1212               /* If this reloc is in a read-only section, we might
1213                  need a copy reloc.  We can't check reliably at this
1214                  stage whether the section is read-only, as input
1215                  sections have not yet been mapped to output sections.
1216                  Tentatively set the flag for now, and correct in
1217                  adjust_dynamic_symbol.  */
1218               h->non_got_ref = 1;
1219
1220               if (!bfd_link_pic (info))
1221                 {
1222                   /* We may need a .plt entry if the function this reloc
1223                      refers to is in a shared lib.  */
1224                   h->plt.refcount += 1;
1225                 }
1226             }
1227
1228           /* If we are creating a shared library, and this is a reloc
1229              against a global symbol, or a non PC relative reloc
1230              against a local symbol, then we need to copy the reloc
1231              into the shared library.  However, if we are linking with
1232              -Bsymbolic, we do not need to copy a reloc against a
1233              global symbol which is defined in an object we are
1234              including in the link (i.e., DEF_REGULAR is set).  At
1235              this point we have not seen all the input files, so it is
1236              possible that DEF_REGULAR is not set now but will be set
1237              later (it is never cleared).  In case of a weak definition,
1238              DEF_REGULAR may be cleared later by a strong definition in
1239              a shared library. We account for that possibility below by
1240              storing information in the relocs_copied field of the hash
1241              table entry.  A similar situation occurs when creating
1242              shared libraries and symbol visibility changes render the
1243              symbol local.
1244
1245              If on the other hand, we are creating an executable, we
1246              may need to keep relocations for symbols satisfied by a
1247              dynamic library if we manage to avoid copy relocs for the
1248              symbol.  */
1249           if ((bfd_link_pic (info)
1250                && (sec->flags & SEC_ALLOC) != 0
1251                && ((ELF64_R_TYPE (rel->r_info) != R_390_PC16
1252                     && ELF64_R_TYPE (rel->r_info) != R_390_PC12DBL
1253                     && ELF64_R_TYPE (rel->r_info) != R_390_PC16DBL
1254                     && ELF64_R_TYPE (rel->r_info) != R_390_PC24DBL
1255                     && ELF64_R_TYPE (rel->r_info) != R_390_PC32
1256                     && ELF64_R_TYPE (rel->r_info) != R_390_PC32DBL
1257                     && ELF64_R_TYPE (rel->r_info) != R_390_PC64)
1258                    || (h != NULL
1259                        && (! SYMBOLIC_BIND (info, h)
1260                            || h->root.type == bfd_link_hash_defweak
1261                            || !h->def_regular))))
1262               || (ELIMINATE_COPY_RELOCS
1263                   && !bfd_link_pic (info)
1264                   && (sec->flags & SEC_ALLOC) != 0
1265                   && h != NULL
1266                   && (h->root.type == bfd_link_hash_defweak
1267                       || !h->def_regular)))
1268             {
1269               struct elf_dyn_relocs *p;
1270               struct elf_dyn_relocs **head;
1271
1272               /* We must copy these reloc types into the output file.
1273                  Create a reloc section in dynobj and make room for
1274                  this reloc.  */
1275               if (sreloc == NULL)
1276                 {
1277                   if (htab->elf.dynobj == NULL)
1278                     htab->elf.dynobj = abfd;
1279
1280                   sreloc = _bfd_elf_make_dynamic_reloc_section
1281                     (sec, htab->elf.dynobj, 3, abfd, /*rela?*/ TRUE);
1282
1283                   if (sreloc == NULL)
1284                     return FALSE;
1285                 }
1286
1287               /* If this is a global symbol, we count the number of
1288                  relocations we need for this symbol.  */
1289               if (h != NULL)
1290                 {
1291                   head = &((struct elf_s390_link_hash_entry *) h)->dyn_relocs;
1292                 }
1293               else
1294                 {
1295                   /* Track dynamic relocs needed for local syms too.
1296                      We really need local syms available to do this
1297                      easily.  Oh well.  */
1298                   asection *s;
1299                   void *vpp;
1300
1301                   isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1302                                                 abfd, r_symndx);
1303                   if (isym == NULL)
1304                     return FALSE;
1305
1306                   s = bfd_section_from_elf_index (abfd, isym->st_shndx);
1307                   if (s == NULL)
1308                     s = sec;
1309
1310                   vpp = &elf_section_data (s)->local_dynrel;
1311                   head = (struct elf_dyn_relocs **) vpp;
1312                 }
1313
1314               p = *head;
1315               if (p == NULL || p->sec != sec)
1316                 {
1317                   bfd_size_type amt = sizeof *p;
1318                   p = ((struct elf_dyn_relocs *)
1319                        bfd_alloc (htab->elf.dynobj, amt));
1320                   if (p == NULL)
1321                     return FALSE;
1322                   p->next = *head;
1323                   *head = p;
1324                   p->sec = sec;
1325                   p->count = 0;
1326                   p->pc_count = 0;
1327                 }
1328
1329               p->count += 1;
1330               if (ELF64_R_TYPE (rel->r_info) == R_390_PC16
1331                   || ELF64_R_TYPE (rel->r_info) == R_390_PC12DBL
1332                   || ELF64_R_TYPE (rel->r_info) == R_390_PC16DBL
1333                   || ELF64_R_TYPE (rel->r_info) == R_390_PC16DBL
1334                   || ELF64_R_TYPE (rel->r_info) == R_390_PC32
1335                   || ELF64_R_TYPE (rel->r_info) == R_390_PC32DBL
1336                   || ELF64_R_TYPE (rel->r_info) == R_390_PC64)
1337                 p->pc_count += 1;
1338             }
1339           break;
1340
1341           /* This relocation describes the C++ object vtable hierarchy.
1342              Reconstruct it for later use during GC.  */
1343         case R_390_GNU_VTINHERIT:
1344           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1345             return FALSE;
1346           break;
1347
1348           /* This relocation describes which C++ vtable entries are actually
1349              used.  Record for later use during GC.  */
1350         case R_390_GNU_VTENTRY:
1351           BFD_ASSERT (h != NULL);
1352           if (h != NULL
1353               && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
1354             return FALSE;
1355           break;
1356
1357         default:
1358           break;
1359         }
1360     }
1361
1362   return TRUE;
1363 }
1364
1365 /* Return the section that should be marked against GC for a given
1366    relocation.  */
1367
1368 static asection *
1369 elf_s390_gc_mark_hook (asection *sec,
1370                        struct bfd_link_info *info,
1371                        Elf_Internal_Rela *rel,
1372                        struct elf_link_hash_entry *h,
1373                        Elf_Internal_Sym *sym)
1374 {
1375   if (h != NULL)
1376     switch (ELF64_R_TYPE (rel->r_info))
1377       {
1378       case R_390_GNU_VTINHERIT:
1379       case R_390_GNU_VTENTRY:
1380         return NULL;
1381       }
1382
1383   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
1384 }
1385
1386 /* Update the got entry reference counts for the section being removed.  */
1387
1388 static bfd_boolean
1389 elf_s390_gc_sweep_hook (bfd *abfd,
1390                         struct bfd_link_info *info,
1391                         asection *sec,
1392                         const Elf_Internal_Rela *relocs)
1393 {
1394   struct elf_s390_link_hash_table *htab;
1395   Elf_Internal_Shdr *symtab_hdr;
1396   struct elf_link_hash_entry **sym_hashes;
1397   bfd_signed_vma *local_got_refcounts;
1398   const Elf_Internal_Rela *rel, *relend;
1399
1400   if (bfd_link_relocatable (info))
1401     return TRUE;
1402
1403   htab = elf_s390_hash_table (info);
1404   if (htab == NULL)
1405     return FALSE;
1406
1407   elf_section_data (sec)->local_dynrel = NULL;
1408
1409   symtab_hdr = &elf_symtab_hdr (abfd);
1410   sym_hashes = elf_sym_hashes (abfd);
1411   local_got_refcounts = elf_local_got_refcounts (abfd);
1412
1413   relend = relocs + sec->reloc_count;
1414   for (rel = relocs; rel < relend; rel++)
1415     {
1416       unsigned long r_symndx;
1417       unsigned int r_type;
1418       struct elf_link_hash_entry *h = NULL;
1419
1420       r_symndx = ELF64_R_SYM (rel->r_info);
1421       if (r_symndx >= symtab_hdr->sh_info)
1422         {
1423           struct elf_s390_link_hash_entry *eh;
1424           struct elf_dyn_relocs **pp;
1425           struct elf_dyn_relocs *p;
1426
1427           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1428           while (h->root.type == bfd_link_hash_indirect
1429                  || h->root.type == bfd_link_hash_warning)
1430             h = (struct elf_link_hash_entry *) h->root.u.i.link;
1431           eh = (struct elf_s390_link_hash_entry *) h;
1432
1433           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
1434             if (p->sec == sec)
1435               {
1436                 /* Everything must go for SEC.  */
1437                 *pp = p->next;
1438                 break;
1439               }
1440         }
1441       else
1442         {
1443           Elf_Internal_Sym *isym;
1444
1445           /* A local symbol.  */
1446           isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1447                                         abfd, r_symndx);
1448           if (isym == NULL)
1449             return FALSE;
1450
1451           if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
1452             {
1453               struct plt_entry *plt = elf_s390_local_plt (abfd);
1454               if (plt[r_symndx].plt.refcount > 0)
1455                 plt[r_symndx].plt.refcount--;
1456             }
1457         }
1458
1459       r_type = ELF64_R_TYPE (rel->r_info);
1460       r_type = elf_s390_tls_transition (info, r_type, h != NULL);
1461       switch (r_type)
1462         {
1463         case R_390_TLS_LDM64:
1464           if (htab->tls_ldm_got.refcount > 0)
1465             htab->tls_ldm_got.refcount -= 1;
1466           break;
1467         case R_390_GOTOFF16:
1468         case R_390_GOTOFF32:
1469         case R_390_GOTOFF64:
1470           if (h != NULL && s390_is_ifunc_symbol_p (h) && h->def_regular)
1471             {
1472               h->plt.refcount--;
1473               break;
1474             }
1475
1476         case R_390_GOTPC:
1477         case R_390_GOTPCDBL:
1478           break;
1479
1480         case R_390_TLS_GD64:
1481         case R_390_TLS_IE64:
1482         case R_390_TLS_GOTIE12:
1483         case R_390_TLS_GOTIE20:
1484         case R_390_TLS_GOTIE64:
1485         case R_390_TLS_IEENT:
1486         case R_390_GOT12:
1487         case R_390_GOT16:
1488         case R_390_GOT20:
1489         case R_390_GOT32:
1490         case R_390_GOT64:
1491         case R_390_GOTENT:
1492           if (h != NULL)
1493             {
1494               if (h->got.refcount > 0)
1495                 h->got.refcount -= 1;
1496             }
1497           else if (local_got_refcounts != NULL)
1498             {
1499               if (local_got_refcounts[r_symndx] > 0)
1500                 local_got_refcounts[r_symndx] -= 1;
1501             }
1502           break;
1503
1504         case R_390_8:
1505         case R_390_12:
1506         case R_390_16:
1507         case R_390_20:
1508         case R_390_32:
1509         case R_390_64:
1510         case R_390_PC16:
1511         case R_390_PC12DBL:
1512         case R_390_PC16DBL:
1513         case R_390_PC24DBL:
1514         case R_390_PC32:
1515         case R_390_PC32DBL:
1516         case R_390_PC64:
1517           if (bfd_link_pic (info))
1518             break;
1519           /* Fall through */
1520
1521         case R_390_PLT12DBL:
1522         case R_390_PLT16DBL:
1523         case R_390_PLT24DBL:
1524         case R_390_PLT32:
1525         case R_390_PLT32DBL:
1526         case R_390_PLT64:
1527         case R_390_PLTOFF16:
1528         case R_390_PLTOFF32:
1529         case R_390_PLTOFF64:
1530           if (h != NULL)
1531             {
1532               if (h->plt.refcount > 0)
1533                 h->plt.refcount -= 1;
1534             }
1535           break;
1536
1537         case R_390_GOTPLT12:
1538         case R_390_GOTPLT16:
1539         case R_390_GOTPLT20:
1540         case R_390_GOTPLT32:
1541         case R_390_GOTPLT64:
1542         case R_390_GOTPLTENT:
1543           if (h != NULL)
1544             {
1545               if (h->plt.refcount > 0)
1546                 {
1547                   ((struct elf_s390_link_hash_entry *) h)->gotplt_refcount--;
1548                   h->plt.refcount -= 1;
1549                 }
1550             }
1551           else if (local_got_refcounts != NULL)
1552             {
1553               if (local_got_refcounts[r_symndx] > 0)
1554                 local_got_refcounts[r_symndx] -= 1;
1555             }
1556           break;
1557
1558         default:
1559           break;
1560         }
1561     }
1562
1563   return TRUE;
1564 }
1565
1566 /* Make sure we emit a GOT entry if the symbol was supposed to have a PLT
1567    entry but we found we will not create any.  Called when we find we will
1568    not have any PLT for this symbol, by for example
1569    elf_s390_adjust_dynamic_symbol when we're doing a proper dynamic link,
1570    or elf_s390_size_dynamic_sections if no dynamic sections will be
1571    created (we're only linking static objects).  */
1572
1573 static void
1574 elf_s390_adjust_gotplt (struct elf_s390_link_hash_entry *h)
1575 {
1576   if (h->elf.root.type == bfd_link_hash_warning)
1577     h = (struct elf_s390_link_hash_entry *) h->elf.root.u.i.link;
1578
1579   if (h->gotplt_refcount <= 0)
1580     return;
1581
1582   /* We simply add the number of gotplt references to the number
1583    * of got references for this symbol.  */
1584   h->elf.got.refcount += h->gotplt_refcount;
1585   h->gotplt_refcount = -1;
1586 }
1587
1588 /* Adjust a symbol defined by a dynamic object and referenced by a
1589    regular object.  The current definition is in some section of the
1590    dynamic object, but we're not including those sections.  We have to
1591    change the definition to something the rest of the link can
1592    understand.  */
1593
1594 static bfd_boolean
1595 elf_s390_adjust_dynamic_symbol (struct bfd_link_info *info,
1596                                 struct elf_link_hash_entry *h)
1597 {
1598   struct elf_s390_link_hash_table *htab;
1599   asection *s;
1600
1601   /* STT_GNU_IFUNC symbol must go through PLT. */
1602   if (s390_is_ifunc_symbol_p (h))
1603     {
1604       /* All local STT_GNU_IFUNC references must be treated as local
1605          calls via local PLT.  */
1606       if (h->ref_regular && SYMBOL_CALLS_LOCAL (info, h))
1607         {
1608           bfd_size_type pc_count = 0, count = 0;
1609           struct elf_dyn_relocs **pp;
1610           struct elf_s390_link_hash_entry *eh;
1611           struct elf_dyn_relocs *p;
1612
1613           eh = (struct elf_s390_link_hash_entry *) h;
1614           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
1615             {
1616               pc_count += p->pc_count;
1617               p->count -= p->pc_count;
1618               p->pc_count = 0;
1619               count += p->count;
1620               if (p->count == 0)
1621                 *pp = p->next;
1622               else
1623                 pp = &p->next;
1624             }
1625
1626           if (pc_count || count)
1627             {
1628               h->needs_plt = 1;
1629               h->non_got_ref = 1;
1630               if (h->plt.refcount <= 0)
1631                 h->plt.refcount = 1;
1632               else
1633                 h->plt.refcount += 1;
1634             }
1635         }
1636
1637       if (h->plt.refcount <= 0)
1638         {
1639           h->plt.offset = (bfd_vma) -1;
1640           h->needs_plt = 0;
1641         }
1642       return TRUE;
1643     }
1644
1645   /* If this is a function, put it in the procedure linkage table.  We
1646      will fill in the contents of the procedure linkage table later
1647      (although we could actually do it here).  */
1648   if (h->type == STT_FUNC
1649       || h->needs_plt)
1650     {
1651       if (h->plt.refcount <= 0
1652           || SYMBOL_CALLS_LOCAL (info, h)
1653           || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
1654               && h->root.type == bfd_link_hash_undefweak))
1655         {
1656           /* This case can occur if we saw a PLT32 reloc in an input
1657              file, but the symbol was never referred to by a dynamic
1658              object, or if all references were garbage collected.  In
1659              such a case, we don't actually need to build a procedure
1660              linkage table, and we can just do a PC32 reloc instead.  */
1661           h->plt.offset = (bfd_vma) -1;
1662           h->needs_plt = 0;
1663           elf_s390_adjust_gotplt((struct elf_s390_link_hash_entry *) h);
1664         }
1665
1666       return TRUE;
1667     }
1668   else
1669     /* It's possible that we incorrectly decided a .plt reloc was
1670        needed for an R_390_PC32 reloc to a non-function sym in
1671        check_relocs.  We can't decide accurately between function and
1672        non-function syms in check-relocs;  Objects loaded later in
1673        the link may change h->type.  So fix it now.  */
1674     h->plt.offset = (bfd_vma) -1;
1675
1676   /* If this is a weak symbol, and there is a real definition, the
1677      processor independent code will have arranged for us to see the
1678      real definition first, and we can just use the same value.  */
1679   if (h->u.weakdef != NULL)
1680     {
1681       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
1682                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
1683       h->root.u.def.section = h->u.weakdef->root.u.def.section;
1684       h->root.u.def.value = h->u.weakdef->root.u.def.value;
1685       if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
1686         h->non_got_ref = h->u.weakdef->non_got_ref;
1687       return TRUE;
1688     }
1689
1690   /* This is a reference to a symbol defined by a dynamic object which
1691      is not a function.  */
1692
1693   /* If we are creating a shared library, we must presume that the
1694      only references to the symbol are via the global offset table.
1695      For such cases we need not do anything here; the relocations will
1696      be handled correctly by relocate_section.  */
1697   if (bfd_link_pic (info))
1698     return TRUE;
1699
1700   /* If there are no references to this symbol that do not use the
1701      GOT, we don't need to generate a copy reloc.  */
1702   if (!h->non_got_ref)
1703     return TRUE;
1704
1705   /* If -z nocopyreloc was given, we won't generate them either.  */
1706   if (info->nocopyreloc)
1707     {
1708       h->non_got_ref = 0;
1709       return TRUE;
1710     }
1711
1712   if (ELIMINATE_COPY_RELOCS)
1713     {
1714       struct elf_s390_link_hash_entry * eh;
1715       struct elf_dyn_relocs *p;
1716
1717       eh = (struct elf_s390_link_hash_entry *) h;
1718       for (p = eh->dyn_relocs; p != NULL; p = p->next)
1719         {
1720           s = p->sec->output_section;
1721           if (s != NULL && (s->flags & SEC_READONLY) != 0)
1722             break;
1723         }
1724
1725       /* If we didn't find any dynamic relocs in read-only sections, then
1726          we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
1727       if (p == NULL)
1728         {
1729           h->non_got_ref = 0;
1730           return TRUE;
1731         }
1732     }
1733
1734   /* We must allocate the symbol in our .dynbss section, which will
1735      become part of the .bss section of the executable.  There will be
1736      an entry for this symbol in the .dynsym section.  The dynamic
1737      object will contain position independent code, so all references
1738      from the dynamic object to this symbol will go through the global
1739      offset table.  The dynamic linker will use the .dynsym entry to
1740      determine the address it must put in the global offset table, so
1741      both the dynamic object and the regular object will refer to the
1742      same memory location for the variable.  */
1743
1744   htab = elf_s390_hash_table (info);
1745   if (htab == NULL)
1746     return FALSE;
1747
1748   /* We must generate a R_390_COPY reloc to tell the dynamic linker to
1749      copy the initial value out of the dynamic object and into the
1750      runtime process image.  */
1751   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
1752     {
1753       htab->srelbss->size += sizeof (Elf64_External_Rela);
1754       h->needs_copy = 1;
1755     }
1756
1757   s = htab->sdynbss;
1758
1759   return _bfd_elf_adjust_dynamic_copy (info, h, s);
1760 }
1761
1762 /* Allocate space in .plt, .got and associated reloc sections for
1763    dynamic relocs.  */
1764
1765 static bfd_boolean
1766 allocate_dynrelocs (struct elf_link_hash_entry *h,
1767                     void * inf)
1768 {
1769   struct bfd_link_info *info;
1770   struct elf_s390_link_hash_table *htab;
1771   struct elf_s390_link_hash_entry *eh = (struct elf_s390_link_hash_entry *)h;
1772   struct elf_dyn_relocs *p;
1773
1774   if (h->root.type == bfd_link_hash_indirect)
1775     return TRUE;
1776
1777   info = (struct bfd_link_info *) inf;
1778   htab = elf_s390_hash_table (info);
1779   if (htab == NULL)
1780     return FALSE;
1781
1782   /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it
1783      here if it is defined and referenced in a non-shared object.  */
1784   if (s390_is_ifunc_symbol_p (h) && h->def_regular)
1785     return s390_elf_allocate_ifunc_dyn_relocs (info, h);
1786   else if (htab->elf.dynamic_sections_created
1787            && h->plt.refcount > 0)
1788     {
1789       /* Make sure this symbol is output as a dynamic symbol.
1790          Undefined weak syms won't yet be marked as dynamic.  */
1791       if (h->dynindx == -1
1792           && !h->forced_local)
1793         {
1794           if (! bfd_elf_link_record_dynamic_symbol (info, h))
1795             return FALSE;
1796         }
1797
1798       if (bfd_link_pic (info)
1799           || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
1800         {
1801           asection *s = htab->elf.splt;
1802
1803           /* If this is the first .plt entry, make room for the special
1804              first entry.  */
1805           if (s->size == 0)
1806             s->size += PLT_FIRST_ENTRY_SIZE;
1807
1808           h->plt.offset = s->size;
1809
1810           /* If this symbol is not defined in a regular file, and we are
1811              not generating a shared library, then set the symbol to this
1812              location in the .plt.  This is required to make function
1813              pointers compare as equal between the normal executable and
1814              the shared library.  */
1815           if (! bfd_link_pic (info)
1816               && !h->def_regular)
1817             {
1818               h->root.u.def.section = s;
1819               h->root.u.def.value = h->plt.offset;
1820             }
1821
1822           /* Make room for this entry.  */
1823           s->size += PLT_ENTRY_SIZE;
1824
1825           /* We also need to make an entry in the .got.plt section, which
1826              will be placed in the .got section by the linker script.  */
1827           htab->elf.sgotplt->size += GOT_ENTRY_SIZE;
1828
1829           /* We also need to make an entry in the .rela.plt section.  */
1830           htab->elf.srelplt->size += sizeof (Elf64_External_Rela);
1831         }
1832       else
1833         {
1834           h->plt.offset = (bfd_vma) -1;
1835           h->needs_plt = 0;
1836           elf_s390_adjust_gotplt((struct elf_s390_link_hash_entry *) h);
1837         }
1838     }
1839   else
1840     {
1841       h->plt.offset = (bfd_vma) -1;
1842       h->needs_plt = 0;
1843       elf_s390_adjust_gotplt((struct elf_s390_link_hash_entry *) h);
1844     }
1845
1846   /* If R_390_TLS_{IE64,GOTIE64,GOTIE12,IEENT} symbol is now local to
1847      the binary, we can optimize a bit. IE64 and GOTIE64 get converted
1848      to R_390_TLS_LE64 requiring no TLS entry. For GOTIE12 and IEENT
1849      we can save the dynamic TLS relocation.  */
1850   if (h->got.refcount > 0
1851       && !bfd_link_pic (info)
1852       && h->dynindx == -1
1853       && elf_s390_hash_entry(h)->tls_type >= GOT_TLS_IE)
1854     {
1855       if (elf_s390_hash_entry(h)->tls_type == GOT_TLS_IE_NLT)
1856         /* For the GOTIE access without a literal pool entry the offset has
1857            to be stored somewhere. The immediate value in the instruction
1858            is not bit enough so the value is stored in the got.  */
1859         {
1860           h->got.offset = htab->elf.sgot->size;
1861           htab->elf.sgot->size += GOT_ENTRY_SIZE;
1862         }
1863       else
1864         h->got.offset = (bfd_vma) -1;
1865     }
1866   else if (h->got.refcount > 0)
1867     {
1868       asection *s;
1869       bfd_boolean dyn;
1870       int tls_type = elf_s390_hash_entry(h)->tls_type;
1871
1872       /* Make sure this symbol is output as a dynamic symbol.
1873          Undefined weak syms won't yet be marked as dynamic.  */
1874       if (h->dynindx == -1
1875           && !h->forced_local)
1876         {
1877           if (! bfd_elf_link_record_dynamic_symbol (info, h))
1878             return FALSE;
1879         }
1880
1881       s = htab->elf.sgot;
1882       h->got.offset = s->size;
1883       s->size += GOT_ENTRY_SIZE;
1884       /* R_390_TLS_GD64 needs 2 consecutive GOT slots.  */
1885       if (tls_type == GOT_TLS_GD)
1886         s->size += GOT_ENTRY_SIZE;
1887       dyn = htab->elf.dynamic_sections_created;
1888       /* R_390_TLS_IE64 needs one dynamic relocation,
1889          R_390_TLS_GD64 needs one if local symbol and two if global.  */
1890       if ((tls_type == GOT_TLS_GD && h->dynindx == -1)
1891           || tls_type >= GOT_TLS_IE)
1892         htab->elf.srelgot->size += sizeof (Elf64_External_Rela);
1893       else if (tls_type == GOT_TLS_GD)
1894         htab->elf.srelgot->size += 2 * sizeof (Elf64_External_Rela);
1895       else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
1896                 || h->root.type != bfd_link_hash_undefweak)
1897                && (bfd_link_pic (info)
1898                    || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
1899         htab->elf.srelgot->size += sizeof (Elf64_External_Rela);
1900     }
1901   else
1902     h->got.offset = (bfd_vma) -1;
1903
1904   if (eh->dyn_relocs == NULL)
1905     return TRUE;
1906
1907   /* In the shared -Bsymbolic case, discard space allocated for
1908      dynamic pc-relative relocs against symbols which turn out to be
1909      defined in regular objects.  For the normal shared case, discard
1910      space for pc-relative relocs that have become local due to symbol
1911      visibility changes.  */
1912
1913   if (bfd_link_pic (info))
1914     {
1915       if (SYMBOL_CALLS_LOCAL (info, h))
1916         {
1917           struct elf_dyn_relocs **pp;
1918
1919           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
1920             {
1921               p->count -= p->pc_count;
1922               p->pc_count = 0;
1923               if (p->count == 0)
1924                 *pp = p->next;
1925               else
1926                 pp = &p->next;
1927             }
1928         }
1929
1930       /* Also discard relocs on undefined weak syms with non-default
1931          visibility.  */
1932       if (eh->dyn_relocs != NULL
1933           && h->root.type == bfd_link_hash_undefweak)
1934         {
1935           if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
1936             eh->dyn_relocs = NULL;
1937
1938           /* Make sure undefined weak symbols are output as a dynamic
1939              symbol in PIEs.  */
1940           else if (h->dynindx == -1
1941                    && !h->forced_local)
1942             {
1943               if (! bfd_elf_link_record_dynamic_symbol (info, h))
1944                 return FALSE;
1945             }
1946         }
1947     }
1948   else if (ELIMINATE_COPY_RELOCS)
1949     {
1950       /* For the non-shared case, discard space for relocs against
1951          symbols which turn out to need copy relocs or are not
1952          dynamic.  */
1953
1954       if (!h->non_got_ref
1955           && ((h->def_dynamic
1956                && !h->def_regular)
1957               || (htab->elf.dynamic_sections_created
1958                   && (h->root.type == bfd_link_hash_undefweak
1959                       || h->root.type == bfd_link_hash_undefined))))
1960         {
1961           /* Make sure this symbol is output as a dynamic symbol.
1962              Undefined weak syms won't yet be marked as dynamic.  */
1963           if (h->dynindx == -1
1964               && !h->forced_local)
1965             {
1966               if (! bfd_elf_link_record_dynamic_symbol (info, h))
1967                 return FALSE;
1968             }
1969
1970           /* If that succeeded, we know we'll be keeping all the
1971              relocs.  */
1972           if (h->dynindx != -1)
1973             goto keep;
1974         }
1975
1976       eh->dyn_relocs = NULL;
1977
1978     keep: ;
1979     }
1980
1981   /* Finally, allocate space.  */
1982   for (p = eh->dyn_relocs; p != NULL; p = p->next)
1983     {
1984       asection *sreloc = elf_section_data (p->sec)->sreloc;
1985       sreloc->size += p->count * sizeof (Elf64_External_Rela);
1986     }
1987
1988   return TRUE;
1989 }
1990
1991 /* Find any dynamic relocs that apply to read-only sections.  */
1992
1993 static bfd_boolean
1994 readonly_dynrelocs (struct elf_link_hash_entry *h, void * inf)
1995 {
1996   struct elf_s390_link_hash_entry *eh;
1997   struct elf_dyn_relocs *p;
1998
1999   eh = (struct elf_s390_link_hash_entry *) h;
2000   for (p = eh->dyn_relocs; p != NULL; p = p->next)
2001     {
2002       asection *s = p->sec->output_section;
2003
2004       if (s != NULL && (s->flags & SEC_READONLY) != 0)
2005         {
2006           struct bfd_link_info *info = (struct bfd_link_info *) inf;
2007
2008           info->flags |= DF_TEXTREL;
2009
2010           /* Not an error, just cut short the traversal.  */
2011           return FALSE;
2012         }
2013     }
2014   return TRUE;
2015 }
2016
2017 /* Set the sizes of the dynamic sections.  */
2018
2019 static bfd_boolean
2020 elf_s390_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2021                                 struct bfd_link_info *info)
2022 {
2023   struct elf_s390_link_hash_table *htab;
2024   bfd *dynobj;
2025   asection *s;
2026   bfd_boolean relocs;
2027   bfd *ibfd;
2028
2029   htab = elf_s390_hash_table (info);
2030   if (htab == NULL)
2031     return FALSE;
2032
2033   dynobj = htab->elf.dynobj;
2034   if (dynobj == NULL)
2035     abort ();
2036
2037   if (htab->elf.dynamic_sections_created)
2038     {
2039       /* Set the contents of the .interp section to the interpreter.  */
2040       if (bfd_link_executable (info) && !info->nointerp)
2041         {
2042           s = bfd_get_linker_section (dynobj, ".interp");
2043           if (s == NULL)
2044             abort ();
2045           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
2046           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2047         }
2048     }
2049
2050   /* Set up .got offsets for local syms, and space for local dynamic
2051      relocs.  */
2052   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
2053     {
2054       bfd_signed_vma *local_got;
2055       bfd_signed_vma *end_local_got;
2056       char *local_tls_type;
2057       bfd_size_type locsymcount;
2058       Elf_Internal_Shdr *symtab_hdr;
2059       asection *srela;
2060       struct plt_entry *local_plt;
2061       unsigned int i;
2062
2063       if (! is_s390_elf (ibfd))
2064         continue;
2065
2066       for (s = ibfd->sections; s != NULL; s = s->next)
2067         {
2068           struct elf_dyn_relocs *p;
2069
2070           for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
2071             {
2072               if (!bfd_is_abs_section (p->sec)
2073                   && bfd_is_abs_section (p->sec->output_section))
2074                 {
2075                   /* Input section has been discarded, either because
2076                      it is a copy of a linkonce section or due to
2077                      linker script /DISCARD/, so we'll be discarding
2078                      the relocs too.  */
2079                 }
2080               else if (p->count != 0)
2081                 {
2082                   srela = elf_section_data (p->sec)->sreloc;
2083                   srela->size += p->count * sizeof (Elf64_External_Rela);
2084                   if ((p->sec->output_section->flags & SEC_READONLY) != 0)
2085                     info->flags |= DF_TEXTREL;
2086                 }
2087             }
2088         }
2089
2090       local_got = elf_local_got_refcounts (ibfd);
2091       if (!local_got)
2092         continue;
2093
2094       symtab_hdr = &elf_symtab_hdr (ibfd);
2095       locsymcount = symtab_hdr->sh_info;
2096       end_local_got = local_got + locsymcount;
2097       local_tls_type = elf_s390_local_got_tls_type (ibfd);
2098       s = htab->elf.sgot;
2099       srela = htab->elf.srelgot;
2100       for (; local_got < end_local_got; ++local_got, ++local_tls_type)
2101         {
2102           if (*local_got > 0)
2103             {
2104               *local_got = s->size;
2105               s->size += GOT_ENTRY_SIZE;
2106               if (*local_tls_type == GOT_TLS_GD)
2107                 s->size += GOT_ENTRY_SIZE;
2108               if (bfd_link_pic (info))
2109                 srela->size += sizeof (Elf64_External_Rela);
2110             }
2111           else
2112             *local_got = (bfd_vma) -1;
2113         }
2114
2115       local_plt = elf_s390_local_plt (ibfd);
2116       for (i = 0; i < symtab_hdr->sh_info; i++)
2117         {
2118           if (local_plt[i].plt.refcount > 0)
2119             {
2120               local_plt[i].plt.offset = htab->elf.iplt->size;
2121               htab->elf.iplt->size += PLT_ENTRY_SIZE;
2122               htab->elf.igotplt->size += GOT_ENTRY_SIZE;
2123               htab->elf.irelplt->size += sizeof (Elf64_External_Rela);
2124             }
2125           else
2126             local_plt[i].plt.offset = (bfd_vma) -1;
2127         }
2128     }
2129
2130   if (htab->tls_ldm_got.refcount > 0)
2131     {
2132       /* Allocate 2 got entries and 1 dynamic reloc for R_390_TLS_LDM64
2133          relocs.  */
2134       htab->tls_ldm_got.offset = htab->elf.sgot->size;
2135       htab->elf.sgot->size += 2 * GOT_ENTRY_SIZE;
2136       htab->elf.srelgot->size += sizeof (Elf64_External_Rela);
2137     }
2138   else
2139     htab->tls_ldm_got.offset = -1;
2140
2141   /* Allocate global sym .plt and .got entries, and space for global
2142      sym dynamic relocs.  */
2143   elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
2144
2145   /* We now have determined the sizes of the various dynamic sections.
2146      Allocate memory for them.  */
2147   relocs = FALSE;
2148   for (s = dynobj->sections; s != NULL; s = s->next)
2149     {
2150       if ((s->flags & SEC_LINKER_CREATED) == 0)
2151         continue;
2152
2153       if (s == htab->elf.splt
2154           || s == htab->elf.sgot
2155           || s == htab->elf.sgotplt
2156           || s == htab->sdynbss
2157           || s == htab->elf.iplt
2158           || s == htab->elf.igotplt
2159           || s == htab->irelifunc)
2160         {
2161           /* Strip this section if we don't need it; see the
2162              comment below.  */
2163         }
2164       else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
2165         {
2166           if (s->size != 0 && s != htab->elf.srelplt)
2167             relocs = TRUE;
2168
2169           /* We use the reloc_count field as a counter if we need
2170              to copy relocs into the output file.  */
2171           s->reloc_count = 0;
2172         }
2173       else
2174         {
2175           /* It's not one of our sections, so don't allocate space.  */
2176           continue;
2177         }
2178
2179       if (s->size == 0)
2180         {
2181           /* If we don't need this section, strip it from the
2182              output file.  This is to handle .rela.bss and
2183              .rela.plt.  We must create it in
2184              create_dynamic_sections, because it must be created
2185              before the linker maps input sections to output
2186              sections.  The linker does that before
2187              adjust_dynamic_symbol is called, and it is that
2188              function which decides whether anything needs to go
2189              into these sections.  */
2190
2191           s->flags |= SEC_EXCLUDE;
2192           continue;
2193         }
2194
2195       if ((s->flags & SEC_HAS_CONTENTS) == 0)
2196         continue;
2197
2198       /* Allocate memory for the section contents.  We use bfd_zalloc
2199          here in case unused entries are not reclaimed before the
2200          section's contents are written out.  This should not happen,
2201          but this way if it does, we get a R_390_NONE reloc instead
2202          of garbage.  */
2203       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
2204       if (s->contents == NULL)
2205         return FALSE;
2206     }
2207
2208   if (htab->elf.dynamic_sections_created)
2209     {
2210       /* Add some entries to the .dynamic section.  We fill in the
2211          values later, in elf_s390_finish_dynamic_sections, but we
2212          must add the entries now so that we get the correct size for
2213          the .dynamic section.  The DT_DEBUG entry is filled in by the
2214          dynamic linker and used by the debugger.  */
2215 #define add_dynamic_entry(TAG, VAL) \
2216   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2217
2218       if (bfd_link_executable (info))
2219         {
2220           if (!add_dynamic_entry (DT_DEBUG, 0))
2221             return FALSE;
2222         }
2223
2224       if (htab->elf.splt->size != 0)
2225         {
2226           if (!add_dynamic_entry (DT_PLTGOT, 0)
2227               || !add_dynamic_entry (DT_PLTRELSZ, 0)
2228               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
2229               || !add_dynamic_entry (DT_JMPREL, 0))
2230             return FALSE;
2231         }
2232
2233       if (relocs)
2234         {
2235           if (!add_dynamic_entry (DT_RELA, 0)
2236               || !add_dynamic_entry (DT_RELASZ, 0)
2237               || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
2238             return FALSE;
2239
2240           /* If any dynamic relocs apply to a read-only section,
2241              then we need a DT_TEXTREL entry.  */
2242           if ((info->flags & DF_TEXTREL) == 0)
2243             elf_link_hash_traverse (&htab->elf, readonly_dynrelocs,
2244                                     info);
2245
2246           if ((info->flags & DF_TEXTREL) != 0)
2247             {
2248               if (!add_dynamic_entry (DT_TEXTREL, 0))
2249                 return FALSE;
2250             }
2251         }
2252     }
2253 #undef add_dynamic_entry
2254
2255   return TRUE;
2256 }
2257
2258 /* Return the base VMA address which should be subtracted from real addresses
2259    when resolving @dtpoff relocation.
2260    This is PT_TLS segment p_vaddr.  */
2261
2262 static bfd_vma
2263 dtpoff_base (struct bfd_link_info *info)
2264 {
2265   /* If tls_sec is NULL, we should have signalled an error already.  */
2266   if (elf_hash_table (info)->tls_sec == NULL)
2267     return 0;
2268   return elf_hash_table (info)->tls_sec->vma;
2269 }
2270
2271 /* Return the relocation value for @tpoff relocation
2272    if STT_TLS virtual address is ADDRESS.  */
2273
2274 static bfd_vma
2275 tpoff (struct bfd_link_info *info, bfd_vma address)
2276 {
2277   struct elf_link_hash_table *htab = elf_hash_table (info);
2278
2279   /* If tls_sec is NULL, we should have signalled an error already.  */
2280   if (htab->tls_sec == NULL)
2281     return 0;
2282   return htab->tls_size + htab->tls_sec->vma - address;
2283 }
2284
2285 /* Complain if TLS instruction relocation is against an invalid
2286    instruction.  */
2287
2288 static void
2289 invalid_tls_insn (bfd *input_bfd,
2290                   asection *input_section,
2291                   Elf_Internal_Rela *rel)
2292 {
2293   reloc_howto_type *howto;
2294
2295   howto = elf_howto_table + ELF64_R_TYPE (rel->r_info);
2296   (*_bfd_error_handler)
2297     (_("%B(%A+0x%lx): invalid instruction for TLS relocation %s"),
2298      input_bfd,
2299      input_section,
2300      (long) rel->r_offset,
2301      howto->name);
2302   bfd_set_error (bfd_error_bad_value);
2303 }
2304
2305 /* Relocate a 390 ELF section.  */
2306
2307 static bfd_boolean
2308 elf_s390_relocate_section (bfd *output_bfd,
2309                            struct bfd_link_info *info,
2310                            bfd *input_bfd,
2311                            asection *input_section,
2312                            bfd_byte *contents,
2313                            Elf_Internal_Rela *relocs,
2314                            Elf_Internal_Sym *local_syms,
2315                            asection **local_sections)
2316 {
2317   struct elf_s390_link_hash_table *htab;
2318   Elf_Internal_Shdr *symtab_hdr;
2319   struct elf_link_hash_entry **sym_hashes;
2320   bfd_vma *local_got_offsets;
2321   Elf_Internal_Rela *rel;
2322   Elf_Internal_Rela *relend;
2323
2324   BFD_ASSERT (is_s390_elf (input_bfd));
2325
2326   htab = elf_s390_hash_table (info);
2327   if (htab == NULL)
2328     return FALSE;
2329
2330   symtab_hdr = &elf_symtab_hdr (input_bfd);
2331   sym_hashes = elf_sym_hashes (input_bfd);
2332   local_got_offsets = elf_local_got_offsets (input_bfd);
2333
2334   rel = relocs;
2335   relend = relocs + input_section->reloc_count;
2336   for (; rel < relend; rel++)
2337     {
2338       unsigned int r_type;
2339       reloc_howto_type *howto;
2340       unsigned long r_symndx;
2341       struct elf_link_hash_entry *h;
2342       Elf_Internal_Sym *sym;
2343       asection *sec;
2344       bfd_vma off;
2345       bfd_vma relocation;
2346       bfd_boolean unresolved_reloc;
2347       bfd_reloc_status_type r;
2348       int tls_type;
2349       asection *base_got = htab->elf.sgot;
2350
2351       r_type = ELF64_R_TYPE (rel->r_info);
2352       if (r_type == (int) R_390_GNU_VTINHERIT
2353           || r_type == (int) R_390_GNU_VTENTRY)
2354         continue;
2355       if (r_type >= (int) R_390_max)
2356         {
2357           bfd_set_error (bfd_error_bad_value);
2358           return FALSE;
2359         }
2360
2361       howto = elf_howto_table + r_type;
2362       r_symndx = ELF64_R_SYM (rel->r_info);
2363
2364       h = NULL;
2365       sym = NULL;
2366       sec = NULL;
2367       unresolved_reloc = FALSE;
2368       if (r_symndx < symtab_hdr->sh_info)
2369         {
2370           sym = local_syms + r_symndx;
2371           sec = local_sections[r_symndx];
2372
2373           if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
2374             {
2375               struct plt_entry *local_plt = elf_s390_local_plt (input_bfd);
2376               if (local_plt == NULL)
2377                 return FALSE;
2378
2379               /* Address of the PLT slot.  */
2380               relocation = (htab->elf.iplt->output_section->vma
2381                             + htab->elf.iplt->output_offset
2382                             + local_plt[r_symndx].plt.offset);
2383
2384               switch (r_type)
2385                 {
2386                 case R_390_PLTOFF16:
2387                 case R_390_PLTOFF32:
2388                 case R_390_PLTOFF64:
2389                   relocation -= htab->elf.sgot->output_section->vma;
2390                   break;
2391                 case R_390_GOTPLT12:
2392                 case R_390_GOTPLT16:
2393                 case R_390_GOTPLT20:
2394                 case R_390_GOTPLT32:
2395                 case R_390_GOTPLT64:
2396                 case R_390_GOTPLTENT:
2397                 case R_390_GOT12:
2398                 case R_390_GOT16:
2399                 case R_390_GOT20:
2400                 case R_390_GOT32:
2401                 case R_390_GOT64:
2402                 case R_390_GOTENT:
2403                   {
2404                     /* Write the PLT slot address into the GOT slot.  */
2405                     bfd_put_64 (output_bfd, relocation,
2406                                 htab->elf.sgot->contents +
2407                                 local_got_offsets[r_symndx]);
2408                     relocation = (local_got_offsets[r_symndx] +
2409                                   htab->elf.sgot->output_offset);
2410
2411                     if (r_type == R_390_GOTENT || r_type == R_390_GOTPLTENT)
2412                       relocation += htab->elf.sgot->output_section->vma;
2413                     break;
2414                   }
2415                 default:
2416                   break;
2417                 }
2418               /* The output section is needed later in
2419                  finish_dynamic_section when creating the dynamic
2420                  relocation.  */
2421               local_plt[r_symndx].sec = sec;
2422               goto do_relocation;
2423             }
2424           else
2425             relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
2426         }
2427       else
2428         {
2429           bfd_boolean warned ATTRIBUTE_UNUSED;
2430           bfd_boolean ignored ATTRIBUTE_UNUSED;
2431
2432           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2433                                    r_symndx, symtab_hdr, sym_hashes,
2434                                    h, sec, relocation,
2435                                    unresolved_reloc, warned, ignored);
2436         }
2437
2438       if (sec != NULL && discarded_section (sec))
2439         RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
2440                                          rel, 1, relend, howto, 0, contents);
2441
2442       if (bfd_link_relocatable (info))
2443         continue;
2444
2445       switch (r_type)
2446         {
2447         case R_390_GOTPLT12:
2448         case R_390_GOTPLT16:
2449         case R_390_GOTPLT20:
2450         case R_390_GOTPLT32:
2451         case R_390_GOTPLT64:
2452         case R_390_GOTPLTENT:
2453           /* There are three cases for a GOTPLT relocation. 1) The
2454              relocation is against the jump slot entry of a plt that
2455              will get emitted to the output file. 2) The relocation
2456              is against the jump slot of a plt entry that has been
2457              removed. elf_s390_adjust_gotplt has created a GOT entry
2458              as replacement. 3) The relocation is against a local symbol.
2459              Cases 2) and 3) are the same as the GOT relocation code
2460              so we just have to test for case 1 and fall through for
2461              the other two.  */
2462           if (h != NULL && h->plt.offset != (bfd_vma) -1)
2463             {
2464               bfd_vma plt_index;
2465
2466               if (s390_is_ifunc_symbol_p (h))
2467                 {
2468                   plt_index = h->plt.offset / PLT_ENTRY_SIZE;
2469                   relocation = (plt_index * GOT_ENTRY_SIZE +
2470                                 htab->elf.igotplt->output_offset);
2471                   if (r_type == R_390_GOTPLTENT)
2472                     relocation += htab->elf.igotplt->output_section->vma;
2473                 }
2474               else
2475                 {
2476                   /* Calc. index no.
2477                      Current offset - size first entry / entry size.  */
2478                   plt_index = (h->plt.offset - PLT_FIRST_ENTRY_SIZE) /
2479                     PLT_ENTRY_SIZE;
2480
2481                   /* Offset in GOT is PLT index plus GOT headers(3)
2482                      times 4, addr & GOT addr.  */
2483                   relocation = (plt_index + 3) * GOT_ENTRY_SIZE;
2484                   if (r_type == R_390_GOTPLTENT)
2485                     relocation += htab->elf.sgot->output_section->vma;
2486                 }
2487               unresolved_reloc = FALSE;
2488               break;
2489             }
2490           /* Fall through.  */
2491
2492         case R_390_GOT12:
2493         case R_390_GOT16:
2494         case R_390_GOT20:
2495         case R_390_GOT32:
2496         case R_390_GOT64:
2497         case R_390_GOTENT:
2498           /* Relocation is to the entry for this symbol in the global
2499              offset table.  */
2500           if (base_got == NULL)
2501             abort ();
2502
2503           if (h != NULL)
2504             {
2505               bfd_boolean dyn;
2506
2507               off = h->got.offset;
2508               dyn = htab->elf.dynamic_sections_created;
2509
2510               if (s390_is_ifunc_symbol_p (h))
2511                 {
2512                   BFD_ASSERT (h->plt.offset != (bfd_vma) -1);
2513                   if (off == (bfd_vma)-1)
2514                     {
2515                       /* No explicit GOT usage so redirect to the
2516                          got.iplt slot.  */
2517                       base_got = htab->elf.igotplt;
2518                       off = h->plt.offset / PLT_ENTRY_SIZE * GOT_ENTRY_SIZE;
2519                     }
2520                   else
2521                     {
2522                       /* Explicit GOT slots must contain the address
2523                          of the PLT slot. This will be handled in
2524                          finish_dynamic_symbol.  */
2525                     }
2526                 }
2527               else if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
2528                                                           bfd_link_pic (info),
2529                                                           h)
2530                        || (bfd_link_pic (info)
2531                            && SYMBOL_REFERENCES_LOCAL (info, h))
2532                        || (ELF_ST_VISIBILITY (h->other)
2533                            && h->root.type == bfd_link_hash_undefweak))
2534                 {
2535                   /* This is actually a static link, or it is a
2536                      -Bsymbolic link and the symbol is defined
2537                      locally, or the symbol was forced to be local
2538                      because of a version file.  We must initialize
2539                      this entry in the global offset table.  Since the
2540                      offset must always be a multiple of 2, we use the
2541                      least significant bit to record whether we have
2542                      initialized it already.
2543
2544                      When doing a dynamic link, we create a .rel.got
2545                      relocation entry to initialize the value.  This
2546                      is done in the finish_dynamic_symbol routine.  */
2547                   if ((off & 1) != 0)
2548                     off &= ~1;
2549                   else
2550                     {
2551                       bfd_put_64 (output_bfd, relocation,
2552                                   base_got->contents + off);
2553                       h->got.offset |= 1;
2554                     }
2555
2556                   if ((h->def_regular
2557                        && bfd_link_pic (info)
2558                        && SYMBOL_REFERENCES_LOCAL (info, h))
2559                       /* lgrl rx,sym@GOTENT -> larl rx, sym */
2560                       && ((r_type == R_390_GOTENT
2561                            && (bfd_get_16 (input_bfd,
2562                                            contents + rel->r_offset - 2)
2563                                & 0xff0f) == 0xc408)
2564                           /* lg rx, sym@GOT(r12) -> larl rx, sym */
2565                           || (r_type == R_390_GOT20
2566                               && (bfd_get_32 (input_bfd,
2567                                               contents + rel->r_offset - 2)
2568                                   & 0xff00f000) == 0xe300c000
2569                               && bfd_get_8 (input_bfd,
2570                                             contents + rel->r_offset + 3) == 0x04)))
2571
2572                     {
2573                       unsigned short new_insn =
2574                         (0xc000 | (bfd_get_8 (input_bfd,
2575                                               contents + rel->r_offset - 1) & 0xf0));
2576                       bfd_put_16 (output_bfd, new_insn,
2577                                   contents + rel->r_offset - 2);
2578                       r_type = R_390_PC32DBL;
2579                       rel->r_addend = 2;
2580                       howto = elf_howto_table + r_type;
2581                       relocation = h->root.u.def.value
2582                         + h->root.u.def.section->output_section->vma
2583                         + h->root.u.def.section->output_offset;
2584                       goto do_relocation;
2585                     }
2586                 }
2587               else
2588                 unresolved_reloc = FALSE;
2589             }
2590           else
2591             {
2592               if (local_got_offsets == NULL)
2593                 abort ();
2594
2595               off = local_got_offsets[r_symndx];
2596
2597               /* The offset must always be a multiple of 8.  We use
2598                  the least significant bit to record whether we have
2599                  already generated the necessary reloc.  */
2600               if ((off & 1) != 0)
2601                 off &= ~1;
2602               else
2603                 {
2604                   bfd_put_64 (output_bfd, relocation,
2605                               htab->elf.sgot->contents + off);
2606
2607                   if (bfd_link_pic (info))
2608                     {
2609                       asection *s;
2610                       Elf_Internal_Rela outrel;
2611                       bfd_byte *loc;
2612
2613                       s = htab->elf.srelgot;
2614                       if (s == NULL)
2615                         abort ();
2616
2617                       outrel.r_offset = (htab->elf.sgot->output_section->vma
2618                                          + htab->elf.sgot->output_offset
2619                                          + off);
2620                       outrel.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
2621                       outrel.r_addend = relocation;
2622                       loc = s->contents;
2623                       loc += s->reloc_count++ * sizeof (Elf64_External_Rela);
2624                       bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2625                     }
2626
2627                   local_got_offsets[r_symndx] |= 1;
2628                 }
2629             }
2630
2631           if (off >= (bfd_vma) -2)
2632             abort ();
2633
2634           relocation = base_got->output_offset + off;
2635
2636           /* For @GOTENT the relocation is against the offset between
2637              the instruction and the symbols entry in the GOT and not
2638              between the start of the GOT and the symbols entry. We
2639              add the vma of the GOT to get the correct value.  */
2640           if (   r_type == R_390_GOTENT
2641               || r_type == R_390_GOTPLTENT)
2642             relocation += base_got->output_section->vma;
2643
2644           break;
2645
2646         case R_390_GOTOFF16:
2647         case R_390_GOTOFF32:
2648         case R_390_GOTOFF64:
2649           /* Relocation is relative to the start of the global offset
2650              table.  */
2651
2652           if (h != NULL
2653               && s390_is_ifunc_symbol_p (h)
2654               && h->def_regular
2655               && !bfd_link_executable (info))
2656             {
2657               relocation = (htab->elf.iplt->output_section->vma
2658                             + htab->elf.iplt->output_offset
2659                             + h->plt.offset
2660                             - htab->elf.sgot->output_section->vma);
2661               goto do_relocation;
2662             }
2663
2664           /* Note that sgot->output_offset is not involved in this
2665              calculation.  We always want the start of .got.  If we
2666              defined _GLOBAL_OFFSET_TABLE in a different way, as is
2667              permitted by the ABI, we might have to change this
2668              calculation.  */
2669           relocation -= htab->elf.sgot->output_section->vma;
2670           break;
2671
2672         case R_390_GOTPC:
2673         case R_390_GOTPCDBL:
2674           /* Use global offset table as symbol value.  */
2675           relocation = htab->elf.sgot->output_section->vma;
2676           unresolved_reloc = FALSE;
2677           break;
2678
2679         case R_390_PLT12DBL:
2680         case R_390_PLT16DBL:
2681         case R_390_PLT24DBL:
2682         case R_390_PLT32:
2683         case R_390_PLT32DBL:
2684         case R_390_PLT64:
2685           /* Relocation is to the entry for this symbol in the
2686              procedure linkage table.  */
2687
2688           /* Resolve a PLT32 reloc against a local symbol directly,
2689              without using the procedure linkage table.  */
2690           if (h == NULL)
2691             break;
2692
2693           if (h->plt.offset == (bfd_vma) -1
2694               || (htab->elf.splt == NULL && !s390_is_ifunc_symbol_p (h)))
2695             {
2696               /* We didn't make a PLT entry for this symbol.  This
2697                  happens when statically linking PIC code, or when
2698                  using -Bsymbolic.  */
2699               break;
2700             }
2701           if (s390_is_ifunc_symbol_p (h))
2702             relocation = (htab->elf.iplt->output_section->vma
2703                           + htab->elf.iplt->output_offset
2704                           + h->plt.offset);
2705           else
2706             relocation = (htab->elf.splt->output_section->vma
2707                           + htab->elf.splt->output_offset
2708                           + h->plt.offset);
2709           unresolved_reloc = FALSE;
2710           break;
2711
2712         case R_390_PLTOFF16:
2713         case R_390_PLTOFF32:
2714         case R_390_PLTOFF64:
2715           /* Relocation is to the entry for this symbol in the
2716              procedure linkage table relative to the start of the GOT.  */
2717
2718           /* For local symbols or if we didn't make a PLT entry for
2719              this symbol resolve the symbol directly.  */
2720           if (h == NULL
2721               || h->plt.offset == (bfd_vma) -1
2722               || (htab->elf.splt == NULL && !s390_is_ifunc_symbol_p (h)))
2723             {
2724               relocation -= htab->elf.sgot->output_section->vma;
2725               break;
2726             }
2727
2728           if (s390_is_ifunc_symbol_p (h))
2729             relocation = (htab->elf.iplt->output_section->vma
2730                           + htab->elf.iplt->output_offset
2731                           + h->plt.offset
2732                           - htab->elf.sgot->output_section->vma);
2733           else
2734             relocation = (htab->elf.splt->output_section->vma
2735                           + htab->elf.splt->output_offset
2736                           + h->plt.offset
2737                           - htab->elf.sgot->output_section->vma);
2738           unresolved_reloc = FALSE;
2739           break;
2740
2741         case R_390_PC16:
2742         case R_390_PC12DBL:
2743         case R_390_PC16DBL:
2744         case R_390_PC24DBL:
2745         case R_390_PC32:
2746         case R_390_PC32DBL:
2747         case R_390_PC64:
2748           /* The target of these relocs are instruction operands
2749              residing in read-only sections.  We cannot emit a runtime
2750              reloc for it.  */
2751           if (h != NULL
2752               && s390_is_ifunc_symbol_p (h)
2753               && h->def_regular
2754               && bfd_link_pic (info))
2755             {
2756               relocation = (htab->elf.iplt->output_section->vma
2757                             + htab->elf.iplt->output_offset
2758                             + h->plt.offset);
2759               goto do_relocation;
2760             }
2761
2762         case R_390_8:
2763         case R_390_16:
2764         case R_390_32:
2765         case R_390_64:
2766
2767           if (h != NULL
2768               && s390_is_ifunc_symbol_p (h)
2769               && h->def_regular)
2770             {
2771               if (!bfd_link_pic (info) || !h->non_got_ref)
2772                 {
2773                   /* For a non-shared object STT_GNU_IFUNC symbol must
2774                      go through PLT.  */
2775                   relocation = (htab->elf.iplt->output_section->vma
2776                                 + htab->elf.iplt->output_offset
2777                                 + h ->plt.offset);
2778                   goto do_relocation;
2779                 }
2780               else
2781                 {
2782                   /* For shared objects a runtime relocation is needed.  */
2783
2784                   Elf_Internal_Rela outrel;
2785                   asection *sreloc;
2786
2787                   /* Need a dynamic relocation to get the real function
2788                      address.  */
2789                   outrel.r_offset = _bfd_elf_section_offset (output_bfd,
2790                                                              info,
2791                                                              input_section,
2792                                                              rel->r_offset);
2793                   if (outrel.r_offset == (bfd_vma) -1
2794                       || outrel.r_offset == (bfd_vma) -2)
2795                     abort ();
2796
2797                   outrel.r_offset += (input_section->output_section->vma
2798                                       + input_section->output_offset);
2799
2800                   if (h->dynindx == -1
2801                       || h->forced_local
2802                       || bfd_link_executable (info))
2803                     {
2804                       /* This symbol is resolved locally.  */
2805                       outrel.r_info = ELF64_R_INFO (0, R_390_IRELATIVE);
2806                       outrel.r_addend = (h->root.u.def.value
2807                                          + h->root.u.def.section->output_section->vma
2808                                          + h->root.u.def.section->output_offset);
2809                     }
2810                   else
2811                     {
2812                       outrel.r_info = ELF64_R_INFO (h->dynindx, r_type);
2813                       outrel.r_addend = 0;
2814                     }
2815
2816                   sreloc = htab->elf.irelifunc;
2817                   elf_append_rela (output_bfd, sreloc, &outrel);
2818
2819                   /* If this reloc is against an external symbol, we
2820                      do not want to fiddle with the addend.  Otherwise,
2821                      we need to include the symbol value so that it
2822                      becomes an addend for the dynamic reloc.  For an
2823                      internal symbol, we have updated addend.  */
2824                   continue;
2825                 }
2826             }
2827
2828           if ((input_section->flags & SEC_ALLOC) == 0)
2829             break;
2830
2831           if ((bfd_link_pic (info)
2832                && (h == NULL
2833                    || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2834                    || h->root.type != bfd_link_hash_undefweak)
2835                && ((r_type != R_390_PC16
2836                     && r_type != R_390_PC12DBL
2837                     && r_type != R_390_PC16DBL
2838                     && r_type != R_390_PC24DBL
2839                     && r_type != R_390_PC32
2840                     && r_type != R_390_PC32DBL
2841                     && r_type != R_390_PC64)
2842                    || !SYMBOL_CALLS_LOCAL (info, h)))
2843               || (ELIMINATE_COPY_RELOCS
2844                   && !bfd_link_pic (info)
2845                   && h != NULL
2846                   && h->dynindx != -1
2847                   && !h->non_got_ref
2848                   && ((h->def_dynamic
2849                        && !h->def_regular)
2850                       || h->root.type == bfd_link_hash_undefweak
2851                       || h->root.type == bfd_link_hash_undefined)))
2852             {
2853               Elf_Internal_Rela outrel;
2854               bfd_boolean skip, relocate;
2855               asection *sreloc;
2856               bfd_byte *loc;
2857
2858               /* When generating a shared object, these relocations
2859                  are copied into the output file to be resolved at run
2860                  time.  */
2861               skip = FALSE;
2862               relocate = FALSE;
2863
2864               outrel.r_offset =
2865                 _bfd_elf_section_offset (output_bfd, info, input_section,
2866                                          rel->r_offset);
2867               if (outrel.r_offset == (bfd_vma) -1)
2868                 skip = TRUE;
2869               else if (outrel.r_offset == (bfd_vma) -2)
2870                 skip = TRUE, relocate = TRUE;
2871
2872               outrel.r_offset += (input_section->output_section->vma
2873                                   + input_section->output_offset);
2874
2875               if (skip)
2876                 memset (&outrel, 0, sizeof outrel);
2877               else if (h != NULL
2878                        && h->dynindx != -1
2879                        && (r_type == R_390_PC16
2880                            || r_type == R_390_PC12DBL
2881                            || r_type == R_390_PC16DBL
2882                            || r_type == R_390_PC24DBL
2883                            || r_type == R_390_PC32
2884                            || r_type == R_390_PC32DBL
2885                            || r_type == R_390_PC64
2886                            || !bfd_link_pic (info)
2887                            || !SYMBOLIC_BIND (info, h)
2888                            || !h->def_regular))
2889                 {
2890                   outrel.r_info = ELF64_R_INFO (h->dynindx, r_type);
2891                   outrel.r_addend = rel->r_addend;
2892                 }
2893               else
2894                 {
2895                   /* This symbol is local, or marked to become local.  */
2896                   outrel.r_addend = relocation + rel->r_addend;
2897                   if (r_type == R_390_64)
2898                     {
2899                       relocate = TRUE;
2900                       outrel.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
2901                     }
2902                   else
2903                     {
2904                       long sindx;
2905
2906                       if (bfd_is_abs_section (sec))
2907                         sindx = 0;
2908                       else if (sec == NULL || sec->owner == NULL)
2909                         {
2910                           bfd_set_error(bfd_error_bad_value);
2911                           return FALSE;
2912                         }
2913                       else
2914                         {
2915                           asection *osec;
2916
2917                           osec = sec->output_section;
2918                           sindx = elf_section_data (osec)->dynindx;
2919
2920                           if (sindx == 0)
2921                             {
2922                               osec = htab->elf.text_index_section;
2923                               sindx = elf_section_data (osec)->dynindx;
2924                             }
2925                           BFD_ASSERT (sindx != 0);
2926
2927                           /* We are turning this relocation into one
2928                              against a section symbol, so subtract out
2929                              the output section's address but not the
2930                              offset of the input section in the output
2931                              section.  */
2932                           outrel.r_addend -= osec->vma;
2933                         }
2934                       outrel.r_info = ELF64_R_INFO (sindx, r_type);
2935                     }
2936                 }
2937
2938               sreloc = elf_section_data (input_section)->sreloc;
2939               if (sreloc == NULL)
2940                 abort ();
2941
2942               loc = sreloc->contents;
2943               loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
2944               bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2945
2946               /* If this reloc is against an external symbol, we do
2947                  not want to fiddle with the addend.  Otherwise, we
2948                  need to include the symbol value so that it becomes
2949                  an addend for the dynamic reloc.  */
2950               if (! relocate)
2951                 continue;
2952             }
2953
2954           break;
2955
2956           /* Relocations for tls literal pool entries.  */
2957         case R_390_TLS_IE64:
2958           if (bfd_link_pic (info))
2959             {
2960               Elf_Internal_Rela outrel;
2961               asection *sreloc;
2962               bfd_byte *loc;
2963
2964               outrel.r_offset = rel->r_offset
2965                                 + input_section->output_section->vma
2966                                 + input_section->output_offset;
2967               outrel.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
2968               sreloc = elf_section_data (input_section)->sreloc;
2969               if (sreloc == NULL)
2970                 abort ();
2971               loc = sreloc->contents;
2972               loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
2973               bfd_elf64_swap_reloc_out (output_bfd, &outrel, loc);
2974             }
2975           /* Fall through.  */
2976
2977         case R_390_TLS_GD64:
2978         case R_390_TLS_GOTIE64:
2979           r_type = elf_s390_tls_transition (info, r_type, h == NULL);
2980           tls_type = GOT_UNKNOWN;
2981           if (h == NULL && local_got_offsets)
2982             tls_type = elf_s390_local_got_tls_type (input_bfd) [r_symndx];
2983           else if (h != NULL)
2984             {
2985               tls_type = elf_s390_hash_entry(h)->tls_type;
2986               if (!bfd_link_pic (info) && h->dynindx == -1 && tls_type >= GOT_TLS_IE)
2987                 r_type = R_390_TLS_LE64;
2988             }
2989           if (r_type == R_390_TLS_GD64 && tls_type >= GOT_TLS_IE)
2990             r_type = R_390_TLS_IE64;
2991
2992           if (r_type == R_390_TLS_LE64)
2993             {
2994               /* This relocation gets optimized away by the local exec
2995                  access optimization.  */
2996               BFD_ASSERT (! unresolved_reloc);
2997               bfd_put_64 (output_bfd, -tpoff (info, relocation),
2998                           contents + rel->r_offset);
2999               continue;
3000             }
3001
3002           if (htab->elf.sgot == NULL)
3003             abort ();
3004
3005           if (h != NULL)
3006             off = h->got.offset;
3007           else
3008             {
3009               if (local_got_offsets == NULL)
3010                 abort ();
3011
3012               off = local_got_offsets[r_symndx];
3013             }
3014
3015         emit_tls_relocs:
3016
3017           if ((off & 1) != 0)
3018             off &= ~1;
3019           else
3020             {
3021               Elf_Internal_Rela outrel;
3022               bfd_byte *loc;
3023               int dr_type, indx;
3024
3025               if (htab->elf.srelgot == NULL)
3026                 abort ();
3027
3028               outrel.r_offset = (htab->elf.sgot->output_section->vma
3029                                  + htab->elf.sgot->output_offset + off);
3030
3031               indx = h && h->dynindx != -1 ? h->dynindx : 0;
3032               if (r_type == R_390_TLS_GD64)
3033                 dr_type = R_390_TLS_DTPMOD;
3034               else
3035                 dr_type = R_390_TLS_TPOFF;
3036               if (dr_type == R_390_TLS_TPOFF && indx == 0)
3037                 outrel.r_addend = relocation - dtpoff_base (info);
3038               else
3039                 outrel.r_addend = 0;
3040               outrel.r_info = ELF64_R_INFO (indx, dr_type);
3041               loc = htab->elf.srelgot->contents;
3042               loc += htab->elf.srelgot->reloc_count++
3043                 * sizeof (Elf64_External_Rela);
3044               bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
3045
3046               if (r_type == R_390_TLS_GD64)
3047                 {
3048                   if (indx == 0)
3049                     {
3050                       BFD_ASSERT (! unresolved_reloc);
3051                       bfd_put_64 (output_bfd,
3052                                   relocation - dtpoff_base (info),
3053                                   htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
3054                     }
3055                   else
3056                     {
3057                       outrel.r_info = ELF64_R_INFO (indx, R_390_TLS_DTPOFF);
3058                       outrel.r_offset += GOT_ENTRY_SIZE;
3059                       outrel.r_addend = 0;
3060                       htab->elf.srelgot->reloc_count++;
3061                       loc += sizeof (Elf64_External_Rela);
3062                       bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
3063                     }
3064                 }
3065
3066               if (h != NULL)
3067                 h->got.offset |= 1;
3068               else
3069                 local_got_offsets[r_symndx] |= 1;
3070             }
3071
3072           if (off >= (bfd_vma) -2)
3073             abort ();
3074           if (r_type == ELF64_R_TYPE (rel->r_info))
3075             {
3076               relocation = htab->elf.sgot->output_offset + off;
3077               if (r_type == R_390_TLS_IE64 || r_type == R_390_TLS_IEENT)
3078                 relocation += htab->elf.sgot->output_section->vma;
3079               unresolved_reloc = FALSE;
3080             }
3081           else
3082             {
3083               bfd_put_64 (output_bfd, htab->elf.sgot->output_offset + off,
3084                           contents + rel->r_offset);
3085               continue;
3086             }
3087           break;
3088
3089         case R_390_TLS_GOTIE12:
3090         case R_390_TLS_GOTIE20:
3091         case R_390_TLS_IEENT:
3092           if (h == NULL)
3093             {
3094               if (local_got_offsets == NULL)
3095                 abort();
3096               off = local_got_offsets[r_symndx];
3097               if (bfd_link_pic (info))
3098                 goto emit_tls_relocs;
3099             }
3100           else
3101             {
3102               off = h->got.offset;
3103               tls_type = elf_s390_hash_entry(h)->tls_type;
3104               if (bfd_link_pic (info) || h->dynindx != -1 || tls_type < GOT_TLS_IE)
3105                 goto emit_tls_relocs;
3106             }
3107
3108           if (htab->elf.sgot == NULL)
3109             abort ();
3110
3111           BFD_ASSERT (! unresolved_reloc);
3112           bfd_put_64 (output_bfd, -tpoff (info, relocation),
3113                       htab->elf.sgot->contents + off);
3114           relocation = htab->elf.sgot->output_offset + off;
3115           if (r_type == R_390_TLS_IEENT)
3116             relocation += htab->elf.sgot->output_section->vma;
3117           unresolved_reloc = FALSE;
3118           break;
3119
3120         case R_390_TLS_LDM64:
3121           if (! bfd_link_pic (info))
3122             /* The literal pool entry this relocation refers to gets ignored
3123                by the optimized code of the local exec model. Do nothing
3124                and the value will turn out zero.  */
3125             continue;
3126
3127           if (htab->elf.sgot == NULL)
3128             abort ();
3129
3130           off = htab->tls_ldm_got.offset;
3131           if (off & 1)
3132             off &= ~1;
3133           else
3134             {
3135               Elf_Internal_Rela outrel;
3136               bfd_byte *loc;
3137
3138               if (htab->elf.srelgot == NULL)
3139                 abort ();
3140
3141               outrel.r_offset = (htab->elf.sgot->output_section->vma
3142                                  + htab->elf.sgot->output_offset + off);
3143
3144               bfd_put_64 (output_bfd, 0,
3145                           htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
3146               outrel.r_info = ELF64_R_INFO (0, R_390_TLS_DTPMOD);
3147               outrel.r_addend = 0;
3148               loc = htab->elf.srelgot->contents;
3149               loc += htab->elf.srelgot->reloc_count++
3150                 * sizeof (Elf64_External_Rela);
3151               bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
3152               htab->tls_ldm_got.offset |= 1;
3153             }
3154           relocation = htab->elf.sgot->output_offset + off;
3155           unresolved_reloc = FALSE;
3156           break;
3157
3158         case R_390_TLS_LE64:
3159           if (bfd_link_dll (info))
3160             {
3161               /* Linking a shared library with non-fpic code requires
3162                  a R_390_TLS_TPOFF relocation.  */
3163               Elf_Internal_Rela outrel;
3164               asection *sreloc;
3165               bfd_byte *loc;
3166               int indx;
3167
3168               outrel.r_offset = rel->r_offset
3169                                 + input_section->output_section->vma
3170                                 + input_section->output_offset;
3171               if (h != NULL && h->dynindx != -1)
3172                 indx = h->dynindx;
3173               else
3174                 indx = 0;
3175               outrel.r_info = ELF64_R_INFO (indx, R_390_TLS_TPOFF);
3176               if (indx == 0)
3177                 outrel.r_addend = relocation - dtpoff_base (info);
3178               else
3179                 outrel.r_addend = 0;
3180               sreloc = elf_section_data (input_section)->sreloc;
3181               if (sreloc == NULL)
3182                 abort ();
3183               loc = sreloc->contents;
3184               loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
3185               bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
3186             }
3187           else
3188             {
3189               BFD_ASSERT (! unresolved_reloc);
3190               bfd_put_64 (output_bfd, -tpoff (info, relocation),
3191                           contents + rel->r_offset);
3192             }
3193           continue;
3194
3195         case R_390_TLS_LDO64:
3196           if (bfd_link_pic (info) || (input_section->flags & SEC_DEBUGGING))
3197             relocation -= dtpoff_base (info);
3198           else
3199             /* When converting LDO to LE, we must negate.  */
3200             relocation = -tpoff (info, relocation);
3201           break;
3202
3203           /* Relocations for tls instructions.  */
3204         case R_390_TLS_LOAD:
3205         case R_390_TLS_GDCALL:
3206         case R_390_TLS_LDCALL:
3207           tls_type = GOT_UNKNOWN;
3208           if (h == NULL && local_got_offsets)
3209             tls_type = elf_s390_local_got_tls_type (input_bfd) [r_symndx];
3210           else if (h != NULL)
3211             tls_type = elf_s390_hash_entry(h)->tls_type;
3212
3213           if (tls_type == GOT_TLS_GD)
3214             continue;
3215
3216           if (r_type == R_390_TLS_LOAD)
3217             {
3218               if (!bfd_link_pic (info) && (h == NULL || h->dynindx == -1))
3219                 {
3220                   /* IE->LE transition. Four valid cases:
3221                      lg %rx,(0,%ry)    -> sllg %rx,%ry,0
3222                      lg %rx,(%ry,0)    -> sllg %rx,%ry,0
3223                      lg %rx,(%ry,%r12) -> sllg %rx,%ry,0
3224                      lg %rx,(%r12,%ry) -> sllg %rx,%ry,0  */
3225                   unsigned int insn0, insn1, ry;
3226
3227                   insn0 = bfd_get_32 (input_bfd, contents + rel->r_offset);
3228                   insn1 = bfd_get_16 (input_bfd, contents + rel->r_offset + 4);
3229                   if (insn1 != 0x0004)
3230                     invalid_tls_insn (input_bfd, input_section, rel);
3231                   ry = 0;
3232                   if ((insn0 & 0xff00f000) == 0xe3000000)
3233                     /* lg %rx,0(%ry,0) -> sllg %rx,%ry,0  */
3234                     ry = (insn0 & 0x000f0000);
3235                   else if ((insn0 & 0xff0f0000) == 0xe3000000)
3236                     /* lg %rx,0(0,%ry) -> sllg %rx,%ry,0  */
3237                     ry = (insn0 & 0x0000f000) << 4;
3238                   else if ((insn0 & 0xff00f000) == 0xe300c000)
3239                     /* lg %rx,0(%ry,%r12) -> sllg %rx,%ry,0  */
3240                     ry = (insn0 & 0x000f0000);
3241                   else if ((insn0 & 0xff0f0000) == 0xe30c0000)
3242                     /* lg %rx,0(%r12,%ry) -> sllg %rx,%ry,0  */
3243                     ry = (insn0 & 0x0000f000) << 4;
3244                   else
3245                     invalid_tls_insn (input_bfd, input_section, rel);
3246                   insn0 = 0xeb000000 | (insn0 & 0x00f00000) | ry;
3247                   insn1 = 0x000d;
3248                   bfd_put_32 (output_bfd, insn0, contents + rel->r_offset);
3249                   bfd_put_16 (output_bfd, insn1, contents + rel->r_offset + 4);
3250                 }
3251             }
3252           else if (r_type == R_390_TLS_GDCALL)
3253             {
3254               unsigned int insn0, insn1;
3255
3256               insn0 = bfd_get_32 (input_bfd, contents + rel->r_offset);
3257               insn1 = bfd_get_16 (input_bfd, contents + rel->r_offset + 4);
3258               if ((insn0 & 0xffff0000) != 0xc0e50000)
3259                 invalid_tls_insn (input_bfd, input_section, rel);
3260               if (!bfd_link_pic (info) && (h == NULL || h->dynindx == -1))
3261                 {
3262                   /* GD->LE transition.
3263                      brasl %r14,__tls_get_addr@plt -> brcl 0,. */
3264                   insn0 = 0xc0040000;
3265                   insn1 = 0x0000;
3266                 }
3267               else
3268                 {
3269                   /* GD->IE transition.
3270                      brasl %r14,__tls_get_addr@plt -> lg %r2,0(%r2,%r12)  */
3271                   insn0 = 0xe322c000;
3272                   insn1 = 0x0004;
3273                 }
3274               bfd_put_32 (output_bfd, insn0, contents + rel->r_offset);
3275               bfd_put_16 (output_bfd, insn1, contents + rel->r_offset + 4);
3276             }
3277           else if (r_type == R_390_TLS_LDCALL)
3278             {
3279               if (!bfd_link_pic (info))
3280                 {
3281                   unsigned int insn0, insn1;
3282
3283                   insn0 = bfd_get_32 (input_bfd, contents + rel->r_offset);
3284                   insn1 = bfd_get_16 (input_bfd, contents + rel->r_offset + 4);
3285                   if ((insn0 & 0xffff0000) != 0xc0e50000)
3286                     invalid_tls_insn (input_bfd, input_section, rel);
3287                   /* LD->LE transition.
3288                      brasl %r14,__tls_get_addr@plt -> brcl 0,. */
3289                   insn0 = 0xc0040000;
3290                   insn1 = 0x0000;
3291                   bfd_put_32 (output_bfd, insn0, contents + rel->r_offset);
3292                   bfd_put_16 (output_bfd, insn1, contents + rel->r_offset + 4);
3293                 }
3294             }
3295           continue;
3296
3297         default:
3298           break;
3299         }
3300
3301       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
3302          because such sections are not SEC_ALLOC and thus ld.so will
3303          not process them.  */
3304       if (unresolved_reloc
3305           && !((input_section->flags & SEC_DEBUGGING) != 0
3306                && h->def_dynamic)
3307           && _bfd_elf_section_offset (output_bfd, info, input_section,
3308                                       rel->r_offset) != (bfd_vma) -1)
3309         (*_bfd_error_handler)
3310           (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
3311            input_bfd,
3312            input_section,
3313            (long) rel->r_offset,
3314            howto->name,
3315            h->root.root.string);
3316
3317     do_relocation:
3318
3319       /* When applying a 24 bit reloc we need to start one byte
3320          earlier.  Otherwise the 32 bit get/put bfd operations might
3321          access a byte after the actual section.  */
3322       if (r_type == R_390_PC24DBL
3323           || r_type == R_390_PLT24DBL)
3324         rel->r_offset--;
3325
3326       if (r_type == R_390_20
3327           || r_type == R_390_GOT20
3328           || r_type == R_390_GOTPLT20
3329           || r_type == R_390_TLS_GOTIE20)
3330         {
3331           relocation += rel->r_addend;
3332           relocation = (relocation&0xfff) << 8 | (relocation&0xff000) >> 12;
3333           r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3334                                         contents, rel->r_offset,
3335                                         relocation, 0);
3336         }
3337       else
3338         r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3339                                       contents, rel->r_offset,
3340                                       relocation, rel->r_addend);
3341
3342       if (r != bfd_reloc_ok)
3343         {
3344           const char *name;
3345
3346           if (h != NULL)
3347             name = h->root.root.string;
3348           else
3349             {
3350               name = bfd_elf_string_from_elf_section (input_bfd,
3351                                                       symtab_hdr->sh_link,
3352                                                       sym->st_name);
3353               if (name == NULL)
3354                 return FALSE;
3355               if (*name == '\0')
3356                 name = bfd_section_name (input_bfd, sec);
3357             }
3358
3359           if (r == bfd_reloc_overflow)
3360             (*info->callbacks->reloc_overflow)
3361               (info, (h ? &h->root : NULL), name, howto->name,
3362                (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
3363           else
3364             {
3365               (*_bfd_error_handler)
3366                 (_("%B(%A+0x%lx): reloc against `%s': error %d"),
3367                  input_bfd, input_section,
3368                  (long) rel->r_offset, name, (int) r);
3369               return FALSE;
3370             }
3371         }
3372     }
3373
3374   return TRUE;
3375 }
3376
3377 /* Generate the PLT slots together with the dynamic relocations needed
3378    for IFUNC symbols.  */
3379
3380 static void
3381 elf_s390_finish_ifunc_symbol (bfd *output_bfd,
3382                               struct bfd_link_info *info,
3383                               struct elf_link_hash_entry *h,
3384                               struct elf_s390_link_hash_table *htab,
3385                               bfd_vma plt_offset,
3386                               bfd_vma resolver_address)
3387 {
3388   bfd_vma plt_index;
3389   bfd_vma got_offset;
3390   Elf_Internal_Rela rela;
3391   bfd_byte *loc;
3392   asection *plt, *gotplt, *relplt;
3393
3394   if (htab->elf.iplt == NULL
3395       || htab->elf.igotplt == NULL
3396       || htab->elf.irelplt == NULL)
3397     abort ();
3398
3399   /* Index of the PLT slot within iplt section.  */
3400   plt_index = plt_offset / PLT_ENTRY_SIZE;
3401   plt = htab->elf.iplt;
3402   /* Offset into the igot.plt section.  */
3403   got_offset = plt_index * GOT_ENTRY_SIZE;
3404   gotplt = htab->elf.igotplt;
3405   relplt = htab->elf.irelplt;
3406
3407   /* Fill in the blueprint of a PLT.  */
3408   memcpy (plt->contents + plt_offset, elf_s390x_plt_entry,
3409           PLT_ENTRY_SIZE);
3410
3411   /* Fixup the relative address to the GOT entry */
3412   bfd_put_32 (output_bfd,
3413               (gotplt->output_section->vma +
3414                gotplt->output_offset + got_offset
3415                - (plt->output_section->vma +
3416                   plt->output_offset +
3417                   plt_offset))/2,
3418               plt->contents + plt_offset + 2);
3419   /* Fixup the relative branch to PLT 0 */
3420   bfd_put_32 (output_bfd, - (plt->output_offset +
3421                              (PLT_ENTRY_SIZE * plt_index) + 22)/2,
3422               plt->contents + plt_offset + 24);
3423   /* Fixup offset into .rela.plt section.  */
3424   bfd_put_32 (output_bfd, relplt->output_offset +
3425               plt_index * sizeof (Elf64_External_Rela),
3426               plt->contents + plt_offset + 28);
3427
3428   /* Fill in the entry in the global offset table.
3429      Points to instruction after GOT offset.  */
3430   bfd_put_64 (output_bfd,
3431               (plt->output_section->vma
3432                + plt->output_offset
3433                + plt_offset
3434                + 14),
3435               gotplt->contents + got_offset);
3436
3437   /* Fill in the entry in the .rela.plt section.  */
3438   rela.r_offset = (gotplt->output_section->vma
3439                    + gotplt->output_offset
3440                    + got_offset);
3441
3442   if (!h
3443       || h->dynindx == -1
3444       || ((bfd_link_executable (info)
3445            || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
3446           && h->def_regular))
3447     {
3448       /* The symbol can be locally resolved.  */
3449       rela.r_info = ELF64_R_INFO (0, R_390_IRELATIVE);
3450       rela.r_addend = resolver_address;
3451     }
3452   else
3453     {
3454       rela.r_info = ELF64_R_INFO (h->dynindx, R_390_JMP_SLOT);
3455       rela.r_addend = 0;
3456     }
3457
3458   loc = relplt->contents + plt_index * sizeof (Elf64_External_Rela);
3459   bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
3460 }
3461
3462
3463 /* Finish up dynamic symbol handling.  We set the contents of various
3464    dynamic sections here.  */
3465
3466 static bfd_boolean
3467 elf_s390_finish_dynamic_symbol (bfd *output_bfd,
3468                                 struct bfd_link_info *info,
3469                                 struct elf_link_hash_entry *h,
3470                                 Elf_Internal_Sym *sym)
3471 {
3472   struct elf_s390_link_hash_table *htab;
3473   struct elf_s390_link_hash_entry *eh = (struct elf_s390_link_hash_entry*)h;
3474
3475   htab = elf_s390_hash_table (info);
3476   if (htab == NULL)
3477     return FALSE;
3478
3479   if (h->plt.offset != (bfd_vma) -1)
3480     {
3481       bfd_vma plt_index;
3482       bfd_vma got_offset;
3483       Elf_Internal_Rela rela;
3484       bfd_byte *loc;
3485
3486       /* This symbol has an entry in the procedure linkage table.  Set
3487          it up.  */
3488       if (s390_is_ifunc_symbol_p (h) && h->def_regular)
3489         {
3490           elf_s390_finish_ifunc_symbol (output_bfd, info, h,
3491             htab, h->plt.offset,
3492             eh->ifunc_resolver_address +
3493             eh->ifunc_resolver_section->output_offset +
3494             eh->ifunc_resolver_section->output_section->vma);
3495
3496           /* Do not return yet.  Handling of explicit GOT slots of
3497              IFUNC symbols is below.  */
3498         }
3499       else
3500         {
3501           if (h->dynindx == -1
3502               || htab->elf.splt == NULL
3503               || htab->elf.sgotplt == NULL
3504               || htab->elf.srelplt == NULL)
3505             abort ();
3506
3507           /* Calc. index no.
3508              Current offset - size first entry / entry size.  */
3509           plt_index = (h->plt.offset - PLT_FIRST_ENTRY_SIZE) / PLT_ENTRY_SIZE;
3510
3511           /* Offset in GOT is PLT index plus GOT headers(3) times 8,
3512              addr & GOT addr.  */
3513           got_offset = (plt_index + 3) * GOT_ENTRY_SIZE;
3514
3515           /* Fill in the blueprint of a PLT.  */
3516           memcpy (htab->elf.splt->contents + h->plt.offset, elf_s390x_plt_entry,
3517                   PLT_ENTRY_SIZE);
3518
3519           /* Fixup the relative address to the GOT entry */
3520           bfd_put_32 (output_bfd,
3521                       (htab->elf.sgotplt->output_section->vma +
3522                        htab->elf.sgotplt->output_offset + got_offset
3523                        - (htab->elf.splt->output_section->vma +
3524                           htab->elf.splt->output_offset +
3525                           h->plt.offset))/2,
3526                       htab->elf.splt->contents + h->plt.offset + 2);
3527           /* Fixup the relative branch to PLT 0 */
3528           bfd_put_32 (output_bfd, - (PLT_FIRST_ENTRY_SIZE +
3529                                      (PLT_ENTRY_SIZE * plt_index) + 22)/2,
3530                       htab->elf.splt->contents + h->plt.offset + 24);
3531           /* Fixup offset into .rela.plt section.  */
3532           bfd_put_32 (output_bfd, plt_index * sizeof (Elf64_External_Rela),
3533                       htab->elf.splt->contents + h->plt.offset + 28);
3534
3535           /* Fill in the entry in the global offset table.
3536              Points to instruction after GOT offset.  */
3537           bfd_put_64 (output_bfd,
3538                       (htab->elf.splt->output_section->vma
3539                        + htab->elf.splt->output_offset
3540                        + h->plt.offset
3541                        + 14),
3542                       htab->elf.sgotplt->contents + got_offset);
3543
3544           /* Fill in the entry in the .rela.plt section.  */
3545           rela.r_offset = (htab->elf.sgotplt->output_section->vma
3546                            + htab->elf.sgotplt->output_offset
3547                            + got_offset);
3548           rela.r_info = ELF64_R_INFO (h->dynindx, R_390_JMP_SLOT);
3549           rela.r_addend = 0;
3550           loc = htab->elf.srelplt->contents + plt_index *
3551             sizeof (Elf64_External_Rela);
3552           bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
3553
3554           if (!h->def_regular)
3555             {
3556               /* Mark the symbol as undefined, rather than as defined in
3557                  the .plt section.  Leave the value alone.  This is a clue
3558                  for the dynamic linker, to make function pointer
3559                  comparisons work between an application and shared
3560                  library.  */
3561               sym->st_shndx = SHN_UNDEF;
3562             }
3563         }
3564     }
3565
3566   if (h->got.offset != (bfd_vma) -1
3567       && elf_s390_hash_entry(h)->tls_type != GOT_TLS_GD
3568       && elf_s390_hash_entry(h)->tls_type != GOT_TLS_IE
3569       && elf_s390_hash_entry(h)->tls_type != GOT_TLS_IE_NLT)
3570     {
3571       Elf_Internal_Rela rela;
3572       bfd_byte *loc;
3573
3574       /* This symbol has an entry in the global offset table.  Set it
3575          up.  */
3576       if (htab->elf.sgot == NULL || htab->elf.srelgot == NULL)
3577         abort ();
3578
3579       rela.r_offset = (htab->elf.sgot->output_section->vma
3580                        + htab->elf.sgot->output_offset
3581                        + (h->got.offset &~ (bfd_vma) 1));
3582
3583       if (h->def_regular && s390_is_ifunc_symbol_p (h))
3584         {
3585           if (bfd_link_pic (info))
3586             {
3587               /* An explicit GOT slot usage needs GLOB_DAT.  If the
3588                  symbol references local the implicit got.iplt slot
3589                  will be used and the IRELATIVE reloc has been created
3590                  above.  */
3591               goto do_glob_dat;
3592             }
3593           else
3594             {
3595               /* For non-shared objects explicit GOT slots must be
3596                  filled with the PLT slot address for pointer
3597                  equality reasons.  */
3598               bfd_put_64 (output_bfd, (htab->elf.iplt->output_section->vma
3599                                        + htab->elf.iplt->output_offset
3600                                        + h->plt.offset),
3601                           htab->elf.sgot->contents + h->got.offset);
3602               return TRUE;
3603             }
3604         }
3605       else if (bfd_link_pic (info)
3606           && SYMBOL_REFERENCES_LOCAL (info, h))
3607         {
3608           /* If this is a static link, or it is a -Bsymbolic link and
3609              the symbol is defined locally or was forced to be local
3610              because of a version file, we just want to emit a
3611              RELATIVE reloc.  The entry in the global offset table
3612              will already have been initialized in the
3613              relocate_section function.  */
3614           if (!h->def_regular)
3615             return FALSE;
3616           BFD_ASSERT((h->got.offset & 1) != 0);
3617           rela.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
3618           rela.r_addend = (h->root.u.def.value
3619                            + h->root.u.def.section->output_section->vma
3620                            + h->root.u.def.section->output_offset);
3621         }
3622       else
3623         {
3624           BFD_ASSERT((h->got.offset & 1) == 0);
3625 do_glob_dat:
3626           bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgot->contents + h->got.offset);
3627           rela.r_info = ELF64_R_INFO (h->dynindx, R_390_GLOB_DAT);
3628           rela.r_addend = 0;
3629         }
3630
3631       loc = htab->elf.srelgot->contents;
3632       loc += htab->elf.srelgot->reloc_count++ * sizeof (Elf64_External_Rela);
3633       bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
3634     }
3635
3636   if (h->needs_copy)
3637     {
3638       Elf_Internal_Rela rela;
3639       bfd_byte *loc;
3640
3641       /* This symbols needs a copy reloc.  Set it up.  */
3642
3643       if (h->dynindx == -1
3644           || (h->root.type != bfd_link_hash_defined
3645               && h->root.type != bfd_link_hash_defweak)
3646           || htab->srelbss == NULL)
3647         abort ();
3648
3649       rela.r_offset = (h->root.u.def.value
3650                        + h->root.u.def.section->output_section->vma
3651                        + h->root.u.def.section->output_offset);
3652       rela.r_info = ELF64_R_INFO (h->dynindx, R_390_COPY);
3653       rela.r_addend = 0;
3654       loc = htab->srelbss->contents;
3655       loc += htab->srelbss->reloc_count++ * sizeof (Elf64_External_Rela);
3656       bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
3657     }
3658
3659   /* Mark some specially defined symbols as absolute.  */
3660   if (h == htab->elf.hdynamic
3661       || h == htab->elf.hgot
3662       || h == htab->elf.hplt)
3663     sym->st_shndx = SHN_ABS;
3664
3665   return TRUE;
3666 }
3667
3668 /* Used to decide how to sort relocs in an optimal manner for the
3669    dynamic linker, before writing them out.  */
3670
3671 static enum elf_reloc_type_class
3672 elf_s390_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
3673                            const asection *rel_sec ATTRIBUTE_UNUSED,
3674                            const Elf_Internal_Rela *rela)
3675 {
3676   bfd *abfd = info->output_bfd;
3677   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
3678   struct elf_s390_link_hash_table *htab = elf_s390_hash_table (info);
3679   unsigned long r_symndx = ELF64_R_SYM (rela->r_info);
3680   Elf_Internal_Sym sym;
3681
3682   if (htab->elf.dynsym == NULL
3683       || !bed->s->swap_symbol_in (abfd,
3684                                   (htab->elf.dynsym->contents
3685                                    + r_symndx * bed->s->sizeof_sym),
3686                                   0, &sym))
3687     abort ();
3688
3689   /* Check relocation against STT_GNU_IFUNC symbol.  */
3690   if (ELF_ST_TYPE (sym.st_info) == STT_GNU_IFUNC)
3691     return reloc_class_ifunc;
3692
3693   switch ((int) ELF64_R_TYPE (rela->r_info))
3694     {
3695     case R_390_RELATIVE:
3696       return reloc_class_relative;
3697     case R_390_JMP_SLOT:
3698       return reloc_class_plt;
3699     case R_390_COPY:
3700       return reloc_class_copy;
3701     default:
3702       return reloc_class_normal;
3703     }
3704 }
3705
3706 /* Finish up the dynamic sections.  */
3707
3708 static bfd_boolean
3709 elf_s390_finish_dynamic_sections (bfd *output_bfd,
3710                                   struct bfd_link_info *info)
3711 {
3712   struct elf_s390_link_hash_table *htab;
3713   bfd *dynobj;
3714   asection *sdyn;
3715   bfd *ibfd;
3716   unsigned int i;
3717
3718   htab = elf_s390_hash_table (info);
3719   if (htab == NULL)
3720     return FALSE;
3721
3722   dynobj = htab->elf.dynobj;
3723   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
3724
3725   if (htab->elf.dynamic_sections_created)
3726     {
3727       Elf64_External_Dyn *dyncon, *dynconend;
3728
3729       if (sdyn == NULL || htab->elf.sgot == NULL)
3730         abort ();
3731
3732       dyncon = (Elf64_External_Dyn *) sdyn->contents;
3733       dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
3734       for (; dyncon < dynconend; dyncon++)
3735         {
3736           Elf_Internal_Dyn dyn;
3737           asection *s;
3738
3739           bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
3740
3741           switch (dyn.d_tag)
3742             {
3743             default:
3744               continue;
3745
3746             case DT_PLTGOT:
3747               s = htab->elf.sgotplt;
3748               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
3749               break;
3750
3751             case DT_JMPREL:
3752               s = htab->elf.srelplt;
3753               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
3754               break;
3755
3756             case DT_PLTRELSZ:
3757               s = htab->elf.srelplt;
3758               dyn.d_un.d_val = s->size;
3759               break;
3760
3761             case DT_RELASZ:
3762               /* The procedure linkage table relocs (DT_JMPREL) should
3763                  not be included in the overall relocs (DT_RELA).
3764                  Therefore, we override the DT_RELASZ entry here to
3765                  make it not include the JMPREL relocs.  Since the
3766                  linker script arranges for .rela.plt to follow all
3767                  other relocation sections, we don't have to worry
3768                  about changing the DT_RELA entry.  */
3769               s = htab->elf.srelplt;
3770               dyn.d_un.d_val -= s->size;
3771               break;
3772             }
3773
3774           bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
3775         }
3776
3777       /* Fill in the special first entry in the procedure linkage table.  */
3778       if (htab->elf.splt && htab->elf.splt->size > 0)
3779         {
3780           /* fill in blueprint for plt 0 entry */
3781           memcpy (htab->elf.splt->contents, elf_s390x_first_plt_entry,
3782                   PLT_FIRST_ENTRY_SIZE);
3783           /* Fixup relative address to start of GOT */
3784           bfd_put_32 (output_bfd,
3785                       (htab->elf.sgotplt->output_section->vma +
3786                        htab->elf.sgotplt->output_offset
3787                        - htab->elf.splt->output_section->vma - 6)/2,
3788                       htab->elf.splt->contents + 8);
3789         }
3790       if (elf_section_data (htab->elf.splt->output_section) != NULL)
3791         elf_section_data (htab->elf.splt->output_section)->this_hdr.sh_entsize
3792           = PLT_ENTRY_SIZE;
3793     }
3794
3795   if (htab->elf.sgotplt)
3796     {
3797       /* Fill in the first three entries in the global offset table.  */
3798       if (htab->elf.sgotplt->size > 0)
3799         {
3800           bfd_put_64 (output_bfd,
3801                       (sdyn == NULL ? (bfd_vma) 0
3802                        : sdyn->output_section->vma + sdyn->output_offset),
3803                       htab->elf.sgotplt->contents);
3804           /* One entry for shared object struct ptr.  */
3805           bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents + 8);
3806           /* One entry for _dl_runtime_resolve.  */
3807           bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents + 12);
3808         }
3809
3810       elf_section_data (htab->elf.sgot->output_section)
3811         ->this_hdr.sh_entsize = 8;
3812     }
3813
3814   /* Finish dynamic symbol for local IFUNC symbols.  */
3815   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
3816     {
3817       struct plt_entry *local_plt;
3818       Elf_Internal_Sym *isym;
3819       Elf_Internal_Shdr *symtab_hdr;
3820
3821       symtab_hdr = &elf_symtab_hdr (ibfd);
3822
3823       local_plt = elf_s390_local_plt (ibfd);
3824       if (local_plt != NULL)
3825         for (i = 0; i < symtab_hdr->sh_info; i++)
3826           {
3827             if (local_plt[i].plt.offset != (bfd_vma) -1)
3828               {
3829                 asection *sec = local_plt[i].sec;
3830                 isym = bfd_sym_from_r_symndx (&htab->sym_cache, ibfd, i);
3831                 if (isym == NULL)
3832                   return FALSE;
3833
3834                 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
3835                   elf_s390_finish_ifunc_symbol (output_bfd, info, NULL, htab,
3836                                                 local_plt[i].plt.offset,
3837                                                 isym->st_value
3838                                                 + sec->output_section->vma
3839                                                 + sec->output_offset);
3840
3841               }
3842           }
3843     }
3844
3845   return TRUE;
3846 }
3847
3848 /* Return address for Ith PLT stub in section PLT, for relocation REL
3849    or (bfd_vma) -1 if it should not be included.  */
3850
3851 static bfd_vma
3852 elf_s390_plt_sym_val (bfd_vma i, const asection *plt,
3853                       const arelent *rel ATTRIBUTE_UNUSED)
3854 {
3855   return plt->vma + PLT_FIRST_ENTRY_SIZE + i * PLT_ENTRY_SIZE;
3856 }
3857
3858 /* Merge backend specific data from an object file to the output
3859    object file when linking.  */
3860
3861 static bfd_boolean
3862 elf64_s390_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
3863 {
3864   if (!is_s390_elf (ibfd) || !is_s390_elf (obfd))
3865     return TRUE;
3866
3867   if (!elf_s390_merge_obj_attributes (ibfd, obfd))
3868     return FALSE;
3869
3870   return TRUE;
3871 }
3872
3873 /* Why was the hash table entry size definition changed from
3874    ARCH_SIZE/8 to 4? This breaks the 64 bit dynamic linker and
3875    this is the only reason for the s390_elf64_size_info structure.  */
3876
3877 const struct elf_size_info s390_elf64_size_info =
3878 {
3879   sizeof (Elf64_External_Ehdr),
3880   sizeof (Elf64_External_Phdr),
3881   sizeof (Elf64_External_Shdr),
3882   sizeof (Elf64_External_Rel),
3883   sizeof (Elf64_External_Rela),
3884   sizeof (Elf64_External_Sym),
3885   sizeof (Elf64_External_Dyn),
3886   sizeof (Elf_External_Note),
3887   8,            /* hash-table entry size.  */
3888   1,            /* internal relocations per external relocations.  */
3889   64,           /* arch_size.  */
3890   3,            /* log_file_align.  */
3891   ELFCLASS64, EV_CURRENT,
3892   bfd_elf64_write_out_phdrs,
3893   bfd_elf64_write_shdrs_and_ehdr,
3894   bfd_elf64_checksum_contents,
3895   bfd_elf64_write_relocs,
3896   bfd_elf64_swap_symbol_in,
3897   bfd_elf64_swap_symbol_out,
3898   bfd_elf64_slurp_reloc_table,
3899   bfd_elf64_slurp_symbol_table,
3900   bfd_elf64_swap_dyn_in,
3901   bfd_elf64_swap_dyn_out,
3902   bfd_elf64_swap_reloc_in,
3903   bfd_elf64_swap_reloc_out,
3904   bfd_elf64_swap_reloca_in,
3905   bfd_elf64_swap_reloca_out
3906 };
3907
3908 #define TARGET_BIG_SYM  s390_elf64_vec
3909 #define TARGET_BIG_NAME "elf64-s390"
3910 #define ELF_ARCH        bfd_arch_s390
3911 #define ELF_TARGET_ID   S390_ELF_DATA
3912 #define ELF_MACHINE_CODE EM_S390
3913 #define ELF_MACHINE_ALT1 EM_S390_OLD
3914 #define ELF_MAXPAGESIZE 0x1000
3915
3916 #define elf_backend_size_info           s390_elf64_size_info
3917
3918 #define elf_backend_can_gc_sections     1
3919 #define elf_backend_can_refcount        1
3920 #define elf_backend_want_got_plt        1
3921 #define elf_backend_plt_readonly        1
3922 #define elf_backend_want_plt_sym        0
3923 #define elf_backend_got_header_size     24
3924 #define elf_backend_rela_normal         1
3925
3926 #define elf_info_to_howto               elf_s390_info_to_howto
3927
3928 #define bfd_elf64_bfd_is_local_label_name     elf_s390_is_local_label_name
3929 #define bfd_elf64_bfd_link_hash_table_create  elf_s390_link_hash_table_create
3930 #define bfd_elf64_bfd_reloc_type_lookup       elf_s390_reloc_type_lookup
3931 #define bfd_elf64_bfd_reloc_name_lookup       elf_s390_reloc_name_lookup
3932 #define bfd_elf64_bfd_merge_private_bfd_data  elf64_s390_merge_private_bfd_data
3933
3934 #define elf_backend_adjust_dynamic_symbol     elf_s390_adjust_dynamic_symbol
3935 #define elf_backend_check_relocs              elf_s390_check_relocs
3936 #define elf_backend_copy_indirect_symbol      elf_s390_copy_indirect_symbol
3937 #define elf_backend_create_dynamic_sections   elf_s390_create_dynamic_sections
3938 #define elf_backend_finish_dynamic_sections   elf_s390_finish_dynamic_sections
3939 #define elf_backend_finish_dynamic_symbol     elf_s390_finish_dynamic_symbol
3940 #define elf_backend_gc_mark_hook              elf_s390_gc_mark_hook
3941 #define elf_backend_gc_sweep_hook             elf_s390_gc_sweep_hook
3942 #define elf_backend_reloc_type_class          elf_s390_reloc_type_class
3943 #define elf_backend_relocate_section          elf_s390_relocate_section
3944 #define elf_backend_size_dynamic_sections     elf_s390_size_dynamic_sections
3945 #define elf_backend_init_index_section        _bfd_elf_init_1_index_section
3946 #define elf_backend_plt_sym_val               elf_s390_plt_sym_val
3947 #define elf_backend_add_symbol_hook           elf_s390_add_symbol_hook
3948 #define elf_backend_sort_relocs_p             elf_s390_elf_sort_relocs_p
3949
3950 #define bfd_elf64_mkobject              elf_s390_mkobject
3951 #define elf_backend_object_p            elf_s390_object_p
3952
3953 #include "elf64-target.h"