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