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