Add tests for new alias default-args related commands and arguments.
[deliverable/binutils-gdb.git] / bfd / elf32-i386.c
CommitLineData
252b5132 1/* Intel 80386/80486-specific support for 32-bit ELF
b3adc24a 2 Copyright (C) 1993-2020 Free Software Foundation, Inc.
252b5132 3
571fe01f 4 This file is part of BFD, the Binary File Descriptor library.
252b5132 5
571fe01f
NC
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
cd123cb7 8 the Free Software Foundation; either version 3 of the License, or
571fe01f 9 (at your option) any later version.
252b5132 10
571fe01f
NC
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
252b5132 15
571fe01f
NC
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
cd123cb7
NC
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
252b5132 20
0afcef53 21#include "elfxx-x86.h"
5a68afcf 22#include "elf-nacl.h"
eac338cf 23#include "elf-vxworks.h"
e41b3a13 24#include "dwarf2.h"
02a86693 25#include "opcode/i386.h"
252b5132 26
55fd94b0
AM
27/* 386 uses REL relocations instead of RELA. */
28#define USE_REL 1
252b5132
RH
29
30#include "elf/i386.h"
31
32static reloc_howto_type elf_howto_table[]=
33{
6346d5ca 34 HOWTO(R_386_NONE, 0, 3, 0, FALSE, 0, complain_overflow_dont,
1b452ec6 35 bfd_elf_generic_reloc, "R_386_NONE",
b34976b6
AM
36 TRUE, 0x00000000, 0x00000000, FALSE),
37 HOWTO(R_386_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
1b452ec6 38 bfd_elf_generic_reloc, "R_386_32",
b34976b6
AM
39 TRUE, 0xffffffff, 0xffffffff, FALSE),
40 HOWTO(R_386_PC32, 0, 2, 32, TRUE, 0, complain_overflow_bitfield,
1b452ec6 41 bfd_elf_generic_reloc, "R_386_PC32",
b34976b6
AM
42 TRUE, 0xffffffff, 0xffffffff, TRUE),
43 HOWTO(R_386_GOT32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
1b452ec6 44 bfd_elf_generic_reloc, "R_386_GOT32",
b34976b6
AM
45 TRUE, 0xffffffff, 0xffffffff, FALSE),
46 HOWTO(R_386_PLT32, 0, 2, 32, TRUE, 0, complain_overflow_bitfield,
1b452ec6 47 bfd_elf_generic_reloc, "R_386_PLT32",
b34976b6
AM
48 TRUE, 0xffffffff, 0xffffffff, TRUE),
49 HOWTO(R_386_COPY, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
1b452ec6 50 bfd_elf_generic_reloc, "R_386_COPY",
b34976b6
AM
51 TRUE, 0xffffffff, 0xffffffff, FALSE),
52 HOWTO(R_386_GLOB_DAT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
1b452ec6 53 bfd_elf_generic_reloc, "R_386_GLOB_DAT",
b34976b6
AM
54 TRUE, 0xffffffff, 0xffffffff, FALSE),
55 HOWTO(R_386_JUMP_SLOT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
1b452ec6 56 bfd_elf_generic_reloc, "R_386_JUMP_SLOT",
b34976b6
AM
57 TRUE, 0xffffffff, 0xffffffff, FALSE),
58 HOWTO(R_386_RELATIVE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
1b452ec6 59 bfd_elf_generic_reloc, "R_386_RELATIVE",
b34976b6
AM
60 TRUE, 0xffffffff, 0xffffffff, FALSE),
61 HOWTO(R_386_GOTOFF, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
1b452ec6 62 bfd_elf_generic_reloc, "R_386_GOTOFF",
b34976b6
AM
63 TRUE, 0xffffffff, 0xffffffff, FALSE),
64 HOWTO(R_386_GOTPC, 0, 2, 32, TRUE, 0, complain_overflow_bitfield,
1b452ec6 65 bfd_elf_generic_reloc, "R_386_GOTPC",
b34976b6 66 TRUE, 0xffffffff, 0xffffffff, TRUE),
1b452ec6 67
dc47f327
AM
68 /* We have a gap in the reloc numbers here.
69 R_386_standard counts the number up to this point, and
70 R_386_ext_offset is the value to subtract from a reloc type of
71 R_386_16 thru R_386_PC8 to form an index into this table. */
55fd94b0
AM
72#define R_386_standard (R_386_GOTPC + 1)
73#define R_386_ext_offset (R_386_TLS_TPOFF - R_386_standard)
1b452ec6 74
37e55690 75 /* These relocs are a GNU extension. */
b34976b6 76 HOWTO(R_386_TLS_TPOFF, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
37e55690 77 bfd_elf_generic_reloc, "R_386_TLS_TPOFF",
b34976b6
AM
78 TRUE, 0xffffffff, 0xffffffff, FALSE),
79 HOWTO(R_386_TLS_IE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
37e55690 80 bfd_elf_generic_reloc, "R_386_TLS_IE",
b34976b6
AM
81 TRUE, 0xffffffff, 0xffffffff, FALSE),
82 HOWTO(R_386_TLS_GOTIE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
37e55690 83 bfd_elf_generic_reloc, "R_386_TLS_GOTIE",
b34976b6
AM
84 TRUE, 0xffffffff, 0xffffffff, FALSE),
85 HOWTO(R_386_TLS_LE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
13ae64f3 86 bfd_elf_generic_reloc, "R_386_TLS_LE",
b34976b6
AM
87 TRUE, 0xffffffff, 0xffffffff, FALSE),
88 HOWTO(R_386_TLS_GD, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
13ae64f3 89 bfd_elf_generic_reloc, "R_386_TLS_GD",
b34976b6
AM
90 TRUE, 0xffffffff, 0xffffffff, FALSE),
91 HOWTO(R_386_TLS_LDM, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
13ae64f3 92 bfd_elf_generic_reloc, "R_386_TLS_LDM",
b34976b6
AM
93 TRUE, 0xffffffff, 0xffffffff, FALSE),
94 HOWTO(R_386_16, 0, 1, 16, FALSE, 0, complain_overflow_bitfield,
1b452ec6 95 bfd_elf_generic_reloc, "R_386_16",
b34976b6 96 TRUE, 0xffff, 0xffff, FALSE),
b0360d8c 97 HOWTO(R_386_PC16, 0, 1, 16, TRUE, 0, complain_overflow_bitfield,
1b452ec6 98 bfd_elf_generic_reloc, "R_386_PC16",
b34976b6
AM
99 TRUE, 0xffff, 0xffff, TRUE),
100 HOWTO(R_386_8, 0, 0, 8, FALSE, 0, complain_overflow_bitfield,
1b452ec6 101 bfd_elf_generic_reloc, "R_386_8",
b34976b6
AM
102 TRUE, 0xff, 0xff, FALSE),
103 HOWTO(R_386_PC8, 0, 0, 8, TRUE, 0, complain_overflow_signed,
1b452ec6 104 bfd_elf_generic_reloc, "R_386_PC8",
b34976b6 105 TRUE, 0xff, 0xff, TRUE),
dc47f327 106
55fd94b0
AM
107#define R_386_ext (R_386_PC8 + 1 - R_386_ext_offset)
108#define R_386_tls_offset (R_386_TLS_LDO_32 - R_386_ext)
13ae64f3 109 /* These are common with Solaris TLS implementation. */
b34976b6 110 HOWTO(R_386_TLS_LDO_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
13ae64f3 111 bfd_elf_generic_reloc, "R_386_TLS_LDO_32",
b34976b6
AM
112 TRUE, 0xffffffff, 0xffffffff, FALSE),
113 HOWTO(R_386_TLS_IE_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
13ae64f3 114 bfd_elf_generic_reloc, "R_386_TLS_IE_32",
b34976b6
AM
115 TRUE, 0xffffffff, 0xffffffff, FALSE),
116 HOWTO(R_386_TLS_LE_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
13ae64f3 117 bfd_elf_generic_reloc, "R_386_TLS_LE_32",
b34976b6
AM
118 TRUE, 0xffffffff, 0xffffffff, FALSE),
119 HOWTO(R_386_TLS_DTPMOD32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
13ae64f3 120 bfd_elf_generic_reloc, "R_386_TLS_DTPMOD32",
b34976b6
AM
121 TRUE, 0xffffffff, 0xffffffff, FALSE),
122 HOWTO(R_386_TLS_DTPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
13ae64f3 123 bfd_elf_generic_reloc, "R_386_TLS_DTPOFF32",
b34976b6
AM
124 TRUE, 0xffffffff, 0xffffffff, FALSE),
125 HOWTO(R_386_TLS_TPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
13ae64f3 126 bfd_elf_generic_reloc, "R_386_TLS_TPOFF32",
b34976b6 127 TRUE, 0xffffffff, 0xffffffff, FALSE),
1788fc08
L
128 HOWTO(R_386_SIZE32, 0, 2, 32, FALSE, 0, complain_overflow_unsigned,
129 bfd_elf_generic_reloc, "R_386_SIZE32",
130 TRUE, 0xffffffff, 0xffffffff, FALSE),
67a4f2b7
AO
131 HOWTO(R_386_TLS_GOTDESC, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
132 bfd_elf_generic_reloc, "R_386_TLS_GOTDESC",
133 TRUE, 0xffffffff, 0xffffffff, FALSE),
134 HOWTO(R_386_TLS_DESC_CALL, 0, 0, 0, FALSE, 0, complain_overflow_dont,
135 bfd_elf_generic_reloc, "R_386_TLS_DESC_CALL",
136 FALSE, 0, 0, FALSE),
137 HOWTO(R_386_TLS_DESC, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
138 bfd_elf_generic_reloc, "R_386_TLS_DESC",
139 TRUE, 0xffffffff, 0xffffffff, FALSE),
cbe950e9
L
140 HOWTO(R_386_IRELATIVE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
141 bfd_elf_generic_reloc, "R_386_IRELATIVE",
142 TRUE, 0xffffffff, 0xffffffff, FALSE),
02a86693
L
143 HOWTO(R_386_GOT32X, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
144 bfd_elf_generic_reloc, "R_386_GOT32X",
145 TRUE, 0xffffffff, 0xffffffff, FALSE),
13ae64f3
JJ
146
147 /* Another gap. */
02a86693 148#define R_386_ext2 (R_386_GOT32X + 1 - R_386_tls_offset)
c74be520 149#define R_386_vt_offset (R_386_GNU_VTINHERIT - R_386_ext2)
252b5132
RH
150
151/* GNU extension to record C++ vtable hierarchy. */
252b5132
RH
152 HOWTO (R_386_GNU_VTINHERIT, /* type */
153 0, /* rightshift */
154 2, /* size (0 = byte, 1 = short, 2 = long) */
155 0, /* bitsize */
b34976b6 156 FALSE, /* pc_relative */
252b5132
RH
157 0, /* bitpos */
158 complain_overflow_dont, /* complain_on_overflow */
159 NULL, /* special_function */
160 "R_386_GNU_VTINHERIT", /* name */
b34976b6 161 FALSE, /* partial_inplace */
252b5132
RH
162 0, /* src_mask */
163 0, /* dst_mask */
b34976b6 164 FALSE), /* pcrel_offset */
252b5132
RH
165
166/* GNU extension to record C++ vtable member usage. */
252b5132
RH
167 HOWTO (R_386_GNU_VTENTRY, /* type */
168 0, /* rightshift */
169 2, /* size (0 = byte, 1 = short, 2 = long) */
170 0, /* bitsize */
b34976b6 171 FALSE, /* pc_relative */
252b5132
RH
172 0, /* bitpos */
173 complain_overflow_dont, /* complain_on_overflow */
174 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
175 "R_386_GNU_VTENTRY", /* name */
b34976b6 176 FALSE, /* partial_inplace */
252b5132
RH
177 0, /* src_mask */
178 0, /* dst_mask */
b34976b6 179 FALSE) /* pcrel_offset */
dc47f327 180
55fd94b0 181#define R_386_vt (R_386_GNU_VTENTRY + 1 - R_386_vt_offset)
dc47f327
AM
182
183};
184
daf1c414
L
185#define X86_PCREL_TYPE_P(TYPE) ((TYPE) == R_386_PC32)
186
aebcc8ff
L
187#define X86_SIZE_TYPE_P(TYPE) ((TYPE) == R_386_SIZE32)
188
252b5132 189#ifdef DEBUG_GEN_RELOC
55fd94b0
AM
190#define TRACE(str) \
191 fprintf (stderr, "i386 bfd reloc lookup %d (%s)\n", code, str)
252b5132
RH
192#else
193#define TRACE(str)
194#endif
195
196static reloc_howto_type *
f3185997 197elf_i386_reloc_type_lookup (bfd *abfd,
55fd94b0 198 bfd_reloc_code_real_type code)
252b5132
RH
199{
200 switch (code)
201 {
202 case BFD_RELOC_NONE:
203 TRACE ("BFD_RELOC_NONE");
55fd94b0 204 return &elf_howto_table[R_386_NONE];
252b5132
RH
205
206 case BFD_RELOC_32:
207 TRACE ("BFD_RELOC_32");
55fd94b0 208 return &elf_howto_table[R_386_32];
252b5132
RH
209
210 case BFD_RELOC_CTOR:
211 TRACE ("BFD_RELOC_CTOR");
55fd94b0 212 return &elf_howto_table[R_386_32];
252b5132
RH
213
214 case BFD_RELOC_32_PCREL:
215 TRACE ("BFD_RELOC_PC32");
55fd94b0 216 return &elf_howto_table[R_386_PC32];
252b5132
RH
217
218 case BFD_RELOC_386_GOT32:
219 TRACE ("BFD_RELOC_386_GOT32");
55fd94b0 220 return &elf_howto_table[R_386_GOT32];
252b5132
RH
221
222 case BFD_RELOC_386_PLT32:
223 TRACE ("BFD_RELOC_386_PLT32");
55fd94b0 224 return &elf_howto_table[R_386_PLT32];
252b5132
RH
225
226 case BFD_RELOC_386_COPY:
227 TRACE ("BFD_RELOC_386_COPY");
55fd94b0 228 return &elf_howto_table[R_386_COPY];
252b5132
RH
229
230 case BFD_RELOC_386_GLOB_DAT:
231 TRACE ("BFD_RELOC_386_GLOB_DAT");
55fd94b0 232 return &elf_howto_table[R_386_GLOB_DAT];
252b5132
RH
233
234 case BFD_RELOC_386_JUMP_SLOT:
235 TRACE ("BFD_RELOC_386_JUMP_SLOT");
55fd94b0 236 return &elf_howto_table[R_386_JUMP_SLOT];
252b5132
RH
237
238 case BFD_RELOC_386_RELATIVE:
239 TRACE ("BFD_RELOC_386_RELATIVE");
55fd94b0 240 return &elf_howto_table[R_386_RELATIVE];
252b5132
RH
241
242 case BFD_RELOC_386_GOTOFF:
243 TRACE ("BFD_RELOC_386_GOTOFF");
55fd94b0 244 return &elf_howto_table[R_386_GOTOFF];
252b5132
RH
245
246 case BFD_RELOC_386_GOTPC:
247 TRACE ("BFD_RELOC_386_GOTPC");
55fd94b0 248 return &elf_howto_table[R_386_GOTPC];
252b5132 249
37e55690
JJ
250 /* These relocs are a GNU extension. */
251 case BFD_RELOC_386_TLS_TPOFF:
252 TRACE ("BFD_RELOC_386_TLS_TPOFF");
55fd94b0 253 return &elf_howto_table[R_386_TLS_TPOFF - R_386_ext_offset];
37e55690
JJ
254
255 case BFD_RELOC_386_TLS_IE:
256 TRACE ("BFD_RELOC_386_TLS_IE");
55fd94b0 257 return &elf_howto_table[R_386_TLS_IE - R_386_ext_offset];
37e55690
JJ
258
259 case BFD_RELOC_386_TLS_GOTIE:
260 TRACE ("BFD_RELOC_386_TLS_GOTIE");
55fd94b0 261 return &elf_howto_table[R_386_TLS_GOTIE - R_386_ext_offset];
37e55690 262
13ae64f3
JJ
263 case BFD_RELOC_386_TLS_LE:
264 TRACE ("BFD_RELOC_386_TLS_LE");
55fd94b0 265 return &elf_howto_table[R_386_TLS_LE - R_386_ext_offset];
13ae64f3
JJ
266
267 case BFD_RELOC_386_TLS_GD:
268 TRACE ("BFD_RELOC_386_TLS_GD");
55fd94b0 269 return &elf_howto_table[R_386_TLS_GD - R_386_ext_offset];
13ae64f3
JJ
270
271 case BFD_RELOC_386_TLS_LDM:
272 TRACE ("BFD_RELOC_386_TLS_LDM");
55fd94b0 273 return &elf_howto_table[R_386_TLS_LDM - R_386_ext_offset];
13ae64f3 274
252b5132
RH
275 case BFD_RELOC_16:
276 TRACE ("BFD_RELOC_16");
55fd94b0 277 return &elf_howto_table[R_386_16 - R_386_ext_offset];
252b5132
RH
278
279 case BFD_RELOC_16_PCREL:
280 TRACE ("BFD_RELOC_16_PCREL");
55fd94b0 281 return &elf_howto_table[R_386_PC16 - R_386_ext_offset];
252b5132
RH
282
283 case BFD_RELOC_8:
284 TRACE ("BFD_RELOC_8");
55fd94b0 285 return &elf_howto_table[R_386_8 - R_386_ext_offset];
252b5132
RH
286
287 case BFD_RELOC_8_PCREL:
288 TRACE ("BFD_RELOC_8_PCREL");
55fd94b0 289 return &elf_howto_table[R_386_PC8 - R_386_ext_offset];
252b5132 290
13ae64f3
JJ
291 /* Common with Sun TLS implementation. */
292 case BFD_RELOC_386_TLS_LDO_32:
293 TRACE ("BFD_RELOC_386_TLS_LDO_32");
55fd94b0 294 return &elf_howto_table[R_386_TLS_LDO_32 - R_386_tls_offset];
13ae64f3
JJ
295
296 case BFD_RELOC_386_TLS_IE_32:
297 TRACE ("BFD_RELOC_386_TLS_IE_32");
55fd94b0 298 return &elf_howto_table[R_386_TLS_IE_32 - R_386_tls_offset];
13ae64f3
JJ
299
300 case BFD_RELOC_386_TLS_LE_32:
301 TRACE ("BFD_RELOC_386_TLS_LE_32");
55fd94b0 302 return &elf_howto_table[R_386_TLS_LE_32 - R_386_tls_offset];
13ae64f3
JJ
303
304 case BFD_RELOC_386_TLS_DTPMOD32:
305 TRACE ("BFD_RELOC_386_TLS_DTPMOD32");
55fd94b0 306 return &elf_howto_table[R_386_TLS_DTPMOD32 - R_386_tls_offset];
13ae64f3
JJ
307
308 case BFD_RELOC_386_TLS_DTPOFF32:
309 TRACE ("BFD_RELOC_386_TLS_DTPOFF32");
55fd94b0 310 return &elf_howto_table[R_386_TLS_DTPOFF32 - R_386_tls_offset];
13ae64f3
JJ
311
312 case BFD_RELOC_386_TLS_TPOFF32:
313 TRACE ("BFD_RELOC_386_TLS_TPOFF32");
55fd94b0 314 return &elf_howto_table[R_386_TLS_TPOFF32 - R_386_tls_offset];
13ae64f3 315
1788fc08
L
316 case BFD_RELOC_SIZE32:
317 TRACE ("BFD_RELOC_SIZE32");
318 return &elf_howto_table[R_386_SIZE32 - R_386_tls_offset];
319
67a4f2b7
AO
320 case BFD_RELOC_386_TLS_GOTDESC:
321 TRACE ("BFD_RELOC_386_TLS_GOTDESC");
322 return &elf_howto_table[R_386_TLS_GOTDESC - R_386_tls_offset];
323
324 case BFD_RELOC_386_TLS_DESC_CALL:
325 TRACE ("BFD_RELOC_386_TLS_DESC_CALL");
326 return &elf_howto_table[R_386_TLS_DESC_CALL - R_386_tls_offset];
327
328 case BFD_RELOC_386_TLS_DESC:
329 TRACE ("BFD_RELOC_386_TLS_DESC");
330 return &elf_howto_table[R_386_TLS_DESC - R_386_tls_offset];
331
cbe950e9
L
332 case BFD_RELOC_386_IRELATIVE:
333 TRACE ("BFD_RELOC_386_IRELATIVE");
2a750708 334 return &elf_howto_table[R_386_IRELATIVE - R_386_tls_offset];
cbe950e9 335
02a86693
L
336 case BFD_RELOC_386_GOT32X:
337 TRACE ("BFD_RELOC_386_GOT32X");
338 return &elf_howto_table[R_386_GOT32X - R_386_tls_offset];
339
252b5132
RH
340 case BFD_RELOC_VTABLE_INHERIT:
341 TRACE ("BFD_RELOC_VTABLE_INHERIT");
55fd94b0 342 return &elf_howto_table[R_386_GNU_VTINHERIT - R_386_vt_offset];
252b5132
RH
343
344 case BFD_RELOC_VTABLE_ENTRY:
345 TRACE ("BFD_RELOC_VTABLE_ENTRY");
55fd94b0 346 return &elf_howto_table[R_386_GNU_VTENTRY - R_386_vt_offset];
252b5132
RH
347
348 default:
f3185997
NC
349 TRACE ("Unknown");
350 /* xgettext:c-format */
e8f5af78 351 _bfd_error_handler (_("%pB: unsupported relocation type: %#x"),
f3185997
NC
352 abfd, (int) code);
353 bfd_set_error (bfd_error_bad_value);
354 return NULL;
252b5132 355 }
252b5132
RH
356}
357
157090f7
AM
358static reloc_howto_type *
359elf_i386_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
360 const char *r_name)
361{
362 unsigned int i;
363
364 for (i = 0; i < sizeof (elf_howto_table) / sizeof (elf_howto_table[0]); i++)
365 if (elf_howto_table[i].name != NULL
366 && strcasecmp (elf_howto_table[i].name, r_name) == 0)
367 return &elf_howto_table[i];
368
369 return NULL;
370}
371
142411ca 372static reloc_howto_type *
b366503e 373elf_i386_rtype_to_howto (unsigned r_type)
252b5132 374{
dc47f327
AM
375 unsigned int indx;
376
377 if ((indx = r_type) >= R_386_standard
378 && ((indx = r_type - R_386_ext_offset) - R_386_standard
379 >= R_386_ext - R_386_standard)
13ae64f3 380 && ((indx = r_type - R_386_tls_offset) - R_386_ext
c74be520
L
381 >= R_386_ext2 - R_386_ext)
382 && ((indx = r_type - R_386_vt_offset) - R_386_ext2
383 >= R_386_vt - R_386_ext2))
f3185997 384 return NULL;
06614111
NC
385 /* PR 17512: file: 0f67f69d. */
386 if (elf_howto_table [indx].type != r_type)
387 return NULL;
142411ca
L
388 return &elf_howto_table[indx];
389}
390
f3185997
NC
391static bfd_boolean
392elf_i386_info_to_howto_rel (bfd *abfd,
142411ca
L
393 arelent *cache_ptr,
394 Elf_Internal_Rela *dst)
395{
396 unsigned int r_type = ELF32_R_TYPE (dst->r_info);
f3185997 397
b366503e 398 if ((cache_ptr->howto = elf_i386_rtype_to_howto (r_type)) == NULL)
f3185997
NC
399 {
400 /* xgettext:c-format */
401 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
402 abfd, r_type);
403 bfd_set_error (bfd_error_bad_value);
404 return FALSE;
405 }
406
407 return TRUE;
252b5132
RH
408}
409
410/* Return whether a symbol name implies a local label. The UnixWare
411 2.1 cc generates temporary symbols that start with .X, so we
412 recognize them here. FIXME: do other SVR4 compilers also use .X?.
413 If so, we should move the .X recognition into
414 _bfd_elf_is_local_label_name. */
415
b34976b6 416static bfd_boolean
55fd94b0 417elf_i386_is_local_label_name (bfd *abfd, const char *name)
252b5132
RH
418{
419 if (name[0] == '.' && name[1] == 'X')
b34976b6 420 return TRUE;
252b5132
RH
421
422 return _bfd_elf_is_local_label_name (abfd, name);
423}
424\f
38701953 425/* Support for core dump NOTE sections. */
61adc1a4 426
b34976b6 427static bfd_boolean
55fd94b0 428elf_i386_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
38701953
AM
429{
430 int offset;
eea6121a 431 size_t size;
38701953 432
61adc1a4 433 if (note->namesz == 8 && strcmp (note->namedata, "FreeBSD") == 0)
38701953 434 {
61adc1a4
NC
435 int pr_version = bfd_get_32 (abfd, note->descdata);
436
437 if (pr_version != 1)
07d6d2b8 438 return FALSE;
61adc1a4
NC
439
440 /* pr_cursig */
228e534f 441 elf_tdata (abfd)->core->signal = bfd_get_32 (abfd, note->descdata + 20);
61adc1a4
NC
442
443 /* pr_pid */
228e534f 444 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
61adc1a4
NC
445
446 /* pr_reg */
447 offset = 28;
eea6121a 448 size = bfd_get_32 (abfd, note->descdata + 8);
61adc1a4
NC
449 }
450 else
451 {
452 switch (note->descsz)
453 {
454 default:
455 return FALSE;
38701953 456
61adc1a4
NC
457 case 144: /* Linux/i386 */
458 /* pr_cursig */
228e534f 459 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
38701953 460
61adc1a4 461 /* pr_pid */
228e534f 462 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
38701953 463
61adc1a4
NC
464 /* pr_reg */
465 offset = 72;
eea6121a 466 size = 68;
38701953 467
61adc1a4
NC
468 break;
469 }
38701953
AM
470 }
471
472 /* Make a ".reg/999" section. */
473 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
eea6121a 474 size, note->descpos + offset);
38701953
AM
475}
476
b34976b6 477static bfd_boolean
55fd94b0 478elf_i386_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
38701953 479{
61adc1a4 480 if (note->namesz == 8 && strcmp (note->namedata, "FreeBSD") == 0)
38701953 481 {
61adc1a4
NC
482 int pr_version = bfd_get_32 (abfd, note->descdata);
483
484 if (pr_version != 1)
b34976b6 485 return FALSE;
38701953 486
228e534f 487 elf_tdata (abfd)->core->program
61adc1a4 488 = _bfd_elfcore_strndup (abfd, note->descdata + 8, 17);
228e534f 489 elf_tdata (abfd)->core->command
61adc1a4
NC
490 = _bfd_elfcore_strndup (abfd, note->descdata + 25, 81);
491 }
492 else
493 {
494 switch (note->descsz)
495 {
496 default:
497 return FALSE;
498
499 case 124: /* Linux/i386 elf_prpsinfo. */
228e534f 500 elf_tdata (abfd)->core->pid
261b8d08 501 = bfd_get_32 (abfd, note->descdata + 12);
228e534f 502 elf_tdata (abfd)->core->program
61adc1a4 503 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
228e534f 504 elf_tdata (abfd)->core->command
61adc1a4
NC
505 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
506 }
38701953
AM
507 }
508
509 /* Note that for some reason, a spurious space is tacked
510 onto the end of the args in some (at least one anyway)
511 implementations, so strip it off if it exists. */
38701953 512 {
228e534f 513 char *command = elf_tdata (abfd)->core->command;
38701953
AM
514 int n = strlen (command);
515
516 if (0 < n && command[n - 1] == ' ')
517 command[n - 1] = '\0';
518 }
519
b34976b6 520 return TRUE;
38701953
AM
521}
522\f
523/* Functions for the i386 ELF linker.
524
525 In order to gain some understanding of code in this file without
526 knowing all the intricate details of the linker, note the
527 following:
528
529 Functions named elf_i386_* are called by external routines, other
530 functions are only called locally. elf_i386_* functions appear
531 in this file more or less in the order in which they are called
532 from external routines. eg. elf_i386_check_relocs is called
533 early in the link process, elf_i386_finish_dynamic_sections is
534 one of the last functions. */
535
f604c2a2 536/* The size in bytes of an entry in the lazy procedure linkage table. */
252b5132 537
f604c2a2 538#define LAZY_PLT_ENTRY_SIZE 16
252b5132 539
f604c2a2
L
540/* The size in bytes of an entry in the non-lazy procedure linkage
541 table. */
252b5132 542
f604c2a2
L
543#define NON_LAZY_PLT_ENTRY_SIZE 8
544
545/* The first entry in an absolute lazy procedure linkage table looks
546 like this. See the SVR4 ABI i386 supplement to see how this works.
547 Will be padded to LAZY_PLT_ENTRY_SIZE with lazy_plt->plt0_pad_byte. */
548
549static const bfd_byte elf_i386_lazy_plt0_entry[12] =
252b5132
RH
550{
551 0xff, 0x35, /* pushl contents of address */
552 0, 0, 0, 0, /* replaced with address of .got + 4. */
553 0xff, 0x25, /* jmp indirect */
eac338cf 554 0, 0, 0, 0 /* replaced with address of .got + 8. */
252b5132
RH
555};
556
f604c2a2
L
557/* Subsequent entries in an absolute lazy procedure linkage table look
558 like this. */
252b5132 559
f604c2a2 560static const bfd_byte elf_i386_lazy_plt_entry[LAZY_PLT_ENTRY_SIZE] =
252b5132
RH
561{
562 0xff, 0x25, /* jmp indirect */
563 0, 0, 0, 0, /* replaced with address of this symbol in .got. */
564 0x68, /* pushl immediate */
565 0, 0, 0, 0, /* replaced with offset into relocation table. */
566 0xe9, /* jmp relative */
567 0, 0, 0, 0 /* replaced with offset to start of .plt. */
568};
569
f604c2a2
L
570/* The first entry in a PIC lazy procedure linkage table look like
571 this. Will be padded to LAZY_PLT_ENTRY_SIZE with
572 lazy_plt->plt0_pad_byte. */
252b5132 573
f604c2a2 574static const bfd_byte elf_i386_pic_lazy_plt0_entry[12] =
252b5132
RH
575{
576 0xff, 0xb3, 4, 0, 0, 0, /* pushl 4(%ebx) */
eac338cf 577 0xff, 0xa3, 8, 0, 0, 0 /* jmp *8(%ebx) */
252b5132
RH
578};
579
f604c2a2
L
580/* Subsequent entries in a PIC lazy procedure linkage table look like
581 this. */
252b5132 582
f604c2a2 583static const bfd_byte elf_i386_pic_lazy_plt_entry[LAZY_PLT_ENTRY_SIZE] =
252b5132
RH
584{
585 0xff, 0xa3, /* jmp *offset(%ebx) */
586 0, 0, 0, 0, /* replaced with offset of this symbol in .got. */
587 0x68, /* pushl immediate */
588 0, 0, 0, 0, /* replaced with offset into relocation table. */
589 0xe9, /* jmp relative */
590 0, 0, 0, 0 /* replaced with offset to start of .plt. */
591};
592
f604c2a2 593/* Entries in the non-lazy procedure linkage table look like this. */
dd7e64d4 594
f604c2a2 595static const bfd_byte elf_i386_non_lazy_plt_entry[NON_LAZY_PLT_ENTRY_SIZE] =
dd7e64d4
L
596{
597 0xff, 0x25, /* jmp indirect */
598 0, 0, 0, 0, /* replaced with offset of this symbol in .got. */
599 0x66, 0x90 /* xchg %ax,%ax */
600};
601
f604c2a2
L
602/* Entries in the PIC non-lazy procedure linkage table look like
603 this. */
dd7e64d4 604
f604c2a2 605static const bfd_byte elf_i386_pic_non_lazy_plt_entry[NON_LAZY_PLT_ENTRY_SIZE] =
dd7e64d4
L
606{
607 0xff, 0xa3, /* jmp *offset(%ebx) */
608 0, 0, 0, 0, /* replaced with offset of this symbol in .got. */
609 0x66, 0x90 /* xchg %ax,%ax */
610};
611
ee2fdd6f
L
612/* The first entry in an absolute IBT-enabled lazy procedure linkage
613 table looks like this. */
614
615static const bfd_byte elf_i386_lazy_ibt_plt0_entry[LAZY_PLT_ENTRY_SIZE] =
616{
07d6d2b8
AM
617 0xff, 0x35, 0, 0, 0, 0, /* pushl GOT[1] */
618 0xff, 0x25, 0, 0, 0, 0, /* jmp *GOT[2] */
619 0x0f, 0x1f, 0x40, 0x00 /* nopl 0(%rax) */
ee2fdd6f
L
620};
621
622/* Subsequent entries for an absolute IBT-enabled lazy procedure linkage
623 table look like this. Subsequent entries for a PIC IBT-enabled lazy
624 procedure linkage table are the same. */
625
626static const bfd_byte elf_i386_lazy_ibt_plt_entry[LAZY_PLT_ENTRY_SIZE] =
627{
07d6d2b8
AM
628 0xf3, 0x0f, 0x1e, 0xfb, /* endbr32 */
629 0x68, 0, 0, 0, 0, /* pushl immediate */
630 0xe9, 0, 0, 0, 0, /* jmp relative */
631 0x66, 0x90 /* xchg %ax,%ax */
ee2fdd6f
L
632};
633
634/* The first entry in a PIC IBT-enabled lazy procedure linkage table
635 look like. */
636
637static const bfd_byte elf_i386_pic_lazy_ibt_plt0_entry[LAZY_PLT_ENTRY_SIZE] =
638{
639 0xff, 0xb3, 4, 0, 0, 0, /* pushl 4(%ebx) */
07d6d2b8
AM
640 0xff, 0xa3, 8, 0, 0, 0, /* jmp *8(%ebx) */
641 0x0f, 0x1f, 0x40, 0x00 /* nopl 0(%rax) */
ee2fdd6f
L
642};
643
644/* Entries for branches with IBT-enabled in the absolute non-lazey
645 procedure linkage table look like this. They have the same size
646 as the lazy PLT entry. */
647
648static const bfd_byte elf_i386_non_lazy_ibt_plt_entry[LAZY_PLT_ENTRY_SIZE] =
649{
07d6d2b8 650 0xf3, 0x0f, 0x1e, 0xfb, /* endbr32 */
ee2fdd6f
L
651 0xff, 0x25, 0, 0, 0, 0, /* jmp *name@GOT */
652 0x66, 0x0f, 0x1f, 0x44, 0x00, 0x00 /* nopw 0x0(%rax,%rax,1) */
653};
654
655/* Entries for branches with IBT-enabled in the PIC non-lazey procedure
656 linkage table look like this. They have the same size as the lazy
657 PLT entry. */
658
659static const bfd_byte elf_i386_pic_non_lazy_ibt_plt_entry[LAZY_PLT_ENTRY_SIZE] =
660{
07d6d2b8 661 0xf3, 0x0f, 0x1e, 0xfb, /* endbr32 */
ee2fdd6f
L
662 0xff, 0xa3, 0, 0, 0, 0, /* jmp *name@GOT(%ebx) */
663 0x66, 0x0f, 0x1f, 0x44, 0x00, 0x00 /* nopw 0x0(%rax,%rax,1) */
664};
665
f604c2a2 666/* .eh_frame covering the lazy .plt section. */
e41b3a13 667
f604c2a2 668static const bfd_byte elf_i386_eh_frame_lazy_plt[] =
e41b3a13 669{
e41b3a13
JJ
670 PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
671 0, 0, 0, 0, /* CIE ID */
672 1, /* CIE version */
673 'z', 'R', 0, /* Augmentation string */
674 1, /* Code alignment factor */
675 0x7c, /* Data alignment factor */
676 8, /* Return address column */
677 1, /* Augmentation size */
678 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
679 DW_CFA_def_cfa, 4, 4, /* DW_CFA_def_cfa: r4 (esp) ofs 4 */
680 DW_CFA_offset + 8, 1, /* DW_CFA_offset: r8 (eip) at cfa-4 */
681 DW_CFA_nop, DW_CFA_nop,
682
683 PLT_FDE_LENGTH, 0, 0, 0, /* FDE length */
684 PLT_CIE_LENGTH + 8, 0, 0, 0, /* CIE pointer */
685 0, 0, 0, 0, /* R_386_PC32 .plt goes here */
686 0, 0, 0, 0, /* .plt size goes here */
687 0, /* Augmentation size */
688 DW_CFA_def_cfa_offset, 8, /* DW_CFA_def_cfa_offset: 8 */
689 DW_CFA_advance_loc + 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */
690 DW_CFA_def_cfa_offset, 12, /* DW_CFA_def_cfa_offset: 12 */
691 DW_CFA_advance_loc + 10, /* DW_CFA_advance_loc: 10 to __PLT__+16 */
692 DW_CFA_def_cfa_expression, /* DW_CFA_def_cfa_expression */
693 11, /* Block length */
694 DW_OP_breg4, 4, /* DW_OP_breg4 (esp): 4 */
695 DW_OP_breg8, 0, /* DW_OP_breg8 (eip): 0 */
696 DW_OP_lit15, DW_OP_and, DW_OP_lit11, DW_OP_ge,
28ede8be 697 DW_OP_lit2, DW_OP_shl, DW_OP_plus,
e41b3a13
JJ
698 DW_CFA_nop, DW_CFA_nop, DW_CFA_nop, DW_CFA_nop
699};
700
ee2fdd6f
L
701/* .eh_frame covering the lazy .plt section with IBT-enabled. */
702
703static const bfd_byte elf_i386_eh_frame_lazy_ibt_plt[] =
704{
705 PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
706 0, 0, 0, 0, /* CIE ID */
707 1, /* CIE version */
708 'z', 'R', 0, /* Augmentation string */
709 1, /* Code alignment factor */
710 0x7c, /* Data alignment factor */
711 8, /* Return address column */
712 1, /* Augmentation size */
713 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
714 DW_CFA_def_cfa, 4, 4, /* DW_CFA_def_cfa: r4 (esp) ofs 4 */
715 DW_CFA_offset + 8, 1, /* DW_CFA_offset: r8 (eip) at cfa-4 */
716 DW_CFA_nop, DW_CFA_nop,
717
718 PLT_FDE_LENGTH, 0, 0, 0, /* FDE length */
719 PLT_CIE_LENGTH + 8, 0, 0, 0, /* CIE pointer */
720 0, 0, 0, 0, /* R_386_PC32 .plt goes here */
721 0, 0, 0, 0, /* .plt size goes here */
722 0, /* Augmentation size */
723 DW_CFA_def_cfa_offset, 8, /* DW_CFA_def_cfa_offset: 8 */
724 DW_CFA_advance_loc + 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */
725 DW_CFA_def_cfa_offset, 12, /* DW_CFA_def_cfa_offset: 12 */
726 DW_CFA_advance_loc + 10, /* DW_CFA_advance_loc: 10 to __PLT__+16 */
727 DW_CFA_def_cfa_expression, /* DW_CFA_def_cfa_expression */
728 11, /* Block length */
729 DW_OP_breg4, 4, /* DW_OP_breg4 (esp): 4 */
730 DW_OP_breg8, 0, /* DW_OP_breg8 (eip): 0 */
731 DW_OP_lit15, DW_OP_and, DW_OP_lit9, DW_OP_ge,
732 DW_OP_lit2, DW_OP_shl, DW_OP_plus,
733 DW_CFA_nop, DW_CFA_nop, DW_CFA_nop, DW_CFA_nop
734};
735
f604c2a2 736/* .eh_frame covering the non-lazy .plt section. */
fff53dae 737
f604c2a2 738static const bfd_byte elf_i386_eh_frame_non_lazy_plt[] =
fff53dae
L
739{
740#define PLT_GOT_FDE_LENGTH 16
741 PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
742 0, 0, 0, 0, /* CIE ID */
743 1, /* CIE version */
744 'z', 'R', 0, /* Augmentation string */
745 1, /* Code alignment factor */
746 0x7c, /* Data alignment factor */
747 8, /* Return address column */
748 1, /* Augmentation size */
749 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
750 DW_CFA_def_cfa, 4, 4, /* DW_CFA_def_cfa: r4 (esp) ofs 4 */
751 DW_CFA_offset + 8, 1, /* DW_CFA_offset: r8 (eip) at cfa-4 */
752 DW_CFA_nop, DW_CFA_nop,
753
754 PLT_GOT_FDE_LENGTH, 0, 0, 0, /* FDE length */
755 PLT_CIE_LENGTH + 8, 0, 0, 0, /* CIE pointer */
f604c2a2
L
756 0, 0, 0, 0, /* the start of non-lazy .plt goes here */
757 0, 0, 0, 0, /* non-lazy .plt size goes here */
fff53dae
L
758 0, /* Augmentation size */
759 DW_CFA_nop, DW_CFA_nop, DW_CFA_nop
760};
761
25e762b9 762/* These are the standard parameters. */
765e526c 763static const struct elf_x86_lazy_plt_layout elf_i386_lazy_plt =
25e762b9 764 {
07d6d2b8
AM
765 elf_i386_lazy_plt0_entry, /* plt0_entry */
766 sizeof (elf_i386_lazy_plt0_entry), /* plt0_entry_size */
767 elf_i386_lazy_plt_entry, /* plt_entry */
768 LAZY_PLT_ENTRY_SIZE, /* plt_entry_size */
92e68c1d
L
769 NULL, /* plt_tlsdesc_entry */
770 0, /* plt_tlsdesc_entry_size*/
771 0, /* plt_tlsdesc_got1_offset */
772 0, /* plt_tlsdesc_got2_offset */
773 0, /* plt_tlsdesc_got1_insn_end */
774 0, /* plt_tlsdesc_got2_insn_end */
07d6d2b8
AM
775 2, /* plt0_got1_offset */
776 8, /* plt0_got2_offset */
777 0, /* plt0_got2_insn_end */
778 2, /* plt_got_offset */
779 7, /* plt_reloc_offset */
780 12, /* plt_plt_offset */
781 0, /* plt_got_insn_size */
782 0, /* plt_plt_insn_end */
783 6, /* plt_lazy_offset */
784 elf_i386_pic_lazy_plt0_entry, /* pic_plt0_entry */
785 elf_i386_pic_lazy_plt_entry, /* pic_plt_entry */
786 elf_i386_eh_frame_lazy_plt, /* eh_frame_plt */
f604c2a2
L
787 sizeof (elf_i386_eh_frame_lazy_plt) /* eh_frame_plt_size */
788 };
789
765e526c 790static const struct elf_x86_non_lazy_plt_layout elf_i386_non_lazy_plt =
f604c2a2 791 {
07d6d2b8
AM
792 elf_i386_non_lazy_plt_entry, /* plt_entry */
793 elf_i386_pic_non_lazy_plt_entry, /* pic_plt_entry */
794 NON_LAZY_PLT_ENTRY_SIZE, /* plt_entry_size */
795 2, /* plt_got_offset */
796 0, /* plt_got_insn_size */
797 elf_i386_eh_frame_non_lazy_plt, /* eh_frame_plt */
f604c2a2 798 sizeof (elf_i386_eh_frame_non_lazy_plt) /* eh_frame_plt_size */
25e762b9 799 };
ee2fdd6f 800
765e526c 801static const struct elf_x86_lazy_plt_layout elf_i386_lazy_ibt_plt =
ee2fdd6f 802 {
07d6d2b8 803 elf_i386_lazy_ibt_plt0_entry, /* plt0_entry */
ee2fdd6f 804 sizeof (elf_i386_lazy_ibt_plt0_entry), /* plt0_entry_size */
07d6d2b8
AM
805 elf_i386_lazy_ibt_plt_entry, /* plt_entry */
806 LAZY_PLT_ENTRY_SIZE, /* plt_entry_size */
92e68c1d
L
807 NULL, /* plt_tlsdesc_entry */
808 0, /* plt_tlsdesc_entry_size*/
809 0, /* plt_tlsdesc_got1_offset */
810 0, /* plt_tlsdesc_got2_offset */
811 0, /* plt_tlsdesc_got1_insn_end */
812 0, /* plt_tlsdesc_got2_insn_end */
07d6d2b8
AM
813 2, /* plt0_got1_offset */
814 8, /* plt0_got2_offset */
815 0, /* plt0_got2_insn_end */
816 4+2, /* plt_got_offset */
817 4+1, /* plt_reloc_offset */
818 4+6, /* plt_plt_offset */
819 0, /* plt_got_insn_size */
820 0, /* plt_plt_insn_end */
821 0, /* plt_lazy_offset */
822 elf_i386_pic_lazy_ibt_plt0_entry, /* pic_plt0_entry */
823 elf_i386_lazy_ibt_plt_entry, /* pic_plt_entry */
824 elf_i386_eh_frame_lazy_ibt_plt, /* eh_frame_plt */
ee2fdd6f
L
825 sizeof (elf_i386_eh_frame_lazy_ibt_plt) /* eh_frame_plt_size */
826 };
827
765e526c 828static const struct elf_x86_non_lazy_plt_layout elf_i386_non_lazy_ibt_plt =
ee2fdd6f 829 {
07d6d2b8 830 elf_i386_non_lazy_ibt_plt_entry, /* plt_entry */
ee2fdd6f 831 elf_i386_pic_non_lazy_ibt_plt_entry,/* pic_plt_entry */
07d6d2b8
AM
832 LAZY_PLT_ENTRY_SIZE, /* plt_entry_size */
833 4+2, /* plt_got_offset */
834 0, /* plt_got_insn_size */
835 elf_i386_eh_frame_non_lazy_plt, /* eh_frame_plt */
ee2fdd6f
L
836 sizeof (elf_i386_eh_frame_non_lazy_plt) /* eh_frame_plt_size */
837 };
25e762b9
RM
838\f
839
eac338cf
PB
840/* On VxWorks, the .rel.plt.unloaded section has absolute relocations
841 for the PLTResolve stub and then for each PLT entry. */
842#define PLTRESOLVE_RELOCS_SHLIB 0
843#define PLTRESOLVE_RELOCS 2
844#define PLT_NON_JUMP_SLOT_RELOCS 2
845
142411ca
L
846/* Return TRUE if the TLS access code sequence support transition
847 from R_TYPE. */
848
849static bfd_boolean
bedfd056 850elf_i386_check_tls_transition (asection *sec,
142411ca
L
851 bfd_byte *contents,
852 Elf_Internal_Shdr *symtab_hdr,
853 struct elf_link_hash_entry **sym_hashes,
854 unsigned int r_type,
855 const Elf_Internal_Rela *rel,
856 const Elf_Internal_Rela *relend)
13ae64f3 857{
6eaa7fb5 858 unsigned int val, type, reg;
142411ca
L
859 unsigned long r_symndx;
860 struct elf_link_hash_entry *h;
861 bfd_vma offset;
6eaa7fb5 862 bfd_byte *call;
1d4af308 863 bfd_boolean indirect_call;
142411ca 864
142411ca 865 offset = rel->r_offset;
13ae64f3 866 switch (r_type)
142411ca
L
867 {
868 case R_386_TLS_GD:
869 case R_386_TLS_LDM:
870 if (offset < 2 || (rel + 1) >= relend)
871 return FALSE;
872
6eaa7fb5
L
873 indirect_call = FALSE;
874 call = contents + offset + 4;
875 val = *(call - 5);
876 type = *(call - 6);
142411ca
L
877 if (r_type == R_386_TLS_GD)
878 {
09e8c3bf 879 /* Check transition from GD access model. Only
6eaa7fb5
L
880 leal foo@tlsgd(,%ebx,1), %eax
881 call ___tls_get_addr@PLT
882 or
883 leal foo@tlsgd(%ebx) %eax
884 call ___tls_get_addr@PLT
885 nop
886 or
887 leal foo@tlsgd(%reg), %eax
888 call *___tls_get_addr@GOT(%reg)
889 which may be converted to
890 addr32 call ___tls_get_addr
142411ca 891 can transit to different access model. */
6eaa7fb5
L
892 if ((offset + 10) > sec->size
893 || (type != 0x8d && type != 0x04))
142411ca
L
894 return FALSE;
895
142411ca
L
896 if (type == 0x04)
897 {
6eaa7fb5
L
898 /* leal foo@tlsgd(,%ebx,1), %eax
899 call ___tls_get_addr@PLT */
142411ca
L
900 if (offset < 3)
901 return FALSE;
902
6eaa7fb5
L
903 if (*(call - 7) != 0x8d
904 || val != 0x1d
905 || call[0] != 0xe8)
142411ca
L
906 return FALSE;
907 }
908 else
909 {
6eaa7fb5
L
910 /* This must be
911 leal foo@tlsgd(%ebx), %eax
912 call ___tls_get_addr@PLT
913 nop
914 or
915 leal foo@tlsgd(%reg), %eax
916 call *___tls_get_addr@GOT(%reg)
917 which may be converted to
918 addr32 call ___tls_get_addr
919
920 %eax can't be used as the GOT base register since it
921 is used to pass parameter to ___tls_get_addr. */
922 reg = val & 7;
923 if ((val & 0xf8) != 0x80 || reg == 4 || reg == 0)
142411ca
L
924 return FALSE;
925
6eaa7fb5
L
926 indirect_call = call[0] == 0xff;
927 if (!(reg == 3 && call[0] == 0xe8 && call[5] == 0x90)
928 && !(call[0] == 0x67 && call[1] == 0xe8)
929 && !(indirect_call
930 && (call[1] & 0xf8) == 0x90
931 && (call[1] & 0x7) == reg))
142411ca
L
932 return FALSE;
933 }
934 }
935 else
936 {
937 /* Check transition from LD access model. Only
6eaa7fb5
L
938 leal foo@tlsldm(%ebx), %eax
939 call ___tls_get_addr@PLT
940 or
941 leal foo@tlsldm(%reg), %eax
942 call *___tls_get_addr@GOT(%reg)
943 which may be converted to
944 addr32 call ___tls_get_addr
142411ca
L
945 can transit to different access model. */
946 if (type != 0x8d || (offset + 9) > sec->size)
947 return FALSE;
948
6eaa7fb5
L
949 /* %eax can't be used as the GOT base register since it is
950 used to pass parameter to ___tls_get_addr. */
951 reg = val & 7;
952 if ((val & 0xf8) != 0x80 || reg == 4 || reg == 0)
142411ca 953 return FALSE;
142411ca 954
6eaa7fb5
L
955 indirect_call = call[0] == 0xff;
956 if (!(reg == 3 && call[0] == 0xe8)
957 && !(call[0] == 0x67 && call[1] == 0xe8)
958 && !(indirect_call
959 && (call[1] & 0xf8) == 0x90
960 && (call[1] & 0x7) == reg))
961 return FALSE;
962 }
142411ca
L
963
964 r_symndx = ELF32_R_SYM (rel[1].r_info);
965 if (r_symndx < symtab_hdr->sh_info)
966 return FALSE;
967
968 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1d4af308 969 if (h == NULL
0afcef53 970 || !((struct elf_x86_link_hash_entry *) h)->tls_get_addr)
6eaa7fb5
L
971 return FALSE;
972 else if (indirect_call)
973 return (ELF32_R_TYPE (rel[1].r_info) == R_386_GOT32X);
974 else
975 return (ELF32_R_TYPE (rel[1].r_info) == R_386_PC32
976 || ELF32_R_TYPE (rel[1].r_info) == R_386_PLT32);
142411ca
L
977
978 case R_386_TLS_IE:
979 /* Check transition from IE access model:
980 movl foo@indntpoff(%rip), %eax
981 movl foo@indntpoff(%rip), %reg
982 addl foo@indntpoff(%rip), %reg
983 */
984
985 if (offset < 1 || (offset + 4) > sec->size)
986 return FALSE;
987
988 /* Check "movl foo@tpoff(%rip), %eax" first. */
989 val = bfd_get_8 (abfd, contents + offset - 1);
990 if (val == 0xa1)
991 return TRUE;
992
993 if (offset < 2)
994 return FALSE;
995
996 /* Check movl|addl foo@tpoff(%rip), %reg. */
997 type = bfd_get_8 (abfd, contents + offset - 2);
998 return ((type == 0x8b || type == 0x03)
999 && (val & 0xc7) == 0x05);
1000
1001 case R_386_TLS_GOTIE:
1002 case R_386_TLS_IE_32:
1003 /* Check transition from {IE_32,GOTIE} access model:
1004 subl foo@{tpoff,gontoff}(%reg1), %reg2
1005 movl foo@{tpoff,gontoff}(%reg1), %reg2
1006 addl foo@{tpoff,gontoff}(%reg1), %reg2
1007 */
1008
1009 if (offset < 2 || (offset + 4) > sec->size)
1010 return FALSE;
1011
1012 val = bfd_get_8 (abfd, contents + offset - 1);
1013 if ((val & 0xc0) != 0x80 || (val & 7) == 4)
1014 return FALSE;
1015
1016 type = bfd_get_8 (abfd, contents + offset - 2);
1017 return type == 0x8b || type == 0x2b || type == 0x03;
1018
1019 case R_386_TLS_GOTDESC:
1020 /* Check transition from GDesc access model:
1021 leal x@tlsdesc(%ebx), %eax
1022
1023 Make sure it's a leal adding ebx to a 32-bit offset
1024 into any register, although it's probably almost always
1025 going to be eax. */
1026
1027 if (offset < 2 || (offset + 4) > sec->size)
1028 return FALSE;
1029
1030 if (bfd_get_8 (abfd, contents + offset - 2) != 0x8d)
1031 return FALSE;
1032
1033 val = bfd_get_8 (abfd, contents + offset - 1);
1034 return (val & 0xc7) == 0x83;
1035
1036 case R_386_TLS_DESC_CALL:
1037 /* Check transition from GDesc access model:
6eaa7fb5 1038 call *x@tlsdesc(%eax)
142411ca
L
1039 */
1040 if (offset + 2 <= sec->size)
1041 {
6eaa7fb5
L
1042 /* Make sure that it's a call *x@tlsdesc(%eax). */
1043 call = contents + offset;
1044 return call[0] == 0xff && call[1] == 0x10;
142411ca
L
1045 }
1046
1047 return FALSE;
1048
1049 default:
1050 abort ();
1051 }
1052}
1053
1054/* Return TRUE if the TLS access transition is OK or no transition
1055 will be performed. Update R_TYPE if there is a transition. */
1056
1057static bfd_boolean
1058elf_i386_tls_transition (struct bfd_link_info *info, bfd *abfd,
1059 asection *sec, bfd_byte *contents,
1060 Elf_Internal_Shdr *symtab_hdr,
1061 struct elf_link_hash_entry **sym_hashes,
1062 unsigned int *r_type, int tls_type,
1063 const Elf_Internal_Rela *rel,
1064 const Elf_Internal_Rela *relend,
4c544807 1065 struct elf_link_hash_entry *h,
bedfd056
L
1066 unsigned long r_symndx,
1067 bfd_boolean from_relocate_section)
142411ca
L
1068{
1069 unsigned int from_type = *r_type;
1070 unsigned int to_type = from_type;
1071 bfd_boolean check = TRUE;
1072
bb1cb422
L
1073 /* Skip TLS transition for functions. */
1074 if (h != NULL
1075 && (h->type == STT_FUNC
1076 || h->type == STT_GNU_IFUNC))
1077 return TRUE;
1078
142411ca 1079 switch (from_type)
13ae64f3
JJ
1080 {
1081 case R_386_TLS_GD:
67a4f2b7
AO
1082 case R_386_TLS_GOTDESC:
1083 case R_386_TLS_DESC_CALL:
13ae64f3 1084 case R_386_TLS_IE_32:
37e55690
JJ
1085 case R_386_TLS_IE:
1086 case R_386_TLS_GOTIE:
0e1862bb 1087 if (bfd_link_executable (info))
142411ca
L
1088 {
1089 if (h == NULL)
1090 to_type = R_386_TLS_LE_32;
1091 else if (from_type != R_386_TLS_IE
1092 && from_type != R_386_TLS_GOTIE)
1093 to_type = R_386_TLS_IE_32;
1094 }
1095
bedfd056
L
1096 /* When we are called from elf_i386_relocate_section, there may
1097 be additional transitions based on TLS_TYPE. */
1098 if (from_relocate_section)
142411ca
L
1099 {
1100 unsigned int new_to_type = to_type;
1101
51537393 1102 if (TLS_TRANSITION_IE_TO_LE_P (info, h, tls_type))
142411ca
L
1103 new_to_type = R_386_TLS_LE_32;
1104
1105 if (to_type == R_386_TLS_GD
1106 || to_type == R_386_TLS_GOTDESC
1107 || to_type == R_386_TLS_DESC_CALL)
1108 {
1109 if (tls_type == GOT_TLS_IE_POS)
1110 new_to_type = R_386_TLS_GOTIE;
1111 else if (tls_type & GOT_TLS_IE)
1112 new_to_type = R_386_TLS_IE_32;
1113 }
1114
1115 /* We checked the transition before when we were called from
1116 elf_i386_check_relocs. We only want to check the new
1117 transition which hasn't been checked before. */
1118 check = new_to_type != to_type && from_type == to_type;
1119 to_type = new_to_type;
1120 }
1121
1122 break;
1123
13ae64f3 1124 case R_386_TLS_LDM:
0e1862bb 1125 if (bfd_link_executable (info))
142411ca
L
1126 to_type = R_386_TLS_LE_32;
1127 break;
1128
1129 default:
1130 return TRUE;
1131 }
1132
1133 /* Return TRUE if there is no transition. */
1134 if (from_type == to_type)
1135 return TRUE;
1136
1137 /* Check if the transition can be performed. */
1138 if (check
bedfd056 1139 && ! elf_i386_check_tls_transition (sec, contents,
142411ca
L
1140 symtab_hdr, sym_hashes,
1141 from_type, rel, relend))
1142 {
2f629d23 1143 reloc_howto_type *from, *to;
4c544807 1144 const char *name;
142411ca 1145
b366503e
L
1146 from = elf_i386_rtype_to_howto (from_type);
1147 to = elf_i386_rtype_to_howto (to_type);
142411ca 1148
4c544807
L
1149 if (h)
1150 name = h->root.root.string;
1151 else
1152 {
0afcef53 1153 struct elf_x86_link_hash_table *htab;
4dfe6ac6 1154
0afcef53 1155 htab = elf_x86_hash_table (info, I386_ELF_DATA);
4dfe6ac6
NC
1156 if (htab == NULL)
1157 name = "*unknown*";
1158 else
1159 {
1160 Elf_Internal_Sym *isym;
1161
1162 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1163 abfd, r_symndx);
1164 name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
1165 }
4c544807
L
1166 }
1167
4eca0228 1168 _bfd_error_handler
695344c0 1169 /* xgettext:c-format */
2dcf00ce
AM
1170 (_("%pB: TLS transition from %s to %s against `%s'"
1171 " at %#" PRIx64 " in section `%pA' failed"),
c08bb8dd 1172 abfd, from->name, to->name, name,
2dcf00ce 1173 (uint64_t) rel->r_offset, sec);
142411ca
L
1174 bfd_set_error (bfd_error_bad_value);
1175 return FALSE;
13ae64f3
JJ
1176 }
1177
142411ca
L
1178 *r_type = to_type;
1179 return TRUE;
13ae64f3
JJ
1180}
1181
c175a657
L
1182/* With the local symbol, foo, we convert
1183 mov foo@GOT[(%reg1)], %reg2
1184 to
1185 lea foo[@GOTOFF(%reg1)], %reg2
1186 and convert
1187 call/jmp *foo@GOT[(%reg)]
1188 to
1189 nop call foo/jmp foo nop
1190 When PIC is false, convert
1191 test %reg1, foo@GOT[(%reg2)]
1192 to
1193 test $foo, %reg1
1194 and convert
1195 binop foo@GOT[(%reg1)], %reg2
1196 to
1197 binop $foo, %reg2
1198 where binop is one of adc, add, and, cmp, or, sbb, sub, xor
1199 instructions. */
1200
1201static
1202bfd_boolean
1203elf_i386_convert_load_reloc (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
1204 bfd_byte *contents,
6999821f 1205 unsigned int *r_type_p,
c175a657
L
1206 Elf_Internal_Rela *irel,
1207 struct elf_link_hash_entry *h,
5e5e02ae 1208 bfd_boolean *converted,
c175a657
L
1209 struct bfd_link_info *link_info)
1210{
0afcef53 1211 struct elf_x86_link_hash_table *htab;
c175a657
L
1212 unsigned int opcode;
1213 unsigned int modrm;
1214 bfd_boolean baseless;
1215 Elf_Internal_Sym *isym;
1216 unsigned int addend;
1217 unsigned int nop;
1218 bfd_vma nop_offset;
1219 bfd_boolean is_pic;
1220 bfd_boolean to_reloc_32;
382aae06 1221 bfd_boolean abs_symbol;
c175a657
L
1222 unsigned int r_type;
1223 unsigned int r_symndx;
1224 bfd_vma roff = irel->r_offset;
0a27fed7
L
1225 bfd_boolean local_ref;
1226 struct elf_x86_link_hash_entry *eh;
c175a657
L
1227
1228 if (roff < 2)
1229 return TRUE;
1230
7d4d9709 1231 /* Addend for R_386_GOT32X relocations must be 0. */
c175a657
L
1232 addend = bfd_get_32 (abfd, contents + roff);
1233 if (addend != 0)
1234 return TRUE;
1235
0afcef53 1236 htab = elf_x86_hash_table (link_info, I386_ELF_DATA);
c175a657
L
1237 is_pic = bfd_link_pic (link_info);
1238
6999821f 1239 r_type = *r_type_p;
c175a657
L
1240 r_symndx = ELF32_R_SYM (irel->r_info);
1241
1242 modrm = bfd_get_8 (abfd, contents + roff - 1);
1243 baseless = (modrm & 0xc7) == 0x5;
1244
382aae06
L
1245 if (h)
1246 {
1247 /* NB: Also set linker_def via SYMBOL_REFERENCES_LOCAL_P. */
1248 local_ref = SYMBOL_REFERENCES_LOCAL_P (link_info, h);
1249 isym = NULL;
1250 abs_symbol = ABS_SYMBOL_P (h);
1251 }
1252 else
1253 {
1254 local_ref = TRUE;
1255 isym = bfd_sym_from_r_symndx (&htab->sym_cache, abfd,
1256 r_symndx);
1257 abs_symbol = isym->st_shndx == SHN_ABS;
1258 }
1259
7d4d9709 1260 if (baseless && is_pic)
c175a657
L
1261 {
1262 /* For PIC, disallow R_386_GOT32X without a base register
7d4d9709 1263 since we don't know what the GOT base is. */
c175a657
L
1264 const char *name;
1265
1266 if (h == NULL)
382aae06 1267 name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
c175a657
L
1268 else
1269 name = h->root.root.string;
1270
4eca0228 1271 _bfd_error_handler
695344c0 1272 /* xgettext:c-format */
871b3ab2 1273 (_("%pB: direct GOT relocation R_386_GOT32X against `%s' without base"
63a5468a 1274 " register can not be used when making a shared object"),
c175a657
L
1275 abfd, name);
1276 return FALSE;
1277 }
1278
1279 opcode = bfd_get_8 (abfd, contents + roff - 2);
1280
c175a657
L
1281 /* Convert to R_386_32 if PIC is false or there is no base
1282 register. */
1283 to_reloc_32 = !is_pic || baseless;
1284
0a27fed7
L
1285 eh = elf_x86_hash_entry (h);
1286
7d4d9709
L
1287 /* Try to convert R_386_GOT32X. Get the symbol referred to by the
1288 reloc. */
c175a657
L
1289 if (h == NULL)
1290 {
1291 if (opcode == 0x0ff)
1292 /* Convert "call/jmp *foo@GOT[(%reg)]". */
1293 goto convert_branch;
1294 else
1295 /* Convert "mov foo@GOT[(%reg1)], %reg2",
1296 "test %reg1, foo@GOT(%reg2)" and
1297 "binop foo@GOT[(%reg1)], %reg2". */
1298 goto convert_load;
1299 }
1300
1301 /* Undefined weak symbol is only bound locally in executable
1302 and its reference is resolved as 0. */
0a27fed7
L
1303 if (h->root.type == bfd_link_hash_undefweak
1304 && !eh->linker_def
1305 && local_ref)
c175a657
L
1306 {
1307 if (opcode == 0xff)
1308 {
1309 /* No direct branch to 0 for PIC. */
1310 if (is_pic)
1311 return TRUE;
1312 else
1313 goto convert_branch;
1314 }
1315 else
1316 {
1317 /* We can convert load of address 0 to R_386_32. */
1318 to_reloc_32 = TRUE;
1319 goto convert_load;
1320 }
1321 }
1322
1323 if (opcode == 0xff)
1324 {
1325 /* We have "call/jmp *foo@GOT[(%reg)]". */
1326 if ((h->root.type == bfd_link_hash_defined
1327 || h->root.type == bfd_link_hash_defweak)
0a27fed7 1328 && local_ref)
c175a657
L
1329 {
1330 /* The function is locally defined. */
dc1e8a47 1331 convert_branch:
c175a657
L
1332 /* Convert R_386_GOT32X to R_386_PC32. */
1333 if (modrm == 0x15 || (modrm & 0xf8) == 0x90)
1334 {
1335 /* Convert to "nop call foo". ADDR_PREFIX_OPCODE
1336 is a nop prefix. */
1337 modrm = 0xe8;
6eaa7fb5
L
1338 /* To support TLS optimization, always use addr32 prefix
1339 for "call *___tls_get_addr@GOT(%reg)". */
1d4af308 1340 if (eh && eh->tls_get_addr)
c175a657 1341 {
6eaa7fb5
L
1342 nop = 0x67;
1343 nop_offset = irel->r_offset - 2;
c175a657
L
1344 }
1345 else
6eaa7fb5 1346 {
5b9c07b2
L
1347 nop = htab->params->call_nop_byte;
1348 if (htab->params->call_nop_as_suffix)
6eaa7fb5
L
1349 {
1350 nop_offset = roff + 3;
1351 irel->r_offset -= 1;
1352 }
1353 else
1354 nop_offset = roff - 2;
1355 }
c175a657
L
1356 }
1357 else
1358 {
1359 /* Convert to "jmp foo nop". */
1360 modrm = 0xe9;
1361 nop = NOP_OPCODE;
1362 nop_offset = roff + 3;
1363 irel->r_offset -= 1;
1364 }
1365
1366 bfd_put_8 (abfd, nop, contents + nop_offset);
1367 bfd_put_8 (abfd, modrm, contents + irel->r_offset - 1);
1368 /* When converting to PC-relative relocation, we
1369 need to adjust addend by -4. */
1370 bfd_put_32 (abfd, -4, contents + irel->r_offset);
1371 irel->r_info = ELF32_R_INFO (r_symndx, R_386_PC32);
6999821f 1372 *r_type_p = R_386_PC32;
5e5e02ae 1373 *converted = TRUE;
c175a657
L
1374 }
1375 }
1376 else
1377 {
1378 /* We have "mov foo@GOT[(%re1g)], %reg2",
1379 "test %reg1, foo@GOT(%reg2)" and
1380 "binop foo@GOT[(%reg1)], %reg2".
1381
1382 Avoid optimizing _DYNAMIC since ld.so may use its
1383 link-time address. */
1384 if (h == htab->elf.hdynamic)
1385 return TRUE;
1386
1387 /* def_regular is set by an assignment in a linker script in
cbd0eecf
L
1388 bfd_elf_record_link_assignment. start_stop is set on
1389 __start_SECNAME/__stop_SECNAME which mark section SECNAME. */
1390 if (h->start_stop
0a27fed7 1391 || eh->linker_def
cbd0eecf
L
1392 || ((h->def_regular
1393 || h->root.type == bfd_link_hash_defined
1394 || h->root.type == bfd_link_hash_defweak)
0a27fed7 1395 && local_ref))
c175a657 1396 {
dc1e8a47 1397 convert_load:
c175a657
L
1398 if (opcode == 0x8b)
1399 {
382aae06
L
1400 if (abs_symbol && local_ref)
1401 to_reloc_32 = TRUE;
1402
c175a657
L
1403 if (to_reloc_32)
1404 {
1405 /* Convert "mov foo@GOT[(%reg1)], %reg2" to
1406 "mov $foo, %reg2" with R_386_32. */
1407 r_type = R_386_32;
1408 modrm = 0xc0 | (modrm & 0x38) >> 3;
1409 bfd_put_8 (abfd, modrm, contents + roff - 1);
1410 opcode = 0xc7;
1411 }
1412 else
1413 {
1414 /* Convert "mov foo@GOT(%reg1), %reg2" to
1415 "lea foo@GOTOFF(%reg1), %reg2". */
1416 r_type = R_386_GOTOFF;
1417 opcode = 0x8d;
1418 }
1419 }
1420 else
1421 {
1422 /* Only R_386_32 is supported. */
1423 if (!to_reloc_32)
1424 return TRUE;
1425
1426 if (opcode == 0x85)
1427 {
1428 /* Convert "test %reg1, foo@GOT(%reg2)" to
1429 "test $foo, %reg1". */
1430 modrm = 0xc0 | (modrm & 0x38) >> 3;
1431 opcode = 0xf7;
1432 }
1433 else
1434 {
1435 /* Convert "binop foo@GOT(%reg1), %reg2" to
1436 "binop $foo, %reg2". */
1437 modrm = (0xc0
1438 | (modrm & 0x38) >> 3
1439 | (opcode & 0x3c));
1440 opcode = 0x81;
1441 }
1442 bfd_put_8 (abfd, modrm, contents + roff - 1);
1443 r_type = R_386_32;
1444 }
1445
1446 bfd_put_8 (abfd, opcode, contents + roff - 2);
1447 irel->r_info = ELF32_R_INFO (r_symndx, r_type);
6999821f 1448 *r_type_p = r_type;
5e5e02ae 1449 *converted = TRUE;
c175a657
L
1450 }
1451 }
1452
1453 return TRUE;
1454}
1455
c1d11331
L
1456/* Rename some of the generic section flags to better document how they
1457 are used here. */
6999821f 1458#define check_relocs_failed sec_flg0
c1d11331 1459
252b5132 1460/* Look through the relocs for a section during the first phase, and
0ac8d2ca
AM
1461 calculate needed space in the global offset table, procedure linkage
1462 table, and dynamic reloc sections. */
252b5132 1463
b34976b6 1464static bfd_boolean
55fd94b0
AM
1465elf_i386_check_relocs (bfd *abfd,
1466 struct bfd_link_info *info,
1467 asection *sec,
1468 const Elf_Internal_Rela *relocs)
252b5132 1469{
0afcef53 1470 struct elf_x86_link_hash_table *htab;
252b5132
RH
1471 Elf_Internal_Shdr *symtab_hdr;
1472 struct elf_link_hash_entry **sym_hashes;
252b5132
RH
1473 const Elf_Internal_Rela *rel;
1474 const Elf_Internal_Rela *rel_end;
252b5132 1475 asection *sreloc;
bedfd056 1476 bfd_byte *contents;
5e5e02ae 1477 bfd_boolean converted;
252b5132 1478
0e1862bb 1479 if (bfd_link_relocatable (info))
b34976b6 1480 return TRUE;
252b5132 1481
0afcef53 1482 htab = elf_x86_hash_table (info, I386_ELF_DATA);
4dfe6ac6 1483 if (htab == NULL)
c337a162
L
1484 {
1485 sec->check_relocs_failed = 1;
1486 return FALSE;
1487 }
4dfe6ac6 1488
fe53b4a4
L
1489 BFD_ASSERT (is_x86_elf (abfd, htab));
1490
bedfd056
L
1491 /* Get the section contents. */
1492 if (elf_section_data (sec)->this_hdr.contents != NULL)
1493 contents = elf_section_data (sec)->this_hdr.contents;
1494 else if (!bfd_malloc_and_get_section (abfd, sec, &contents))
1495 {
1496 sec->check_relocs_failed = 1;
1497 return FALSE;
1498 }
1499
0ffa91dd 1500 symtab_hdr = &elf_symtab_hdr (abfd);
252b5132 1501 sym_hashes = elf_sym_hashes (abfd);
252b5132 1502
5e5e02ae
L
1503 converted = FALSE;
1504
252b5132
RH
1505 sreloc = NULL;
1506
1507 rel_end = relocs + sec->reloc_count;
1508 for (rel = relocs; rel < rel_end; rel++)
1509 {
13ae64f3 1510 unsigned int r_type;
d42c267e 1511 unsigned int r_symndx;
252b5132 1512 struct elf_link_hash_entry *h;
0afcef53 1513 struct elf_x86_link_hash_entry *eh;
4c544807
L
1514 Elf_Internal_Sym *isym;
1515 const char *name;
06a6a421 1516 bfd_boolean size_reloc;
382aae06 1517 bfd_boolean no_dynreloc;
252b5132
RH
1518
1519 r_symndx = ELF32_R_SYM (rel->r_info);
13ae64f3 1520 r_type = ELF32_R_TYPE (rel->r_info);
252b5132 1521
d9bc7a44 1522 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
f5f31454 1523 {
695344c0 1524 /* xgettext:c-format */
871b3ab2 1525 _bfd_error_handler (_("%pB: bad symbol index: %d"),
4eca0228 1526 abfd, r_symndx);
c337a162 1527 goto error_return;
f5f31454
L
1528 }
1529
252b5132 1530 if (r_symndx < symtab_hdr->sh_info)
c25bc9fc
L
1531 {
1532 /* A local symbol. */
c2e61a4e
L
1533 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1534 abfd, r_symndx);
1535 if (isym == NULL)
c337a162 1536 goto error_return;
c25bc9fc
L
1537
1538 /* Check relocation against local STT_GNU_IFUNC symbol. */
c25bc9fc
L
1539 if (ELF32_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
1540 {
0afcef53 1541 h = _bfd_elf_x86_get_local_sym_hash (htab, abfd, rel, TRUE);
c25bc9fc 1542 if (h == NULL)
c337a162 1543 goto error_return;
6bbec505 1544
c25bc9fc 1545 /* Fake a STT_GNU_IFUNC symbol. */
6322e5c5
L
1546 h->root.root.string = bfd_elf_sym_name (abfd, symtab_hdr,
1547 isym, NULL);
c25bc9fc
L
1548 h->type = STT_GNU_IFUNC;
1549 h->def_regular = 1;
1550 h->ref_regular = 1;
1551 h->forced_local = 1;
1552 h->root.type = bfd_link_hash_defined;
1553 }
1554 else
1555 h = NULL;
1556 }
252b5132 1557 else
71cb9464 1558 {
4c544807 1559 isym = NULL;
71cb9464
L
1560 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1561 while (h->root.type == bfd_link_hash_indirect
1562 || h->root.type == bfd_link_hash_warning)
1563 h = (struct elf_link_hash_entry *) h->root.u.i.link;
c25bc9fc 1564 }
cbe950e9 1565
0afcef53 1566 eh = (struct elf_x86_link_hash_entry *) h;
c25bc9fc
L
1567 if (h != NULL)
1568 {
f604c2a2
L
1569 if (r_type == R_386_GOTOFF)
1570 eh->gotoff_ref = 1;
cbe950e9 1571
ad1e85de
L
1572 /* It is referenced by a non-shared object. */
1573 h->ref_regular = 1;
71cb9464 1574 }
252b5132 1575
6999821f
L
1576 if (r_type == R_386_GOT32X
1577 && (h == NULL || h->type != STT_GNU_IFUNC))
1578 {
1579 Elf_Internal_Rela *irel = (Elf_Internal_Rela *) rel;
1580 if (!elf_i386_convert_load_reloc (abfd, symtab_hdr, contents,
5e5e02ae
L
1581 &r_type, irel, h,
1582 &converted, info))
6999821f
L
1583 goto error_return;
1584 }
1585
382aae06
L
1586 if (!_bfd_elf_x86_valid_reloc_p (sec, info, htab, rel, h, isym,
1587 symtab_hdr, &no_dynreloc))
1588 return FALSE;
1589
bedfd056 1590 if (! elf_i386_tls_transition (info, abfd, sec, contents,
142411ca
L
1591 symtab_hdr, sym_hashes,
1592 &r_type, GOT_UNKNOWN,
bedfd056 1593 rel, rel_end, h, r_symndx, FALSE))
c337a162 1594 goto error_return;
13ae64f3 1595
cd048363
L
1596 /* Check if _GLOBAL_OFFSET_TABLE_ is referenced. */
1597 if (h == htab->elf.hgot)
1598 htab->got_referenced = TRUE;
1599
13ae64f3 1600 switch (r_type)
252b5132 1601 {
37e55690 1602 case R_386_TLS_LDM:
0f09b4d8 1603 htab->tls_ld_or_ldm_got.refcount = 1;
37e55690
JJ
1604 goto create_got;
1605
1606 case R_386_PLT32:
1607 /* This symbol requires a procedure linkage table entry. We
1608 actually build the entry in adjust_dynamic_symbol,
1609 because this might be a case of linking PIC code which is
1610 never referenced by a dynamic object, in which case we
1611 don't need to generate a procedure linkage table entry
1612 after all. */
1613
1614 /* If this is a local symbol, we resolve it directly without
1615 creating a procedure linkage table entry. */
1616 if (h == NULL)
1617 continue;
1618
98b273dc 1619 eh->zero_undefweak &= 0x2;
f5385ebf 1620 h->needs_plt = 1;
79b0c981 1621 h->plt.refcount = 1;
37e55690
JJ
1622 break;
1623
6a3e1bae 1624 case R_386_SIZE32:
06a6a421 1625 size_reloc = TRUE;
6a3e1bae
L
1626 goto do_size;
1627
13ae64f3 1628 case R_386_TLS_IE_32:
37e55690
JJ
1629 case R_386_TLS_IE:
1630 case R_386_TLS_GOTIE:
0e1862bb 1631 if (!bfd_link_executable (info))
13ae64f3 1632 info->flags |= DF_STATIC_TLS;
37e55690
JJ
1633 /* Fall through */
1634
252b5132 1635 case R_386_GOT32:
02a86693 1636 case R_386_GOT32X:
13ae64f3 1637 case R_386_TLS_GD:
67a4f2b7
AO
1638 case R_386_TLS_GOTDESC:
1639 case R_386_TLS_DESC_CALL:
252b5132 1640 /* This symbol requires a global offset table entry. */
13ae64f3
JJ
1641 {
1642 int tls_type, old_tls_type;
1643
1644 switch (r_type)
1645 {
1646 default:
02a86693
L
1647 case R_386_GOT32:
1648 case R_386_GOT32X:
1649 tls_type = GOT_NORMAL;
1650 break;
13ae64f3 1651 case R_386_TLS_GD: tls_type = GOT_TLS_GD; break;
67a4f2b7
AO
1652 case R_386_TLS_GOTDESC:
1653 case R_386_TLS_DESC_CALL:
1654 tls_type = GOT_TLS_GDESC; break;
37e55690
JJ
1655 case R_386_TLS_IE_32:
1656 if (ELF32_R_TYPE (rel->r_info) == r_type)
1657 tls_type = GOT_TLS_IE_NEG;
1658 else
ebcfb3c0
JJ
1659 /* If this is a GD->IE transition, we may use either of
1660 R_386_TLS_TPOFF and R_386_TLS_TPOFF32. */
37e55690
JJ
1661 tls_type = GOT_TLS_IE;
1662 break;
1663 case R_386_TLS_IE:
1664 case R_386_TLS_GOTIE:
1665 tls_type = GOT_TLS_IE_POS; break;
13ae64f3
JJ
1666 }
1667
1668 if (h != NULL)
1669 {
0f09b4d8 1670 h->got.refcount = 1;
0afcef53 1671 old_tls_type = elf_x86_hash_entry (h)->tls_type;
13ae64f3
JJ
1672 }
1673 else
1674 {
1675 bfd_signed_vma *local_got_refcounts;
1676
1677 /* This is a global offset table entry for a local symbol. */
1678 local_got_refcounts = elf_local_got_refcounts (abfd);
1679 if (local_got_refcounts == NULL)
1680 {
1681 bfd_size_type size;
1682
1683 size = symtab_hdr->sh_info;
67a4f2b7
AO
1684 size *= (sizeof (bfd_signed_vma)
1685 + sizeof (bfd_vma) + sizeof(char));
a50b1753 1686 local_got_refcounts = (bfd_signed_vma *)
07d6d2b8 1687 bfd_zalloc (abfd, size);
13ae64f3 1688 if (local_got_refcounts == NULL)
c337a162 1689 goto error_return;
13ae64f3 1690 elf_local_got_refcounts (abfd) = local_got_refcounts;
0afcef53 1691 elf_x86_local_tlsdesc_gotent (abfd)
67a4f2b7 1692 = (bfd_vma *) (local_got_refcounts + symtab_hdr->sh_info);
0afcef53 1693 elf_x86_local_got_tls_type (abfd)
67a4f2b7 1694 = (char *) (local_got_refcounts + 2 * symtab_hdr->sh_info);
13ae64f3 1695 }
0f09b4d8 1696 local_got_refcounts[r_symndx] = 1;
0afcef53 1697 old_tls_type = elf_x86_local_got_tls_type (abfd) [r_symndx];
13ae64f3
JJ
1698 }
1699
37e55690
JJ
1700 if ((old_tls_type & GOT_TLS_IE) && (tls_type & GOT_TLS_IE))
1701 tls_type |= old_tls_type;
13ae64f3
JJ
1702 /* If a TLS symbol is accessed using IE at least once,
1703 there is no point to use dynamic model for it. */
ebcfb3c0 1704 else if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
67a4f2b7 1705 && (! GOT_TLS_GD_ANY_P (old_tls_type)
37e55690 1706 || (tls_type & GOT_TLS_IE) == 0))
13ae64f3 1707 {
67a4f2b7 1708 if ((old_tls_type & GOT_TLS_IE) && GOT_TLS_GD_ANY_P (tls_type))
37e55690 1709 tls_type = old_tls_type;
67a4f2b7
AO
1710 else if (GOT_TLS_GD_ANY_P (old_tls_type)
1711 && GOT_TLS_GD_ANY_P (tls_type))
1712 tls_type |= old_tls_type;
13ae64f3
JJ
1713 else
1714 {
09a24cbf 1715 if (h)
4c544807
L
1716 name = h->root.root.string;
1717 else
1718 name = bfd_elf_sym_name (abfd, symtab_hdr, isym,
1719 NULL);
4eca0228 1720 _bfd_error_handler
695344c0 1721 /* xgettext:c-format */
871b3ab2 1722 (_("%pB: `%s' accessed both as normal and "
55fd94b0 1723 "thread local symbol"),
4c544807 1724 abfd, name);
68c4a57e 1725 bfd_set_error (bfd_error_bad_value);
c337a162 1726 goto error_return;
13ae64f3
JJ
1727 }
1728 }
1729
1730 if (old_tls_type != tls_type)
1731 {
1732 if (h != NULL)
0afcef53 1733 elf_x86_hash_entry (h)->tls_type = tls_type;
13ae64f3 1734 else
0afcef53 1735 elf_x86_local_got_tls_type (abfd) [r_symndx] = tls_type;
13ae64f3
JJ
1736 }
1737 }
0ac8d2ca
AM
1738 /* Fall through */
1739
1740 case R_386_GOTOFF:
1741 case R_386_GOTPC:
dc1e8a47 1742 create_got:
37e55690 1743 if (r_type != R_386_TLS_IE)
aec6b87e
L
1744 {
1745 if (eh != NULL)
cd048363
L
1746 {
1747 eh->zero_undefweak &= 0x2;
1748
1749 /* Need GOT to resolve undefined weak symbol to 0. */
1750 if (r_type == R_386_GOTOFF
1751 && h->root.type == bfd_link_hash_undefweak
1752 && bfd_link_executable (info))
1753 htab->got_referenced = TRUE;
1754 }
aec6b87e
L
1755 break;
1756 }
37e55690 1757 /* Fall through */
252b5132 1758
37e55690
JJ
1759 case R_386_TLS_LE_32:
1760 case R_386_TLS_LE:
aec6b87e 1761 if (eh != NULL)
98b273dc 1762 eh->zero_undefweak &= 0x2;
0e1862bb 1763 if (bfd_link_executable (info))
37e55690 1764 break;
bffbf940 1765 info->flags |= DF_STATIC_TLS;
aec6b87e 1766 goto do_relocation;
252b5132
RH
1767
1768 case R_386_32:
1769 case R_386_PC32:
aec6b87e 1770 if (eh != NULL && (sec->flags & SEC_CODE) != 0)
98b273dc 1771 eh->zero_undefweak |= 0x2;
dc1e8a47 1772 do_relocation:
bf52d7c7
L
1773 /* We are called after all symbols have been resolved. Only
1774 relocation against STT_GNU_IFUNC symbol must go through
1775 PLT. */
d1ed1c7d
L
1776 if (h != NULL
1777 && (bfd_link_executable (info)
bf52d7c7 1778 || h->type == STT_GNU_IFUNC))
6725bdbf 1779 {
79b0c981 1780 bfd_boolean func_pointer_ref = FALSE;
233cc9c1 1781
4b627c18
L
1782 if (r_type == R_386_PC32)
1783 {
1784 /* Since something like ".long foo - ." may be used
1785 as pointer, make sure that PLT is used if foo is
1786 a function defined in a shared library. */
1787 if ((sec->flags & SEC_CODE) == 0)
1788 h->pointer_equality_needed = 1;
74437ea2
L
1789 else if (h->type == STT_GNU_IFUNC
1790 && bfd_link_pic (info))
1791 {
6322e5c5
L
1792 _bfd_error_handler
1793 /* xgettext:c-format */
871b3ab2 1794 (_("%pB: unsupported non-PIC call to IFUNC `%s'"),
6322e5c5 1795 abfd, h->root.root.string);
74437ea2
L
1796 bfd_set_error (bfd_error_bad_value);
1797 goto error_return;
1798 }
4b627c18
L
1799 }
1800 else
04ebc307
L
1801 {
1802 h->pointer_equality_needed = 1;
1803 /* R_386_32 can be resolved at run-time. */
1804 if (r_type == R_386_32
1805 && (sec->flags & SEC_READONLY) == 0)
79b0c981
L
1806 func_pointer_ref = TRUE;
1807 }
1808
1809 if (!func_pointer_ref)
1810 {
1811 /* If this reloc is in a read-only section, we might
1812 need a copy reloc. We can't check reliably at this
1813 stage whether the section is read-only, as input
1814 sections have not yet been mapped to output sections.
1815 Tentatively set the flag for now, and correct in
1816 adjust_dynamic_symbol. */
1817 h->non_got_ref = 1;
1818
1819 /* We may need a .plt entry if the symbol is a function
1820 defined in a shared lib or is a function referenced
1821 from the code or read-only section. */
1822 if (!h->def_regular
1823 || (sec->flags & (SEC_CODE | SEC_READONLY)) != 0)
1824 h->plt.refcount = 1;
04ebc307 1825 }
6725bdbf 1826 }
7843f00e 1827
06a6a421 1828 size_reloc = FALSE;
dc1e8a47 1829 do_size:
382aae06
L
1830 if (!no_dynreloc
1831 && NEED_DYNAMIC_RELOCATION_P (info, FALSE, h, sec, r_type,
1832 R_386_32))
252b5132 1833 {
e03a8ed8
L
1834 struct elf_dyn_relocs *p;
1835 struct elf_dyn_relocs **head;
ec338859 1836
12d0ee4a
AM
1837 /* We must copy these reloc types into the output file.
1838 Create a reloc section in dynobj and make room for
1839 this reloc. */
252b5132
RH
1840 if (sreloc == NULL)
1841 {
83bac4b0
NC
1842 sreloc = _bfd_elf_make_dynamic_reloc_section
1843 (sec, htab->elf.dynobj, 2, abfd, /*rela?*/ FALSE);
1844
252b5132 1845 if (sreloc == NULL)
c337a162 1846 goto error_return;
252b5132
RH
1847 }
1848
0c715baa
AM
1849 /* If this is a global symbol, we count the number of
1850 relocations we need for this symbol. */
1851 if (h != NULL)
252b5132 1852 {
190eb1dd 1853 head = &h->dyn_relocs;
0c715baa
AM
1854 }
1855 else
1856 {
ec338859
AM
1857 /* Track dynamic relocs needed for local syms too.
1858 We really need local syms available to do this
1859 easily. Oh well. */
87d72d41 1860 void **vpp;
ec338859 1861 asection *s;
87d72d41
AM
1862
1863 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1864 abfd, r_symndx);
1865 if (isym == NULL)
c337a162 1866 goto error_return;
87d72d41
AM
1867
1868 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
ec338859 1869 if (s == NULL)
87d72d41 1870 s = sec;
ec338859 1871
e81d3500 1872 vpp = &elf_section_data (s)->local_dynrel;
e03a8ed8 1873 head = (struct elf_dyn_relocs **)vpp;
ec338859
AM
1874 }
1875
1876 p = *head;
1877 if (p == NULL || p->sec != sec)
1878 {
986f0783 1879 size_t amt = sizeof *p;
a50b1753 1880 p = (struct elf_dyn_relocs *) bfd_alloc (htab->elf.dynobj,
07d6d2b8 1881 amt);
ec338859 1882 if (p == NULL)
c337a162 1883 goto error_return;
ec338859
AM
1884 p->next = *head;
1885 *head = p;
1886 p->sec = sec;
1887 p->count = 0;
1888 p->pc_count = 0;
252b5132 1889 }
ec338859
AM
1890
1891 p->count += 1;
06a6a421
L
1892 /* Count size relocation as PC-relative relocation. */
1893 if (r_type == R_386_PC32 || size_reloc)
ec338859 1894 p->pc_count += 1;
252b5132 1895 }
252b5132
RH
1896 break;
1897
1898 /* This relocation describes the C++ object vtable hierarchy.
1899 Reconstruct it for later use during GC. */
1900 case R_386_GNU_VTINHERIT:
d17e0c6e 1901 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
c337a162 1902 goto error_return;
252b5132
RH
1903 break;
1904
1905 /* This relocation describes which C++ vtable entries are actually
1906 used. Record for later use during GC. */
1907 case R_386_GNU_VTENTRY:
a0ea3a14 1908 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
c337a162 1909 goto error_return;
252b5132
RH
1910 break;
1911
1912 default:
1913 break;
1914 }
1915 }
1916
bedfd056
L
1917 if (elf_section_data (sec)->this_hdr.contents != contents)
1918 {
5e5e02ae 1919 if (!converted && !info->keep_memory)
bedfd056
L
1920 free (contents);
1921 else
1922 {
5e5e02ae
L
1923 /* Cache the section contents for elf_link_input_bfd if any
1924 load is converted or --no-keep-memory isn't used. */
bedfd056
L
1925 elf_section_data (sec)->this_hdr.contents = contents;
1926 }
1927 }
1928
5e5e02ae
L
1929 /* Cache relocations if any load is converted. */
1930 if (elf_section_data (sec)->relocs != relocs && converted)
1931 elf_section_data (sec)->relocs = (Elf_Internal_Rela *) relocs;
1932
b34976b6 1933 return TRUE;
c337a162 1934
dc1e8a47 1935 error_return:
bedfd056
L
1936 if (elf_section_data (sec)->this_hdr.contents != contents)
1937 free (contents);
c337a162
L
1938 sec->check_relocs_failed = 1;
1939 return FALSE;
252b5132
RH
1940}
1941
38701953
AM
1942/* Set the correct type for an x86 ELF section. We do this by the
1943 section name, which is a hack, but ought to work. */
1944
b34976b6 1945static bfd_boolean
55fd94b0
AM
1946elf_i386_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
1947 Elf_Internal_Shdr *hdr,
1948 asection *sec)
38701953 1949{
91d6fa6a 1950 const char *name;
38701953 1951
fd361982 1952 name = bfd_section_name (sec);
38701953
AM
1953
1954 /* This is an ugly, but unfortunately necessary hack that is
1955 needed when producing EFI binaries on x86. It tells
1956 elf.c:elf_fake_sections() not to consider ".reloc" as a section
1957 containing ELF relocation info. We need this hack in order to
1958 be able to generate ELF binaries that can be translated into
1959 EFI applications (which are essentially COFF objects). Those
1960 files contain a COFF ".reloc" section inside an ELFNN object,
1961 which would normally cause BFD to segfault because it would
1962 attempt to interpret this section as containing relocation
1963 entries for section "oc". With this hack enabled, ".reloc"
1964 will be treated as a normal data section, which will avoid the
1965 segfault. However, you won't be able to create an ELFNN binary
1966 with a section named "oc" that needs relocations, but that's
1967 the kind of ugly side-effects you get when detecting section
1968 types based on their names... In practice, this limitation is
1969 unlikely to bite. */
1970 if (strcmp (name, ".reloc") == 0)
1971 hdr->sh_type = SHT_PROGBITS;
1972
b34976b6 1973 return TRUE;
38701953
AM
1974}
1975
13ae64f3
JJ
1976/* Return the relocation value for @tpoff relocation
1977 if STT_TLS virtual address is ADDRESS. */
1978
1979static bfd_vma
eb4ff4d6 1980elf_i386_tpoff (struct bfd_link_info *info, bfd_vma address)
13ae64f3 1981{
e1918d23 1982 struct elf_link_hash_table *htab = elf_hash_table (info);
7dc98aea
RO
1983 const struct elf_backend_data *bed = get_elf_backend_data (info->output_bfd);
1984 bfd_vma static_tls_size;
13ae64f3 1985
e1918d23
AM
1986 /* If tls_sec is NULL, we should have signalled an error already. */
1987 if (htab->tls_sec == NULL)
6a30718d 1988 return 0;
7dc98aea
RO
1989
1990 /* Consider special static TLS alignment requirements. */
1991 static_tls_size = BFD_ALIGN (htab->tls_size, bed->static_tls_alignment);
1992 return static_tls_size + htab->tls_sec->vma - address;
13ae64f3
JJ
1993}
1994
252b5132
RH
1995/* Relocate an i386 ELF section. */
1996
b34976b6 1997static bfd_boolean
55fd94b0
AM
1998elf_i386_relocate_section (bfd *output_bfd,
1999 struct bfd_link_info *info,
2000 bfd *input_bfd,
2001 asection *input_section,
2002 bfd_byte *contents,
2003 Elf_Internal_Rela *relocs,
2004 Elf_Internal_Sym *local_syms,
2005 asection **local_sections)
252b5132 2006{
0afcef53 2007 struct elf_x86_link_hash_table *htab;
252b5132
RH
2008 Elf_Internal_Shdr *symtab_hdr;
2009 struct elf_link_hash_entry **sym_hashes;
2010 bfd_vma *local_got_offsets;
67a4f2b7 2011 bfd_vma *local_tlsdesc_gotents;
252b5132 2012 Elf_Internal_Rela *rel;
60f2e42e 2013 Elf_Internal_Rela *wrel;
252b5132 2014 Elf_Internal_Rela *relend;
3348747a 2015 bfd_boolean is_vxworks_tls;
25e762b9 2016 unsigned plt_entry_size;
252b5132 2017
c337a162
L
2018 /* Skip if check_relocs failed. */
2019 if (input_section->check_relocs_failed)
2020 return FALSE;
2021
0afcef53 2022 htab = elf_x86_hash_table (info, I386_ELF_DATA);
4dfe6ac6
NC
2023 if (htab == NULL)
2024 return FALSE;
fe53b4a4 2025
7af5d5c4
AM
2026 if (!is_x86_elf (input_bfd, htab))
2027 {
2028 bfd_set_error (bfd_error_wrong_format);
2029 return FALSE;
2030 }
fe53b4a4 2031
0ffa91dd 2032 symtab_hdr = &elf_symtab_hdr (input_bfd);
252b5132
RH
2033 sym_hashes = elf_sym_hashes (input_bfd);
2034 local_got_offsets = elf_local_got_offsets (input_bfd);
0afcef53 2035 local_tlsdesc_gotents = elf_x86_local_tlsdesc_gotent (input_bfd);
3348747a
NS
2036 /* We have to handle relocations in vxworks .tls_vars sections
2037 specially, because the dynamic loader is 'weird'. */
90c14f0c 2038 is_vxworks_tls = (htab->elf.target_os == is_vxworks
07d6d2b8 2039 && bfd_link_pic (info)
3348747a
NS
2040 && !strcmp (input_section->output_section->name,
2041 ".tls_vars"));
252b5132 2042
0afcef53 2043 _bfd_x86_elf_set_tls_module_base (info);
9f03412a 2044
765e526c 2045 plt_entry_size = htab->plt.plt_entry_size;
25e762b9 2046
60f2e42e 2047 rel = wrel = relocs;
252b5132 2048 relend = relocs + input_section->reloc_count;
60f2e42e 2049 for (; rel < relend; wrel++, rel++)
252b5132 2050 {
419414ea 2051 unsigned int r_type, r_type_tls;
252b5132
RH
2052 reloc_howto_type *howto;
2053 unsigned long r_symndx;
2054 struct elf_link_hash_entry *h;
0afcef53 2055 struct elf_x86_link_hash_entry *eh;
252b5132
RH
2056 Elf_Internal_Sym *sym;
2057 asection *sec;
dd7e64d4 2058 bfd_vma off, offplt, plt_offset;
252b5132 2059 bfd_vma relocation;
b34976b6 2060 bfd_boolean unresolved_reloc;
252b5132 2061 bfd_reloc_status_type r;
1b452ec6 2062 unsigned int indx;
13ae64f3 2063 int tls_type;
1788fc08 2064 bfd_vma st_size;
dd7e64d4 2065 asection *resolved_plt;
aec6b87e 2066 bfd_boolean resolved_to_zero;
e133d005 2067 bfd_boolean relative_reloc;
252b5132
RH
2068
2069 r_type = ELF32_R_TYPE (rel->r_info);
55fd94b0
AM
2070 if (r_type == R_386_GNU_VTINHERIT
2071 || r_type == R_386_GNU_VTENTRY)
18954b29
L
2072 {
2073 if (wrel != rel)
2074 *wrel = *rel;
2075 continue;
2076 }
dc47f327 2077
b366503e 2078 howto = elf_i386_rtype_to_howto (r_type);
76268e02 2079 if (howto == NULL)
47aeb64c
NC
2080 return _bfd_unrecognized_reloc (input_bfd, input_section, r_type);
2081
252b5132 2082 r_symndx = ELF32_R_SYM (rel->r_info);
252b5132
RH
2083 h = NULL;
2084 sym = NULL;
2085 sec = NULL;
b34976b6 2086 unresolved_reloc = FALSE;
252b5132
RH
2087 if (r_symndx < symtab_hdr->sh_info)
2088 {
2089 sym = local_syms + r_symndx;
2090 sec = local_sections[r_symndx];
2091 relocation = (sec->output_section->vma
2092 + sec->output_offset
2093 + sym->st_value);
1788fc08 2094 st_size = sym->st_size;
ab96bf03
AM
2095
2096 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION
2097 && ((sec->flags & SEC_MERGE) != 0
0e1862bb 2098 || (bfd_link_relocatable (info)
ab96bf03 2099 && sec->output_offset != 0)))
f8df10f4 2100 {
f8df10f4 2101 bfd_vma addend;
4a335f3d 2102 bfd_byte *where = contents + rel->r_offset;
f8df10f4 2103
4a335f3d 2104 switch (howto->size)
f8df10f4 2105 {
4a335f3d
AM
2106 case 0:
2107 addend = bfd_get_8 (input_bfd, where);
2108 if (howto->pc_relative)
2109 {
2110 addend = (addend ^ 0x80) - 0x80;
2111 addend += 1;
2112 }
2113 break;
2114 case 1:
2115 addend = bfd_get_16 (input_bfd, where);
2116 if (howto->pc_relative)
2117 {
2118 addend = (addend ^ 0x8000) - 0x8000;
2119 addend += 2;
2120 }
2121 break;
2122 case 2:
2123 addend = bfd_get_32 (input_bfd, where);
2124 if (howto->pc_relative)
2125 {
2126 addend = (addend ^ 0x80000000) - 0x80000000;
2127 addend += 4;
2128 }
2129 break;
2130 default:
2131 abort ();
f8df10f4
JJ
2132 }
2133
0e1862bb 2134 if (bfd_link_relocatable (info))
ab96bf03
AM
2135 addend += sec->output_offset;
2136 else
2137 {
2138 asection *msec = sec;
2139 addend = _bfd_elf_rel_local_sym (output_bfd, sym, &msec,
2140 addend);
2141 addend -= relocation;
2142 addend += msec->output_section->vma + msec->output_offset;
2143 }
4a335f3d
AM
2144
2145 switch (howto->size)
2146 {
2147 case 0:
16a10388 2148 /* FIXME: overflow checks. */
4a335f3d
AM
2149 if (howto->pc_relative)
2150 addend -= 1;
2151 bfd_put_8 (input_bfd, addend, where);
4a335f3d
AM
2152 break;
2153 case 1:
2154 if (howto->pc_relative)
2155 addend -= 2;
2156 bfd_put_16 (input_bfd, addend, where);
4a335f3d
AM
2157 break;
2158 case 2:
2159 if (howto->pc_relative)
2160 addend -= 4;
2161 bfd_put_32 (input_bfd, addend, where);
2162 break;
2163 }
f8df10f4 2164 }
0e1862bb 2165 else if (!bfd_link_relocatable (info)
1f85278f 2166 && ELF32_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
c25bc9fc
L
2167 {
2168 /* Relocate against local STT_GNU_IFUNC symbol. */
0afcef53
L
2169 h = _bfd_elf_x86_get_local_sym_hash (htab, input_bfd, rel,
2170 FALSE);
c25bc9fc
L
2171 if (h == NULL)
2172 abort ();
2173
23209a78 2174 /* Set STT_GNU_IFUNC symbol value. */
c25bc9fc
L
2175 h->root.u.def.value = sym->st_value;
2176 h->root.u.def.section = sec;
2177 }
252b5132
RH
2178 }
2179 else
2180 {
3d540e93 2181 bfd_boolean warned ATTRIBUTE_UNUSED;
62d887d4 2182 bfd_boolean ignored ATTRIBUTE_UNUSED;
ffb2e45b 2183
b2a8e766
AM
2184 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2185 r_symndx, symtab_hdr, sym_hashes,
2186 h, sec, relocation,
62d887d4 2187 unresolved_reloc, warned, ignored);
1788fc08 2188 st_size = h->size;
252b5132
RH
2189 }
2190
dbaa2011 2191 if (sec != NULL && discarded_section (sec))
60f2e42e
L
2192 {
2193 _bfd_clear_contents (howto, input_bfd, input_section,
0930cb30 2194 contents, rel->r_offset);
60f2e42e
L
2195 wrel->r_offset = rel->r_offset;
2196 wrel->r_info = 0;
2197 wrel->r_addend = 0;
2198
2199 /* For ld -r, remove relocations in debug sections against
2200 sections defined in discarded sections. Not done for
2201 eh_frame editing code expects to be present. */
2202 if (bfd_link_relocatable (info)
2203 && (input_section->flags & SEC_DEBUGGING))
2204 wrel--;
2205
2206 continue;
2207 }
9635fe29 2208
0e1862bb 2209 if (bfd_link_relocatable (info))
2d5da473
L
2210 {
2211 if (wrel != rel)
2212 *wrel = *rel;
2213 continue;
2214 }
ab96bf03 2215
0afcef53 2216 eh = (struct elf_x86_link_hash_entry *) h;
ee2fdd6f 2217
cbe950e9
L
2218 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle
2219 it here if it is defined in a non-shared object. */
2220 if (h != NULL
2221 && h->type == STT_GNU_IFUNC
2222 && h->def_regular)
2223 {
ee2fdd6f 2224 asection *gotplt, *base_got;
cbe950e9 2225 bfd_vma plt_index;
4c544807 2226 const char *name;
cbe950e9 2227
97dc35c8
L
2228 if ((input_section->flags & SEC_ALLOC) == 0)
2229 {
347a8774
L
2230 /* If this is a SHT_NOTE section without SHF_ALLOC, treat
2231 STT_GNU_IFUNC symbol as STT_FUNC. */
2232 if (elf_section_type (input_section) == SHT_NOTE)
2233 goto skip_ifunc;
97dc35c8
L
2234 /* Dynamic relocs are not propagated for SEC_DEBUGGING
2235 sections because such sections are not SEC_ALLOC and
2236 thus ld.so will not process them. */
2237 if ((input_section->flags & SEC_DEBUGGING) != 0)
0eace210 2238 continue;
97dc35c8
L
2239 abort ();
2240 }
cbe950e9
L
2241
2242 /* STT_GNU_IFUNC symbol must go through PLT. */
6de2ae4a 2243 if (htab->elf.splt != NULL)
cbe950e9 2244 {
ee2fdd6f
L
2245 if (htab->plt_second != NULL)
2246 {
2247 resolved_plt = htab->plt_second;
2248 plt_offset = eh->plt_second.offset;
2249 }
2250 else
2251 {
2252 resolved_plt = htab->elf.splt;
2253 plt_offset = h->plt.offset;
2254 }
6de2ae4a 2255 gotplt = htab->elf.sgotplt;
cbe950e9
L
2256 }
2257 else
2258 {
ee2fdd6f
L
2259 resolved_plt = htab->elf.iplt;
2260 plt_offset = h->plt.offset;
6de2ae4a 2261 gotplt = htab->elf.igotplt;
cbe950e9
L
2262 }
2263
cbe950e9
L
2264 switch (r_type)
2265 {
2266 default:
233cc9c1 2267 break;
cbe950e9
L
2268
2269 case R_386_GOT32:
02a86693 2270 case R_386_GOT32X:
6de2ae4a 2271 base_got = htab->elf.sgot;
cbe950e9
L
2272 off = h->got.offset;
2273
7afd84dc 2274 if (base_got == NULL)
cbe950e9
L
2275 abort ();
2276
7afd84dc 2277 if (off == (bfd_vma) -1)
cbe950e9 2278 {
7afd84dc
L
2279 /* We can't use h->got.offset here to save state, or
2280 even just remember the offset, as finish_dynamic_symbol
2281 would use that as offset into .got. */
6bbec505 2282
233cc9c1
L
2283 if (h->plt.offset == (bfd_vma) -1)
2284 abort ();
2285
6de2ae4a 2286 if (htab->elf.splt != NULL)
7afd84dc 2287 {
f604c2a2 2288 plt_index = (h->plt.offset / plt_entry_size
765e526c 2289 - htab->plt.has_plt0);
7afd84dc 2290 off = (plt_index + 3) * 4;
6de2ae4a 2291 base_got = htab->elf.sgotplt;
7afd84dc 2292 }
cbe950e9
L
2293 else
2294 {
25e762b9 2295 plt_index = h->plt.offset / plt_entry_size;
7afd84dc 2296 off = plt_index * 4;
6de2ae4a 2297 base_got = htab->elf.igotplt;
7afd84dc
L
2298 }
2299
2300 if (h->dynindx == -1
2301 || h->forced_local
2302 || info->symbolic)
2303 {
2304 /* This references the local defitionion. We must
2305 initialize this entry in the global offset table.
2306 Since the offset must always be a multiple of 8,
2307 we use the least significant bit to record
2308 whether we have initialized it already.
2309
2310 When doing a dynamic link, we create a .rela.got
2311 relocation entry to initialize the value. This
2312 is done in the finish_dynamic_symbol routine. */
2313 if ((off & 1) != 0)
2314 off &= ~1;
2315 else
2316 {
2317 bfd_put_32 (output_bfd, relocation,
2318 base_got->contents + off);
2319 h->got.offset |= 1;
2320 }
cbe950e9 2321 }
cbe950e9 2322
7afd84dc 2323 relocation = off;
7afd84dc
L
2324 }
2325 else
ca8c86ef
L
2326 relocation = (base_got->output_section->vma
2327 + base_got->output_offset + off
2328 - gotplt->output_section->vma
2329 - gotplt->output_offset);
2330
2a568401
L
2331 if (rel->r_offset > 1
2332 && (*(contents + rel->r_offset - 1) & 0xc7) == 0x5
2333 && *(contents + rel->r_offset - 2) != 0x8d)
712ec279
L
2334 {
2335 if (bfd_link_pic (info))
2336 goto disallow_got32;
2337
2338 /* Add the GOT base if there is no base register. */
2339 relocation += (gotplt->output_section->vma
2340 + gotplt->output_offset);
2341 }
2342 else if (htab->elf.splt == NULL)
2343 {
2344 /* Adjust for static executables. */
2345 relocation += gotplt->output_offset;
2346 }
0018b0a3 2347
cbe950e9 2348 goto do_relocation;
233cc9c1
L
2349 }
2350
2351 if (h->plt.offset == (bfd_vma) -1)
2352 {
2353 /* Handle static pointers of STT_GNU_IFUNC symbols. */
2354 if (r_type == R_386_32
2355 && (input_section->flags & SEC_CODE) == 0)
2356 goto do_ifunc_pointer;
2357 goto bad_ifunc_reloc;
2358 }
2359
ee2fdd6f
L
2360 relocation = (resolved_plt->output_section->vma
2361 + resolved_plt->output_offset + plt_offset);
233cc9c1
L
2362
2363 switch (r_type)
2364 {
2365 default:
dc1e8a47 2366 bad_ifunc_reloc:
233cc9c1
L
2367 if (h->root.root.string)
2368 name = h->root.root.string;
2369 else
2370 name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
2371 NULL);
4eca0228 2372 _bfd_error_handler
695344c0 2373 /* xgettext:c-format */
871b3ab2 2374 (_("%pB: relocation %s against STT_GNU_IFUNC "
233cc9c1
L
2375 "symbol `%s' isn't supported"), input_bfd,
2376 howto->name, name);
2377 bfd_set_error (bfd_error_bad_value);
2378 return FALSE;
2379
2380 case R_386_32:
2381 /* Generate dynamic relcoation only when there is a
2382 non-GOT reference in a shared object. */
2383 if ((bfd_link_pic (info) && h->non_got_ref)
2384 || h->plt.offset == (bfd_vma) -1)
2385 {
2386 Elf_Internal_Rela outrel;
2387 asection *sreloc;
2388 bfd_vma offset;
2389
dc1e8a47 2390 do_ifunc_pointer:
233cc9c1
L
2391 /* Need a dynamic relocation to get the real function
2392 adddress. */
2393 offset = _bfd_elf_section_offset (output_bfd,
2394 info,
2395 input_section,
2396 rel->r_offset);
2397 if (offset == (bfd_vma) -1
2398 || offset == (bfd_vma) -2)
2399 abort ();
2400
2401 outrel.r_offset = (input_section->output_section->vma
2402 + input_section->output_offset
2403 + offset);
2404
cf1070f1 2405 if (POINTER_LOCAL_IFUNC_P (info, h))
233cc9c1 2406 {
871b3ab2 2407 info->callbacks->minfo (_("Local IFUNC function `%s' in %pB\n"),
6322e5c5
L
2408 h->root.root.string,
2409 h->root.u.def.section->owner);
2410
233cc9c1
L
2411 /* This symbol is resolved locally. */
2412 outrel.r_info = ELF32_R_INFO (0, R_386_IRELATIVE);
2413 bfd_put_32 (output_bfd,
2414 (h->root.u.def.value
2415 + h->root.u.def.section->output_section->vma
2416 + h->root.u.def.section->output_offset),
2417 contents + offset);
2418 }
2419 else
2420 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
2421
2422 /* Dynamic relocations are stored in
2423 1. .rel.ifunc section in PIC object.
2424 2. .rel.got section in dynamic executable.
2425 3. .rel.iplt section in static executable. */
2426 if (bfd_link_pic (info))
2427 sreloc = htab->elf.irelifunc;
2428 else if (htab->elf.splt != NULL)
2429 sreloc = htab->elf.srelgot;
2430 else
2431 sreloc = htab->elf.irelplt;
2432 elf_append_rel (output_bfd, sreloc, &outrel);
2433
2434 /* If this reloc is against an external symbol, we
2435 do not want to fiddle with the addend. Otherwise,
2436 we need to include the symbol value so that it
2437 becomes an addend for the dynamic reloc. For an
2438 internal symbol, we have updated addend. */
2439 continue;
2440 }
2441 /* FALLTHROUGH */
2442 case R_386_PC32:
2443 case R_386_PLT32:
2444 goto do_relocation;
cbe950e9
L
2445
2446 case R_386_GOTOFF:
2447 relocation -= (gotplt->output_section->vma
2448 + gotplt->output_offset);
2449 goto do_relocation;
2450 }
2451 }
2452
dc1e8a47 2453 skip_ifunc:
aec6b87e 2454 resolved_to_zero = (eh != NULL
c5bce5c6 2455 && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh));
aec6b87e 2456
252b5132
RH
2457 switch (r_type)
2458 {
02a86693 2459 case R_386_GOT32X:
252b5132
RH
2460 case R_386_GOT32:
2461 /* Relocation is to the entry for this symbol in the global
2462 offset table. */
6de2ae4a 2463 if (htab->elf.sgot == NULL)
ffb2e45b 2464 abort ();
252b5132 2465
e133d005 2466 relative_reloc = FALSE;
252b5132
RH
2467 if (h != NULL)
2468 {
252b5132 2469 off = h->got.offset;
2eba97c2 2470 if (RESOLVED_LOCALLY_P (info, h, htab))
252b5132 2471 {
2eba97c2
L
2472 /* We must initialize this entry in the global offset
2473 table. Since the offset must always be a multiple
2474 of 4, we use the least significant bit to record
2475 whether we have initialized it already.
252b5132
RH
2476
2477 When doing a dynamic link, we create a .rel.got
2478 relocation entry to initialize the value. This
2479 is done in the finish_dynamic_symbol routine. */
2480 if ((off & 1) != 0)
2481 off &= ~1;
2482 else
2483 {
2484 bfd_put_32 (output_bfd, relocation,
6de2ae4a 2485 htab->elf.sgot->contents + off);
252b5132 2486 h->got.offset |= 1;
e133d005 2487
f70656b2 2488 if (GENERATE_RELATIVE_RELOC_P (info, h))
e133d005
L
2489 {
2490 /* PR ld/21402: If this symbol isn't dynamic
0dc9a308 2491 in PIC, generate R_386_RELATIVE here. */
e133d005
L
2492 eh->no_finish_dynamic_symbol = 1;
2493 relative_reloc = TRUE;
2494 }
252b5132
RH
2495 }
2496 }
8c694914 2497 else
b34976b6 2498 unresolved_reloc = FALSE;
252b5132
RH
2499 }
2500 else
2501 {
ffb2e45b
AM
2502 if (local_got_offsets == NULL)
2503 abort ();
252b5132
RH
2504
2505 off = local_got_offsets[r_symndx];
2506
2507 /* The offset must always be a multiple of 4. We use
83be169b
AM
2508 the least significant bit to record whether we have
2509 already generated the necessary reloc. */
252b5132
RH
2510 if ((off & 1) != 0)
2511 off &= ~1;
2512 else
2513 {
6725bdbf 2514 bfd_put_32 (output_bfd, relocation,
6de2ae4a 2515 htab->elf.sgot->contents + off);
e133d005 2516 local_got_offsets[r_symndx] |= 1;
252b5132 2517
0e1862bb 2518 if (bfd_link_pic (info))
e133d005 2519 relative_reloc = TRUE;
252b5132 2520 }
252b5132
RH
2521 }
2522
e133d005
L
2523 if (relative_reloc)
2524 {
2525 asection *s;
2526 Elf_Internal_Rela outrel;
2527
2528 s = htab->elf.srelgot;
2529 if (s == NULL)
2530 abort ();
2531
2532 outrel.r_offset = (htab->elf.sgot->output_section->vma
2533 + htab->elf.sgot->output_offset
2534 + off);
2535 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
2536 elf_append_rel (output_bfd, s, &outrel);
2537 }
2538
ffb2e45b
AM
2539 if (off >= (bfd_vma) -2)
2540 abort ();
2541
74d7f0aa
L
2542 relocation = (htab->elf.sgot->output_section->vma
2543 + htab->elf.sgot->output_offset + off);
2a568401
L
2544 if (rel->r_offset > 1
2545 && (*(contents + rel->r_offset - 1) & 0xc7) == 0x5
2546 && *(contents + rel->r_offset - 2) != 0x8d)
74d7f0aa
L
2547 {
2548 if (bfd_link_pic (info))
2549 {
2550 /* For PIC, disallow R_386_GOT32 without a base
2a568401
L
2551 register, except for "lea foo@GOT, %reg", since
2552 we don't know what the GOT base is. */
74d7f0aa
L
2553 const char *name;
2554
dc1e8a47 2555 disallow_got32:
a5def14f 2556 if (h == NULL || h->root.root.string == NULL)
74d7f0aa
L
2557 name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
2558 NULL);
2559 else
2560 name = h->root.root.string;
2561
4eca0228 2562 _bfd_error_handler
695344c0 2563 /* xgettext:c-format */
871b3ab2 2564 (_("%pB: direct GOT relocation %s against `%s'"
63a5468a
AM
2565 " without base register can not be used"
2566 " when making a shared object"),
712ec279 2567 input_bfd, howto->name, name);
74d7f0aa
L
2568 bfd_set_error (bfd_error_bad_value);
2569 return FALSE;
2570 }
2571 }
2572 else
2573 {
2574 /* Subtract the .got.plt section address only with a base
2575 register. */
2576 relocation -= (htab->elf.sgotplt->output_section->vma
2577 + htab->elf.sgotplt->output_offset);
2578 }
2579
252b5132
RH
2580 break;
2581
2582 case R_386_GOTOFF:
2583 /* Relocation is relative to the start of the global offset
2584 table. */
2585
3d949995
L
2586 /* Check to make sure it isn't a protected function or data
2587 symbol for shared library since it may not be local when
2588 used as function address or with copy relocation. We also
e3c0e327 2589 need to make sure that a symbol is referenced locally. */
0e1862bb 2590 if (!bfd_link_executable (info) && h)
90f487df 2591 {
41bed6dd
L
2592 if (!h->def_regular)
2593 {
2594 const char *v;
2595
2596 switch (ELF_ST_VISIBILITY (h->other))
2597 {
2598 case STV_HIDDEN:
2599 v = _("hidden symbol");
2600 break;
2601 case STV_INTERNAL:
2602 v = _("internal symbol");
2603 break;
2604 case STV_PROTECTED:
2605 v = _("protected symbol");
2606 break;
2607 default:
2608 v = _("symbol");
2609 break;
2610 }
2611
4eca0228 2612 _bfd_error_handler
695344c0 2613 /* xgettext:c-format */
871b3ab2 2614 (_("%pB: relocation R_386_GOTOFF against undefined %s"
63a5468a 2615 " `%s' can not be used when making a shared object"),
41bed6dd
L
2616 input_bfd, v, h->root.root.string);
2617 bfd_set_error (bfd_error_bad_value);
2618 return FALSE;
2619 }
6999821f 2620 else if (!SYMBOL_REFERENCES_LOCAL_P (info, h)
3d949995
L
2621 && (h->type == STT_FUNC
2622 || h->type == STT_OBJECT)
41bed6dd
L
2623 && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
2624 {
4eca0228 2625 _bfd_error_handler
695344c0 2626 /* xgettext:c-format */
871b3ab2 2627 (_("%pB: relocation R_386_GOTOFF against protected %s"
63a5468a 2628 " `%s' can not be used when making a shared object"),
3d949995
L
2629 input_bfd,
2630 h->type == STT_FUNC ? "function" : "data",
2631 h->root.root.string);
41bed6dd
L
2632 bfd_set_error (bfd_error_bad_value);
2633 return FALSE;
2634 }
90f487df
L
2635 }
2636
8c37241b
JJ
2637 /* Note that sgot is not involved in this
2638 calculation. We always want the start of .got.plt. If we
2639 defined _GLOBAL_OFFSET_TABLE_ in a different way, as is
252b5132
RH
2640 permitted by the ABI, we might have to change this
2641 calculation. */
6de2ae4a
L
2642 relocation -= htab->elf.sgotplt->output_section->vma
2643 + htab->elf.sgotplt->output_offset;
252b5132
RH
2644 break;
2645
2646 case R_386_GOTPC:
2647 /* Use global offset table as symbol value. */
6de2ae4a
L
2648 relocation = htab->elf.sgotplt->output_section->vma
2649 + htab->elf.sgotplt->output_offset;
b34976b6 2650 unresolved_reloc = FALSE;
252b5132
RH
2651 break;
2652
2653 case R_386_PLT32:
2654 /* Relocation is to the entry for this symbol in the
2655 procedure linkage table. */
2656
dd5724d5 2657 /* Resolve a PLT32 reloc against a local symbol directly,
83be169b 2658 without using the procedure linkage table. */
252b5132
RH
2659 if (h == NULL)
2660 break;
2661
dd7e64d4
L
2662 if ((h->plt.offset == (bfd_vma) -1
2663 && eh->plt_got.offset == (bfd_vma) -1)
6de2ae4a 2664 || htab->elf.splt == NULL)
252b5132
RH
2665 {
2666 /* We didn't make a PLT entry for this symbol. This
83be169b
AM
2667 happens when statically linking PIC code, or when
2668 using -Bsymbolic. */
252b5132
RH
2669 break;
2670 }
2671
dd7e64d4
L
2672 if (h->plt.offset != (bfd_vma) -1)
2673 {
ee2fdd6f
L
2674 if (htab->plt_second != NULL)
2675 {
2676 resolved_plt = htab->plt_second;
2677 plt_offset = eh->plt_second.offset;
2678 }
2679 else
2680 {
2681 resolved_plt = htab->elf.splt;
2682 plt_offset = h->plt.offset;
2683 }
dd7e64d4
L
2684 }
2685 else
2686 {
2687 resolved_plt = htab->plt_got;
2688 plt_offset = eh->plt_got.offset;
2689 }
2690
2691 relocation = (resolved_plt->output_section->vma
2692 + resolved_plt->output_offset
2693 + plt_offset);
b34976b6 2694 unresolved_reloc = FALSE;
252b5132
RH
2695 break;
2696
1788fc08 2697 case R_386_SIZE32:
1788fc08
L
2698 /* Set to symbol size. */
2699 relocation = st_size;
2700 /* Fall through. */
2701
252b5132
RH
2702 case R_386_32:
2703 case R_386_PC32:
3348747a
NS
2704 if ((input_section->flags & SEC_ALLOC) == 0
2705 || is_vxworks_tls)
ec338859
AM
2706 break;
2707
382aae06 2708 if (GENERATE_DYNAMIC_RELOCATION_P (info, eh, r_type, sec,
aebcc8ff
L
2709 FALSE, resolved_to_zero,
2710 (r_type == R_386_PC32)))
252b5132 2711 {
947216bf 2712 Elf_Internal_Rela outrel;
b34976b6 2713 bfd_boolean skip, relocate;
0c715baa 2714 asection *sreloc;
252b5132
RH
2715
2716 /* When generating a shared object, these relocations
2717 are copied into the output file to be resolved at run
2718 time. */
2719
b34976b6
AM
2720 skip = FALSE;
2721 relocate = FALSE;
252b5132 2722
c629eae0
JJ
2723 outrel.r_offset =
2724 _bfd_elf_section_offset (output_bfd, info, input_section,
2725 rel->r_offset);
2726 if (outrel.r_offset == (bfd_vma) -1)
b34976b6 2727 skip = TRUE;
0bb2d96a 2728 else if (outrel.r_offset == (bfd_vma) -2)
b34976b6 2729 skip = TRUE, relocate = TRUE;
252b5132
RH
2730 outrel.r_offset += (input_section->output_section->vma
2731 + input_section->output_offset);
2732
2733 if (skip)
0bb2d96a 2734 memset (&outrel, 0, sizeof outrel);
e74399c4 2735 else if (COPY_INPUT_RELOC_P (info, h, r_type))
0bb2d96a 2736 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
252b5132
RH
2737 else
2738 {
5a15f56f 2739 /* This symbol is local, or marked to become local. */
b34976b6 2740 relocate = TRUE;
5a15f56f 2741 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
252b5132
RH
2742 }
2743
cbe950e9 2744 sreloc = elf_section_data (input_section)->sreloc;
e7c33416 2745
62d78908
L
2746 if (sreloc == NULL || sreloc->contents == NULL)
2747 {
2748 r = bfd_reloc_notsupported;
2749 goto check_relocation_error;
2750 }
0c715baa 2751
59d6ffb2 2752 elf_append_rel (output_bfd, sreloc, &outrel);
252b5132
RH
2753
2754 /* If this reloc is against an external symbol, we do
2755 not want to fiddle with the addend. Otherwise, we
2756 need to include the symbol value so that it becomes
2757 an addend for the dynamic reloc. */
0f88be7a 2758 if (! relocate)
252b5132
RH
2759 continue;
2760 }
252b5132
RH
2761 break;
2762
37e55690 2763 case R_386_TLS_IE:
0e1862bb 2764 if (!bfd_link_executable (info))
37e55690 2765 {
947216bf 2766 Elf_Internal_Rela outrel;
37e55690 2767 asection *sreloc;
37e55690
JJ
2768
2769 outrel.r_offset = rel->r_offset
2770 + input_section->output_section->vma
2771 + input_section->output_offset;
2772 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
2773 sreloc = elf_section_data (input_section)->sreloc;
2774 if (sreloc == NULL)
2775 abort ();
59d6ffb2 2776 elf_append_rel (output_bfd, sreloc, &outrel);
37e55690
JJ
2777 }
2778 /* Fall through */
2779
13ae64f3 2780 case R_386_TLS_GD:
67a4f2b7
AO
2781 case R_386_TLS_GOTDESC:
2782 case R_386_TLS_DESC_CALL:
13ae64f3 2783 case R_386_TLS_IE_32:
37e55690 2784 case R_386_TLS_GOTIE:
13ae64f3
JJ
2785 tls_type = GOT_UNKNOWN;
2786 if (h == NULL && local_got_offsets)
0afcef53 2787 tls_type = elf_x86_local_got_tls_type (input_bfd) [r_symndx];
13ae64f3 2788 else if (h != NULL)
0afcef53 2789 tls_type = elf_x86_hash_entry(h)->tls_type;
37e55690
JJ
2790 if (tls_type == GOT_TLS_IE)
2791 tls_type = GOT_TLS_IE_NEG;
142411ca 2792
419414ea 2793 r_type_tls = r_type;
142411ca
L
2794 if (! elf_i386_tls_transition (info, input_bfd,
2795 input_section, contents,
2796 symtab_hdr, sym_hashes,
419414ea 2797 &r_type_tls, tls_type, rel,
bedfd056 2798 relend, h, r_symndx, TRUE))
142411ca 2799 return FALSE;
13ae64f3 2800
419414ea 2801 if (r_type_tls == R_386_TLS_LE_32)
13ae64f3 2802 {
82e51918 2803 BFD_ASSERT (! unresolved_reloc);
419414ea 2804 if (r_type == R_386_TLS_GD)
13ae64f3 2805 {
142411ca 2806 unsigned int type;
13ae64f3
JJ
2807 bfd_vma roff;
2808
2809 /* GD->LE transition. */
6eaa7fb5 2810 type = *(contents + rel->r_offset - 2);
13ae64f3
JJ
2811 if (type == 0x04)
2812 {
6eaa7fb5
L
2813 /* Change
2814 leal foo@tlsgd(,%ebx,1), %eax
2815 call ___tls_get_addr@PLT
2816 into:
2817 movl %gs:0, %eax
2818 subl $foo@tpoff, %eax
13ae64f3 2819 (6 byte form of subl). */
142411ca 2820 roff = rel->r_offset + 5;
13ae64f3
JJ
2821 }
2822 else
2823 {
6eaa7fb5
L
2824 /* Change
2825 leal foo@tlsgd(%ebx), %eax
2826 call ___tls_get_addr@PLT
2827 nop
2828 or
2829 leal foo@tlsgd(%reg), %eax
2830 call *___tls_get_addr@GOT(%reg)
2831 which may be converted to
2832 addr32 call ___tls_get_addr
2833 into:
2834 movl %gs:0, %eax; subl $foo@tpoff, %eax
142411ca 2835 (6 byte form of subl). */
142411ca 2836 roff = rel->r_offset + 6;
13ae64f3 2837 }
6eaa7fb5
L
2838 memcpy (contents + roff - 8,
2839 "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12);
eb4ff4d6 2840 bfd_put_32 (output_bfd, elf_i386_tpoff (info, relocation),
13ae64f3 2841 contents + roff);
6eaa7fb5 2842 /* Skip R_386_PC32, R_386_PLT32 and R_386_GOT32X. */
13ae64f3 2843 rel++;
60f2e42e 2844 wrel++;
13ae64f3
JJ
2845 continue;
2846 }
419414ea 2847 else if (r_type == R_386_TLS_GOTDESC)
67a4f2b7
AO
2848 {
2849 /* GDesc -> LE transition.
2850 It's originally something like:
2851 leal x@tlsdesc(%ebx), %eax
2852
2853 leal x@ntpoff, %eax
2854
2855 Registers other than %eax may be set up here. */
2856
142411ca 2857 unsigned int val;
67a4f2b7
AO
2858 bfd_vma roff;
2859
67a4f2b7 2860 roff = rel->r_offset;
67a4f2b7 2861 val = bfd_get_8 (input_bfd, contents + roff - 1);
67a4f2b7
AO
2862
2863 /* Now modify the instruction as appropriate. */
2864 /* aoliva FIXME: remove the above and xor the byte
2865 below with 0x86. */
2866 bfd_put_8 (output_bfd, val ^ 0x86,
2867 contents + roff - 1);
eb4ff4d6 2868 bfd_put_32 (output_bfd, -elf_i386_tpoff (info, relocation),
67a4f2b7
AO
2869 contents + roff);
2870 continue;
2871 }
419414ea 2872 else if (r_type == R_386_TLS_DESC_CALL)
67a4f2b7
AO
2873 {
2874 /* GDesc -> LE transition.
2875 It's originally:
2876 call *(%eax)
2877 Turn it into:
142411ca 2878 xchg %ax,%ax */
67a4f2b7 2879
67a4f2b7 2880 bfd_vma roff;
6bbec505 2881
67a4f2b7 2882 roff = rel->r_offset;
10efb593 2883 bfd_put_8 (output_bfd, 0x66, contents + roff);
67a4f2b7
AO
2884 bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
2885 continue;
2886 }
419414ea 2887 else if (r_type == R_386_TLS_IE)
13ae64f3 2888 {
142411ca 2889 unsigned int val;
13ae64f3
JJ
2890
2891 /* IE->LE transition:
37e55690
JJ
2892 Originally it can be one of:
2893 movl foo, %eax
2894 movl foo, %reg
2895 addl foo, %reg
2896 We change it into:
2897 movl $foo, %eax
2898 movl $foo, %reg
2899 addl $foo, %reg. */
37e55690 2900 val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
37e55690
JJ
2901 if (val == 0xa1)
2902 {
2903 /* movl foo, %eax. */
55fd94b0
AM
2904 bfd_put_8 (output_bfd, 0xb8,
2905 contents + rel->r_offset - 1);
37e55690 2906 }
299bf759 2907 else
37e55690 2908 {
142411ca
L
2909 unsigned int type;
2910
55fd94b0
AM
2911 type = bfd_get_8 (input_bfd,
2912 contents + rel->r_offset - 2);
299bf759 2913 switch (type)
26e41594 2914 {
299bf759
L
2915 case 0x8b:
2916 /* movl */
299bf759
L
2917 bfd_put_8 (output_bfd, 0xc7,
2918 contents + rel->r_offset - 2);
2919 bfd_put_8 (output_bfd,
2920 0xc0 | ((val >> 3) & 7),
2921 contents + rel->r_offset - 1);
2922 break;
2923 case 0x03:
2924 /* addl */
299bf759
L
2925 bfd_put_8 (output_bfd, 0x81,
2926 contents + rel->r_offset - 2);
2927 bfd_put_8 (output_bfd,
2928 0xc0 | ((val >> 3) & 7),
2929 contents + rel->r_offset - 1);
2930 break;
2931 default:
2932 BFD_FAIL ();
2933 break;
26e41594 2934 }
37e55690 2935 }
eb4ff4d6 2936 bfd_put_32 (output_bfd, -elf_i386_tpoff (info, relocation),
37e55690
JJ
2937 contents + rel->r_offset);
2938 continue;
2939 }
2940 else
2941 {
2942 unsigned int val, type;
2943
2944 /* {IE_32,GOTIE}->LE transition:
2945 Originally it can be one of:
13ae64f3 2946 subl foo(%reg1), %reg2
13ae64f3 2947 movl foo(%reg1), %reg2
37e55690 2948 addl foo(%reg1), %reg2
13ae64f3
JJ
2949 We change it into:
2950 subl $foo, %reg2
37e55690
JJ
2951 movl $foo, %reg2 (6 byte form)
2952 addl $foo, %reg2. */
13ae64f3
JJ
2953 type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
2954 val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
13ae64f3
JJ
2955 if (type == 0x8b)
2956 {
2957 /* movl */
13ae64f3
JJ
2958 bfd_put_8 (output_bfd, 0xc7,
2959 contents + rel->r_offset - 2);
2960 bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
2961 contents + rel->r_offset - 1);
2962 }
2963 else if (type == 0x2b)
2964 {
2965 /* subl */
13ae64f3
JJ
2966 bfd_put_8 (output_bfd, 0x81,
2967 contents + rel->r_offset - 2);
2968 bfd_put_8 (output_bfd, 0xe8 | ((val >> 3) & 7),
2969 contents + rel->r_offset - 1);
2970 }
37e55690
JJ
2971 else if (type == 0x03)
2972 {
2973 /* addl */
2974 bfd_put_8 (output_bfd, 0x81,
2975 contents + rel->r_offset - 2);
2976 bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
2977 contents + rel->r_offset - 1);
2978 }
13ae64f3
JJ
2979 else
2980 BFD_FAIL ();
419414ea 2981 if (r_type == R_386_TLS_GOTIE)
eb4ff4d6 2982 bfd_put_32 (output_bfd, -elf_i386_tpoff (info, relocation),
37e55690
JJ
2983 contents + rel->r_offset);
2984 else
eb4ff4d6 2985 bfd_put_32 (output_bfd, elf_i386_tpoff (info, relocation),
37e55690 2986 contents + rel->r_offset);
13ae64f3
JJ
2987 continue;
2988 }
2989 }
2990
6de2ae4a 2991 if (htab->elf.sgot == NULL)
13ae64f3
JJ
2992 abort ();
2993
2994 if (h != NULL)
67a4f2b7
AO
2995 {
2996 off = h->got.offset;
0afcef53 2997 offplt = elf_x86_hash_entry (h)->tlsdesc_got;
67a4f2b7 2998 }
13ae64f3
JJ
2999 else
3000 {
3001 if (local_got_offsets == NULL)
3002 abort ();
3003
3004 off = local_got_offsets[r_symndx];
67a4f2b7 3005 offplt = local_tlsdesc_gotents[r_symndx];
13ae64f3
JJ
3006 }
3007
3008 if ((off & 1) != 0)
3009 off &= ~1;
26e41594 3010 else
13ae64f3 3011 {
947216bf 3012 Elf_Internal_Rela outrel;
91d6fa6a 3013 int dr_type;
67a4f2b7 3014 asection *sreloc;
13ae64f3 3015
6de2ae4a 3016 if (htab->elf.srelgot == NULL)
13ae64f3
JJ
3017 abort ();
3018
67a4f2b7
AO
3019 indx = h && h->dynindx != -1 ? h->dynindx : 0;
3020
3021 if (GOT_TLS_GDESC_P (tls_type))
3022 {
59d6ffb2 3023 bfd_byte *loc;
67a4f2b7
AO
3024 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_DESC);
3025 BFD_ASSERT (htab->sgotplt_jump_table_size + offplt + 8
6de2ae4a
L
3026 <= htab->elf.sgotplt->size);
3027 outrel.r_offset = (htab->elf.sgotplt->output_section->vma
3028 + htab->elf.sgotplt->output_offset
67a4f2b7
AO
3029 + offplt
3030 + htab->sgotplt_jump_table_size);
6de2ae4a 3031 sreloc = htab->elf.srelplt;
67a4f2b7 3032 loc = sreloc->contents;
765e526c 3033 loc += (htab->next_tls_desc_index++
5ae0bfb6 3034 * sizeof (Elf32_External_Rel));
67a4f2b7 3035 BFD_ASSERT (loc + sizeof (Elf32_External_Rel)
c3b02097 3036 <= sreloc->contents + sreloc->size);
67a4f2b7
AO
3037 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
3038 if (indx == 0)
3039 {
3040 BFD_ASSERT (! unresolved_reloc);
3041 bfd_put_32 (output_bfd,
0afcef53 3042 relocation - _bfd_x86_elf_dtpoff_base (info),
6de2ae4a 3043 htab->elf.sgotplt->contents + offplt
67a4f2b7
AO
3044 + htab->sgotplt_jump_table_size + 4);
3045 }
3046 else
3047 {
3048 bfd_put_32 (output_bfd, 0,
6de2ae4a 3049 htab->elf.sgotplt->contents + offplt
67a4f2b7
AO
3050 + htab->sgotplt_jump_table_size + 4);
3051 }
3052 }
3053
6de2ae4a 3054 sreloc = htab->elf.srelgot;
67a4f2b7 3055
6de2ae4a
L
3056 outrel.r_offset = (htab->elf.sgot->output_section->vma
3057 + htab->elf.sgot->output_offset + off);
13ae64f3 3058
67a4f2b7 3059 if (GOT_TLS_GD_P (tls_type))
13ae64f3 3060 dr_type = R_386_TLS_DTPMOD32;
67a4f2b7
AO
3061 else if (GOT_TLS_GDESC_P (tls_type))
3062 goto dr_done;
37e55690
JJ
3063 else if (tls_type == GOT_TLS_IE_POS)
3064 dr_type = R_386_TLS_TPOFF;
13ae64f3
JJ
3065 else
3066 dr_type = R_386_TLS_TPOFF32;
67a4f2b7 3067
37e55690 3068 if (dr_type == R_386_TLS_TPOFF && indx == 0)
eb4ff4d6 3069 bfd_put_32 (output_bfd,
0afcef53 3070 relocation - _bfd_x86_elf_dtpoff_base (info),
6de2ae4a 3071 htab->elf.sgot->contents + off);
37e55690 3072 else if (dr_type == R_386_TLS_TPOFF32 && indx == 0)
23209a78 3073 bfd_put_32 (output_bfd,
0afcef53 3074 _bfd_x86_elf_dtpoff_base (info) - relocation,
6de2ae4a 3075 htab->elf.sgot->contents + off);
67a4f2b7 3076 else if (dr_type != R_386_TLS_DESC)
c366c25e 3077 bfd_put_32 (output_bfd, 0,
6de2ae4a 3078 htab->elf.sgot->contents + off);
13ae64f3 3079 outrel.r_info = ELF32_R_INFO (indx, dr_type);
67a4f2b7 3080
59d6ffb2 3081 elf_append_rel (output_bfd, sreloc, &outrel);
13ae64f3 3082
67a4f2b7 3083 if (GOT_TLS_GD_P (tls_type))
13ae64f3
JJ
3084 {
3085 if (indx == 0)
3086 {
07d6d2b8 3087 BFD_ASSERT (! unresolved_reloc);
13ae64f3 3088 bfd_put_32 (output_bfd,
0afcef53 3089 relocation - _bfd_x86_elf_dtpoff_base (info),
6de2ae4a 3090 htab->elf.sgot->contents + off + 4);
13ae64f3
JJ
3091 }
3092 else
3093 {
3094 bfd_put_32 (output_bfd, 0,
6de2ae4a 3095 htab->elf.sgot->contents + off + 4);
13ae64f3
JJ
3096 outrel.r_info = ELF32_R_INFO (indx,
3097 R_386_TLS_DTPOFF32);
3098 outrel.r_offset += 4;
59d6ffb2 3099 elf_append_rel (output_bfd, sreloc, &outrel);
13ae64f3
JJ
3100 }
3101 }
37e55690
JJ
3102 else if (tls_type == GOT_TLS_IE_BOTH)
3103 {
3104 bfd_put_32 (output_bfd,
eb4ff4d6 3105 (indx == 0
0afcef53 3106 ? relocation - _bfd_x86_elf_dtpoff_base (info)
eb4ff4d6 3107 : 0),
6de2ae4a 3108 htab->elf.sgot->contents + off + 4);
37e55690
JJ
3109 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF);
3110 outrel.r_offset += 4;
59d6ffb2 3111 elf_append_rel (output_bfd, sreloc, &outrel);
37e55690 3112 }
13ae64f3 3113
67a4f2b7 3114 dr_done:
13ae64f3
JJ
3115 if (h != NULL)
3116 h->got.offset |= 1;
3117 else
3118 local_got_offsets[r_symndx] |= 1;
3119 }
3120
67a4f2b7
AO
3121 if (off >= (bfd_vma) -2
3122 && ! GOT_TLS_GDESC_P (tls_type))
13ae64f3 3123 abort ();
419414ea
L
3124 if (r_type_tls == R_386_TLS_GOTDESC
3125 || r_type_tls == R_386_TLS_DESC_CALL)
67a4f2b7
AO
3126 {
3127 relocation = htab->sgotplt_jump_table_size + offplt;
3128 unresolved_reloc = FALSE;
3129 }
419414ea 3130 else if (r_type_tls == r_type)
13ae64f3 3131 {
6de2ae4a
L
3132 bfd_vma g_o_t = htab->elf.sgotplt->output_section->vma
3133 + htab->elf.sgotplt->output_offset;
3134 relocation = htab->elf.sgot->output_section->vma
3135 + htab->elf.sgot->output_offset + off - g_o_t;
37e55690
JJ
3136 if ((r_type == R_386_TLS_IE || r_type == R_386_TLS_GOTIE)
3137 && tls_type == GOT_TLS_IE_BOTH)
3138 relocation += 4;
3139 if (r_type == R_386_TLS_IE)
8c37241b 3140 relocation += g_o_t;
b34976b6 3141 unresolved_reloc = FALSE;
13ae64f3 3142 }
419414ea 3143 else if (r_type == R_386_TLS_GD)
13ae64f3
JJ
3144 {
3145 unsigned int val, type;
3146 bfd_vma roff;
3147
3148 /* GD->IE transition. */
6eaa7fb5
L
3149 type = *(contents + rel->r_offset - 2);
3150 val = *(contents + rel->r_offset - 1);
13ae64f3
JJ
3151 if (type == 0x04)
3152 {
6eaa7fb5
L
3153 /* Change
3154 leal foo@tlsgd(,%ebx,1), %eax
3155 call ___tls_get_addr@PLT
3156 into:
3157 movl %gs:0, %eax
3158 subl $foo@gottpoff(%ebx), %eax. */
13ae64f3 3159 val >>= 3;
142411ca 3160 roff = rel->r_offset - 3;
13ae64f3
JJ
3161 }
3162 else
3163 {
6eaa7fb5
L
3164 /* Change
3165 leal foo@tlsgd(%ebx), %eax
3166 call ___tls_get_addr@PLT
3167 nop
3168 or
3169 leal foo@tlsgd(%reg), %eax
3170 call *___tls_get_addr@GOT(%reg)
3171 which may be converted to
3172 addr32 call ___tls_get_addr
3173 into:
3174 movl %gs:0, %eax;
3175 subl $foo@gottpoff(%reg), %eax. */
13ae64f3
JJ
3176 roff = rel->r_offset - 2;
3177 }
3178 memcpy (contents + roff,
3179 "\x65\xa1\0\0\0\0\x2b\x80\0\0\0", 12);
3180 contents[roff + 7] = 0x80 | (val & 7);
37e55690
JJ
3181 /* If foo is used only with foo@gotntpoff(%reg) and
3182 foo@indntpoff, but not with foo@gottpoff(%reg), change
3183 subl $foo@gottpoff(%reg), %eax
3184 into:
3185 addl $foo@gotntpoff(%reg), %eax. */
ebcfb3c0
JJ
3186 if (tls_type == GOT_TLS_IE_POS)
3187 contents[roff + 6] = 0x03;
8c37241b 3188 bfd_put_32 (output_bfd,
6de2ae4a
L
3189 htab->elf.sgot->output_section->vma
3190 + htab->elf.sgot->output_offset + off
3191 - htab->elf.sgotplt->output_section->vma
3192 - htab->elf.sgotplt->output_offset,
13ae64f3 3193 contents + roff + 8);
6eaa7fb5 3194 /* Skip R_386_PLT32 and R_386_GOT32X. */
13ae64f3 3195 rel++;
60f2e42e 3196 wrel++;
13ae64f3
JJ
3197 continue;
3198 }
419414ea 3199 else if (r_type == R_386_TLS_GOTDESC)
67a4f2b7
AO
3200 {
3201 /* GDesc -> IE transition.
3202 It's originally something like:
3203 leal x@tlsdesc(%ebx), %eax
3204
3205 Change it to:
142411ca 3206 movl x@gotntpoff(%ebx), %eax # before xchg %ax,%ax
67a4f2b7
AO
3207 or:
3208 movl x@gottpoff(%ebx), %eax # before negl %eax
3209
3210 Registers other than %eax may be set up here. */
3211
67a4f2b7
AO
3212 bfd_vma roff;
3213
3214 /* First, make sure it's a leal adding ebx to a 32-bit
3215 offset into any register, although it's probably
3216 almost always going to be eax. */
3217 roff = rel->r_offset;
67a4f2b7
AO
3218
3219 /* Now modify the instruction as appropriate. */
3220 /* To turn a leal into a movl in the form we use it, it
3221 suffices to change the first byte from 0x8d to 0x8b.
3222 aoliva FIXME: should we decide to keep the leal, all
3223 we have to do is remove the statement below, and
3224 adjust the relaxation of R_386_TLS_DESC_CALL. */
3225 bfd_put_8 (output_bfd, 0x8b, contents + roff - 2);
3226
3227 if (tls_type == GOT_TLS_IE_BOTH)
3228 off += 4;
3229
3230 bfd_put_32 (output_bfd,
6de2ae4a
L
3231 htab->elf.sgot->output_section->vma
3232 + htab->elf.sgot->output_offset + off
3233 - htab->elf.sgotplt->output_section->vma
3234 - htab->elf.sgotplt->output_offset,
67a4f2b7
AO
3235 contents + roff);
3236 continue;
3237 }
419414ea 3238 else if (r_type == R_386_TLS_DESC_CALL)
67a4f2b7
AO
3239 {
3240 /* GDesc -> IE transition.
3241 It's originally:
3242 call *(%eax)
3243
3244 Change it to:
142411ca 3245 xchg %ax,%ax
67a4f2b7
AO
3246 or
3247 negl %eax
3248 depending on how we transformed the TLS_GOTDESC above.
3249 */
3250
67a4f2b7
AO
3251 bfd_vma roff;
3252
67a4f2b7 3253 roff = rel->r_offset;
67a4f2b7
AO
3254
3255 /* Now modify the instruction as appropriate. */
3256 if (tls_type != GOT_TLS_IE_NEG)
3257 {
10efb593
L
3258 /* xchg %ax,%ax */
3259 bfd_put_8 (output_bfd, 0x66, contents + roff);
67a4f2b7
AO
3260 bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
3261 }
3262 else
3263 {
3264 /* negl %eax */
3265 bfd_put_8 (output_bfd, 0xf7, contents + roff);
3266 bfd_put_8 (output_bfd, 0xd8, contents + roff + 1);
3267 }
3268
3269 continue;
3270 }
3271 else
3272 BFD_ASSERT (FALSE);
13ae64f3
JJ
3273 break;
3274
3275 case R_386_TLS_LDM:
142411ca
L
3276 if (! elf_i386_tls_transition (info, input_bfd,
3277 input_section, contents,
3278 symtab_hdr, sym_hashes,
3279 &r_type, GOT_UNKNOWN, rel,
bedfd056 3280 relend, h, r_symndx, TRUE))
142411ca 3281 return FALSE;
13ae64f3 3282
142411ca
L
3283 if (r_type != R_386_TLS_LDM)
3284 {
6eaa7fb5
L
3285 /* LD->LE transition. Change
3286 leal foo@tlsldm(%ebx) %eax
3287 call ___tls_get_addr@PLT
3288 into:
3289 movl %gs:0, %eax
3290 nop
3291 leal 0(%esi,1), %esi
3292 or change
3293 leal foo@tlsldm(%reg) %eax
3294 call *___tls_get_addr@GOT(%reg)
3295 which may be converted to
3296 addr32 call ___tls_get_addr
3297 into:
3298 movl %gs:0, %eax
3299 leal 0(%esi), %esi */
142411ca 3300 BFD_ASSERT (r_type == R_386_TLS_LE_32);
6eaa7fb5
L
3301 if (*(contents + rel->r_offset + 4) == 0xff
3302 || *(contents + rel->r_offset + 4) == 0x67)
3303 memcpy (contents + rel->r_offset - 2,
3304 "\x65\xa1\0\0\0\0\x8d\xb6\0\0\0", 12);
3305 else
3306 memcpy (contents + rel->r_offset - 2,
3307 "\x65\xa1\0\0\0\0\x90\x8d\x74\x26", 11);
a3fadc9a 3308 /* Skip R_386_PC32/R_386_PLT32. */
13ae64f3 3309 rel++;
60f2e42e 3310 wrel++;
13ae64f3
JJ
3311 continue;
3312 }
3313
6de2ae4a 3314 if (htab->elf.sgot == NULL)
13ae64f3
JJ
3315 abort ();
3316
0afcef53 3317 off = htab->tls_ld_or_ldm_got.offset;
13ae64f3
JJ
3318 if (off & 1)
3319 off &= ~1;
3320 else
3321 {
947216bf 3322 Elf_Internal_Rela outrel;
13ae64f3 3323
6de2ae4a 3324 if (htab->elf.srelgot == NULL)
13ae64f3
JJ
3325 abort ();
3326
6de2ae4a
L
3327 outrel.r_offset = (htab->elf.sgot->output_section->vma
3328 + htab->elf.sgot->output_offset + off);
13ae64f3
JJ
3329
3330 bfd_put_32 (output_bfd, 0,
6de2ae4a 3331 htab->elf.sgot->contents + off);
13ae64f3 3332 bfd_put_32 (output_bfd, 0,
6de2ae4a 3333 htab->elf.sgot->contents + off + 4);
13ae64f3 3334 outrel.r_info = ELF32_R_INFO (0, R_386_TLS_DTPMOD32);
59d6ffb2 3335 elf_append_rel (output_bfd, htab->elf.srelgot, &outrel);
0afcef53 3336 htab->tls_ld_or_ldm_got.offset |= 1;
13ae64f3 3337 }
6de2ae4a
L
3338 relocation = htab->elf.sgot->output_section->vma
3339 + htab->elf.sgot->output_offset + off
3340 - htab->elf.sgotplt->output_section->vma
3341 - htab->elf.sgotplt->output_offset;
b34976b6 3342 unresolved_reloc = FALSE;
13ae64f3
JJ
3343 break;
3344
3345 case R_386_TLS_LDO_32:
0e1862bb
L
3346 if (!bfd_link_executable (info)
3347 || (input_section->flags & SEC_CODE) == 0)
0afcef53 3348 relocation -= _bfd_x86_elf_dtpoff_base (info);
13ae64f3
JJ
3349 else
3350 /* When converting LDO to LE, we must negate. */
eb4ff4d6 3351 relocation = -elf_i386_tpoff (info, relocation);
13ae64f3
JJ
3352 break;
3353
3354 case R_386_TLS_LE_32:
13ae64f3 3355 case R_386_TLS_LE:
0e1862bb 3356 if (!bfd_link_executable (info))
37e55690 3357 {
947216bf 3358 Elf_Internal_Rela outrel;
37e55690 3359 asection *sreloc;
37e55690
JJ
3360
3361 outrel.r_offset = rel->r_offset
3362 + input_section->output_section->vma
3363 + input_section->output_offset;
3364 if (h != NULL && h->dynindx != -1)
3365 indx = h->dynindx;
3366 else
3367 indx = 0;
3368 if (r_type == R_386_TLS_LE_32)
3369 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF32);
3370 else
3371 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF);
3372 sreloc = elf_section_data (input_section)->sreloc;
3373 if (sreloc == NULL)
3374 abort ();
59d6ffb2 3375 elf_append_rel (output_bfd, sreloc, &outrel);
37e55690
JJ
3376 if (indx)
3377 continue;
3378 else if (r_type == R_386_TLS_LE_32)
0afcef53 3379 relocation = _bfd_x86_elf_dtpoff_base (info) - relocation;
37e55690 3380 else
0afcef53 3381 relocation -= _bfd_x86_elf_dtpoff_base (info);
37e55690
JJ
3382 }
3383 else if (r_type == R_386_TLS_LE_32)
eb4ff4d6 3384 relocation = elf_i386_tpoff (info, relocation);
37e55690 3385 else
eb4ff4d6 3386 relocation = -elf_i386_tpoff (info, relocation);
13ae64f3
JJ
3387 break;
3388
252b5132
RH
3389 default:
3390 break;
3391 }
3392
239e1f3a
AM
3393 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
3394 because such sections are not SEC_ALLOC and thus ld.so will
3395 not process them. */
8c694914 3396 if (unresolved_reloc
239e1f3a 3397 && !((input_section->flags & SEC_DEBUGGING) != 0
1d5316ab
AM
3398 && h->def_dynamic)
3399 && _bfd_elf_section_offset (output_bfd, info, input_section,
3400 rel->r_offset) != (bfd_vma) -1)
6a30718d 3401 {
4eca0228 3402 _bfd_error_handler
695344c0 3403 /* xgettext:c-format */
2dcf00ce 3404 (_("%pB(%pA+%#" PRIx64 "): unresolvable %s relocation against symbol `%s'"),
d003868e
AM
3405 input_bfd,
3406 input_section,
2dcf00ce 3407 (uint64_t) rel->r_offset,
843fe662 3408 howto->name,
6a30718d 3409 h->root.root.string);
b34976b6 3410 return FALSE;
6a30718d 3411 }
83be169b 3412
dc1e8a47 3413 do_relocation:
252b5132
RH
3414 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3415 contents, rel->r_offset,
55fd94b0 3416 relocation, 0);
252b5132 3417
dc1e8a47 3418 check_relocation_error:
cf5c0c5b 3419 if (r != bfd_reloc_ok)
252b5132 3420 {
cf5c0c5b 3421 const char *name;
ffb2e45b 3422
cf5c0c5b
AM
3423 if (h != NULL)
3424 name = h->root.root.string;
3425 else
3426 {
3427 name = bfd_elf_string_from_elf_section (input_bfd,
3428 symtab_hdr->sh_link,
3429 sym->st_name);
3430 if (name == NULL)
b34976b6 3431 return FALSE;
cf5c0c5b 3432 if (*name == '\0')
fd361982 3433 name = bfd_section_name (sec);
cf5c0c5b 3434 }
ffb2e45b 3435
cf5c0c5b 3436 if (r == bfd_reloc_overflow)
1a72702b
AM
3437 (*info->callbacks->reloc_overflow)
3438 (info, (h ? &h->root : NULL), name, howto->name,
3439 (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
cf5c0c5b
AM
3440 else
3441 {
4eca0228 3442 _bfd_error_handler
695344c0 3443 /* xgettext:c-format */
2dcf00ce 3444 (_("%pB(%pA+%#" PRIx64 "): reloc against `%s': error %d"),
d003868e 3445 input_bfd, input_section,
2dcf00ce 3446 (uint64_t) rel->r_offset, name, (int) r);
b34976b6 3447 return FALSE;
cf5c0c5b 3448 }
252b5132 3449 }
60f2e42e
L
3450
3451 if (wrel != rel)
3452 *wrel = *rel;
3453 }
3454
3455 if (wrel != rel)
3456 {
3457 Elf_Internal_Shdr *rel_hdr;
3458 size_t deleted = rel - wrel;
3459
3460 rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section);
3461 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
3462 if (rel_hdr->sh_size == 0)
3463 {
3464 /* It is too late to remove an empty reloc section. Leave
3465 one NONE reloc.
3466 ??? What is wrong with an empty section??? */
3467 rel_hdr->sh_size = rel_hdr->sh_entsize;
3468 deleted -= 1;
3469 }
3470 rel_hdr = _bfd_elf_single_rel_hdr (input_section);
3471 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
3472 input_section->reloc_count -= deleted;
252b5132
RH
3473 }
3474
b34976b6 3475 return TRUE;
252b5132
RH
3476}
3477
3478/* Finish up dynamic symbol handling. We set the contents of various
3479 dynamic sections here. */
3480
b34976b6 3481static bfd_boolean
55fd94b0
AM
3482elf_i386_finish_dynamic_symbol (bfd *output_bfd,
3483 struct bfd_link_info *info,
3484 struct elf_link_hash_entry *h,
3485 Elf_Internal_Sym *sym)
252b5132 3486{
0afcef53 3487 struct elf_x86_link_hash_table *htab;
25e762b9 3488 unsigned plt_entry_size;
0afcef53 3489 struct elf_x86_link_hash_entry *eh;
aec6b87e 3490 bfd_boolean local_undefweak;
ee2fdd6f 3491 bfd_boolean use_plt_second;
252b5132 3492
0afcef53 3493 htab = elf_x86_hash_table (info, I386_ELF_DATA);
4dfe6ac6
NC
3494 if (htab == NULL)
3495 return FALSE;
252b5132 3496
765e526c 3497 plt_entry_size = htab->plt.plt_entry_size;
25e762b9 3498
ee2fdd6f
L
3499 /* Use the second PLT section only if there is .plt section. */
3500 use_plt_second = htab->elf.splt != NULL && htab->plt_second != NULL;
3501
0afcef53 3502 eh = (struct elf_x86_link_hash_entry *) h;
e133d005
L
3503 if (eh->no_finish_dynamic_symbol)
3504 abort ();
dd7e64d4 3505
aec6b87e
L
3506 /* We keep PLT/GOT entries without dynamic PLT/GOT relocations for
3507 resolved undefined weak symbols in executable so that their
3508 references have value 0 at run-time. */
c5bce5c6 3509 local_undefweak = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
aec6b87e 3510
252b5132
RH
3511 if (h->plt.offset != (bfd_vma) -1)
3512 {
ee2fdd6f 3513 bfd_vma plt_index, plt_offset;
252b5132 3514 bfd_vma got_offset;
947216bf
AM
3515 Elf_Internal_Rela rel;
3516 bfd_byte *loc;
ee2fdd6f 3517 asection *plt, *resolved_plt, *gotplt, *relplt;
cbe950e9
L
3518
3519 /* When building a static executable, use .iplt, .igot.plt and
3520 .rel.iplt sections for STT_GNU_IFUNC symbols. */
6de2ae4a 3521 if (htab->elf.splt != NULL)
cbe950e9 3522 {
6de2ae4a
L
3523 plt = htab->elf.splt;
3524 gotplt = htab->elf.sgotplt;
3525 relplt = htab->elf.srelplt;
cbe950e9
L
3526 }
3527 else
3528 {
6de2ae4a
L
3529 plt = htab->elf.iplt;
3530 gotplt = htab->elf.igotplt;
3531 relplt = htab->elf.irelplt;
cbe950e9 3532 }
252b5132 3533
f3180fa9 3534 VERIFY_PLT_ENTRY (info, h, plt, gotplt, relplt, local_undefweak)
252b5132
RH
3535
3536 /* Get the index in the procedure linkage table which
3537 corresponds to this symbol. This is the index of this symbol
3538 in all the symbols for which we are making plt entries. The
cbe950e9 3539 first entry in the procedure linkage table is reserved.
252b5132 3540
cbe950e9 3541 Get the offset into the .got table of the entry that
252b5132 3542 corresponds to this function. Each .got entry is 4 bytes.
cbe950e9 3543 The first three are reserved.
6bbec505 3544
cbe950e9
L
3545 For static executables, we don't reserve anything. */
3546
6de2ae4a 3547 if (plt == htab->elf.splt)
cbe950e9 3548 {
f604c2a2 3549 got_offset = (h->plt.offset / plt_entry_size
765e526c 3550 - htab->plt.has_plt0);
e1f98742 3551 got_offset = (got_offset + 3) * 4;
cbe950e9
L
3552 }
3553 else
3554 {
e1f98742
L
3555 got_offset = h->plt.offset / plt_entry_size;
3556 got_offset = got_offset * 4;
cbe950e9 3557 }
252b5132 3558
f604c2a2
L
3559 /* Fill in the entry in the procedure linkage table and update
3560 the first slot. */
765e526c 3561 memcpy (plt->contents + h->plt.offset, htab->plt.plt_entry,
f604c2a2 3562 plt_entry_size);
ee2fdd6f
L
3563
3564 if (use_plt_second)
3565 {
3566 const bfd_byte *plt_entry;
3567 if (bfd_link_pic (info))
765e526c 3568 plt_entry = htab->non_lazy_plt->pic_plt_entry;
ee2fdd6f 3569 else
765e526c 3570 plt_entry = htab->non_lazy_plt->plt_entry;
ee2fdd6f 3571 memcpy (htab->plt_second->contents + eh->plt_second.offset,
765e526c 3572 plt_entry, htab->non_lazy_plt->plt_entry_size);
ee2fdd6f
L
3573
3574 resolved_plt = htab->plt_second;
3575 plt_offset = eh->plt_second.offset;
3576 }
3577 else
3578 {
3579 resolved_plt = plt;
3580 plt_offset = h->plt.offset;
3581 }
3582
0e1862bb 3583 if (! bfd_link_pic (info))
252b5132 3584 {
252b5132 3585 bfd_put_32 (output_bfd,
cbe950e9
L
3586 (gotplt->output_section->vma
3587 + gotplt->output_offset
252b5132 3588 + got_offset),
ee2fdd6f 3589 resolved_plt->contents + plt_offset
07d6d2b8 3590 + htab->plt.plt_got_offset);
eac338cf 3591
90c14f0c 3592 if (htab->elf.target_os == is_vxworks)
eac338cf
PB
3593 {
3594 int s, k, reloc_index;
3595
3596 /* Create the R_386_32 relocation referencing the GOT
3597 for this PLT entry. */
3598
3599 /* S: Current slot number (zero-based). */
765e526c 3600 s = ((h->plt.offset - htab->plt.plt_entry_size)
07d6d2b8 3601 / htab->plt.plt_entry_size);
eac338cf 3602 /* K: Number of relocations for PLTResolve. */
0e1862bb 3603 if (bfd_link_pic (info))
eac338cf
PB
3604 k = PLTRESOLVE_RELOCS_SHLIB;
3605 else
3606 k = PLTRESOLVE_RELOCS;
3607 /* Skip the PLTresolve relocations, and the relocations for
3608 the other PLT slots. */
3609 reloc_index = k + s * PLT_NON_JUMP_SLOT_RELOCS;
765e526c 3610 loc = (htab->srelplt2->contents + reloc_index
eac338cf
PB
3611 * sizeof (Elf32_External_Rel));
3612
ee2fdd6f
L
3613 rel.r_offset = (plt->output_section->vma
3614 + plt->output_offset
eac338cf 3615 + h->plt.offset + 2),
7325306f 3616 rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
eac338cf
PB
3617 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
3618
3619 /* Create the R_386_32 relocation referencing the beginning of
3620 the PLT for this GOT entry. */
6de2ae4a
L
3621 rel.r_offset = (htab->elf.sgotplt->output_section->vma
3622 + htab->elf.sgotplt->output_offset
eac338cf 3623 + got_offset);
7325306f 3624 rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_386_32);
eac338cf 3625 bfd_elf32_swap_reloc_out (output_bfd, &rel,
13ca3149 3626 loc + sizeof (Elf32_External_Rel));
eac338cf 3627 }
252b5132
RH
3628 }
3629 else
3630 {
252b5132 3631 bfd_put_32 (output_bfd, got_offset,
ee2fdd6f 3632 resolved_plt->contents + plt_offset
07d6d2b8 3633 + htab->plt.plt_got_offset);
252b5132
RH
3634 }
3635
aec6b87e
L
3636 /* Fill in the entry in the global offset table. Leave the entry
3637 as zero for undefined weak symbol in PIE. No PLT relocation
3638 against undefined weak symbol in PIE. */
3639 if (!local_undefweak)
cbe950e9 3640 {
765e526c 3641 if (htab->plt.has_plt0)
f604c2a2
L
3642 bfd_put_32 (output_bfd,
3643 (plt->output_section->vma
3644 + plt->output_offset
3645 + h->plt.offset
765e526c 3646 + htab->lazy_plt->plt_lazy_offset),
f604c2a2 3647 gotplt->contents + got_offset);
252b5132 3648
aec6b87e
L
3649 /* Fill in the entry in the .rel.plt section. */
3650 rel.r_offset = (gotplt->output_section->vma
3651 + gotplt->output_offset
3652 + got_offset);
cf1070f1 3653 if (PLT_LOCAL_IFUNC_P (info, h))
aec6b87e 3654 {
871b3ab2 3655 info->callbacks->minfo (_("Local IFUNC function `%s' in %pB\n"),
6322e5c5
L
3656 h->root.root.string,
3657 h->root.u.def.section->owner);
3658
aec6b87e
L
3659 /* If an STT_GNU_IFUNC symbol is locally defined, generate
3660 R_386_IRELATIVE instead of R_386_JUMP_SLOT. Store addend
3661 in the .got.plt section. */
3662 bfd_put_32 (output_bfd,
3663 (h->root.u.def.value
3664 + h->root.u.def.section->output_section->vma
3665 + h->root.u.def.section->output_offset),
3666 gotplt->contents + got_offset);
3667 rel.r_info = ELF32_R_INFO (0, R_386_IRELATIVE);
3668 /* R_386_IRELATIVE comes last. */
3669 plt_index = htab->next_irelative_index--;
3670 }
3671 else
3672 {
3673 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_JUMP_SLOT);
3674 plt_index = htab->next_jump_slot_index++;
3675 }
3676
3677 loc = relplt->contents + plt_index * sizeof (Elf32_External_Rel);
3678 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
3679
f604c2a2
L
3680 /* Don't fill the second and third slots in PLT entry for
3681 static executables nor without PLT0. */
765e526c 3682 if (plt == htab->elf.splt && htab->plt.has_plt0)
aec6b87e
L
3683 {
3684 bfd_put_32 (output_bfd,
3685 plt_index * sizeof (Elf32_External_Rel),
3686 plt->contents + h->plt.offset
765e526c 3687 + htab->lazy_plt->plt_reloc_offset);
f604c2a2
L
3688 bfd_put_32 (output_bfd,
3689 - (h->plt.offset
765e526c 3690 + htab->lazy_plt->plt_plt_offset + 4),
f604c2a2 3691 (plt->contents + h->plt.offset
765e526c 3692 + htab->lazy_plt->plt_plt_offset));
aec6b87e 3693 }
e1f98742 3694 }
dd7e64d4
L
3695 }
3696 else if (eh->plt_got.offset != (bfd_vma) -1)
3697 {
3698 bfd_vma got_offset, plt_offset;
3699 asection *plt, *got, *gotplt;
3700 const bfd_byte *got_plt_entry;
3701
dd7e64d4
L
3702 /* Set the entry in the GOT procedure linkage table. */
3703 plt = htab->plt_got;
3704 got = htab->elf.sgot;
3705 gotplt = htab->elf.sgotplt;
3706 got_offset = h->got.offset;
3707
3708 if (got_offset == (bfd_vma) -1
3709 || plt == NULL
3710 || got == NULL
3711 || gotplt == NULL)
3712 abort ();
3713
3714 /* Fill in the entry in the GOT procedure linkage table. */
0e1862bb 3715 if (! bfd_link_pic (info))
252b5132 3716 {
765e526c 3717 got_plt_entry = htab->non_lazy_plt->plt_entry;
dd7e64d4 3718 got_offset += got->output_section->vma + got->output_offset;
252b5132 3719 }
dd7e64d4
L
3720 else
3721 {
765e526c 3722 got_plt_entry = htab->non_lazy_plt->pic_plt_entry;
dd7e64d4
L
3723 got_offset += (got->output_section->vma
3724 + got->output_offset
3725 - gotplt->output_section->vma
3726 - gotplt->output_offset);
3727 }
3728
3729 plt_offset = eh->plt_got.offset;
3730 memcpy (plt->contents + plt_offset, got_plt_entry,
765e526c 3731 htab->non_lazy_plt->plt_entry_size);
dd7e64d4 3732 bfd_put_32 (output_bfd, got_offset,
f604c2a2 3733 (plt->contents + plt_offset
765e526c 3734 + htab->non_lazy_plt->plt_got_offset));
dd7e64d4
L
3735 }
3736
aec6b87e
L
3737 if (!local_undefweak
3738 && !h->def_regular
dd7e64d4
L
3739 && (h->plt.offset != (bfd_vma) -1
3740 || eh->plt_got.offset != (bfd_vma) -1))
3741 {
3742 /* Mark the symbol as undefined, rather than as defined in
3743 the .plt section. Leave the value if there were any
3744 relocations where pointer equality matters (this is a clue
3745 for the dynamic linker, to make function pointer
3746 comparisons work between an application and shared
3747 library), otherwise set it to zero. If a function is only
3748 called from a binary, there is no need to slow down
3749 shared libraries because of that. */
3750 sym->st_shndx = SHN_UNDEF;
3751 if (!h->pointer_equality_needed)
3752 sym->st_value = 0;
252b5132
RH
3753 }
3754
4ec09950
L
3755 _bfd_x86_elf_link_fixup_ifunc_symbol (info, htab, h, sym);
3756
aec6b87e
L
3757 /* Don't generate dynamic GOT relocation against undefined weak
3758 symbol in executable. */
13ae64f3 3759 if (h->got.offset != (bfd_vma) -1
0afcef53
L
3760 && ! GOT_TLS_GD_ANY_P (elf_x86_hash_entry(h)->tls_type)
3761 && (elf_x86_hash_entry(h)->tls_type & GOT_TLS_IE) == 0
aec6b87e 3762 && !local_undefweak)
252b5132 3763 {
947216bf 3764 Elf_Internal_Rela rel;
233cc9c1 3765 asection *relgot = htab->elf.srelgot;
252b5132
RH
3766
3767 /* This symbol has an entry in the global offset table. Set it
3768 up. */
3769
6de2ae4a 3770 if (htab->elf.sgot == NULL || htab->elf.srelgot == NULL)
ffb2e45b 3771 abort ();
252b5132 3772
6de2ae4a
L
3773 rel.r_offset = (htab->elf.sgot->output_section->vma
3774 + htab->elf.sgot->output_offset
dc810e39 3775 + (h->got.offset & ~(bfd_vma) 1));
252b5132 3776
dd5724d5
AM
3777 /* If this is a static link, or it is a -Bsymbolic link and the
3778 symbol is defined locally or was forced to be local because
3779 of a version file, we just want to emit a RELATIVE reloc.
252b5132
RH
3780 The entry in the global offset table will already have been
3781 initialized in the relocate_section function. */
710ab287 3782 if (h->def_regular
0018b0a3
L
3783 && h->type == STT_GNU_IFUNC)
3784 {
233cc9c1
L
3785 if (h->plt.offset == (bfd_vma) -1)
3786 {
3787 /* STT_GNU_IFUNC is referenced without PLT. */
3788 if (htab->elf.splt == NULL)
3789 {
3790 /* use .rel[a].iplt section to store .got relocations
3791 in static executable. */
3792 relgot = htab->elf.irelplt;
3793 }
6999821f 3794 if (SYMBOL_REFERENCES_LOCAL_P (info, h))
233cc9c1 3795 {
871b3ab2 3796 info->callbacks->minfo (_("Local IFUNC function `%s' in %pB\n"),
6322e5c5
L
3797 h->root.root.string,
3798 h->root.u.def.section->owner);
3799
233cc9c1
L
3800 bfd_put_32 (output_bfd,
3801 (h->root.u.def.value
3802 + h->root.u.def.section->output_section->vma
3803 + h->root.u.def.section->output_offset),
3804 htab->elf.sgot->contents + h->got.offset);
3805 rel.r_info = ELF32_R_INFO (0, R_386_IRELATIVE);
3806 }
3807 else
3808 goto do_glob_dat;
3809 }
3810 else if (bfd_link_pic (info))
710ab287
L
3811 {
3812 /* Generate R_386_GLOB_DAT. */
3813 goto do_glob_dat;
3814 }
3815 else
3816 {
cd2b2c10 3817 asection *plt;
ee2fdd6f 3818 bfd_vma plt_offset;
cd2b2c10 3819
710ab287
L
3820 if (!h->pointer_equality_needed)
3821 abort ();
3822
3823 /* For non-shared object, we can't use .got.plt, which
3824 contains the real function addres if we need pointer
3825 equality. We load the GOT entry with the PLT entry. */
ee2fdd6f
L
3826 if (htab->plt_second != NULL)
3827 {
3828 plt = htab->plt_second;
3829 plt_offset = eh->plt_second.offset;
3830 }
3831 else
3832 {
3833 plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt;
3834 plt_offset = h->plt.offset;
3835 }
710ab287
L
3836 bfd_put_32 (output_bfd,
3837 (plt->output_section->vma
ee2fdd6f 3838 + plt->output_offset + plt_offset),
6de2ae4a 3839 htab->elf.sgot->contents + h->got.offset);
710ab287
L
3840 return TRUE;
3841 }
0018b0a3 3842 }
0e1862bb 3843 else if (bfd_link_pic (info)
6999821f 3844 && SYMBOL_REFERENCES_LOCAL_P (info, h))
dd5724d5 3845 {
6725bdbf 3846 BFD_ASSERT((h->got.offset & 1) != 0);
dd5724d5
AM
3847 rel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
3848 }
252b5132
RH
3849 else
3850 {
dd5724d5 3851 BFD_ASSERT((h->got.offset & 1) == 0);
dc1e8a47 3852 do_glob_dat:
6725bdbf 3853 bfd_put_32 (output_bfd, (bfd_vma) 0,
6de2ae4a 3854 htab->elf.sgot->contents + h->got.offset);
252b5132
RH
3855 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_GLOB_DAT);
3856 }
3857
233cc9c1 3858 elf_append_rel (output_bfd, relgot, &rel);
252b5132
RH
3859 }
3860
f5385ebf 3861 if (h->needs_copy)
252b5132 3862 {
947216bf 3863 Elf_Internal_Rela rel;
5474d94f 3864 asection *s;
252b5132
RH
3865
3866 /* This symbol needs a copy reloc. Set it up. */
ff38b4cc 3867 VERIFY_COPY_RELOC (h, htab)
252b5132
RH
3868
3869 rel.r_offset = (h->root.u.def.value
3870 + h->root.u.def.section->output_section->vma
3871 + h->root.u.def.section->output_offset);
3872 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_COPY);
afbf7e8e 3873 if (h->root.u.def.section == htab->elf.sdynrelro)
5474d94f
AM
3874 s = htab->elf.sreldynrelro;
3875 else
3876 s = htab->elf.srelbss;
3877 elf_append_rel (output_bfd, s, &rel);
252b5132
RH
3878 }
3879
b34976b6 3880 return TRUE;
252b5132
RH
3881}
3882
c25bc9fc
L
3883/* Finish up local dynamic symbol handling. We set the contents of
3884 various dynamic sections here. */
3885
3886static bfd_boolean
3887elf_i386_finish_local_dynamic_symbol (void **slot, void *inf)
3888{
3889 struct elf_link_hash_entry *h
3890 = (struct elf_link_hash_entry *) *slot;
3891 struct bfd_link_info *info
23209a78 3892 = (struct bfd_link_info *) inf;
c25bc9fc
L
3893
3894 return elf_i386_finish_dynamic_symbol (info->output_bfd, info,
3895 h, NULL);
3896}
3897
aec6b87e
L
3898/* Finish up undefined weak symbol handling in PIE. Fill its PLT entry
3899 here since undefined weak symbol may not be dynamic and may not be
3900 called for elf_i386_finish_dynamic_symbol. */
3901
3902static bfd_boolean
3903elf_i386_pie_finish_undefweak_symbol (struct bfd_hash_entry *bh,
3904 void *inf)
3905{
3906 struct elf_link_hash_entry *h = (struct elf_link_hash_entry *) bh;
3907 struct bfd_link_info *info = (struct bfd_link_info *) inf;
3908
3909 if (h->root.type != bfd_link_hash_undefweak
3910 || h->dynindx != -1)
3911 return TRUE;
3912
3913 return elf_i386_finish_dynamic_symbol (info->output_bfd,
5f0f0847 3914 info, h, NULL);
aec6b87e
L
3915}
3916
38701953
AM
3917/* Used to decide how to sort relocs in an optimal manner for the
3918 dynamic linker, before writing them out. */
3919
3920static enum elf_reloc_type_class
cae1fbbb 3921elf_i386_reloc_type_class (const struct bfd_link_info *info,
7e612e98
AM
3922 const asection *rel_sec ATTRIBUTE_UNUSED,
3923 const Elf_Internal_Rela *rela)
38701953 3924{
cae1fbbb
L
3925 bfd *abfd = info->output_bfd;
3926 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
3927 struct elf_link_hash_table *htab = elf_hash_table (info);
cae1fbbb 3928
d9e3b590
L
3929 if (htab->dynsym != NULL
3930 && htab->dynsym->contents != NULL)
3931 {
3932 /* Check relocation against STT_GNU_IFUNC symbol if there are
07d6d2b8 3933 dynamic symbols. */
d9e3b590 3934 unsigned long r_symndx = ELF32_R_SYM (rela->r_info);
c428ce9d
L
3935 if (r_symndx != STN_UNDEF)
3936 {
3937 Elf_Internal_Sym sym;
3938 if (!bed->s->swap_symbol_in (abfd,
3939 (htab->dynsym->contents
3940 + r_symndx * sizeof (Elf32_External_Sym)),
3941 0, &sym))
3942 abort ();
d9e3b590 3943
c428ce9d
L
3944 if (ELF32_ST_TYPE (sym.st_info) == STT_GNU_IFUNC)
3945 return reloc_class_ifunc;
3946 }
d9e3b590 3947 }
cae1fbbb 3948
55fd94b0 3949 switch (ELF32_R_TYPE (rela->r_info))
38701953 3950 {
c428ce9d
L
3951 case R_386_IRELATIVE:
3952 return reloc_class_ifunc;
38701953
AM
3953 case R_386_RELATIVE:
3954 return reloc_class_relative;
3955 case R_386_JUMP_SLOT:
3956 return reloc_class_plt;
3957 case R_386_COPY:
3958 return reloc_class_copy;
3959 default:
3960 return reloc_class_normal;
3961 }
3962}
3963
252b5132
RH
3964/* Finish up the dynamic sections. */
3965
b34976b6 3966static bfd_boolean
55fd94b0
AM
3967elf_i386_finish_dynamic_sections (bfd *output_bfd,
3968 struct bfd_link_info *info)
252b5132 3969{
0afcef53 3970 struct elf_x86_link_hash_table *htab;
252b5132 3971
9577f60b 3972 htab = _bfd_x86_elf_finish_dynamic_sections (output_bfd, info);
4dfe6ac6
NC
3973 if (htab == NULL)
3974 return FALSE;
3975
9577f60b
L
3976 if (!htab->elf.dynamic_sections_created)
3977 return TRUE;
252b5132 3978
9577f60b 3979 if (htab->elf.splt && htab->elf.splt->size > 0)
252b5132 3980 {
9577f60b
L
3981 /* UnixWare sets the entsize of .plt to 4, although that doesn't
3982 really seem like the right value. */
3983 elf_section_data (htab->elf.splt->output_section)
3984 ->this_hdr.sh_entsize = 4;
252b5132 3985
9577f60b 3986 if (htab->plt.has_plt0)
252b5132 3987 {
9577f60b
L
3988 /* Fill in the special first entry in the procedure linkage
3989 table. */
9577f60b
L
3990 memcpy (htab->elf.splt->contents, htab->plt.plt0_entry,
3991 htab->lazy_plt->plt0_entry_size);
3992 memset (htab->elf.splt->contents + htab->lazy_plt->plt0_entry_size,
851b6fa1 3993 htab->plt0_pad_byte,
9577f60b
L
3994 htab->plt.plt_entry_size - htab->lazy_plt->plt0_entry_size);
3995 if (!bfd_link_pic (info))
252b5132 3996 {
9577f60b
L
3997 bfd_put_32 (output_bfd,
3998 (htab->elf.sgotplt->output_section->vma
3999 + htab->elf.sgotplt->output_offset
4000 + 4),
4001 htab->elf.splt->contents
4002 + htab->lazy_plt->plt0_got1_offset);
4003 bfd_put_32 (output_bfd,
4004 (htab->elf.sgotplt->output_section->vma
4005 + htab->elf.sgotplt->output_offset
4006 + 8),
4007 htab->elf.splt->contents
4008 + htab->lazy_plt->plt0_got2_offset);
1f78f649 4009
90c14f0c 4010 if (htab->elf.target_os == is_vxworks)
eac338cf 4011 {
9577f60b
L
4012 Elf_Internal_Rela rel;
4013 int num_plts = (htab->elf.splt->size
4014 / htab->plt.plt_entry_size) - 1;
4015 unsigned char *p;
4016 asection *srelplt2 = htab->srelplt2;
4017
4018 /* Generate a relocation for _GLOBAL_OFFSET_TABLE_
4019 + 4. On IA32 we use REL relocations so the
4020 addend goes in the PLT directly. */
4021 rel.r_offset = (htab->elf.splt->output_section->vma
4022 + htab->elf.splt->output_offset
4023 + htab->lazy_plt->plt0_got1_offset);
4024 rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx,
4025 R_386_32);
4026 bfd_elf32_swap_reloc_out (output_bfd, &rel,
4027 srelplt2->contents);
4028 /* Generate a relocation for _GLOBAL_OFFSET_TABLE_
4029 + 8. */
4030 rel.r_offset = (htab->elf.splt->output_section->vma
4031 + htab->elf.splt->output_offset
4032 + htab->lazy_plt->plt0_got2_offset);
4033 rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx,
4034 R_386_32);
4035 bfd_elf32_swap_reloc_out (output_bfd, &rel,
4036 srelplt2->contents +
4037 sizeof (Elf32_External_Rel));
4038 /* Correct the .rel.plt.unloaded relocations. */
4039 p = srelplt2->contents;
4040 if (bfd_link_pic (info))
4041 p += PLTRESOLVE_RELOCS_SHLIB * sizeof (Elf32_External_Rel);
4042 else
4043 p += PLTRESOLVE_RELOCS * sizeof (Elf32_External_Rel);
eac338cf 4044
9577f60b 4045 for (; num_plts; num_plts--)
1f78f649 4046 {
9577f60b 4047 bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
f604c2a2 4048 rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx,
1f78f649 4049 R_386_32);
9577f60b
L
4050 bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
4051 p += sizeof (Elf32_External_Rel);
f604c2a2 4052
9577f60b
L
4053 bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
4054 rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx,
4055 R_386_32);
4056 bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
4057 p += sizeof (Elf32_External_Rel);
1f78f649 4058 }
eac338cf
PB
4059 }
4060 }
252b5132 4061 }
fff53dae
L
4062 }
4063
aec6b87e
L
4064 /* Fill PLT entries for undefined weak symbols in PIE. */
4065 if (bfd_link_pie (info))
4066 bfd_hash_traverse (&info->hash->table,
4067 elf_i386_pie_finish_undefweak_symbol,
4068 info);
4069
b34976b6 4070 return TRUE;
252b5132
RH
4071}
4072
233cc9c1
L
4073/* Fill PLT/GOT entries and allocate dynamic relocations for local
4074 STT_GNU_IFUNC symbols, which aren't in the ELF linker hash table.
4075 It has to be done before elf_link_sort_relocs is called so that
4076 dynamic relocations are properly sorted. */
4077
4078static bfd_boolean
4079elf_i386_output_arch_local_syms
4080 (bfd *output_bfd ATTRIBUTE_UNUSED,
4081 struct bfd_link_info *info,
4082 void *flaginfo ATTRIBUTE_UNUSED,
4083 int (*func) (void *, const char *,
4084 Elf_Internal_Sym *,
4085 asection *,
4086 struct elf_link_hash_entry *) ATTRIBUTE_UNUSED)
4087{
0afcef53
L
4088 struct elf_x86_link_hash_table *htab
4089 = elf_x86_hash_table (info, I386_ELF_DATA);
233cc9c1
L
4090 if (htab == NULL)
4091 return FALSE;
4092
4093 /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols. */
4094 htab_traverse (htab->loc_hash_table,
4095 elf_i386_finish_local_dynamic_symbol,
4096 info);
4097
4098 return TRUE;
4099}
4100
f604c2a2 4101/* Forward declaration. */
765e526c 4102static const struct elf_x86_lazy_plt_layout elf_i386_nacl_plt;
f604c2a2
L
4103
4104/* Similar to _bfd_elf_get_synthetic_symtab. Support PLTs with all
4105 dynamic relocations. */
4106
4107static long
4108elf_i386_get_synthetic_symtab (bfd *abfd,
4109 long symcount ATTRIBUTE_UNUSED,
4110 asymbol **syms ATTRIBUTE_UNUSED,
4111 long dynsymcount,
4112 asymbol **dynsyms,
4113 asymbol **ret)
4114{
f493882d 4115 long count, i, n;
f604c2a2 4116 int j;
f604c2a2 4117 bfd_byte *plt_contents;
f493882d 4118 long relsize;
765e526c
L
4119 const struct elf_x86_lazy_plt_layout *lazy_plt;
4120 const struct elf_x86_non_lazy_plt_layout *non_lazy_plt;
4121 const struct elf_x86_lazy_plt_layout *lazy_ibt_plt;
4122 const struct elf_x86_non_lazy_plt_layout *non_lazy_ibt_plt;
f604c2a2
L
4123 asection *plt;
4124 bfd_vma got_addr;
f493882d
L
4125 enum elf_x86_plt_type plt_type;
4126 struct elf_x86_plt plts[] =
3972882e 4127 {
f493882d
L
4128 { ".plt", NULL, NULL, plt_unknown, 0, 0, 0, 0 },
4129 { ".plt.got", NULL, NULL, plt_non_lazy, 0, 0, 0, 0 },
4130 { ".plt.sec", NULL, NULL, plt_second, 0, 0, 0, 0 },
4131 { NULL, NULL, NULL, plt_non_lazy, 0, 0, 0, 0 }
f604c2a2 4132 };
144bed8d 4133
f604c2a2 4134 *ret = NULL;
144bed8d 4135
f604c2a2
L
4136 if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0)
4137 return 0;
3972882e 4138
f604c2a2
L
4139 if (dynsymcount <= 0)
4140 return 0;
cca5b8b6 4141
f604c2a2
L
4142 relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
4143 if (relsize <= 0)
4144 return -1;
cca5b8b6 4145
f604c2a2
L
4146 non_lazy_plt = NULL;
4147 /* Silence GCC 6. */
4148 lazy_plt = NULL;
ee2fdd6f
L
4149 non_lazy_ibt_plt = NULL;
4150 lazy_ibt_plt = NULL;
90c14f0c 4151 switch (get_elf_backend_data (abfd)->target_os)
144bed8d 4152 {
f604c2a2 4153 case is_normal:
3b4c3844 4154 case is_solaris:
f604c2a2 4155 non_lazy_plt = &elf_i386_non_lazy_plt;
ee2fdd6f
L
4156 lazy_ibt_plt = &elf_i386_lazy_ibt_plt;
4157 non_lazy_ibt_plt = &elf_i386_non_lazy_ibt_plt;
f604c2a2
L
4158 /* Fall through */
4159 case is_vxworks:
4160 lazy_plt = &elf_i386_lazy_plt;
4161 break;
4162 case is_nacl:
4163 lazy_plt = &elf_i386_nacl_plt;
4164 break;
90c14f0c
L
4165 default:
4166 abort ();
f604c2a2
L
4167 }
4168
4169 got_addr = 0;
3972882e 4170
f604c2a2
L
4171 count = 0;
4172 for (j = 0; plts[j].name != NULL; j++)
4173 {
4174 plt = bfd_get_section_by_name (abfd, plts[j].name);
90efb642 4175 if (plt == NULL || plt->size == 0)
6f25f223 4176 continue;
533d0af0 4177
f604c2a2
L
4178 /* Get the PLT section contents. */
4179 plt_contents = (bfd_byte *) bfd_malloc (plt->size);
4180 if (plt_contents == NULL)
4181 break;
4182 if (!bfd_get_section_contents (abfd, (asection *) plt,
4183 plt_contents, 0, plt->size))
4184 {
4185 free (plt_contents);
4186 break;
4187 }
4188
4189 /* Check what kind of PLT it is. */
4190 plt_type = plt_unknown;
90efb642
L
4191 if (plts[j].type == plt_unknown
4192 && (plt->size >= (lazy_plt->plt0_entry_size
4193 + lazy_plt->plt_entry_size)))
f604c2a2
L
4194 {
4195 /* Match lazy PLT first. */
4196 if (memcmp (plt_contents, lazy_plt->plt0_entry,
4197 lazy_plt->plt0_got1_offset) == 0)
ee2fdd6f
L
4198 {
4199 /* The fist entry in the lazy IBT PLT is the same as the
4200 normal lazy PLT. */
4201 if (lazy_ibt_plt != NULL
90efb642 4202 && (memcmp (plt_contents + lazy_ibt_plt->plt0_entry_size,
ee2fdd6f
L
4203 lazy_ibt_plt->plt_entry,
4204 lazy_ibt_plt->plt_got_offset) == 0))
4205 plt_type = plt_lazy | plt_second;
4206 else
4207 plt_type = plt_lazy;
4208 }
f604c2a2
L
4209 else if (memcmp (plt_contents, lazy_plt->pic_plt0_entry,
4210 lazy_plt->plt0_got1_offset) == 0)
ee2fdd6f
L
4211 {
4212 /* The fist entry in the PIC lazy IBT PLT is the same as
4213 the normal PIC lazy PLT. */
4214 if (lazy_ibt_plt != NULL
90efb642 4215 && (memcmp (plt_contents + lazy_ibt_plt->plt0_entry_size,
ee2fdd6f
L
4216 lazy_ibt_plt->pic_plt_entry,
4217 lazy_ibt_plt->plt_got_offset) == 0))
4218 plt_type = plt_lazy | plt_pic | plt_second;
4219 else
4220 plt_type = plt_lazy | plt_pic;
4221 }
f604c2a2
L
4222 }
4223
4224 if (non_lazy_plt != NULL
90efb642
L
4225 && (plt_type == plt_unknown || plt_type == plt_non_lazy)
4226 && plt->size >= non_lazy_plt->plt_entry_size)
f604c2a2
L
4227 {
4228 /* Match non-lazy PLT. */
4229 if (memcmp (plt_contents, non_lazy_plt->plt_entry,
4230 non_lazy_plt->plt_got_offset) == 0)
4231 plt_type = plt_non_lazy;
4232 else if (memcmp (plt_contents, non_lazy_plt->pic_plt_entry,
4233 non_lazy_plt->plt_got_offset) == 0)
4234 plt_type = plt_pic;
4235 }
4236
ee2fdd6f 4237 if ((non_lazy_ibt_plt != NULL)
90efb642
L
4238 && (plt_type == plt_unknown || plt_type == plt_second)
4239 && plt->size >= non_lazy_ibt_plt->plt_entry_size)
ee2fdd6f
L
4240 {
4241 if (memcmp (plt_contents,
4242 non_lazy_ibt_plt->plt_entry,
4243 non_lazy_ibt_plt->plt_got_offset) == 0)
4244 {
4245 /* Match IBT PLT. */
4246 plt_type = plt_second;
4247 non_lazy_plt = non_lazy_ibt_plt;
4248 }
4249 else if (memcmp (plt_contents,
4250 non_lazy_ibt_plt->pic_plt_entry,
4251 non_lazy_ibt_plt->plt_got_offset) == 0)
4252 {
4253 /* Match PIC IBT PLT. */
4254 plt_type = plt_second | plt_pic;
4255 non_lazy_plt = non_lazy_ibt_plt;
4256 }
4257 }
4258
f604c2a2 4259 if (plt_type == plt_unknown)
37c0b6ee
L
4260 {
4261 free (plt_contents);
4262 continue;
4263 }
3972882e 4264
f604c2a2
L
4265 plts[j].sec = plt;
4266 plts[j].type = plt_type;
ec1f73bb 4267
f604c2a2
L
4268 if ((plt_type & plt_lazy))
4269 {
4270 plts[j].plt_got_offset = lazy_plt->plt_got_offset;
4271 plts[j].plt_entry_size = lazy_plt->plt_entry_size;
4272 /* Skip PLT0 in lazy PLT. */
4273 i = 1;
4274 }
4275 else
4276 {
4277 plts[j].plt_got_offset = non_lazy_plt->plt_got_offset;
4278 plts[j].plt_entry_size = non_lazy_plt->plt_entry_size;
4279 i = 0;
4280 }
fca6ae69 4281
ee2fdd6f
L
4282 /* Skip lazy PLT when the second PLT is used. */
4283 if ((plt_type & (plt_lazy | plt_second))
4284 == (plt_lazy | plt_second))
4285 plts[j].count = 0;
4286 else
4287 {
4288 n = plt->size / plts[j].plt_entry_size;
4289 plts[j].count = n;
4290 count += n - i;
4291 }
f604c2a2
L
4292
4293 plts[j].contents = plt_contents;
4294
4295 /* The _GLOBAL_OFFSET_TABLE_ address is needed. */
4296 if ((plt_type & plt_pic))
4297 got_addr = (bfd_vma) -1;
144bed8d
L
4298 }
4299
f493882d
L
4300 return _bfd_x86_elf_get_synthetic_symtab (abfd, count, relsize,
4301 got_addr, plts, dynsyms,
4302 ret);
4c45e5c9
JJ
4303}
4304
f604c2a2
L
4305/* Set up i386 GNU properties. Return the first relocatable ELF input
4306 with GNU properties if found. Otherwise, return NULL. */
4307
4308static bfd *
4309elf_i386_link_setup_gnu_properties (struct bfd_link_info *info)
4310{
1de031c8 4311 struct elf_x86_init_table init_table;
f604c2a2 4312
90c14f0c 4313 switch (get_elf_backend_data (info->output_bfd)->target_os)
f604c2a2
L
4314 {
4315 case is_normal:
3b4c3844 4316 case is_solaris:
851b6fa1 4317 init_table.plt0_pad_byte = 0x0;
1de031c8
L
4318 init_table.lazy_plt = &elf_i386_lazy_plt;
4319 init_table.non_lazy_plt = &elf_i386_non_lazy_plt;
4320 init_table.lazy_ibt_plt = &elf_i386_lazy_ibt_plt;
4321 init_table.non_lazy_ibt_plt = &elf_i386_non_lazy_ibt_plt;
f604c2a2
L
4322 break;
4323 case is_vxworks:
851b6fa1 4324 init_table.plt0_pad_byte = 0x90;
1de031c8
L
4325 init_table.lazy_plt = &elf_i386_lazy_plt;
4326 init_table.non_lazy_plt = NULL;
4327 init_table.lazy_ibt_plt = NULL;
4328 init_table.non_lazy_ibt_plt = NULL;
f604c2a2
L
4329 break;
4330 case is_nacl:
851b6fa1 4331 init_table.plt0_pad_byte = 0x90;
1de031c8
L
4332 init_table.lazy_plt = &elf_i386_nacl_plt;
4333 init_table.non_lazy_plt = NULL;
4334 init_table.lazy_ibt_plt = NULL;
4335 init_table.non_lazy_ibt_plt = NULL;
f604c2a2 4336 break;
90c14f0c
L
4337 default:
4338 abort ();
f604c2a2
L
4339 }
4340
1de031c8
L
4341 init_table.r_info = elf32_r_info;
4342 init_table.r_sym = elf32_r_sym;
7a382c1c 4343
1de031c8 4344 return _bfd_x86_elf_link_setup_gnu_properties (info, &init_table);
f604c2a2
L
4345}
4346
6d00b590 4347#define TARGET_LITTLE_SYM i386_elf32_vec
252b5132
RH
4348#define TARGET_LITTLE_NAME "elf32-i386"
4349#define ELF_ARCH bfd_arch_i386
ae95ffa6 4350#define ELF_TARGET_ID I386_ELF_DATA
252b5132
RH
4351#define ELF_MACHINE_CODE EM_386
4352#define ELF_MAXPAGESIZE 0x1000
252b5132
RH
4353
4354#define elf_backend_can_gc_sections 1
51b64d56 4355#define elf_backend_can_refcount 1
252b5132
RH
4356#define elf_backend_want_got_plt 1
4357#define elf_backend_plt_readonly 1
4358#define elf_backend_want_plt_sym 0
4359#define elf_backend_got_header_size 12
e41b3a13 4360#define elf_backend_plt_alignment 4
64f52338 4361#define elf_backend_dtrel_excludes_plt 1
f7483970 4362#define elf_backend_extern_protected_data 1
bedfd056 4363#define elf_backend_caches_rawsize 1
5474d94f 4364#define elf_backend_want_dynrelro 1
252b5132 4365
8c29f035
AM
4366/* Support RELA for objdump of prelink objects. */
4367#define elf_info_to_howto elf_i386_info_to_howto_rel
dd5724d5
AM
4368#define elf_info_to_howto_rel elf_i386_info_to_howto_rel
4369
dd5724d5 4370#define bfd_elf32_bfd_is_local_label_name elf_i386_is_local_label_name
dd5724d5 4371#define bfd_elf32_bfd_reloc_type_lookup elf_i386_reloc_type_lookup
13285a1b 4372#define bfd_elf32_bfd_reloc_name_lookup elf_i386_reloc_name_lookup
3972882e 4373#define bfd_elf32_get_synthetic_symtab elf_i386_get_synthetic_symtab
dd5724d5 4374
13285a1b 4375#define elf_backend_relocs_compatible _bfd_elf_relocs_compatible
dd5724d5 4376#define elf_backend_check_relocs elf_i386_check_relocs
f604c2a2 4377#define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections
0ac8d2ca 4378#define elf_backend_fake_sections elf_i386_fake_sections
dd5724d5
AM
4379#define elf_backend_finish_dynamic_sections elf_i386_finish_dynamic_sections
4380#define elf_backend_finish_dynamic_symbol elf_i386_finish_dynamic_symbol
233cc9c1 4381#define elf_backend_output_arch_local_syms elf_i386_output_arch_local_syms
c5fccbec
DJ
4382#define elf_backend_grok_prstatus elf_i386_grok_prstatus
4383#define elf_backend_grok_psinfo elf_i386_grok_psinfo
db6751f2 4384#define elf_backend_reloc_type_class elf_i386_reloc_type_class
0ac8d2ca 4385#define elf_backend_relocate_section elf_i386_relocate_section
f604c2a2 4386#define elf_backend_setup_gnu_properties elf_i386_link_setup_gnu_properties
9f857535 4387#define elf_backend_hide_symbol _bfd_x86_elf_hide_symbol
dd5724d5 4388
a2f63b2e
MR
4389#define elf_backend_linux_prpsinfo32_ugid16 TRUE
4390
8f56f7a2
L
4391#define elf32_bed elf32_i386_bed
4392
252b5132 4393#include "elf32-target.h"
2bc3c89a
AM
4394
4395/* FreeBSD support. */
4396
4397#undef TARGET_LITTLE_SYM
6d00b590 4398#define TARGET_LITTLE_SYM i386_elf32_fbsd_vec
2bc3c89a
AM
4399#undef TARGET_LITTLE_NAME
4400#define TARGET_LITTLE_NAME "elf32-i386-freebsd"
d1036acb
L
4401#undef ELF_OSABI
4402#define ELF_OSABI ELFOSABI_FREEBSD
2bc3c89a
AM
4403
4404/* The kernel recognizes executables as valid only if they carry a
4405 "FreeBSD" label in the ELF header. So we put this label on all
4406 executables and (for simplicity) also all other object files. */
4407
ed7e9d0b
AM
4408static bfd_boolean
4409elf_i386_fbsd_init_file_header (bfd *abfd, struct bfd_link_info *info)
2bc3c89a 4410{
ed7e9d0b
AM
4411 if (!_bfd_elf_init_file_header (abfd, info))
4412 return FALSE;
2bc3c89a 4413
2bc3c89a 4414#ifdef OLD_FREEBSD_ABI_LABEL
cf7363b4
L
4415 {
4416 /* The ABI label supported by FreeBSD <= 4.0 is quite nonstandard. */
4417 Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
4418 memcpy (&i_ehdrp->e_ident[EI_ABIVERSION], "FreeBSD", 8);
4419 }
caf47ea6 4420#endif
ed7e9d0b 4421 return TRUE;
2bc3c89a
AM
4422}
4423
ed7e9d0b
AM
4424#undef elf_backend_init_file_header
4425#define elf_backend_init_file_header elf_i386_fbsd_init_file_header
571fe01f
NC
4426#undef elf32_bed
4427#define elf32_bed elf32_i386_fbsd_bed
2bc3c89a 4428
d8045f23
NC
4429#undef elf_backend_add_symbol_hook
4430
2bc3c89a 4431#include "elf32-target.h"
eac338cf 4432
ed7e9d0b
AM
4433#undef elf_backend_init_file_header
4434
a6cc6b3b
RO
4435/* Solaris 2. */
4436
4437#undef TARGET_LITTLE_SYM
6d00b590 4438#define TARGET_LITTLE_SYM i386_elf32_sol2_vec
a6cc6b3b
RO
4439#undef TARGET_LITTLE_NAME
4440#define TARGET_LITTLE_NAME "elf32-i386-sol2"
4441
90c14f0c
L
4442#undef ELF_TARGET_OS
4443#define ELF_TARGET_OS is_solaris
3b4c3844 4444
a6cc6b3b
RO
4445/* Restore default: we cannot use ELFOSABI_SOLARIS, otherwise ELFOSABI_NONE
4446 objects won't be recognized. */
4447#undef ELF_OSABI
4448
4449#undef elf32_bed
4450#define elf32_bed elf32_i386_sol2_bed
4451
7dc98aea
RO
4452/* The 32-bit static TLS arena size is rounded to the nearest 8-byte
4453 boundary. */
84865015 4454#undef elf_backend_static_tls_alignment
7dc98aea
RO
4455#define elf_backend_static_tls_alignment 8
4456
a6cc6b3b
RO
4457/* The Solaris 2 ABI requires a plt symbol on all platforms.
4458
4459 Cf. Linker and Libraries Guide, Ch. 2, Link-Editor, Generating the Output
4460 File, p.63. */
84865015 4461#undef elf_backend_want_plt_sym
a6cc6b3b
RO
4462#define elf_backend_want_plt_sym 1
4463
84865015
NC
4464#undef elf_backend_strtab_flags
4465#define elf_backend_strtab_flags SHF_STRINGS
4466
5522f910 4467/* Called to set the sh_flags, sh_link and sh_info fields of OSECTION which
07d6d2b8 4468 has a type >= SHT_LOOS. Returns TRUE if these fields were initialised
5522f910
NC
4469 FALSE otherwise. ISECTION is the best guess matching section from the
4470 input bfd IBFD, but it might be NULL. */
4471
84865015 4472static bfd_boolean
5522f910
NC
4473elf32_i386_copy_solaris_special_section_fields (const bfd *ibfd ATTRIBUTE_UNUSED,
4474 bfd *obfd ATTRIBUTE_UNUSED,
4475 const Elf_Internal_Shdr *isection ATTRIBUTE_UNUSED,
4476 Elf_Internal_Shdr *osection ATTRIBUTE_UNUSED)
84865015
NC
4477{
4478 /* PR 19938: FIXME: Need to add code for setting the sh_info
5522f910
NC
4479 and sh_link fields of Solaris specific section types. */
4480 return FALSE;
84865015 4481
5522f910 4482 /* Based upon Oracle Solaris 11.3 Linkers and Libraries Guide, Ch. 13,
84865015
NC
4483 Object File Format, Table 13-9 ELF sh_link and sh_info Interpretation:
4484
4485http://docs.oracle.com/cd/E53394_01/html/E54813/chapter6-94076.html#scrolltoc
4486
4487 The following values should be set:
07d6d2b8
AM
4488
4489Type Link Info
84865015
NC
4490-----------------------------------------------------------------------------
4491SHT_SUNW_ancillary The section header index of 0
07d6d2b8
AM
4492 [0x6fffffee] the associated string table.
4493
84865015 4494SHT_SUNW_capinfo The section header index of For a dynamic object, the
07d6d2b8
AM
4495 [0x6ffffff0] the associated symbol table. section header index of
4496 the associated
84865015
NC
4497 SHT_SUNW_capchain table,
4498 otherwise 0.
4499
4500SHT_SUNW_symsort The section header index of 0
07d6d2b8 4501 [0x6ffffff1] the associated symbol table.
84865015
NC
4502
4503SHT_SUNW_tlssort The section header index of 0
07d6d2b8
AM
4504 [0x6ffffff2] the associated symbol table.
4505
4506SHT_SUNW_LDYNSYM The section header index of One greater than the
4507 [0x6ffffff3] the associated string table. symbol table index of the
4508 This index is the same string last local symbol,
84865015 4509 table used by the SHT_DYNSYM STB_LOCAL. Since
07d6d2b8
AM
4510 section. SHT_SUNW_LDYNSYM only
4511 contains local symbols,
84865015
NC
4512 sh_info is equivalent to
4513 the number of symbols in
4514 the table.
4515
07d6d2b8
AM
4516SHT_SUNW_cap If symbol capabilities exist, If any capabilities refer
4517 [0x6ffffff5] the section header index of to named strings, the
4518 the associated section header index of
4519 SHT_SUNW_capinfo table, the associated string
4520 otherwise 0. table, otherwise 0.
84865015 4521
07d6d2b8
AM
4522SHT_SUNW_move The section header index of 0
4523 [0x6ffffffa] the associated symbol table.
4524
4525SHT_SUNW_COMDAT 0 0
84865015
NC
4526 [0x6ffffffb]
4527
4528SHT_SUNW_syminfo The section header index of The section header index
07d6d2b8
AM
4529 [0x6ffffffc] the associated symbol table. of the associated
4530 .dynamic section.
84865015 4531
07d6d2b8
AM
4532SHT_SUNW_verdef The section header index of The number of version
4533 [0x6ffffffd] the associated string table. definitions within the
4534 section.
84865015
NC
4535
4536SHT_SUNW_verneed The section header index of The number of version
07d6d2b8
AM
4537 [0x6ffffffe] the associated string table. dependencies within the
4538 section.
84865015 4539
07d6d2b8
AM
4540SHT_SUNW_versym The section header index of 0
4541 [0x6fffffff] the associated symbol table. */
84865015
NC
4542}
4543
5522f910
NC
4544#undef elf_backend_copy_special_section_fields
4545#define elf_backend_copy_special_section_fields elf32_i386_copy_solaris_special_section_fields
84865015 4546
a6cc6b3b
RO
4547#include "elf32-target.h"
4548
bf64a951
L
4549/* Intel MCU support. */
4550
4551static bfd_boolean
4552elf32_iamcu_elf_object_p (bfd *abfd)
4553{
4554 /* Set the right machine number for an IAMCU elf32 file. */
4555 bfd_default_set_arch_mach (abfd, bfd_arch_iamcu, bfd_mach_i386_iamcu);
4556 return TRUE;
4557}
4558
4559#undef TARGET_LITTLE_SYM
4560#define TARGET_LITTLE_SYM iamcu_elf32_vec
4561#undef TARGET_LITTLE_NAME
4562#define TARGET_LITTLE_NAME "elf32-iamcu"
84865015 4563#undef ELF_ARCH
bf64a951
L
4564#define ELF_ARCH bfd_arch_iamcu
4565
4566#undef ELF_MACHINE_CODE
4567#define ELF_MACHINE_CODE EM_IAMCU
4568
90c14f0c 4569#undef ELF_TARGET_OS
bf64a951
L
4570#undef ELF_OSABI
4571
4572#undef elf32_bed
4573#define elf32_bed elf32_iamcu_bed
4574
4575#undef elf_backend_object_p
4576#define elf_backend_object_p elf32_iamcu_elf_object_p
4577
4578#undef elf_backend_static_tls_alignment
4579
4580#undef elf_backend_want_plt_sym
07d6d2b8 4581#define elf_backend_want_plt_sym 0
bf64a951 4582
84865015 4583#undef elf_backend_strtab_flags
5522f910 4584#undef elf_backend_copy_special_section_fields
84865015 4585
bf64a951
L
4586#include "elf32-target.h"
4587
4588/* Restore defaults. */
4589#undef ELF_ARCH
4590#define ELF_ARCH bfd_arch_i386
4591#undef ELF_MACHINE_CODE
4592#define ELF_MACHINE_CODE EM_386
4593
a27e4371
RM
4594/* Native Client support. */
4595
4596#undef TARGET_LITTLE_SYM
6d00b590 4597#define TARGET_LITTLE_SYM i386_elf32_nacl_vec
a27e4371
RM
4598#undef TARGET_LITTLE_NAME
4599#define TARGET_LITTLE_NAME "elf32-i386-nacl"
4600#undef elf32_bed
4601#define elf32_bed elf32_i386_nacl_bed
4602
4603#undef ELF_MAXPAGESIZE
4604#define ELF_MAXPAGESIZE 0x10000
4605
4606/* Restore defaults. */
4607#undef ELF_OSABI
4608#undef elf_backend_want_plt_sym
4609#define elf_backend_want_plt_sym 0
a27e4371
RM
4610#undef elf_backend_static_tls_alignment
4611
4612/* NaCl uses substantially different PLT entries for the same effects. */
4613
4614#undef elf_backend_plt_alignment
4615#define elf_backend_plt_alignment 5
4616#define NACL_PLT_ENTRY_SIZE 64
4617#define NACLMASK 0xe0 /* 32-byte alignment mask. */
4618
4619static const bfd_byte elf_i386_nacl_plt0_entry[] =
4620 {
4621 0xff, 0x35, /* pushl contents of address */
07d6d2b8
AM
4622 0, 0, 0, 0, /* replaced with address of .got + 4. */
4623 0x8b, 0x0d, /* movl contents of address, %ecx */
4624 0, 0, 0, 0, /* replaced with address of .got + 8. */
a27e4371
RM
4625 0x83, 0xe1, NACLMASK, /* andl $NACLMASK, %ecx */
4626 0xff, 0xe1 /* jmp *%ecx */
4627 };
4628
4629static const bfd_byte elf_i386_nacl_plt_entry[NACL_PLT_ENTRY_SIZE] =
4630 {
4631 0x8b, 0x0d, /* movl contents of address, %ecx */
4632 0, 0, 0, 0, /* replaced with GOT slot address. */
4633 0x83, 0xe1, NACLMASK, /* andl $NACLMASK, %ecx */
4634 0xff, 0xe1, /* jmp *%ecx */
4635
07d6d2b8 4636 /* Pad to the next 32-byte boundary with nop instructions. */
a27e4371
RM
4637 0x90,
4638 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
4639 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
4640
4641 /* Lazy GOT entries point here (32-byte aligned). */
4642 0x68, /* pushl immediate */
4643 0, 0, 0, 0, /* replaced with reloc offset. */
4644 0xe9, /* jmp relative */
07d6d2b8 4645 0, 0, 0, 0, /* replaced with offset to .plt. */
a27e4371 4646
07d6d2b8 4647 /* Pad to the next 32-byte boundary with nop instructions. */
a27e4371
RM
4648 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
4649 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
4650 0x90, 0x90
4651 };
4652
4653static const bfd_byte
4654elf_i386_nacl_pic_plt0_entry[sizeof (elf_i386_nacl_plt0_entry)] =
4655 {
4656 0xff, 0x73, 0x04, /* pushl 4(%ebx) */
4657 0x8b, 0x4b, 0x08, /* mov 0x8(%ebx), %ecx */
4658 0x83, 0xe1, 0xe0, /* and $NACLMASK, %ecx */
4659 0xff, 0xe1, /* jmp *%ecx */
caa0075c
RM
4660
4661 /* This is expected to be the same size as elf_i386_nacl_plt0_entry,
4662 so pad to that size with nop instructions. */
4663 0x90, 0x90, 0x90, 0x90, 0x90, 0x90
a27e4371
RM
4664 };
4665
4666static const bfd_byte elf_i386_nacl_pic_plt_entry[NACL_PLT_ENTRY_SIZE] =
4667 {
07d6d2b8
AM
4668 0x8b, 0x8b, /* movl offset(%ebx), %ecx */
4669 0, 0, 0, 0, /* replaced with offset of this symbol in .got. */
4670 0x83, 0xe1, 0xe0, /* andl $NACLMASK, %ecx */
4671 0xff, 0xe1, /* jmp *%ecx */
a27e4371 4672
07d6d2b8 4673 /* Pad to the next 32-byte boundary with nop instructions. */
a27e4371
RM
4674 0x90,
4675 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
4676 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
4677
4678 /* Lazy GOT entries point here (32-byte aligned). */
07d6d2b8
AM
4679 0x68, /* pushl immediate */
4680 0, 0, 0, 0, /* replaced with offset into relocation table. */
4681 0xe9, /* jmp relative */
4682 0, 0, 0, 0, /* replaced with offset to start of .plt. */
a27e4371 4683
07d6d2b8 4684 /* Pad to the next 32-byte boundary with nop instructions. */
a27e4371
RM
4685 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
4686 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
4687 0x90, 0x90
4688 };
4689
4690static const bfd_byte elf_i386_nacl_eh_frame_plt[] =
4691 {
07d6d2b8
AM
4692#if (PLT_CIE_LENGTH != 20 \
4693 || PLT_FDE_LENGTH != 36 \
4694 || PLT_FDE_START_OFFSET != 4 + PLT_CIE_LENGTH + 8 \
a27e4371 4695 || PLT_FDE_LEN_OFFSET != 4 + PLT_CIE_LENGTH + 12)
90c14f0c 4696# error "Need PLT_CIE_LENGTH parameters for eh_frame_plt offsets!"
a27e4371
RM
4697#endif
4698 PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
07d6d2b8
AM
4699 0, 0, 0, 0, /* CIE ID */
4700 1, /* CIE version */
4701 'z', 'R', 0, /* Augmentation string */
4702 1, /* Code alignment factor */
4703 0x7c, /* Data alignment factor: -4 */
4704 8, /* Return address column */
a27e4371
RM
4705 1, /* Augmentation size */
4706 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
4707 DW_CFA_def_cfa, 4, 4, /* DW_CFA_def_cfa: r4 (esp) ofs 4 */
4708 DW_CFA_offset + 8, 1, /* DW_CFA_offset: r8 (eip) at cfa-4 */
4709 DW_CFA_nop, DW_CFA_nop,
4710
07d6d2b8 4711 PLT_FDE_LENGTH, 0, 0, 0, /* FDE length */
a27e4371 4712 PLT_CIE_LENGTH + 8, 0, 0, 0, /* CIE pointer */
07d6d2b8
AM
4713 0, 0, 0, 0, /* R_386_PC32 .plt goes here */
4714 0, 0, 0, 0, /* .plt size goes here */
4715 0, /* Augmentation size */
4716 DW_CFA_def_cfa_offset, 8, /* DW_CFA_def_cfa_offset: 8 */
4717 DW_CFA_advance_loc + 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */
4718 DW_CFA_def_cfa_offset, 12, /* DW_CFA_def_cfa_offset: 12 */
4719 DW_CFA_advance_loc + 58, /* DW_CFA_advance_loc: 58 to __PLT__+64 */
4720 DW_CFA_def_cfa_expression, /* DW_CFA_def_cfa_expression */
4721 13, /* Block length */
4722 DW_OP_breg4, 4, /* DW_OP_breg4 (esp): 4 */
4723 DW_OP_breg8, 0, /* DW_OP_breg8 (eip): 0 */
a27e4371
RM
4724 DW_OP_const1u, 63, DW_OP_and, DW_OP_const1u, 37, DW_OP_ge,
4725 DW_OP_lit2, DW_OP_shl, DW_OP_plus,
4726 DW_CFA_nop, DW_CFA_nop
4727 };
4728
765e526c 4729static const struct elf_x86_lazy_plt_layout elf_i386_nacl_plt =
a27e4371
RM
4730 {
4731 elf_i386_nacl_plt0_entry, /* plt0_entry */
4732 sizeof (elf_i386_nacl_plt0_entry), /* plt0_entry_size */
a27e4371
RM
4733 elf_i386_nacl_plt_entry, /* plt_entry */
4734 NACL_PLT_ENTRY_SIZE, /* plt_entry_size */
92e68c1d
L
4735 NULL, /* plt_tlsdesc_entry */
4736 0, /* plt_tlsdesc_entry_size*/
4737 0, /* plt_tlsdesc_got1_offset */
4738 0, /* plt_tlsdesc_got2_offset */
4739 0, /* plt_tlsdesc_got1_insn_end */
4740 0, /* plt_tlsdesc_got2_insn_end */
765e526c
L
4741 2, /* plt0_got1_offset */
4742 8, /* plt0_got2_offset */
4743 0, /* plt0_got2_insn_end */
a27e4371
RM
4744 2, /* plt_got_offset */
4745 33, /* plt_reloc_offset */
4746 38, /* plt_plt_offset */
765e526c
L
4747 0, /* plt_got_insn_size */
4748 0, /* plt_plt_insn_end */
a27e4371
RM
4749 32, /* plt_lazy_offset */
4750 elf_i386_nacl_pic_plt0_entry, /* pic_plt0_entry */
4751 elf_i386_nacl_pic_plt_entry, /* pic_plt_entry */
4752 elf_i386_nacl_eh_frame_plt, /* eh_frame_plt */
f604c2a2 4753 sizeof (elf_i386_nacl_eh_frame_plt) /* eh_frame_plt_size */
a27e4371
RM
4754 };
4755
64b384e1
RM
4756static bfd_boolean
4757elf32_i386_nacl_elf_object_p (bfd *abfd)
4758{
4759 /* Set the right machine number for a NaCl i386 ELF32 file. */
4760 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_i386_i386_nacl);
4761 return TRUE;
4762}
4763
90c14f0c
L
4764#undef ELF_TARGET_OS
4765#define ELF_TARGET_OS is_nacl
a27e4371 4766
64b384e1
RM
4767#undef elf_backend_object_p
4768#define elf_backend_object_p elf32_i386_nacl_elf_object_p
5a68afcf
RM
4769#undef elf_backend_modify_segment_map
4770#define elf_backend_modify_segment_map nacl_modify_segment_map
6d6c25c8
AM
4771#undef elf_backend_modify_headers
4772#define elf_backend_modify_headers nacl_modify_headers
887badb3
RM
4773#undef elf_backend_final_write_processing
4774#define elf_backend_final_write_processing nacl_final_write_processing
5a68afcf 4775
a27e4371
RM
4776#include "elf32-target.h"
4777
5a68afcf 4778/* Restore defaults. */
64b384e1 4779#undef elf_backend_object_p
5a68afcf 4780#undef elf_backend_modify_segment_map
6d6c25c8 4781#undef elf_backend_modify_headers
887badb3 4782#undef elf_backend_final_write_processing
5a68afcf 4783
eac338cf
PB
4784/* VxWorks support. */
4785
4786#undef TARGET_LITTLE_SYM
6d00b590 4787#define TARGET_LITTLE_SYM i386_elf32_vxworks_vec
eac338cf
PB
4788#undef TARGET_LITTLE_NAME
4789#define TARGET_LITTLE_NAME "elf32-i386-vxworks"
d1036acb 4790#undef ELF_OSABI
1587442d
L
4791#undef ELF_MAXPAGESIZE
4792#define ELF_MAXPAGESIZE 0x1000
a27e4371
RM
4793#undef elf_backend_plt_alignment
4794#define elf_backend_plt_alignment 4
eac338cf 4795
90c14f0c
L
4796#undef ELF_TARGET_OS
4797#define ELF_TARGET_OS is_vxworks
eac338cf 4798
13285a1b 4799#undef elf_backend_relocs_compatible
eac338cf
PB
4800#undef elf_backend_add_symbol_hook
4801#define elf_backend_add_symbol_hook \
4802 elf_vxworks_add_symbol_hook
4803#undef elf_backend_link_output_symbol_hook
4804#define elf_backend_link_output_symbol_hook \
9c72ff84 4805 elf_vxworks_link_output_symbol_hook
eac338cf
PB
4806#undef elf_backend_emit_relocs
4807#define elf_backend_emit_relocs elf_vxworks_emit_relocs
4808#undef elf_backend_final_write_processing
4809#define elf_backend_final_write_processing \
4810 elf_vxworks_final_write_processing
7dc98aea 4811#undef elf_backend_static_tls_alignment
eac338cf
PB
4812
4813/* On VxWorks, we emit relocations against _PROCEDURE_LINKAGE_TABLE_, so
4814 define it. */
4815#undef elf_backend_want_plt_sym
4816#define elf_backend_want_plt_sym 1
4817
4818#undef elf32_bed
4819#define elf32_bed elf32_i386_vxworks_bed
4820
4821#include "elf32-target.h"
This page took 1.549503 seconds and 4 git commands to generate.