i386: Don't relocate section when check_relocs failed
[deliverable/binutils-gdb.git] / bfd / elf32-i386.c
1 /* Intel 80386/80486-specific support for 32-bit ELF
2 Copyright (C) 1993-2016 Free Software Foundation, Inc.
3
4 This file is part of BFD, the Binary File Descriptor library.
5
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
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
10
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.
15
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
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
20
21 #include "sysdep.h"
22 #include "bfd.h"
23 #include "bfdlink.h"
24 #include "libbfd.h"
25 #include "elf-bfd.h"
26 #include "elf-nacl.h"
27 #include "elf-vxworks.h"
28 #include "bfd_stdint.h"
29 #include "objalloc.h"
30 #include "hashtab.h"
31 #include "dwarf2.h"
32 #include "opcode/i386.h"
33
34 /* 386 uses REL relocations instead of RELA. */
35 #define USE_REL 1
36
37 #include "elf/i386.h"
38
39 static reloc_howto_type elf_howto_table[]=
40 {
41 HOWTO(R_386_NONE, 0, 3, 0, FALSE, 0, complain_overflow_dont,
42 bfd_elf_generic_reloc, "R_386_NONE",
43 TRUE, 0x00000000, 0x00000000, FALSE),
44 HOWTO(R_386_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
45 bfd_elf_generic_reloc, "R_386_32",
46 TRUE, 0xffffffff, 0xffffffff, FALSE),
47 HOWTO(R_386_PC32, 0, 2, 32, TRUE, 0, complain_overflow_bitfield,
48 bfd_elf_generic_reloc, "R_386_PC32",
49 TRUE, 0xffffffff, 0xffffffff, TRUE),
50 HOWTO(R_386_GOT32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
51 bfd_elf_generic_reloc, "R_386_GOT32",
52 TRUE, 0xffffffff, 0xffffffff, FALSE),
53 HOWTO(R_386_PLT32, 0, 2, 32, TRUE, 0, complain_overflow_bitfield,
54 bfd_elf_generic_reloc, "R_386_PLT32",
55 TRUE, 0xffffffff, 0xffffffff, TRUE),
56 HOWTO(R_386_COPY, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
57 bfd_elf_generic_reloc, "R_386_COPY",
58 TRUE, 0xffffffff, 0xffffffff, FALSE),
59 HOWTO(R_386_GLOB_DAT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
60 bfd_elf_generic_reloc, "R_386_GLOB_DAT",
61 TRUE, 0xffffffff, 0xffffffff, FALSE),
62 HOWTO(R_386_JUMP_SLOT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
63 bfd_elf_generic_reloc, "R_386_JUMP_SLOT",
64 TRUE, 0xffffffff, 0xffffffff, FALSE),
65 HOWTO(R_386_RELATIVE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
66 bfd_elf_generic_reloc, "R_386_RELATIVE",
67 TRUE, 0xffffffff, 0xffffffff, FALSE),
68 HOWTO(R_386_GOTOFF, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
69 bfd_elf_generic_reloc, "R_386_GOTOFF",
70 TRUE, 0xffffffff, 0xffffffff, FALSE),
71 HOWTO(R_386_GOTPC, 0, 2, 32, TRUE, 0, complain_overflow_bitfield,
72 bfd_elf_generic_reloc, "R_386_GOTPC",
73 TRUE, 0xffffffff, 0xffffffff, TRUE),
74
75 /* We have a gap in the reloc numbers here.
76 R_386_standard counts the number up to this point, and
77 R_386_ext_offset is the value to subtract from a reloc type of
78 R_386_16 thru R_386_PC8 to form an index into this table. */
79 #define R_386_standard (R_386_GOTPC + 1)
80 #define R_386_ext_offset (R_386_TLS_TPOFF - R_386_standard)
81
82 /* These relocs are a GNU extension. */
83 HOWTO(R_386_TLS_TPOFF, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
84 bfd_elf_generic_reloc, "R_386_TLS_TPOFF",
85 TRUE, 0xffffffff, 0xffffffff, FALSE),
86 HOWTO(R_386_TLS_IE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
87 bfd_elf_generic_reloc, "R_386_TLS_IE",
88 TRUE, 0xffffffff, 0xffffffff, FALSE),
89 HOWTO(R_386_TLS_GOTIE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
90 bfd_elf_generic_reloc, "R_386_TLS_GOTIE",
91 TRUE, 0xffffffff, 0xffffffff, FALSE),
92 HOWTO(R_386_TLS_LE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
93 bfd_elf_generic_reloc, "R_386_TLS_LE",
94 TRUE, 0xffffffff, 0xffffffff, FALSE),
95 HOWTO(R_386_TLS_GD, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
96 bfd_elf_generic_reloc, "R_386_TLS_GD",
97 TRUE, 0xffffffff, 0xffffffff, FALSE),
98 HOWTO(R_386_TLS_LDM, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
99 bfd_elf_generic_reloc, "R_386_TLS_LDM",
100 TRUE, 0xffffffff, 0xffffffff, FALSE),
101 HOWTO(R_386_16, 0, 1, 16, FALSE, 0, complain_overflow_bitfield,
102 bfd_elf_generic_reloc, "R_386_16",
103 TRUE, 0xffff, 0xffff, FALSE),
104 HOWTO(R_386_PC16, 0, 1, 16, TRUE, 0, complain_overflow_bitfield,
105 bfd_elf_generic_reloc, "R_386_PC16",
106 TRUE, 0xffff, 0xffff, TRUE),
107 HOWTO(R_386_8, 0, 0, 8, FALSE, 0, complain_overflow_bitfield,
108 bfd_elf_generic_reloc, "R_386_8",
109 TRUE, 0xff, 0xff, FALSE),
110 HOWTO(R_386_PC8, 0, 0, 8, TRUE, 0, complain_overflow_signed,
111 bfd_elf_generic_reloc, "R_386_PC8",
112 TRUE, 0xff, 0xff, TRUE),
113
114 #define R_386_ext (R_386_PC8 + 1 - R_386_ext_offset)
115 #define R_386_tls_offset (R_386_TLS_LDO_32 - R_386_ext)
116 /* These are common with Solaris TLS implementation. */
117 HOWTO(R_386_TLS_LDO_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
118 bfd_elf_generic_reloc, "R_386_TLS_LDO_32",
119 TRUE, 0xffffffff, 0xffffffff, FALSE),
120 HOWTO(R_386_TLS_IE_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
121 bfd_elf_generic_reloc, "R_386_TLS_IE_32",
122 TRUE, 0xffffffff, 0xffffffff, FALSE),
123 HOWTO(R_386_TLS_LE_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
124 bfd_elf_generic_reloc, "R_386_TLS_LE_32",
125 TRUE, 0xffffffff, 0xffffffff, FALSE),
126 HOWTO(R_386_TLS_DTPMOD32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
127 bfd_elf_generic_reloc, "R_386_TLS_DTPMOD32",
128 TRUE, 0xffffffff, 0xffffffff, FALSE),
129 HOWTO(R_386_TLS_DTPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
130 bfd_elf_generic_reloc, "R_386_TLS_DTPOFF32",
131 TRUE, 0xffffffff, 0xffffffff, FALSE),
132 HOWTO(R_386_TLS_TPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
133 bfd_elf_generic_reloc, "R_386_TLS_TPOFF32",
134 TRUE, 0xffffffff, 0xffffffff, FALSE),
135 HOWTO(R_386_SIZE32, 0, 2, 32, FALSE, 0, complain_overflow_unsigned,
136 bfd_elf_generic_reloc, "R_386_SIZE32",
137 TRUE, 0xffffffff, 0xffffffff, FALSE),
138 HOWTO(R_386_TLS_GOTDESC, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
139 bfd_elf_generic_reloc, "R_386_TLS_GOTDESC",
140 TRUE, 0xffffffff, 0xffffffff, FALSE),
141 HOWTO(R_386_TLS_DESC_CALL, 0, 0, 0, FALSE, 0, complain_overflow_dont,
142 bfd_elf_generic_reloc, "R_386_TLS_DESC_CALL",
143 FALSE, 0, 0, FALSE),
144 HOWTO(R_386_TLS_DESC, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
145 bfd_elf_generic_reloc, "R_386_TLS_DESC",
146 TRUE, 0xffffffff, 0xffffffff, FALSE),
147 HOWTO(R_386_IRELATIVE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
148 bfd_elf_generic_reloc, "R_386_IRELATIVE",
149 TRUE, 0xffffffff, 0xffffffff, FALSE),
150 HOWTO(R_386_GOT32X, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
151 bfd_elf_generic_reloc, "R_386_GOT32X",
152 TRUE, 0xffffffff, 0xffffffff, FALSE),
153
154 /* Another gap. */
155 #define R_386_ext2 (R_386_GOT32X + 1 - R_386_tls_offset)
156 #define R_386_vt_offset (R_386_GNU_VTINHERIT - R_386_ext2)
157
158 /* GNU extension to record C++ vtable hierarchy. */
159 HOWTO (R_386_GNU_VTINHERIT, /* type */
160 0, /* rightshift */
161 2, /* size (0 = byte, 1 = short, 2 = long) */
162 0, /* bitsize */
163 FALSE, /* pc_relative */
164 0, /* bitpos */
165 complain_overflow_dont, /* complain_on_overflow */
166 NULL, /* special_function */
167 "R_386_GNU_VTINHERIT", /* name */
168 FALSE, /* partial_inplace */
169 0, /* src_mask */
170 0, /* dst_mask */
171 FALSE), /* pcrel_offset */
172
173 /* GNU extension to record C++ vtable member usage. */
174 HOWTO (R_386_GNU_VTENTRY, /* type */
175 0, /* rightshift */
176 2, /* size (0 = byte, 1 = short, 2 = long) */
177 0, /* bitsize */
178 FALSE, /* pc_relative */
179 0, /* bitpos */
180 complain_overflow_dont, /* complain_on_overflow */
181 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
182 "R_386_GNU_VTENTRY", /* name */
183 FALSE, /* partial_inplace */
184 0, /* src_mask */
185 0, /* dst_mask */
186 FALSE) /* pcrel_offset */
187
188 #define R_386_vt (R_386_GNU_VTENTRY + 1 - R_386_vt_offset)
189
190 };
191
192 #ifdef DEBUG_GEN_RELOC
193 #define TRACE(str) \
194 fprintf (stderr, "i386 bfd reloc lookup %d (%s)\n", code, str)
195 #else
196 #define TRACE(str)
197 #endif
198
199 static reloc_howto_type *
200 elf_i386_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
201 bfd_reloc_code_real_type code)
202 {
203 switch (code)
204 {
205 case BFD_RELOC_NONE:
206 TRACE ("BFD_RELOC_NONE");
207 return &elf_howto_table[R_386_NONE];
208
209 case BFD_RELOC_32:
210 TRACE ("BFD_RELOC_32");
211 return &elf_howto_table[R_386_32];
212
213 case BFD_RELOC_CTOR:
214 TRACE ("BFD_RELOC_CTOR");
215 return &elf_howto_table[R_386_32];
216
217 case BFD_RELOC_32_PCREL:
218 TRACE ("BFD_RELOC_PC32");
219 return &elf_howto_table[R_386_PC32];
220
221 case BFD_RELOC_386_GOT32:
222 TRACE ("BFD_RELOC_386_GOT32");
223 return &elf_howto_table[R_386_GOT32];
224
225 case BFD_RELOC_386_PLT32:
226 TRACE ("BFD_RELOC_386_PLT32");
227 return &elf_howto_table[R_386_PLT32];
228
229 case BFD_RELOC_386_COPY:
230 TRACE ("BFD_RELOC_386_COPY");
231 return &elf_howto_table[R_386_COPY];
232
233 case BFD_RELOC_386_GLOB_DAT:
234 TRACE ("BFD_RELOC_386_GLOB_DAT");
235 return &elf_howto_table[R_386_GLOB_DAT];
236
237 case BFD_RELOC_386_JUMP_SLOT:
238 TRACE ("BFD_RELOC_386_JUMP_SLOT");
239 return &elf_howto_table[R_386_JUMP_SLOT];
240
241 case BFD_RELOC_386_RELATIVE:
242 TRACE ("BFD_RELOC_386_RELATIVE");
243 return &elf_howto_table[R_386_RELATIVE];
244
245 case BFD_RELOC_386_GOTOFF:
246 TRACE ("BFD_RELOC_386_GOTOFF");
247 return &elf_howto_table[R_386_GOTOFF];
248
249 case BFD_RELOC_386_GOTPC:
250 TRACE ("BFD_RELOC_386_GOTPC");
251 return &elf_howto_table[R_386_GOTPC];
252
253 /* These relocs are a GNU extension. */
254 case BFD_RELOC_386_TLS_TPOFF:
255 TRACE ("BFD_RELOC_386_TLS_TPOFF");
256 return &elf_howto_table[R_386_TLS_TPOFF - R_386_ext_offset];
257
258 case BFD_RELOC_386_TLS_IE:
259 TRACE ("BFD_RELOC_386_TLS_IE");
260 return &elf_howto_table[R_386_TLS_IE - R_386_ext_offset];
261
262 case BFD_RELOC_386_TLS_GOTIE:
263 TRACE ("BFD_RELOC_386_TLS_GOTIE");
264 return &elf_howto_table[R_386_TLS_GOTIE - R_386_ext_offset];
265
266 case BFD_RELOC_386_TLS_LE:
267 TRACE ("BFD_RELOC_386_TLS_LE");
268 return &elf_howto_table[R_386_TLS_LE - R_386_ext_offset];
269
270 case BFD_RELOC_386_TLS_GD:
271 TRACE ("BFD_RELOC_386_TLS_GD");
272 return &elf_howto_table[R_386_TLS_GD - R_386_ext_offset];
273
274 case BFD_RELOC_386_TLS_LDM:
275 TRACE ("BFD_RELOC_386_TLS_LDM");
276 return &elf_howto_table[R_386_TLS_LDM - R_386_ext_offset];
277
278 case BFD_RELOC_16:
279 TRACE ("BFD_RELOC_16");
280 return &elf_howto_table[R_386_16 - R_386_ext_offset];
281
282 case BFD_RELOC_16_PCREL:
283 TRACE ("BFD_RELOC_16_PCREL");
284 return &elf_howto_table[R_386_PC16 - R_386_ext_offset];
285
286 case BFD_RELOC_8:
287 TRACE ("BFD_RELOC_8");
288 return &elf_howto_table[R_386_8 - R_386_ext_offset];
289
290 case BFD_RELOC_8_PCREL:
291 TRACE ("BFD_RELOC_8_PCREL");
292 return &elf_howto_table[R_386_PC8 - R_386_ext_offset];
293
294 /* Common with Sun TLS implementation. */
295 case BFD_RELOC_386_TLS_LDO_32:
296 TRACE ("BFD_RELOC_386_TLS_LDO_32");
297 return &elf_howto_table[R_386_TLS_LDO_32 - R_386_tls_offset];
298
299 case BFD_RELOC_386_TLS_IE_32:
300 TRACE ("BFD_RELOC_386_TLS_IE_32");
301 return &elf_howto_table[R_386_TLS_IE_32 - R_386_tls_offset];
302
303 case BFD_RELOC_386_TLS_LE_32:
304 TRACE ("BFD_RELOC_386_TLS_LE_32");
305 return &elf_howto_table[R_386_TLS_LE_32 - R_386_tls_offset];
306
307 case BFD_RELOC_386_TLS_DTPMOD32:
308 TRACE ("BFD_RELOC_386_TLS_DTPMOD32");
309 return &elf_howto_table[R_386_TLS_DTPMOD32 - R_386_tls_offset];
310
311 case BFD_RELOC_386_TLS_DTPOFF32:
312 TRACE ("BFD_RELOC_386_TLS_DTPOFF32");
313 return &elf_howto_table[R_386_TLS_DTPOFF32 - R_386_tls_offset];
314
315 case BFD_RELOC_386_TLS_TPOFF32:
316 TRACE ("BFD_RELOC_386_TLS_TPOFF32");
317 return &elf_howto_table[R_386_TLS_TPOFF32 - R_386_tls_offset];
318
319 case BFD_RELOC_SIZE32:
320 TRACE ("BFD_RELOC_SIZE32");
321 return &elf_howto_table[R_386_SIZE32 - R_386_tls_offset];
322
323 case BFD_RELOC_386_TLS_GOTDESC:
324 TRACE ("BFD_RELOC_386_TLS_GOTDESC");
325 return &elf_howto_table[R_386_TLS_GOTDESC - R_386_tls_offset];
326
327 case BFD_RELOC_386_TLS_DESC_CALL:
328 TRACE ("BFD_RELOC_386_TLS_DESC_CALL");
329 return &elf_howto_table[R_386_TLS_DESC_CALL - R_386_tls_offset];
330
331 case BFD_RELOC_386_TLS_DESC:
332 TRACE ("BFD_RELOC_386_TLS_DESC");
333 return &elf_howto_table[R_386_TLS_DESC - R_386_tls_offset];
334
335 case BFD_RELOC_386_IRELATIVE:
336 TRACE ("BFD_RELOC_386_IRELATIVE");
337 return &elf_howto_table[R_386_IRELATIVE - R_386_tls_offset];
338
339 case BFD_RELOC_386_GOT32X:
340 TRACE ("BFD_RELOC_386_GOT32X");
341 return &elf_howto_table[R_386_GOT32X - R_386_tls_offset];
342
343 case BFD_RELOC_VTABLE_INHERIT:
344 TRACE ("BFD_RELOC_VTABLE_INHERIT");
345 return &elf_howto_table[R_386_GNU_VTINHERIT - R_386_vt_offset];
346
347 case BFD_RELOC_VTABLE_ENTRY:
348 TRACE ("BFD_RELOC_VTABLE_ENTRY");
349 return &elf_howto_table[R_386_GNU_VTENTRY - R_386_vt_offset];
350
351 default:
352 break;
353 }
354
355 TRACE ("Unknown");
356 return 0;
357 }
358
359 static reloc_howto_type *
360 elf_i386_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
361 const char *r_name)
362 {
363 unsigned int i;
364
365 for (i = 0; i < sizeof (elf_howto_table) / sizeof (elf_howto_table[0]); i++)
366 if (elf_howto_table[i].name != NULL
367 && strcasecmp (elf_howto_table[i].name, r_name) == 0)
368 return &elf_howto_table[i];
369
370 return NULL;
371 }
372
373 static reloc_howto_type *
374 elf_i386_rtype_to_howto (bfd *abfd, unsigned r_type)
375 {
376 unsigned int indx;
377
378 if ((indx = r_type) >= R_386_standard
379 && ((indx = r_type - R_386_ext_offset) - R_386_standard
380 >= R_386_ext - R_386_standard)
381 && ((indx = r_type - R_386_tls_offset) - R_386_ext
382 >= R_386_ext2 - R_386_ext)
383 && ((indx = r_type - R_386_vt_offset) - R_386_ext2
384 >= R_386_vt - R_386_ext2))
385 {
386 (*_bfd_error_handler) (_("%B: invalid relocation type %d"),
387 abfd, (int) r_type);
388 indx = R_386_NONE;
389 }
390 /* PR 17512: file: 0f67f69d. */
391 if (elf_howto_table [indx].type != r_type)
392 return NULL;
393 return &elf_howto_table[indx];
394 }
395
396 static void
397 elf_i386_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
398 arelent *cache_ptr,
399 Elf_Internal_Rela *dst)
400 {
401 unsigned int r_type = ELF32_R_TYPE (dst->r_info);
402 cache_ptr->howto = elf_i386_rtype_to_howto (abfd, r_type);
403 }
404
405 /* Return whether a symbol name implies a local label. The UnixWare
406 2.1 cc generates temporary symbols that start with .X, so we
407 recognize them here. FIXME: do other SVR4 compilers also use .X?.
408 If so, we should move the .X recognition into
409 _bfd_elf_is_local_label_name. */
410
411 static bfd_boolean
412 elf_i386_is_local_label_name (bfd *abfd, const char *name)
413 {
414 if (name[0] == '.' && name[1] == 'X')
415 return TRUE;
416
417 return _bfd_elf_is_local_label_name (abfd, name);
418 }
419 \f
420 /* Support for core dump NOTE sections. */
421
422 static bfd_boolean
423 elf_i386_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
424 {
425 int offset;
426 size_t size;
427
428 if (note->namesz == 8 && strcmp (note->namedata, "FreeBSD") == 0)
429 {
430 int pr_version = bfd_get_32 (abfd, note->descdata);
431
432 if (pr_version != 1)
433 return FALSE;
434
435 /* pr_cursig */
436 elf_tdata (abfd)->core->signal = bfd_get_32 (abfd, note->descdata + 20);
437
438 /* pr_pid */
439 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
440
441 /* pr_reg */
442 offset = 28;
443 size = bfd_get_32 (abfd, note->descdata + 8);
444 }
445 else
446 {
447 switch (note->descsz)
448 {
449 default:
450 return FALSE;
451
452 case 144: /* Linux/i386 */
453 /* pr_cursig */
454 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
455
456 /* pr_pid */
457 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
458
459 /* pr_reg */
460 offset = 72;
461 size = 68;
462
463 break;
464 }
465 }
466
467 /* Make a ".reg/999" section. */
468 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
469 size, note->descpos + offset);
470 }
471
472 static bfd_boolean
473 elf_i386_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
474 {
475 if (note->namesz == 8 && strcmp (note->namedata, "FreeBSD") == 0)
476 {
477 int pr_version = bfd_get_32 (abfd, note->descdata);
478
479 if (pr_version != 1)
480 return FALSE;
481
482 elf_tdata (abfd)->core->program
483 = _bfd_elfcore_strndup (abfd, note->descdata + 8, 17);
484 elf_tdata (abfd)->core->command
485 = _bfd_elfcore_strndup (abfd, note->descdata + 25, 81);
486 }
487 else
488 {
489 switch (note->descsz)
490 {
491 default:
492 return FALSE;
493
494 case 124: /* Linux/i386 elf_prpsinfo. */
495 elf_tdata (abfd)->core->pid
496 = bfd_get_32 (abfd, note->descdata + 12);
497 elf_tdata (abfd)->core->program
498 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
499 elf_tdata (abfd)->core->command
500 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
501 }
502 }
503
504 /* Note that for some reason, a spurious space is tacked
505 onto the end of the args in some (at least one anyway)
506 implementations, so strip it off if it exists. */
507 {
508 char *command = elf_tdata (abfd)->core->command;
509 int n = strlen (command);
510
511 if (0 < n && command[n - 1] == ' ')
512 command[n - 1] = '\0';
513 }
514
515 return TRUE;
516 }
517 \f
518 /* Functions for the i386 ELF linker.
519
520 In order to gain some understanding of code in this file without
521 knowing all the intricate details of the linker, note the
522 following:
523
524 Functions named elf_i386_* are called by external routines, other
525 functions are only called locally. elf_i386_* functions appear
526 in this file more or less in the order in which they are called
527 from external routines. eg. elf_i386_check_relocs is called
528 early in the link process, elf_i386_finish_dynamic_sections is
529 one of the last functions. */
530
531
532 /* The name of the dynamic interpreter. This is put in the .interp
533 section. */
534
535 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1"
536
537 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
538 copying dynamic variables from a shared lib into an app's dynbss
539 section, and instead use a dynamic relocation to point into the
540 shared lib. */
541 #define ELIMINATE_COPY_RELOCS 1
542
543 /* The size in bytes of an entry in the procedure linkage table. */
544
545 #define PLT_ENTRY_SIZE 16
546
547 /* The first entry in an absolute procedure linkage table looks like
548 this. See the SVR4 ABI i386 supplement to see how this works.
549 Will be padded to PLT_ENTRY_SIZE with htab->plt0_pad_byte. */
550
551 static const bfd_byte elf_i386_plt0_entry[12] =
552 {
553 0xff, 0x35, /* pushl contents of address */
554 0, 0, 0, 0, /* replaced with address of .got + 4. */
555 0xff, 0x25, /* jmp indirect */
556 0, 0, 0, 0 /* replaced with address of .got + 8. */
557 };
558
559 /* Subsequent entries in an absolute procedure linkage table look like
560 this. */
561
562 static const bfd_byte elf_i386_plt_entry[PLT_ENTRY_SIZE] =
563 {
564 0xff, 0x25, /* jmp indirect */
565 0, 0, 0, 0, /* replaced with address of this symbol in .got. */
566 0x68, /* pushl immediate */
567 0, 0, 0, 0, /* replaced with offset into relocation table. */
568 0xe9, /* jmp relative */
569 0, 0, 0, 0 /* replaced with offset to start of .plt. */
570 };
571
572 /* The first entry in a PIC procedure linkage table look like this.
573 Will be padded to PLT_ENTRY_SIZE with htab->plt0_pad_byte. */
574
575 static const bfd_byte elf_i386_pic_plt0_entry[12] =
576 {
577 0xff, 0xb3, 4, 0, 0, 0, /* pushl 4(%ebx) */
578 0xff, 0xa3, 8, 0, 0, 0 /* jmp *8(%ebx) */
579 };
580
581 /* Subsequent entries in a PIC procedure linkage table look like this. */
582
583 static const bfd_byte elf_i386_pic_plt_entry[PLT_ENTRY_SIZE] =
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
593 /* Entries in the GOT procedure linkage table look like this. */
594
595 static const bfd_byte elf_i386_got_plt_entry[8] =
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
602 /* Entries in the PIC GOT procedure linkage table look like this. */
603
604 static const bfd_byte elf_i386_pic_got_plt_entry[8] =
605 {
606 0xff, 0xa3, /* jmp *offset(%ebx) */
607 0, 0, 0, 0, /* replaced with offset of this symbol in .got. */
608 0x66, 0x90 /* xchg %ax,%ax */
609 };
610
611 /* .eh_frame covering the .plt section. */
612
613 static const bfd_byte elf_i386_eh_frame_plt[] =
614 {
615 #define PLT_CIE_LENGTH 20
616 #define PLT_FDE_LENGTH 36
617 #define PLT_FDE_START_OFFSET 4 + PLT_CIE_LENGTH + 8
618 #define PLT_FDE_LEN_OFFSET 4 + PLT_CIE_LENGTH + 12
619 PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
620 0, 0, 0, 0, /* CIE ID */
621 1, /* CIE version */
622 'z', 'R', 0, /* Augmentation string */
623 1, /* Code alignment factor */
624 0x7c, /* Data alignment factor */
625 8, /* Return address column */
626 1, /* Augmentation size */
627 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
628 DW_CFA_def_cfa, 4, 4, /* DW_CFA_def_cfa: r4 (esp) ofs 4 */
629 DW_CFA_offset + 8, 1, /* DW_CFA_offset: r8 (eip) at cfa-4 */
630 DW_CFA_nop, DW_CFA_nop,
631
632 PLT_FDE_LENGTH, 0, 0, 0, /* FDE length */
633 PLT_CIE_LENGTH + 8, 0, 0, 0, /* CIE pointer */
634 0, 0, 0, 0, /* R_386_PC32 .plt goes here */
635 0, 0, 0, 0, /* .plt size goes here */
636 0, /* Augmentation size */
637 DW_CFA_def_cfa_offset, 8, /* DW_CFA_def_cfa_offset: 8 */
638 DW_CFA_advance_loc + 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */
639 DW_CFA_def_cfa_offset, 12, /* DW_CFA_def_cfa_offset: 12 */
640 DW_CFA_advance_loc + 10, /* DW_CFA_advance_loc: 10 to __PLT__+16 */
641 DW_CFA_def_cfa_expression, /* DW_CFA_def_cfa_expression */
642 11, /* Block length */
643 DW_OP_breg4, 4, /* DW_OP_breg4 (esp): 4 */
644 DW_OP_breg8, 0, /* DW_OP_breg8 (eip): 0 */
645 DW_OP_lit15, DW_OP_and, DW_OP_lit11, DW_OP_ge,
646 DW_OP_lit2, DW_OP_shl, DW_OP_plus,
647 DW_CFA_nop, DW_CFA_nop, DW_CFA_nop, DW_CFA_nop
648 };
649
650 struct elf_i386_plt_layout
651 {
652 /* The first entry in an absolute procedure linkage table looks like this. */
653 const bfd_byte *plt0_entry;
654 unsigned int plt0_entry_size;
655
656 /* Offsets into plt0_entry that are to be replaced with GOT[1] and GOT[2]. */
657 unsigned int plt0_got1_offset;
658 unsigned int plt0_got2_offset;
659
660 /* Later entries in an absolute procedure linkage table look like this. */
661 const bfd_byte *plt_entry;
662 unsigned int plt_entry_size;
663
664 /* Offsets into plt_entry that are to be replaced with... */
665 unsigned int plt_got_offset; /* ... address of this symbol in .got. */
666 unsigned int plt_reloc_offset; /* ... offset into relocation table. */
667 unsigned int plt_plt_offset; /* ... offset to start of .plt. */
668
669 /* Offset into plt_entry where the initial value of the GOT entry points. */
670 unsigned int plt_lazy_offset;
671
672 /* The first entry in a PIC procedure linkage table looks like this. */
673 const bfd_byte *pic_plt0_entry;
674
675 /* Subsequent entries in a PIC procedure linkage table look like this. */
676 const bfd_byte *pic_plt_entry;
677
678 /* .eh_frame covering the .plt section. */
679 const bfd_byte *eh_frame_plt;
680 unsigned int eh_frame_plt_size;
681 };
682
683 #define GET_PLT_ENTRY_SIZE(abfd) \
684 get_elf_i386_backend_data (abfd)->plt->plt_entry_size
685
686 /* These are the standard parameters. */
687 static const struct elf_i386_plt_layout elf_i386_plt =
688 {
689 elf_i386_plt0_entry, /* plt0_entry */
690 sizeof (elf_i386_plt0_entry), /* plt0_entry_size */
691 2, /* plt0_got1_offset */
692 8, /* plt0_got2_offset */
693 elf_i386_plt_entry, /* plt_entry */
694 PLT_ENTRY_SIZE, /* plt_entry_size */
695 2, /* plt_got_offset */
696 7, /* plt_reloc_offset */
697 12, /* plt_plt_offset */
698 6, /* plt_lazy_offset */
699 elf_i386_pic_plt0_entry, /* pic_plt0_entry */
700 elf_i386_pic_plt_entry, /* pic_plt_entry */
701 elf_i386_eh_frame_plt, /* eh_frame_plt */
702 sizeof (elf_i386_eh_frame_plt), /* eh_frame_plt_size */
703 };
704 \f
705
706 /* On VxWorks, the .rel.plt.unloaded section has absolute relocations
707 for the PLTResolve stub and then for each PLT entry. */
708 #define PLTRESOLVE_RELOCS_SHLIB 0
709 #define PLTRESOLVE_RELOCS 2
710 #define PLT_NON_JUMP_SLOT_RELOCS 2
711
712 /* Architecture-specific backend data for i386. */
713
714 struct elf_i386_backend_data
715 {
716 /* Parameters describing PLT generation. */
717 const struct elf_i386_plt_layout *plt;
718
719 /* Value used to fill the unused bytes of the first PLT entry. */
720 bfd_byte plt0_pad_byte;
721
722 /* True if the target system is VxWorks. */
723 int is_vxworks;
724 };
725
726 #define get_elf_i386_backend_data(abfd) \
727 ((const struct elf_i386_backend_data *) \
728 get_elf_backend_data (abfd)->arch_data)
729
730 /* These are the standard parameters. */
731 static const struct elf_i386_backend_data elf_i386_arch_bed =
732 {
733 &elf_i386_plt, /* plt */
734 0, /* plt0_pad_byte */
735 0, /* is_vxworks */
736 };
737
738 #define elf_backend_arch_data &elf_i386_arch_bed
739
740 /* Is a undefined weak symbol which is resolved to 0. Reference to an
741 undefined weak symbol is resolved to 0 when building executable if
742 it isn't dynamic and
743 1. Has non-GOT/non-PLT relocations in text section. Or
744 2. Has no GOT/PLT relocation.
745 */
746 #define UNDEFINED_WEAK_RESOLVED_TO_ZERO(INFO, EH) \
747 ((EH)->elf.root.type == bfd_link_hash_undefweak \
748 && bfd_link_executable (INFO) \
749 && (elf_i386_hash_table (INFO)->interp == NULL \
750 || !(EH)->has_got_reloc \
751 || (EH)->has_non_got_reloc \
752 || !(INFO)->dynamic_undefined_weak))
753
754 /* i386 ELF linker hash entry. */
755
756 struct elf_i386_link_hash_entry
757 {
758 struct elf_link_hash_entry elf;
759
760 /* Track dynamic relocs copied for this symbol. */
761 struct elf_dyn_relocs *dyn_relocs;
762
763 #define GOT_UNKNOWN 0
764 #define GOT_NORMAL 1
765 #define GOT_TLS_GD 2
766 #define GOT_TLS_IE 4
767 #define GOT_TLS_IE_POS 5
768 #define GOT_TLS_IE_NEG 6
769 #define GOT_TLS_IE_BOTH 7
770 #define GOT_TLS_GDESC 8
771 #define GOT_TLS_GD_BOTH_P(type) \
772 ((type) == (GOT_TLS_GD | GOT_TLS_GDESC))
773 #define GOT_TLS_GD_P(type) \
774 ((type) == GOT_TLS_GD || GOT_TLS_GD_BOTH_P (type))
775 #define GOT_TLS_GDESC_P(type) \
776 ((type) == GOT_TLS_GDESC || GOT_TLS_GD_BOTH_P (type))
777 #define GOT_TLS_GD_ANY_P(type) \
778 (GOT_TLS_GD_P (type) || GOT_TLS_GDESC_P (type))
779 unsigned char tls_type;
780
781 /* Symbol is referenced by R_386_GOTOFF relocation. */
782 unsigned int gotoff_ref : 1;
783
784 /* Symbol has GOT or PLT relocations. */
785 unsigned int has_got_reloc : 1;
786
787 /* Symbol has non-GOT/non-PLT relocations in text sections. */
788 unsigned int has_non_got_reloc : 1;
789
790 /* Reference count of C/C++ function pointer relocations in read-write
791 section which can be resolved at run-time. */
792 bfd_signed_vma func_pointer_refcount;
793
794 /* Information about the GOT PLT entry. Filled when there are both
795 GOT and PLT relocations against the same function. */
796 union gotplt_union plt_got;
797
798 /* Offset of the GOTPLT entry reserved for the TLS descriptor,
799 starting at the end of the jump table. */
800 bfd_vma tlsdesc_got;
801 };
802
803 #define elf_i386_hash_entry(ent) ((struct elf_i386_link_hash_entry *)(ent))
804
805 struct elf_i386_obj_tdata
806 {
807 struct elf_obj_tdata root;
808
809 /* tls_type for each local got entry. */
810 char *local_got_tls_type;
811
812 /* GOTPLT entries for TLS descriptors. */
813 bfd_vma *local_tlsdesc_gotent;
814 };
815
816 #define elf_i386_tdata(abfd) \
817 ((struct elf_i386_obj_tdata *) (abfd)->tdata.any)
818
819 #define elf_i386_local_got_tls_type(abfd) \
820 (elf_i386_tdata (abfd)->local_got_tls_type)
821
822 #define elf_i386_local_tlsdesc_gotent(abfd) \
823 (elf_i386_tdata (abfd)->local_tlsdesc_gotent)
824
825 #define is_i386_elf(bfd) \
826 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
827 && elf_tdata (bfd) != NULL \
828 && elf_object_id (bfd) == I386_ELF_DATA)
829
830 static bfd_boolean
831 elf_i386_mkobject (bfd *abfd)
832 {
833 return bfd_elf_allocate_object (abfd, sizeof (struct elf_i386_obj_tdata),
834 I386_ELF_DATA);
835 }
836
837 /* i386 ELF linker hash table. */
838
839 struct elf_i386_link_hash_table
840 {
841 struct elf_link_hash_table elf;
842
843 /* Short-cuts to get to dynamic linker sections. */
844 asection *interp;
845 asection *sdynbss;
846 asection *srelbss;
847 asection *plt_eh_frame;
848 asection *plt_got;
849
850 union
851 {
852 bfd_signed_vma refcount;
853 bfd_vma offset;
854 } tls_ldm_got;
855
856 /* The amount of space used by the reserved portion of the sgotplt
857 section, plus whatever space is used by the jump slots. */
858 bfd_vma sgotplt_jump_table_size;
859
860 /* Small local sym cache. */
861 struct sym_cache sym_cache;
862
863 /* _TLS_MODULE_BASE_ symbol. */
864 struct bfd_link_hash_entry *tls_module_base;
865
866 /* Used by local STT_GNU_IFUNC symbols. */
867 htab_t loc_hash_table;
868 void * loc_hash_memory;
869
870 /* The (unloaded but important) .rel.plt.unloaded section on VxWorks. */
871 asection *srelplt2;
872
873 /* The index of the next unused R_386_TLS_DESC slot in .rel.plt. */
874 bfd_vma next_tls_desc_index;
875
876 /* The index of the next unused R_386_JUMP_SLOT slot in .rel.plt. */
877 bfd_vma next_jump_slot_index;
878
879 /* The index of the next unused R_386_IRELATIVE slot in .rel.plt. */
880 bfd_vma next_irelative_index;
881
882 /* TRUE if there are dynamic relocs against IFUNC symbols that apply
883 to read-only sections. */
884 bfd_boolean readonly_dynrelocs_against_ifunc;
885 };
886
887 /* Get the i386 ELF linker hash table from a link_info structure. */
888
889 #define elf_i386_hash_table(p) \
890 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
891 == I386_ELF_DATA ? ((struct elf_i386_link_hash_table *) ((p)->hash)) : NULL)
892
893 #define elf_i386_compute_jump_table_size(htab) \
894 ((htab)->elf.srelplt->reloc_count * 4)
895
896 /* Create an entry in an i386 ELF linker hash table. */
897
898 static struct bfd_hash_entry *
899 elf_i386_link_hash_newfunc (struct bfd_hash_entry *entry,
900 struct bfd_hash_table *table,
901 const char *string)
902 {
903 /* Allocate the structure if it has not already been allocated by a
904 subclass. */
905 if (entry == NULL)
906 {
907 entry = (struct bfd_hash_entry *)
908 bfd_hash_allocate (table, sizeof (struct elf_i386_link_hash_entry));
909 if (entry == NULL)
910 return entry;
911 }
912
913 /* Call the allocation method of the superclass. */
914 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
915 if (entry != NULL)
916 {
917 struct elf_i386_link_hash_entry *eh;
918
919 eh = (struct elf_i386_link_hash_entry *) entry;
920 eh->dyn_relocs = NULL;
921 eh->tls_type = GOT_UNKNOWN;
922 eh->gotoff_ref = 0;
923 eh->has_got_reloc = 0;
924 eh->has_non_got_reloc = 0;
925 eh->func_pointer_refcount = 0;
926 eh->plt_got.offset = (bfd_vma) -1;
927 eh->tlsdesc_got = (bfd_vma) -1;
928 }
929
930 return entry;
931 }
932
933 /* Compute a hash of a local hash entry. We use elf_link_hash_entry
934 for local symbol so that we can handle local STT_GNU_IFUNC symbols
935 as global symbol. We reuse indx and dynstr_index for local symbol
936 hash since they aren't used by global symbols in this backend. */
937
938 static hashval_t
939 elf_i386_local_htab_hash (const void *ptr)
940 {
941 struct elf_link_hash_entry *h
942 = (struct elf_link_hash_entry *) ptr;
943 return ELF_LOCAL_SYMBOL_HASH (h->indx, h->dynstr_index);
944 }
945
946 /* Compare local hash entries. */
947
948 static int
949 elf_i386_local_htab_eq (const void *ptr1, const void *ptr2)
950 {
951 struct elf_link_hash_entry *h1
952 = (struct elf_link_hash_entry *) ptr1;
953 struct elf_link_hash_entry *h2
954 = (struct elf_link_hash_entry *) ptr2;
955
956 return h1->indx == h2->indx && h1->dynstr_index == h2->dynstr_index;
957 }
958
959 /* Find and/or create a hash entry for local symbol. */
960
961 static struct elf_link_hash_entry *
962 elf_i386_get_local_sym_hash (struct elf_i386_link_hash_table *htab,
963 bfd *abfd, const Elf_Internal_Rela *rel,
964 bfd_boolean create)
965 {
966 struct elf_i386_link_hash_entry e, *ret;
967 asection *sec = abfd->sections;
968 hashval_t h = ELF_LOCAL_SYMBOL_HASH (sec->id,
969 ELF32_R_SYM (rel->r_info));
970 void **slot;
971
972 e.elf.indx = sec->id;
973 e.elf.dynstr_index = ELF32_R_SYM (rel->r_info);
974 slot = htab_find_slot_with_hash (htab->loc_hash_table, &e, h,
975 create ? INSERT : NO_INSERT);
976
977 if (!slot)
978 return NULL;
979
980 if (*slot)
981 {
982 ret = (struct elf_i386_link_hash_entry *) *slot;
983 return &ret->elf;
984 }
985
986 ret = (struct elf_i386_link_hash_entry *)
987 objalloc_alloc ((struct objalloc *) htab->loc_hash_memory,
988 sizeof (struct elf_i386_link_hash_entry));
989 if (ret)
990 {
991 memset (ret, 0, sizeof (*ret));
992 ret->elf.indx = sec->id;
993 ret->elf.dynstr_index = ELF32_R_SYM (rel->r_info);
994 ret->elf.dynindx = -1;
995 ret->func_pointer_refcount = 0;
996 ret->plt_got.offset = (bfd_vma) -1;
997 *slot = ret;
998 }
999 return &ret->elf;
1000 }
1001
1002 /* Destroy an i386 ELF linker hash table. */
1003
1004 static void
1005 elf_i386_link_hash_table_free (bfd *obfd)
1006 {
1007 struct elf_i386_link_hash_table *htab
1008 = (struct elf_i386_link_hash_table *) obfd->link.hash;
1009
1010 if (htab->loc_hash_table)
1011 htab_delete (htab->loc_hash_table);
1012 if (htab->loc_hash_memory)
1013 objalloc_free ((struct objalloc *) htab->loc_hash_memory);
1014 _bfd_elf_link_hash_table_free (obfd);
1015 }
1016
1017 /* Create an i386 ELF linker hash table. */
1018
1019 static struct bfd_link_hash_table *
1020 elf_i386_link_hash_table_create (bfd *abfd)
1021 {
1022 struct elf_i386_link_hash_table *ret;
1023 bfd_size_type amt = sizeof (struct elf_i386_link_hash_table);
1024
1025 ret = (struct elf_i386_link_hash_table *) bfd_zmalloc (amt);
1026 if (ret == NULL)
1027 return NULL;
1028
1029 if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd,
1030 elf_i386_link_hash_newfunc,
1031 sizeof (struct elf_i386_link_hash_entry),
1032 I386_ELF_DATA))
1033 {
1034 free (ret);
1035 return NULL;
1036 }
1037
1038 ret->loc_hash_table = htab_try_create (1024,
1039 elf_i386_local_htab_hash,
1040 elf_i386_local_htab_eq,
1041 NULL);
1042 ret->loc_hash_memory = objalloc_create ();
1043 if (!ret->loc_hash_table || !ret->loc_hash_memory)
1044 {
1045 elf_i386_link_hash_table_free (abfd);
1046 return NULL;
1047 }
1048 ret->elf.root.hash_table_free = elf_i386_link_hash_table_free;
1049
1050 return &ret->elf.root;
1051 }
1052
1053 /* Create .plt, .rel.plt, .got, .got.plt, .rel.got, .dynbss, and
1054 .rel.bss sections in DYNOBJ, and set up shortcuts to them in our
1055 hash table. */
1056
1057 static bfd_boolean
1058 elf_i386_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
1059 {
1060 struct elf_i386_link_hash_table *htab;
1061
1062 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
1063 return FALSE;
1064
1065 htab = elf_i386_hash_table (info);
1066 if (htab == NULL)
1067 return FALSE;
1068
1069 htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss");
1070 if (!htab->sdynbss)
1071 abort ();
1072
1073 if (bfd_link_executable (info))
1074 {
1075 /* Always allow copy relocs for building executables. */
1076 asection *s = bfd_get_linker_section (dynobj, ".rel.bss");
1077 if (s == NULL)
1078 {
1079 const struct elf_backend_data *bed = get_elf_backend_data (dynobj);
1080 s = bfd_make_section_anyway_with_flags (dynobj,
1081 ".rel.bss",
1082 (bed->dynamic_sec_flags
1083 | SEC_READONLY));
1084 if (s == NULL
1085 || ! bfd_set_section_alignment (dynobj, s,
1086 bed->s->log_file_align))
1087 return FALSE;
1088 }
1089 htab->srelbss = s;
1090 }
1091
1092 if (get_elf_i386_backend_data (dynobj)->is_vxworks
1093 && !elf_vxworks_create_dynamic_sections (dynobj, info,
1094 &htab->srelplt2))
1095 return FALSE;
1096
1097 if (!info->no_ld_generated_unwind_info
1098 && htab->plt_eh_frame == NULL
1099 && htab->elf.splt != NULL)
1100 {
1101 flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
1102 | SEC_HAS_CONTENTS | SEC_IN_MEMORY
1103 | SEC_LINKER_CREATED);
1104 htab->plt_eh_frame
1105 = bfd_make_section_anyway_with_flags (dynobj, ".eh_frame", flags);
1106 if (htab->plt_eh_frame == NULL
1107 || !bfd_set_section_alignment (dynobj, htab->plt_eh_frame, 2))
1108 return FALSE;
1109 }
1110
1111 return TRUE;
1112 }
1113
1114 /* Copy the extra info we tack onto an elf_link_hash_entry. */
1115
1116 static void
1117 elf_i386_copy_indirect_symbol (struct bfd_link_info *info,
1118 struct elf_link_hash_entry *dir,
1119 struct elf_link_hash_entry *ind)
1120 {
1121 struct elf_i386_link_hash_entry *edir, *eind;
1122
1123 edir = (struct elf_i386_link_hash_entry *) dir;
1124 eind = (struct elf_i386_link_hash_entry *) ind;
1125
1126 if (eind->dyn_relocs != NULL)
1127 {
1128 if (edir->dyn_relocs != NULL)
1129 {
1130 struct elf_dyn_relocs **pp;
1131 struct elf_dyn_relocs *p;
1132
1133 /* Add reloc counts against the indirect sym to the direct sym
1134 list. Merge any entries against the same section. */
1135 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
1136 {
1137 struct elf_dyn_relocs *q;
1138
1139 for (q = edir->dyn_relocs; q != NULL; q = q->next)
1140 if (q->sec == p->sec)
1141 {
1142 q->pc_count += p->pc_count;
1143 q->count += p->count;
1144 *pp = p->next;
1145 break;
1146 }
1147 if (q == NULL)
1148 pp = &p->next;
1149 }
1150 *pp = edir->dyn_relocs;
1151 }
1152
1153 edir->dyn_relocs = eind->dyn_relocs;
1154 eind->dyn_relocs = NULL;
1155 }
1156
1157 if (ind->root.type == bfd_link_hash_indirect
1158 && dir->got.refcount <= 0)
1159 {
1160 edir->tls_type = eind->tls_type;
1161 eind->tls_type = GOT_UNKNOWN;
1162 }
1163
1164 /* Copy gotoff_ref so that elf_i386_adjust_dynamic_symbol will
1165 generate a R_386_COPY reloc. */
1166 edir->gotoff_ref |= eind->gotoff_ref;
1167
1168 edir->has_got_reloc |= eind->has_got_reloc;
1169 edir->has_non_got_reloc |= eind->has_non_got_reloc;
1170
1171 if (ELIMINATE_COPY_RELOCS
1172 && ind->root.type != bfd_link_hash_indirect
1173 && dir->dynamic_adjusted)
1174 {
1175 /* If called to transfer flags for a weakdef during processing
1176 of elf_adjust_dynamic_symbol, don't copy non_got_ref.
1177 We clear it ourselves for ELIMINATE_COPY_RELOCS. */
1178 dir->ref_dynamic |= ind->ref_dynamic;
1179 dir->ref_regular |= ind->ref_regular;
1180 dir->ref_regular_nonweak |= ind->ref_regular_nonweak;
1181 dir->needs_plt |= ind->needs_plt;
1182 dir->pointer_equality_needed |= ind->pointer_equality_needed;
1183 }
1184 else
1185 {
1186 if (eind->func_pointer_refcount > 0)
1187 {
1188 edir->func_pointer_refcount += eind->func_pointer_refcount;
1189 eind->func_pointer_refcount = 0;
1190 }
1191
1192 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
1193 }
1194 }
1195
1196 /* Return TRUE if the TLS access code sequence support transition
1197 from R_TYPE. */
1198
1199 static bfd_boolean
1200 elf_i386_check_tls_transition (bfd *abfd, asection *sec,
1201 bfd_byte *contents,
1202 Elf_Internal_Shdr *symtab_hdr,
1203 struct elf_link_hash_entry **sym_hashes,
1204 unsigned int r_type,
1205 const Elf_Internal_Rela *rel,
1206 const Elf_Internal_Rela *relend)
1207 {
1208 unsigned int val, type;
1209 unsigned long r_symndx;
1210 struct elf_link_hash_entry *h;
1211 bfd_vma offset;
1212
1213 /* Get the section contents. */
1214 if (contents == NULL)
1215 {
1216 if (elf_section_data (sec)->this_hdr.contents != NULL)
1217 contents = elf_section_data (sec)->this_hdr.contents;
1218 else
1219 {
1220 /* FIXME: How to better handle error condition? */
1221 if (!bfd_malloc_and_get_section (abfd, sec, &contents))
1222 return FALSE;
1223
1224 /* Cache the section contents for elf_link_input_bfd. */
1225 elf_section_data (sec)->this_hdr.contents = contents;
1226 }
1227 }
1228
1229 offset = rel->r_offset;
1230 switch (r_type)
1231 {
1232 case R_386_TLS_GD:
1233 case R_386_TLS_LDM:
1234 if (offset < 2 || (rel + 1) >= relend)
1235 return FALSE;
1236
1237 type = bfd_get_8 (abfd, contents + offset - 2);
1238 if (r_type == R_386_TLS_GD)
1239 {
1240 /* Check transition from GD access model. Only
1241 leal foo@tlsgd(,%reg,1), %eax; call ___tls_get_addr
1242 leal foo@tlsgd(%reg), %eax; call ___tls_get_addr; nop
1243 can transit to different access model. */
1244 if ((offset + 10) > sec->size ||
1245 (type != 0x8d && type != 0x04))
1246 return FALSE;
1247
1248 val = bfd_get_8 (abfd, contents + offset - 1);
1249 if (type == 0x04)
1250 {
1251 /* leal foo@tlsgd(,%reg,1), %eax; call ___tls_get_addr */
1252 if (offset < 3)
1253 return FALSE;
1254
1255 if (bfd_get_8 (abfd, contents + offset - 3) != 0x8d)
1256 return FALSE;
1257
1258 if ((val & 0xc7) != 0x05 || val == (4 << 3))
1259 return FALSE;
1260 }
1261 else
1262 {
1263 /* leal foo@tlsgd(%reg), %eax; call ___tls_get_addr; nop */
1264 if ((val & 0xf8) != 0x80 || (val & 7) == 4)
1265 return FALSE;
1266
1267 if (bfd_get_8 (abfd, contents + offset + 9) != 0x90)
1268 return FALSE;
1269 }
1270 }
1271 else
1272 {
1273 /* Check transition from LD access model. Only
1274 leal foo@tlsgd(%reg), %eax; call ___tls_get_addr
1275 can transit to different access model. */
1276 if (type != 0x8d || (offset + 9) > sec->size)
1277 return FALSE;
1278
1279 val = bfd_get_8 (abfd, contents + offset - 1);
1280 if ((val & 0xf8) != 0x80 || (val & 7) == 4)
1281 return FALSE;
1282 }
1283
1284 if (bfd_get_8 (abfd, contents + offset + 4) != 0xe8)
1285 return FALSE;
1286
1287 r_symndx = ELF32_R_SYM (rel[1].r_info);
1288 if (r_symndx < symtab_hdr->sh_info)
1289 return FALSE;
1290
1291 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1292 /* Use strncmp to check ___tls_get_addr since ___tls_get_addr
1293 may be versioned. */
1294 return (h != NULL
1295 && h->root.root.string != NULL
1296 && (ELF32_R_TYPE (rel[1].r_info) == R_386_PC32
1297 || ELF32_R_TYPE (rel[1].r_info) == R_386_PLT32)
1298 && (strncmp (h->root.root.string, "___tls_get_addr",
1299 15) == 0));
1300
1301 case R_386_TLS_IE:
1302 /* Check transition from IE access model:
1303 movl foo@indntpoff(%rip), %eax
1304 movl foo@indntpoff(%rip), %reg
1305 addl foo@indntpoff(%rip), %reg
1306 */
1307
1308 if (offset < 1 || (offset + 4) > sec->size)
1309 return FALSE;
1310
1311 /* Check "movl foo@tpoff(%rip), %eax" first. */
1312 val = bfd_get_8 (abfd, contents + offset - 1);
1313 if (val == 0xa1)
1314 return TRUE;
1315
1316 if (offset < 2)
1317 return FALSE;
1318
1319 /* Check movl|addl foo@tpoff(%rip), %reg. */
1320 type = bfd_get_8 (abfd, contents + offset - 2);
1321 return ((type == 0x8b || type == 0x03)
1322 && (val & 0xc7) == 0x05);
1323
1324 case R_386_TLS_GOTIE:
1325 case R_386_TLS_IE_32:
1326 /* Check transition from {IE_32,GOTIE} access model:
1327 subl foo@{tpoff,gontoff}(%reg1), %reg2
1328 movl foo@{tpoff,gontoff}(%reg1), %reg2
1329 addl foo@{tpoff,gontoff}(%reg1), %reg2
1330 */
1331
1332 if (offset < 2 || (offset + 4) > sec->size)
1333 return FALSE;
1334
1335 val = bfd_get_8 (abfd, contents + offset - 1);
1336 if ((val & 0xc0) != 0x80 || (val & 7) == 4)
1337 return FALSE;
1338
1339 type = bfd_get_8 (abfd, contents + offset - 2);
1340 return type == 0x8b || type == 0x2b || type == 0x03;
1341
1342 case R_386_TLS_GOTDESC:
1343 /* Check transition from GDesc access model:
1344 leal x@tlsdesc(%ebx), %eax
1345
1346 Make sure it's a leal adding ebx to a 32-bit offset
1347 into any register, although it's probably almost always
1348 going to be eax. */
1349
1350 if (offset < 2 || (offset + 4) > sec->size)
1351 return FALSE;
1352
1353 if (bfd_get_8 (abfd, contents + offset - 2) != 0x8d)
1354 return FALSE;
1355
1356 val = bfd_get_8 (abfd, contents + offset - 1);
1357 return (val & 0xc7) == 0x83;
1358
1359 case R_386_TLS_DESC_CALL:
1360 /* Check transition from GDesc access model:
1361 call *x@tlsdesc(%rax)
1362 */
1363 if (offset + 2 <= sec->size)
1364 {
1365 /* Make sure that it's a call *x@tlsdesc(%rax). */
1366 static const unsigned char call[] = { 0xff, 0x10 };
1367 return memcmp (contents + offset, call, 2) == 0;
1368 }
1369
1370 return FALSE;
1371
1372 default:
1373 abort ();
1374 }
1375 }
1376
1377 /* Return TRUE if the TLS access transition is OK or no transition
1378 will be performed. Update R_TYPE if there is a transition. */
1379
1380 static bfd_boolean
1381 elf_i386_tls_transition (struct bfd_link_info *info, bfd *abfd,
1382 asection *sec, bfd_byte *contents,
1383 Elf_Internal_Shdr *symtab_hdr,
1384 struct elf_link_hash_entry **sym_hashes,
1385 unsigned int *r_type, int tls_type,
1386 const Elf_Internal_Rela *rel,
1387 const Elf_Internal_Rela *relend,
1388 struct elf_link_hash_entry *h,
1389 unsigned long r_symndx)
1390 {
1391 unsigned int from_type = *r_type;
1392 unsigned int to_type = from_type;
1393 bfd_boolean check = TRUE;
1394
1395 /* Skip TLS transition for functions. */
1396 if (h != NULL
1397 && (h->type == STT_FUNC
1398 || h->type == STT_GNU_IFUNC))
1399 return TRUE;
1400
1401 switch (from_type)
1402 {
1403 case R_386_TLS_GD:
1404 case R_386_TLS_GOTDESC:
1405 case R_386_TLS_DESC_CALL:
1406 case R_386_TLS_IE_32:
1407 case R_386_TLS_IE:
1408 case R_386_TLS_GOTIE:
1409 if (bfd_link_executable (info))
1410 {
1411 if (h == NULL)
1412 to_type = R_386_TLS_LE_32;
1413 else if (from_type != R_386_TLS_IE
1414 && from_type != R_386_TLS_GOTIE)
1415 to_type = R_386_TLS_IE_32;
1416 }
1417
1418 /* When we are called from elf_i386_relocate_section, CONTENTS
1419 isn't NULL and there may be additional transitions based on
1420 TLS_TYPE. */
1421 if (contents != NULL)
1422 {
1423 unsigned int new_to_type = to_type;
1424
1425 if (bfd_link_executable (info)
1426 && h != NULL
1427 && h->dynindx == -1
1428 && (tls_type & GOT_TLS_IE))
1429 new_to_type = R_386_TLS_LE_32;
1430
1431 if (to_type == R_386_TLS_GD
1432 || to_type == R_386_TLS_GOTDESC
1433 || to_type == R_386_TLS_DESC_CALL)
1434 {
1435 if (tls_type == GOT_TLS_IE_POS)
1436 new_to_type = R_386_TLS_GOTIE;
1437 else if (tls_type & GOT_TLS_IE)
1438 new_to_type = R_386_TLS_IE_32;
1439 }
1440
1441 /* We checked the transition before when we were called from
1442 elf_i386_check_relocs. We only want to check the new
1443 transition which hasn't been checked before. */
1444 check = new_to_type != to_type && from_type == to_type;
1445 to_type = new_to_type;
1446 }
1447
1448 break;
1449
1450 case R_386_TLS_LDM:
1451 if (bfd_link_executable (info))
1452 to_type = R_386_TLS_LE_32;
1453 break;
1454
1455 default:
1456 return TRUE;
1457 }
1458
1459 /* Return TRUE if there is no transition. */
1460 if (from_type == to_type)
1461 return TRUE;
1462
1463 /* Check if the transition can be performed. */
1464 if (check
1465 && ! elf_i386_check_tls_transition (abfd, sec, contents,
1466 symtab_hdr, sym_hashes,
1467 from_type, rel, relend))
1468 {
1469 reloc_howto_type *from, *to;
1470 const char *name;
1471
1472 from = elf_i386_rtype_to_howto (abfd, from_type);
1473 to = elf_i386_rtype_to_howto (abfd, to_type);
1474
1475 if (h)
1476 name = h->root.root.string;
1477 else
1478 {
1479 struct elf_i386_link_hash_table *htab;
1480
1481 htab = elf_i386_hash_table (info);
1482 if (htab == NULL)
1483 name = "*unknown*";
1484 else
1485 {
1486 Elf_Internal_Sym *isym;
1487
1488 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1489 abfd, r_symndx);
1490 name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
1491 }
1492 }
1493
1494 (*_bfd_error_handler)
1495 (_("%B: TLS transition from %s to %s against `%s' at 0x%lx "
1496 "in section `%A' failed"),
1497 abfd, sec, from->name, to->name, name,
1498 (unsigned long) rel->r_offset);
1499 bfd_set_error (bfd_error_bad_value);
1500 return FALSE;
1501 }
1502
1503 *r_type = to_type;
1504 return TRUE;
1505 }
1506
1507 /* Rename some of the generic section flags to better document how they
1508 are used here. */
1509 #define need_convert_load sec_flg0
1510 #define check_relocs_failed sec_flg1
1511
1512 /* Look through the relocs for a section during the first phase, and
1513 calculate needed space in the global offset table, procedure linkage
1514 table, and dynamic reloc sections. */
1515
1516 static bfd_boolean
1517 elf_i386_check_relocs (bfd *abfd,
1518 struct bfd_link_info *info,
1519 asection *sec,
1520 const Elf_Internal_Rela *relocs)
1521 {
1522 struct elf_i386_link_hash_table *htab;
1523 Elf_Internal_Shdr *symtab_hdr;
1524 struct elf_link_hash_entry **sym_hashes;
1525 const Elf_Internal_Rela *rel;
1526 const Elf_Internal_Rela *rel_end;
1527 asection *sreloc;
1528 bfd_boolean use_plt_got;
1529
1530 if (bfd_link_relocatable (info))
1531 return TRUE;
1532
1533 BFD_ASSERT (is_i386_elf (abfd));
1534
1535 htab = elf_i386_hash_table (info);
1536 if (htab == NULL)
1537 {
1538 sec->check_relocs_failed = 1;
1539 return FALSE;
1540 }
1541
1542 use_plt_got = (!get_elf_i386_backend_data (abfd)->is_vxworks
1543 && (get_elf_i386_backend_data (abfd)
1544 == &elf_i386_arch_bed));
1545
1546 symtab_hdr = &elf_symtab_hdr (abfd);
1547 sym_hashes = elf_sym_hashes (abfd);
1548
1549 sreloc = NULL;
1550
1551 rel_end = relocs + sec->reloc_count;
1552 for (rel = relocs; rel < rel_end; rel++)
1553 {
1554 unsigned int r_type;
1555 unsigned long r_symndx;
1556 struct elf_link_hash_entry *h;
1557 struct elf_i386_link_hash_entry *eh;
1558 Elf_Internal_Sym *isym;
1559 const char *name;
1560 bfd_boolean size_reloc;
1561
1562 r_symndx = ELF32_R_SYM (rel->r_info);
1563 r_type = ELF32_R_TYPE (rel->r_info);
1564
1565 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
1566 {
1567 (*_bfd_error_handler) (_("%B: bad symbol index: %d"),
1568 abfd,
1569 r_symndx);
1570 goto error_return;
1571 }
1572
1573 if (r_symndx < symtab_hdr->sh_info)
1574 {
1575 /* A local symbol. */
1576 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1577 abfd, r_symndx);
1578 if (isym == NULL)
1579 goto error_return;
1580
1581 /* Check relocation against local STT_GNU_IFUNC symbol. */
1582 if (ELF32_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
1583 {
1584 h = elf_i386_get_local_sym_hash (htab, abfd, rel, TRUE);
1585 if (h == NULL)
1586 goto error_return;
1587
1588 /* Fake a STT_GNU_IFUNC symbol. */
1589 h->type = STT_GNU_IFUNC;
1590 h->def_regular = 1;
1591 h->ref_regular = 1;
1592 h->forced_local = 1;
1593 h->root.type = bfd_link_hash_defined;
1594 }
1595 else
1596 h = NULL;
1597 }
1598 else
1599 {
1600 isym = NULL;
1601 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1602 while (h->root.type == bfd_link_hash_indirect
1603 || h->root.type == bfd_link_hash_warning)
1604 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1605 }
1606
1607 eh = (struct elf_i386_link_hash_entry *) h;
1608 if (h != NULL)
1609 {
1610 switch (r_type)
1611 {
1612 default:
1613 break;
1614
1615 case R_386_GOTOFF:
1616 eh->gotoff_ref = 1;
1617 case R_386_32:
1618 case R_386_PC32:
1619 case R_386_PLT32:
1620 case R_386_GOT32:
1621 case R_386_GOT32X:
1622 if (htab->elf.dynobj == NULL)
1623 htab->elf.dynobj = abfd;
1624 /* Create the ifunc sections for static executables. */
1625 if (h->type == STT_GNU_IFUNC
1626 && !_bfd_elf_create_ifunc_sections (htab->elf.dynobj,
1627 info))
1628 goto error_return;
1629 break;
1630 }
1631
1632 /* It is referenced by a non-shared object. */
1633 h->ref_regular = 1;
1634 h->root.non_ir_ref = 1;
1635
1636 if (h->type == STT_GNU_IFUNC)
1637 elf_tdata (info->output_bfd)->has_gnu_symbols
1638 |= elf_gnu_symbol_ifunc;
1639 }
1640
1641 if (! elf_i386_tls_transition (info, abfd, sec, NULL,
1642 symtab_hdr, sym_hashes,
1643 &r_type, GOT_UNKNOWN,
1644 rel, rel_end, h, r_symndx))
1645 goto error_return;
1646
1647 switch (r_type)
1648 {
1649 case R_386_TLS_LDM:
1650 htab->tls_ldm_got.refcount += 1;
1651 goto create_got;
1652
1653 case R_386_PLT32:
1654 /* This symbol requires a procedure linkage table entry. We
1655 actually build the entry in adjust_dynamic_symbol,
1656 because this might be a case of linking PIC code which is
1657 never referenced by a dynamic object, in which case we
1658 don't need to generate a procedure linkage table entry
1659 after all. */
1660
1661 /* If this is a local symbol, we resolve it directly without
1662 creating a procedure linkage table entry. */
1663 if (h == NULL)
1664 continue;
1665
1666 eh->has_got_reloc = 1;
1667 h->needs_plt = 1;
1668 h->plt.refcount += 1;
1669 break;
1670
1671 case R_386_SIZE32:
1672 size_reloc = TRUE;
1673 goto do_size;
1674
1675 case R_386_TLS_IE_32:
1676 case R_386_TLS_IE:
1677 case R_386_TLS_GOTIE:
1678 if (!bfd_link_executable (info))
1679 info->flags |= DF_STATIC_TLS;
1680 /* Fall through */
1681
1682 case R_386_GOT32:
1683 case R_386_GOT32X:
1684 case R_386_TLS_GD:
1685 case R_386_TLS_GOTDESC:
1686 case R_386_TLS_DESC_CALL:
1687 /* This symbol requires a global offset table entry. */
1688 {
1689 int tls_type, old_tls_type;
1690
1691 switch (r_type)
1692 {
1693 default:
1694 case R_386_GOT32:
1695 case R_386_GOT32X:
1696 tls_type = GOT_NORMAL;
1697 break;
1698 case R_386_TLS_GD: tls_type = GOT_TLS_GD; break;
1699 case R_386_TLS_GOTDESC:
1700 case R_386_TLS_DESC_CALL:
1701 tls_type = GOT_TLS_GDESC; break;
1702 case R_386_TLS_IE_32:
1703 if (ELF32_R_TYPE (rel->r_info) == r_type)
1704 tls_type = GOT_TLS_IE_NEG;
1705 else
1706 /* If this is a GD->IE transition, we may use either of
1707 R_386_TLS_TPOFF and R_386_TLS_TPOFF32. */
1708 tls_type = GOT_TLS_IE;
1709 break;
1710 case R_386_TLS_IE:
1711 case R_386_TLS_GOTIE:
1712 tls_type = GOT_TLS_IE_POS; break;
1713 }
1714
1715 if (h != NULL)
1716 {
1717 h->got.refcount += 1;
1718 old_tls_type = elf_i386_hash_entry(h)->tls_type;
1719 }
1720 else
1721 {
1722 bfd_signed_vma *local_got_refcounts;
1723
1724 /* This is a global offset table entry for a local symbol. */
1725 local_got_refcounts = elf_local_got_refcounts (abfd);
1726 if (local_got_refcounts == NULL)
1727 {
1728 bfd_size_type size;
1729
1730 size = symtab_hdr->sh_info;
1731 size *= (sizeof (bfd_signed_vma)
1732 + sizeof (bfd_vma) + sizeof(char));
1733 local_got_refcounts = (bfd_signed_vma *)
1734 bfd_zalloc (abfd, size);
1735 if (local_got_refcounts == NULL)
1736 goto error_return;
1737 elf_local_got_refcounts (abfd) = local_got_refcounts;
1738 elf_i386_local_tlsdesc_gotent (abfd)
1739 = (bfd_vma *) (local_got_refcounts + symtab_hdr->sh_info);
1740 elf_i386_local_got_tls_type (abfd)
1741 = (char *) (local_got_refcounts + 2 * symtab_hdr->sh_info);
1742 }
1743 local_got_refcounts[r_symndx] += 1;
1744 old_tls_type = elf_i386_local_got_tls_type (abfd) [r_symndx];
1745 }
1746
1747 if ((old_tls_type & GOT_TLS_IE) && (tls_type & GOT_TLS_IE))
1748 tls_type |= old_tls_type;
1749 /* If a TLS symbol is accessed using IE at least once,
1750 there is no point to use dynamic model for it. */
1751 else if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
1752 && (! GOT_TLS_GD_ANY_P (old_tls_type)
1753 || (tls_type & GOT_TLS_IE) == 0))
1754 {
1755 if ((old_tls_type & GOT_TLS_IE) && GOT_TLS_GD_ANY_P (tls_type))
1756 tls_type = old_tls_type;
1757 else if (GOT_TLS_GD_ANY_P (old_tls_type)
1758 && GOT_TLS_GD_ANY_P (tls_type))
1759 tls_type |= old_tls_type;
1760 else
1761 {
1762 if (h)
1763 name = h->root.root.string;
1764 else
1765 name = bfd_elf_sym_name (abfd, symtab_hdr, isym,
1766 NULL);
1767 (*_bfd_error_handler)
1768 (_("%B: `%s' accessed both as normal and "
1769 "thread local symbol"),
1770 abfd, name);
1771 bfd_set_error (bfd_error_bad_value);
1772 goto error_return;
1773 }
1774 }
1775
1776 if (old_tls_type != tls_type)
1777 {
1778 if (h != NULL)
1779 elf_i386_hash_entry (h)->tls_type = tls_type;
1780 else
1781 elf_i386_local_got_tls_type (abfd) [r_symndx] = tls_type;
1782 }
1783 }
1784 /* Fall through */
1785
1786 case R_386_GOTOFF:
1787 case R_386_GOTPC:
1788 create_got:
1789 if (htab->elf.sgot == NULL)
1790 {
1791 if (htab->elf.dynobj == NULL)
1792 htab->elf.dynobj = abfd;
1793 if (!_bfd_elf_create_got_section (htab->elf.dynobj, info))
1794 goto error_return;
1795 }
1796 if (r_type != R_386_TLS_IE)
1797 {
1798 if (eh != NULL)
1799 eh->has_got_reloc = 1;
1800 break;
1801 }
1802 /* Fall through */
1803
1804 case R_386_TLS_LE_32:
1805 case R_386_TLS_LE:
1806 if (eh != NULL)
1807 eh->has_got_reloc = 1;
1808 if (bfd_link_executable (info))
1809 break;
1810 info->flags |= DF_STATIC_TLS;
1811 goto do_relocation;
1812
1813 case R_386_32:
1814 case R_386_PC32:
1815 if (eh != NULL && (sec->flags & SEC_CODE) != 0)
1816 eh->has_non_got_reloc = 1;
1817 do_relocation:
1818 /* STT_GNU_IFUNC symbol must go through PLT even if it is
1819 locally defined and undefined symbol may turn out to be
1820 a STT_GNU_IFUNC symbol later. */
1821 if (h != NULL
1822 && (bfd_link_executable (info)
1823 || ((h->type == STT_GNU_IFUNC
1824 || h->root.type == bfd_link_hash_undefweak
1825 || h->root.type == bfd_link_hash_undefined)
1826 && SYMBOLIC_BIND (info, h))))
1827 {
1828 /* If this reloc is in a read-only section, we might
1829 need a copy reloc. We can't check reliably at this
1830 stage whether the section is read-only, as input
1831 sections have not yet been mapped to output sections.
1832 Tentatively set the flag for now, and correct in
1833 adjust_dynamic_symbol. */
1834 h->non_got_ref = 1;
1835
1836 /* We may need a .plt entry if the function this reloc
1837 refers to is in a shared lib. */
1838 h->plt.refcount += 1;
1839 if (r_type == R_386_PC32)
1840 {
1841 /* Since something like ".long foo - ." may be used
1842 as pointer, make sure that PLT is used if foo is
1843 a function defined in a shared library. */
1844 if ((sec->flags & SEC_CODE) == 0)
1845 h->pointer_equality_needed = 1;
1846 }
1847 else
1848 {
1849 h->pointer_equality_needed = 1;
1850 /* R_386_32 can be resolved at run-time. */
1851 if (r_type == R_386_32
1852 && (sec->flags & SEC_READONLY) == 0)
1853 eh->func_pointer_refcount += 1;
1854 }
1855 }
1856
1857 size_reloc = FALSE;
1858 do_size:
1859 /* If we are creating a shared library, and this is a reloc
1860 against a global symbol, or a non PC relative reloc
1861 against a local symbol, then we need to copy the reloc
1862 into the shared library. However, if we are linking with
1863 -Bsymbolic, we do not need to copy a reloc against a
1864 global symbol which is defined in an object we are
1865 including in the link (i.e., DEF_REGULAR is set). At
1866 this point we have not seen all the input files, so it is
1867 possible that DEF_REGULAR is not set now but will be set
1868 later (it is never cleared). In case of a weak definition,
1869 DEF_REGULAR may be cleared later by a strong definition in
1870 a shared library. We account for that possibility below by
1871 storing information in the relocs_copied field of the hash
1872 table entry. A similar situation occurs when creating
1873 shared libraries and symbol visibility changes render the
1874 symbol local.
1875
1876 If on the other hand, we are creating an executable, we
1877 may need to keep relocations for symbols satisfied by a
1878 dynamic library if we manage to avoid copy relocs for the
1879 symbol. */
1880 if ((bfd_link_pic (info)
1881 && (sec->flags & SEC_ALLOC) != 0
1882 && (r_type != R_386_PC32
1883 || (h != NULL
1884 && (! (bfd_link_pie (info)
1885 || SYMBOLIC_BIND (info, h))
1886 || h->root.type == bfd_link_hash_defweak
1887 || !h->def_regular))))
1888 || (ELIMINATE_COPY_RELOCS
1889 && !bfd_link_pic (info)
1890 && (sec->flags & SEC_ALLOC) != 0
1891 && h != NULL
1892 && (h->root.type == bfd_link_hash_defweak
1893 || !h->def_regular)))
1894 {
1895 struct elf_dyn_relocs *p;
1896 struct elf_dyn_relocs **head;
1897
1898 /* We must copy these reloc types into the output file.
1899 Create a reloc section in dynobj and make room for
1900 this reloc. */
1901 if (sreloc == NULL)
1902 {
1903 if (htab->elf.dynobj == NULL)
1904 htab->elf.dynobj = abfd;
1905
1906 sreloc = _bfd_elf_make_dynamic_reloc_section
1907 (sec, htab->elf.dynobj, 2, abfd, /*rela?*/ FALSE);
1908
1909 if (sreloc == NULL)
1910 goto error_return;
1911 }
1912
1913 /* If this is a global symbol, we count the number of
1914 relocations we need for this symbol. */
1915 if (h != NULL)
1916 {
1917 head = &eh->dyn_relocs;
1918 }
1919 else
1920 {
1921 /* Track dynamic relocs needed for local syms too.
1922 We really need local syms available to do this
1923 easily. Oh well. */
1924 void **vpp;
1925 asection *s;
1926
1927 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1928 abfd, r_symndx);
1929 if (isym == NULL)
1930 goto error_return;
1931
1932 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
1933 if (s == NULL)
1934 s = sec;
1935
1936 vpp = &elf_section_data (s)->local_dynrel;
1937 head = (struct elf_dyn_relocs **)vpp;
1938 }
1939
1940 p = *head;
1941 if (p == NULL || p->sec != sec)
1942 {
1943 bfd_size_type amt = sizeof *p;
1944 p = (struct elf_dyn_relocs *) bfd_alloc (htab->elf.dynobj,
1945 amt);
1946 if (p == NULL)
1947 goto error_return;
1948 p->next = *head;
1949 *head = p;
1950 p->sec = sec;
1951 p->count = 0;
1952 p->pc_count = 0;
1953 }
1954
1955 p->count += 1;
1956 /* Count size relocation as PC-relative relocation. */
1957 if (r_type == R_386_PC32 || size_reloc)
1958 p->pc_count += 1;
1959 }
1960 break;
1961
1962 /* This relocation describes the C++ object vtable hierarchy.
1963 Reconstruct it for later use during GC. */
1964 case R_386_GNU_VTINHERIT:
1965 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1966 goto error_return;
1967 break;
1968
1969 /* This relocation describes which C++ vtable entries are actually
1970 used. Record for later use during GC. */
1971 case R_386_GNU_VTENTRY:
1972 BFD_ASSERT (h != NULL);
1973 if (h != NULL
1974 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
1975 goto error_return;
1976 break;
1977
1978 default:
1979 break;
1980 }
1981
1982 if (use_plt_got
1983 && h != NULL
1984 && h->plt.refcount > 0
1985 && (((info->flags & DF_BIND_NOW) && !h->pointer_equality_needed)
1986 || h->got.refcount > 0)
1987 && htab->plt_got == NULL)
1988 {
1989 /* Create the GOT procedure linkage table. */
1990 unsigned int plt_got_align;
1991 const struct elf_backend_data *bed;
1992
1993 bed = get_elf_backend_data (info->output_bfd);
1994 BFD_ASSERT (sizeof (elf_i386_got_plt_entry) == 8
1995 && (sizeof (elf_i386_got_plt_entry)
1996 == sizeof (elf_i386_pic_got_plt_entry)));
1997 plt_got_align = 3;
1998
1999 if (htab->elf.dynobj == NULL)
2000 htab->elf.dynobj = abfd;
2001 htab->plt_got
2002 = bfd_make_section_anyway_with_flags (htab->elf.dynobj,
2003 ".plt.got",
2004 (bed->dynamic_sec_flags
2005 | SEC_ALLOC
2006 | SEC_CODE
2007 | SEC_LOAD
2008 | SEC_READONLY));
2009 if (htab->plt_got == NULL
2010 || !bfd_set_section_alignment (htab->elf.dynobj,
2011 htab->plt_got,
2012 plt_got_align))
2013 goto error_return;
2014 }
2015
2016 if ((r_type == R_386_GOT32 || r_type == R_386_GOT32X)
2017 && (h == NULL || h->type != STT_GNU_IFUNC))
2018 sec->need_convert_load = 1;
2019 }
2020
2021 return TRUE;
2022
2023 error_return:
2024 sec->check_relocs_failed = 1;
2025 return FALSE;
2026 }
2027
2028 /* Return the section that should be marked against GC for a given
2029 relocation. */
2030
2031 static asection *
2032 elf_i386_gc_mark_hook (asection *sec,
2033 struct bfd_link_info *info,
2034 Elf_Internal_Rela *rel,
2035 struct elf_link_hash_entry *h,
2036 Elf_Internal_Sym *sym)
2037 {
2038 if (h != NULL)
2039 switch (ELF32_R_TYPE (rel->r_info))
2040 {
2041 case R_386_GNU_VTINHERIT:
2042 case R_386_GNU_VTENTRY:
2043 return NULL;
2044 }
2045
2046 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
2047 }
2048
2049 /* Remove undefined weak symbol from the dynamic symbol table if it
2050 is resolved to 0. */
2051
2052 static bfd_boolean
2053 elf_i386_fixup_symbol (struct bfd_link_info *info,
2054 struct elf_link_hash_entry *h)
2055 {
2056 if (h->dynindx != -1
2057 && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info,
2058 elf_i386_hash_entry (h)))
2059 {
2060 h->dynindx = -1;
2061 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
2062 h->dynstr_index);
2063 }
2064 return TRUE;
2065 }
2066
2067 /* Adjust a symbol defined by a dynamic object and referenced by a
2068 regular object. The current definition is in some section of the
2069 dynamic object, but we're not including those sections. We have to
2070 change the definition to something the rest of the link can
2071 understand. */
2072
2073 static bfd_boolean
2074 elf_i386_adjust_dynamic_symbol (struct bfd_link_info *info,
2075 struct elf_link_hash_entry *h)
2076 {
2077 struct elf_i386_link_hash_table *htab;
2078 asection *s;
2079 struct elf_i386_link_hash_entry *eh;
2080 struct elf_dyn_relocs *p;
2081
2082 /* STT_GNU_IFUNC symbol must go through PLT. */
2083 if (h->type == STT_GNU_IFUNC)
2084 {
2085 /* All local STT_GNU_IFUNC references must be treate as local
2086 calls via local PLT. */
2087 if (h->ref_regular
2088 && SYMBOL_CALLS_LOCAL (info, h))
2089 {
2090 bfd_size_type pc_count = 0, count = 0;
2091 struct elf_dyn_relocs **pp;
2092
2093 eh = (struct elf_i386_link_hash_entry *) h;
2094 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2095 {
2096 pc_count += p->pc_count;
2097 p->count -= p->pc_count;
2098 p->pc_count = 0;
2099 count += p->count;
2100 if (p->count == 0)
2101 *pp = p->next;
2102 else
2103 pp = &p->next;
2104 }
2105
2106 if (pc_count || count)
2107 {
2108 h->needs_plt = 1;
2109 h->non_got_ref = 1;
2110 if (h->plt.refcount <= 0)
2111 h->plt.refcount = 1;
2112 else
2113 h->plt.refcount += 1;
2114 }
2115 }
2116
2117 if (h->plt.refcount <= 0)
2118 {
2119 h->plt.offset = (bfd_vma) -1;
2120 h->needs_plt = 0;
2121 }
2122 return TRUE;
2123 }
2124
2125 /* If this is a function, put it in the procedure linkage table. We
2126 will fill in the contents of the procedure linkage table later,
2127 when we know the address of the .got section. */
2128 if (h->type == STT_FUNC
2129 || h->needs_plt)
2130 {
2131 if (h->plt.refcount <= 0
2132 || SYMBOL_CALLS_LOCAL (info, h)
2133 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2134 && h->root.type == bfd_link_hash_undefweak))
2135 {
2136 /* This case can occur if we saw a PLT32 reloc in an input
2137 file, but the symbol was never referred to by a dynamic
2138 object, or if all references were garbage collected. In
2139 such a case, we don't actually need to build a procedure
2140 linkage table, and we can just do a PC32 reloc instead. */
2141 h->plt.offset = (bfd_vma) -1;
2142 h->needs_plt = 0;
2143 }
2144
2145 return TRUE;
2146 }
2147 else
2148 /* It's possible that we incorrectly decided a .plt reloc was
2149 needed for an R_386_PC32 reloc to a non-function sym in
2150 check_relocs. We can't decide accurately between function and
2151 non-function syms in check-relocs; Objects loaded later in
2152 the link may change h->type. So fix it now. */
2153 h->plt.offset = (bfd_vma) -1;
2154
2155 /* If this is a weak symbol, and there is a real definition, the
2156 processor independent code will have arranged for us to see the
2157 real definition first, and we can just use the same value. */
2158 if (h->u.weakdef != NULL)
2159 {
2160 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
2161 || h->u.weakdef->root.type == bfd_link_hash_defweak);
2162 h->root.u.def.section = h->u.weakdef->root.u.def.section;
2163 h->root.u.def.value = h->u.weakdef->root.u.def.value;
2164 if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
2165 h->non_got_ref = h->u.weakdef->non_got_ref;
2166 return TRUE;
2167 }
2168
2169 /* This is a reference to a symbol defined by a dynamic object which
2170 is not a function. */
2171
2172 /* If we are creating a shared library, we must presume that the
2173 only references to the symbol are via the global offset table.
2174 For such cases we need not do anything here; the relocations will
2175 be handled correctly by relocate_section. */
2176 if (!bfd_link_executable (info))
2177 return TRUE;
2178
2179 /* If there are no references to this symbol that do not use the
2180 GOT nor R_386_GOTOFF relocation, we don't need to generate a copy
2181 reloc. */
2182 eh = (struct elf_i386_link_hash_entry *) h;
2183 if (!h->non_got_ref && !eh->gotoff_ref)
2184 return TRUE;
2185
2186 /* If -z nocopyreloc was given, we won't generate them either. */
2187 if (info->nocopyreloc)
2188 {
2189 h->non_got_ref = 0;
2190 return TRUE;
2191 }
2192
2193 htab = elf_i386_hash_table (info);
2194 if (htab == NULL)
2195 return FALSE;
2196
2197 /* If there aren't any dynamic relocs in read-only sections nor
2198 R_386_GOTOFF relocation, then we can keep the dynamic relocs and
2199 avoid the copy reloc. This doesn't work on VxWorks, where we can
2200 not have dynamic relocations (other than copy and jump slot
2201 relocations) in an executable. */
2202 if (ELIMINATE_COPY_RELOCS
2203 && !eh->gotoff_ref
2204 && !get_elf_i386_backend_data (info->output_bfd)->is_vxworks)
2205 {
2206 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2207 {
2208 s = p->sec->output_section;
2209 if (s != NULL && (s->flags & SEC_READONLY) != 0)
2210 break;
2211 }
2212
2213 if (p == NULL)
2214 {
2215 h->non_got_ref = 0;
2216 return TRUE;
2217 }
2218 }
2219
2220 /* We must allocate the symbol in our .dynbss section, which will
2221 become part of the .bss section of the executable. There will be
2222 an entry for this symbol in the .dynsym section. The dynamic
2223 object will contain position independent code, so all references
2224 from the dynamic object to this symbol will go through the global
2225 offset table. The dynamic linker will use the .dynsym entry to
2226 determine the address it must put in the global offset table, so
2227 both the dynamic object and the regular object will refer to the
2228 same memory location for the variable. */
2229
2230 /* We must generate a R_386_COPY reloc to tell the dynamic linker to
2231 copy the initial value out of the dynamic object and into the
2232 runtime process image. */
2233 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
2234 {
2235 htab->srelbss->size += sizeof (Elf32_External_Rel);
2236 h->needs_copy = 1;
2237 }
2238
2239 s = htab->sdynbss;
2240
2241 return _bfd_elf_adjust_dynamic_copy (info, h, s);
2242 }
2243
2244 /* Allocate space in .plt, .got and associated reloc sections for
2245 dynamic relocs. */
2246
2247 static bfd_boolean
2248 elf_i386_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
2249 {
2250 struct bfd_link_info *info;
2251 struct elf_i386_link_hash_table *htab;
2252 struct elf_i386_link_hash_entry *eh;
2253 struct elf_dyn_relocs *p;
2254 unsigned plt_entry_size;
2255 bfd_boolean resolved_to_zero;
2256
2257 if (h->root.type == bfd_link_hash_indirect)
2258 return TRUE;
2259
2260 eh = (struct elf_i386_link_hash_entry *) h;
2261
2262 info = (struct bfd_link_info *) inf;
2263 htab = elf_i386_hash_table (info);
2264 if (htab == NULL)
2265 return FALSE;
2266
2267 plt_entry_size = GET_PLT_ENTRY_SIZE (info->output_bfd);
2268
2269 resolved_to_zero = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
2270
2271 /* Clear the reference count of function pointer relocations if
2272 symbol isn't a normal function. */
2273 if (h->type != STT_FUNC)
2274 eh->func_pointer_refcount = 0;
2275
2276 /* We can't use the GOT PLT if pointer equality is needed since
2277 finish_dynamic_symbol won't clear symbol value and the dynamic
2278 linker won't update the GOT slot. We will get into an infinite
2279 loop at run-time. */
2280 if (htab->plt_got != NULL
2281 && h->type != STT_GNU_IFUNC
2282 && !h->pointer_equality_needed
2283 && h->plt.refcount > 0
2284 && h->got.refcount > 0)
2285 {
2286 /* Don't use the regular PLT if there are both GOT and GOTPLT
2287 reloctions. */
2288 h->plt.offset = (bfd_vma) -1;
2289
2290 /* Use the GOT PLT. */
2291 eh->plt_got.refcount = 1;
2292 }
2293
2294 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it
2295 here if it is defined and referenced in a non-shared object. */
2296 if (h->type == STT_GNU_IFUNC
2297 && h->def_regular)
2298 return _bfd_elf_allocate_ifunc_dyn_relocs (info, h, &eh->dyn_relocs,
2299 &htab->readonly_dynrelocs_against_ifunc,
2300 plt_entry_size,
2301 plt_entry_size, 4);
2302 /* Don't create the PLT entry if there are only function pointer
2303 relocations which can be resolved at run-time. */
2304 else if (htab->elf.dynamic_sections_created
2305 && (h->plt.refcount > eh->func_pointer_refcount
2306 || eh->plt_got.refcount > 0))
2307 {
2308 bfd_boolean use_plt_got;
2309
2310 /* Clear the reference count of function pointer relocations
2311 if PLT is used. */
2312 eh->func_pointer_refcount = 0;
2313
2314 if ((info->flags & DF_BIND_NOW) && !h->pointer_equality_needed)
2315 {
2316 /* Don't use the regular PLT for DF_BIND_NOW. */
2317 h->plt.offset = (bfd_vma) -1;
2318
2319 /* Use the GOT PLT. */
2320 h->got.refcount = 1;
2321 eh->plt_got.refcount = 1;
2322 }
2323
2324 use_plt_got = eh->plt_got.refcount > 0;
2325
2326 /* Make sure this symbol is output as a dynamic symbol.
2327 Undefined weak syms won't yet be marked as dynamic. */
2328 if (h->dynindx == -1
2329 && !h->forced_local
2330 && !resolved_to_zero)
2331 {
2332 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2333 return FALSE;
2334 }
2335
2336 if (bfd_link_pic (info)
2337 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
2338 {
2339 asection *s = htab->elf.splt;
2340 asection *got_s = htab->plt_got;
2341
2342 /* If this is the first .plt entry, make room for the special
2343 first entry. The .plt section is used by prelink to undo
2344 prelinking for dynamic relocations. */
2345 if (s->size == 0)
2346 s->size = plt_entry_size;
2347
2348 if (use_plt_got)
2349 eh->plt_got.offset = got_s->size;
2350 else
2351 h->plt.offset = s->size;
2352
2353 /* If this symbol is not defined in a regular file, and we are
2354 not generating a shared library, then set the symbol to this
2355 location in the .plt. This is required to make function
2356 pointers compare as equal between the normal executable and
2357 the shared library. */
2358 if (! bfd_link_pic (info)
2359 && !h->def_regular)
2360 {
2361 if (use_plt_got)
2362 {
2363 /* We need to make a call to the entry of the GOT PLT
2364 instead of regular PLT entry. */
2365 h->root.u.def.section = got_s;
2366 h->root.u.def.value = eh->plt_got.offset;
2367 }
2368 else
2369 {
2370 h->root.u.def.section = s;
2371 h->root.u.def.value = h->plt.offset;
2372 }
2373 }
2374
2375 /* Make room for this entry. */
2376 if (use_plt_got)
2377 got_s->size += sizeof (elf_i386_got_plt_entry);
2378 else
2379 {
2380 s->size += plt_entry_size;
2381
2382 /* We also need to make an entry in the .got.plt section,
2383 which will be placed in the .got section by the linker
2384 script. */
2385 htab->elf.sgotplt->size += 4;
2386
2387 /* There should be no PLT relocation against resolved
2388 undefined weak symbol in executable. */
2389 if (!resolved_to_zero)
2390 {
2391 /* We also need to make an entry in the .rel.plt
2392 section. */
2393 htab->elf.srelplt->size += sizeof (Elf32_External_Rel);
2394 htab->elf.srelplt->reloc_count++;
2395 }
2396 }
2397
2398 if (get_elf_i386_backend_data (info->output_bfd)->is_vxworks
2399 && !bfd_link_pic (info))
2400 {
2401 /* VxWorks has a second set of relocations for each PLT entry
2402 in executables. They go in a separate relocation section,
2403 which is processed by the kernel loader. */
2404
2405 /* There are two relocations for the initial PLT entry: an
2406 R_386_32 relocation for _GLOBAL_OFFSET_TABLE_ + 4 and an
2407 R_386_32 relocation for _GLOBAL_OFFSET_TABLE_ + 8. */
2408
2409 if (h->plt.offset == plt_entry_size)
2410 htab->srelplt2->size += (sizeof (Elf32_External_Rel) * 2);
2411
2412 /* There are two extra relocations for each subsequent PLT entry:
2413 an R_386_32 relocation for the GOT entry, and an R_386_32
2414 relocation for the PLT entry. */
2415
2416 htab->srelplt2->size += (sizeof (Elf32_External_Rel) * 2);
2417 }
2418 }
2419 else
2420 {
2421 eh->plt_got.offset = (bfd_vma) -1;
2422 h->plt.offset = (bfd_vma) -1;
2423 h->needs_plt = 0;
2424 }
2425 }
2426 else
2427 {
2428 eh->plt_got.offset = (bfd_vma) -1;
2429 h->plt.offset = (bfd_vma) -1;
2430 h->needs_plt = 0;
2431 }
2432
2433 eh->tlsdesc_got = (bfd_vma) -1;
2434
2435 /* If R_386_TLS_{IE_32,IE,GOTIE} symbol is now local to the binary,
2436 make it a R_386_TLS_LE_32 requiring no TLS entry. */
2437 if (h->got.refcount > 0
2438 && bfd_link_executable (info)
2439 && h->dynindx == -1
2440 && (elf_i386_hash_entry(h)->tls_type & GOT_TLS_IE))
2441 h->got.offset = (bfd_vma) -1;
2442 else if (h->got.refcount > 0)
2443 {
2444 asection *s;
2445 bfd_boolean dyn;
2446 int tls_type = elf_i386_hash_entry(h)->tls_type;
2447
2448 /* Make sure this symbol is output as a dynamic symbol.
2449 Undefined weak syms won't yet be marked as dynamic. */
2450 if (h->dynindx == -1
2451 && !h->forced_local
2452 && !resolved_to_zero)
2453 {
2454 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2455 return FALSE;
2456 }
2457
2458 s = htab->elf.sgot;
2459 if (GOT_TLS_GDESC_P (tls_type))
2460 {
2461 eh->tlsdesc_got = htab->elf.sgotplt->size
2462 - elf_i386_compute_jump_table_size (htab);
2463 htab->elf.sgotplt->size += 8;
2464 h->got.offset = (bfd_vma) -2;
2465 }
2466 if (! GOT_TLS_GDESC_P (tls_type)
2467 || GOT_TLS_GD_P (tls_type))
2468 {
2469 h->got.offset = s->size;
2470 s->size += 4;
2471 /* R_386_TLS_GD needs 2 consecutive GOT slots. */
2472 if (GOT_TLS_GD_P (tls_type) || tls_type == GOT_TLS_IE_BOTH)
2473 s->size += 4;
2474 }
2475 dyn = htab->elf.dynamic_sections_created;
2476 /* R_386_TLS_IE_32 needs one dynamic relocation,
2477 R_386_TLS_IE resp. R_386_TLS_GOTIE needs one dynamic relocation,
2478 (but if both R_386_TLS_IE_32 and R_386_TLS_IE is present, we
2479 need two), R_386_TLS_GD needs one if local symbol and two if
2480 global. No dynamic relocation against resolved undefined weak
2481 symbol in executable. */
2482 if (tls_type == GOT_TLS_IE_BOTH)
2483 htab->elf.srelgot->size += 2 * sizeof (Elf32_External_Rel);
2484 else if ((GOT_TLS_GD_P (tls_type) && h->dynindx == -1)
2485 || (tls_type & GOT_TLS_IE))
2486 htab->elf.srelgot->size += sizeof (Elf32_External_Rel);
2487 else if (GOT_TLS_GD_P (tls_type))
2488 htab->elf.srelgot->size += 2 * sizeof (Elf32_External_Rel);
2489 else if (! GOT_TLS_GDESC_P (tls_type)
2490 && ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2491 && !resolved_to_zero)
2492 || h->root.type != bfd_link_hash_undefweak)
2493 && (bfd_link_pic (info)
2494 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
2495 htab->elf.srelgot->size += sizeof (Elf32_External_Rel);
2496 if (GOT_TLS_GDESC_P (tls_type))
2497 htab->elf.srelplt->size += sizeof (Elf32_External_Rel);
2498 }
2499 else
2500 h->got.offset = (bfd_vma) -1;
2501
2502 if (eh->dyn_relocs == NULL)
2503 return TRUE;
2504
2505 /* In the shared -Bsymbolic case, discard space allocated for
2506 dynamic pc-relative relocs against symbols which turn out to be
2507 defined in regular objects. For the normal shared case, discard
2508 space for pc-relative relocs that have become local due to symbol
2509 visibility changes. */
2510
2511 if (bfd_link_pic (info))
2512 {
2513 /* The only reloc that uses pc_count is R_386_PC32, which will
2514 appear on a call or on something like ".long foo - .". We
2515 want calls to protected symbols to resolve directly to the
2516 function rather than going via the plt. If people want
2517 function pointer comparisons to work as expected then they
2518 should avoid writing assembly like ".long foo - .". */
2519 if (SYMBOL_CALLS_LOCAL (info, h))
2520 {
2521 struct elf_dyn_relocs **pp;
2522
2523 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2524 {
2525 p->count -= p->pc_count;
2526 p->pc_count = 0;
2527 if (p->count == 0)
2528 *pp = p->next;
2529 else
2530 pp = &p->next;
2531 }
2532 }
2533
2534 if (get_elf_i386_backend_data (info->output_bfd)->is_vxworks)
2535 {
2536 struct elf_dyn_relocs **pp;
2537 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2538 {
2539 if (strcmp (p->sec->output_section->name, ".tls_vars") == 0)
2540 *pp = p->next;
2541 else
2542 pp = &p->next;
2543 }
2544 }
2545
2546 /* Also discard relocs on undefined weak syms with non-default
2547 visibility or in PIE. */
2548 if (eh->dyn_relocs != NULL
2549 && h->root.type == bfd_link_hash_undefweak)
2550 {
2551 /* Undefined weak symbol is never bound locally in shared
2552 library. */
2553 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2554 || resolved_to_zero)
2555 {
2556 if (h->non_got_ref)
2557 {
2558 /* Keep dynamic non-GOT/non-PLT relocation so that we
2559 can branch to 0 without PLT. */
2560 struct elf_dyn_relocs **pp;
2561
2562 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2563 if (p->pc_count == 0)
2564 *pp = p->next;
2565 else
2566 {
2567 /* Remove non-R_386_PC32 relocation. */
2568 p->count = p->pc_count;
2569 pp = &p->next;
2570 }
2571
2572 if (eh->dyn_relocs != NULL)
2573 {
2574 /* Make sure undefined weak symbols are output
2575 as dynamic symbols in PIEs for dynamic non-GOT
2576 non-PLT reloations. */
2577 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2578 return FALSE;
2579 }
2580 }
2581 else
2582 eh->dyn_relocs = NULL;
2583 }
2584 else if (h->dynindx == -1
2585 && !h->forced_local)
2586 {
2587 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2588 return FALSE;
2589 }
2590 }
2591 }
2592 else if (ELIMINATE_COPY_RELOCS)
2593 {
2594 /* For the non-shared case, discard space for relocs against
2595 symbols which turn out to need copy relocs or are not
2596 dynamic. Keep dynamic relocations for run-time function
2597 pointer initialization. */
2598
2599 if ((!h->non_got_ref
2600 || eh->func_pointer_refcount > 0
2601 || (h->root.type == bfd_link_hash_undefweak
2602 && !resolved_to_zero))
2603 && ((h->def_dynamic
2604 && !h->def_regular)
2605 || (htab->elf.dynamic_sections_created
2606 && (h->root.type == bfd_link_hash_undefweak
2607 || h->root.type == bfd_link_hash_undefined))))
2608 {
2609 /* Make sure this symbol is output as a dynamic symbol.
2610 Undefined weak syms won't yet be marked as dynamic. */
2611 if (h->dynindx == -1
2612 && !h->forced_local
2613 && !resolved_to_zero)
2614 {
2615 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2616 return FALSE;
2617 }
2618
2619 /* If that succeeded, we know we'll be keeping all the
2620 relocs. */
2621 if (h->dynindx != -1)
2622 goto keep;
2623 }
2624
2625 eh->dyn_relocs = NULL;
2626 eh->func_pointer_refcount = 0;
2627
2628 keep: ;
2629 }
2630
2631 /* Finally, allocate space. */
2632 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2633 {
2634 asection *sreloc;
2635
2636 sreloc = elf_section_data (p->sec)->sreloc;
2637
2638 BFD_ASSERT (sreloc != NULL);
2639 sreloc->size += p->count * sizeof (Elf32_External_Rel);
2640 }
2641
2642 return TRUE;
2643 }
2644
2645 /* Allocate space in .plt, .got and associated reloc sections for
2646 local dynamic relocs. */
2647
2648 static bfd_boolean
2649 elf_i386_allocate_local_dynrelocs (void **slot, void *inf)
2650 {
2651 struct elf_link_hash_entry *h
2652 = (struct elf_link_hash_entry *) *slot;
2653
2654 if (h->type != STT_GNU_IFUNC
2655 || !h->def_regular
2656 || !h->ref_regular
2657 || !h->forced_local
2658 || h->root.type != bfd_link_hash_defined)
2659 abort ();
2660
2661 return elf_i386_allocate_dynrelocs (h, inf);
2662 }
2663
2664 /* Find any dynamic relocs that apply to read-only sections. */
2665
2666 static bfd_boolean
2667 elf_i386_readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
2668 {
2669 struct elf_i386_link_hash_entry *eh;
2670 struct elf_dyn_relocs *p;
2671
2672 /* Skip local IFUNC symbols. */
2673 if (h->forced_local && h->type == STT_GNU_IFUNC)
2674 return TRUE;
2675
2676 eh = (struct elf_i386_link_hash_entry *) h;
2677 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2678 {
2679 asection *s = p->sec->output_section;
2680
2681 if (s != NULL && (s->flags & SEC_READONLY) != 0)
2682 {
2683 struct bfd_link_info *info = (struct bfd_link_info *) inf;
2684
2685 info->flags |= DF_TEXTREL;
2686
2687 if ((info->warn_shared_textrel && bfd_link_pic (info))
2688 || info->error_textrel)
2689 info->callbacks->einfo (_("%P: %B: warning: relocation against `%s' in readonly section `%A'\n"),
2690 p->sec->owner, h->root.root.string,
2691 p->sec);
2692
2693 /* Not an error, just cut short the traversal. */
2694 return FALSE;
2695 }
2696 }
2697 return TRUE;
2698 }
2699
2700 /* With the local symbol, foo, we convert
2701 mov foo@GOT[(%reg1)], %reg2
2702 to
2703 lea foo[@GOTOFF(%reg1)], %reg2
2704 and convert
2705 call/jmp *foo@GOT[(%reg)]
2706 to
2707 nop call foo/jmp foo nop
2708 When PIC is false, convert
2709 test %reg1, foo@GOT[(%reg2)]
2710 to
2711 test $foo, %reg1
2712 and convert
2713 binop foo@GOT[(%reg1)], %reg2
2714 to
2715 binop $foo, %reg2
2716 where binop is one of adc, add, and, cmp, or, sbb, sub, xor
2717 instructions. */
2718
2719 static bfd_boolean
2720 elf_i386_convert_load (bfd *abfd, asection *sec,
2721 struct bfd_link_info *link_info)
2722 {
2723 Elf_Internal_Shdr *symtab_hdr;
2724 Elf_Internal_Rela *internal_relocs;
2725 Elf_Internal_Rela *irel, *irelend;
2726 bfd_byte *contents;
2727 struct elf_i386_link_hash_table *htab;
2728 bfd_boolean changed_contents;
2729 bfd_boolean changed_relocs;
2730 bfd_boolean is_pic;
2731 bfd_signed_vma *local_got_refcounts;
2732
2733 /* Don't even try to convert non-ELF outputs. */
2734 if (!is_elf_hash_table (link_info->hash))
2735 return FALSE;
2736
2737 /* Nothing to do if there is no need or no output. */
2738 if ((sec->flags & (SEC_CODE | SEC_RELOC)) != (SEC_CODE | SEC_RELOC)
2739 || sec->need_convert_load == 0
2740 || bfd_is_abs_section (sec->output_section))
2741 return TRUE;
2742
2743 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2744
2745 /* Load the relocations for this section. */
2746 internal_relocs = (_bfd_elf_link_read_relocs
2747 (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
2748 link_info->keep_memory));
2749 if (internal_relocs == NULL)
2750 return FALSE;
2751
2752 htab = elf_i386_hash_table (link_info);
2753 changed_contents = FALSE;
2754 changed_relocs = FALSE;
2755 local_got_refcounts = elf_local_got_refcounts (abfd);
2756
2757 is_pic = bfd_link_pic (link_info);
2758
2759 /* Get the section contents. */
2760 if (elf_section_data (sec)->this_hdr.contents != NULL)
2761 contents = elf_section_data (sec)->this_hdr.contents;
2762 else
2763 {
2764 if (!bfd_malloc_and_get_section (abfd, sec, &contents))
2765 goto error_return;
2766 }
2767
2768 irelend = internal_relocs + sec->reloc_count;
2769 for (irel = internal_relocs; irel < irelend; irel++)
2770 {
2771 unsigned int r_type = ELF32_R_TYPE (irel->r_info);
2772 unsigned int r_symndx = ELF32_R_SYM (irel->r_info);
2773 unsigned int indx;
2774 struct elf_link_hash_entry *h;
2775 unsigned int opcode;
2776 unsigned int modrm;
2777 bfd_vma roff;
2778 bfd_boolean baseless;
2779 Elf_Internal_Sym *isym;
2780 unsigned int addend;
2781 unsigned int nop;
2782 bfd_vma nop_offset;
2783 bfd_boolean to_reloc_32;
2784
2785 if (r_type != R_386_GOT32 && r_type != R_386_GOT32X)
2786 continue;
2787
2788 roff = irel->r_offset;
2789 if (roff < 2)
2790 continue;
2791
2792 /* Addend for R_386_GOT32 and R_386_GOT32X relocations must be 0. */
2793 addend = bfd_get_32 (abfd, contents + roff);
2794 if (addend != 0)
2795 continue;
2796
2797 modrm = bfd_get_8 (abfd, contents + roff - 1);
2798 baseless = (modrm & 0xc7) == 0x5;
2799
2800 if (r_type == R_386_GOT32X && baseless && is_pic)
2801 {
2802 /* For PIC, disallow R_386_GOT32X without a base register
2803 since we don't know what the GOT base is. Allow
2804 R_386_GOT32 for existing object files. */
2805 const char *name;
2806
2807 if (r_symndx < symtab_hdr->sh_info)
2808 {
2809 isym = bfd_sym_from_r_symndx (&htab->sym_cache, abfd,
2810 r_symndx);
2811 name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
2812 }
2813 else
2814 {
2815 indx = r_symndx - symtab_hdr->sh_info;
2816 h = elf_sym_hashes (abfd)[indx];
2817 BFD_ASSERT (h != NULL);
2818 name = h->root.root.string;
2819 }
2820
2821 (*_bfd_error_handler)
2822 (_("%B: direct GOT relocation R_386_GOT32X against `%s' without base register can not be used when making a shared object"),
2823 abfd, name);
2824 goto error_return;
2825 }
2826
2827 opcode = bfd_get_8 (abfd, contents + roff - 2);
2828
2829 /* Convert mov to lea since it has been done for a while. */
2830 if (opcode != 0x8b)
2831 {
2832 /* Only convert R_386_GOT32X relocation for call, jmp or
2833 one of adc, add, and, cmp, or, sbb, sub, test, xor
2834 instructions. */
2835 if (r_type != R_386_GOT32X)
2836 continue;
2837 }
2838
2839 /* Convert to R_386_32 if PIC is false or there is no base
2840 register. */
2841 to_reloc_32 = !is_pic || baseless;
2842
2843 /* Try to convert R_386_GOT32 and R_386_GOT32X. Get the symbol
2844 referred to by the reloc. */
2845 if (r_symndx < symtab_hdr->sh_info)
2846 {
2847 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
2848 abfd, r_symndx);
2849
2850 /* STT_GNU_IFUNC must keep GOT32 relocations. */
2851 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
2852 continue;
2853
2854 h = NULL;
2855 if (opcode == 0x0ff)
2856 /* Convert "call/jmp *foo@GOT[(%reg)]". */
2857 goto convert_branch;
2858 else
2859 /* Convert "mov foo@GOT[(%reg1)], %reg2",
2860 "test %reg1, foo@GOT(%reg2)" and
2861 "binop foo@GOT[(%reg1)], %reg2". */
2862 goto convert_load;
2863 }
2864
2865 indx = r_symndx - symtab_hdr->sh_info;
2866 h = elf_sym_hashes (abfd)[indx];
2867 BFD_ASSERT (h != NULL);
2868
2869 while (h->root.type == bfd_link_hash_indirect
2870 || h->root.type == bfd_link_hash_warning)
2871 h = (struct elf_link_hash_entry *) h->root.u.i.link;
2872
2873 /* STT_GNU_IFUNC must keep GOT32 relocations. */
2874 if (h->type == STT_GNU_IFUNC)
2875 continue;
2876
2877 /* Undefined weak symbol is only bound locally in executable
2878 and its reference is resolved as 0. */
2879 if (UNDEFINED_WEAK_RESOLVED_TO_ZERO (link_info,
2880 elf_i386_hash_entry (h)))
2881 {
2882 if (opcode == 0xff)
2883 {
2884 /* No direct branch to 0 for PIC. */
2885 if (is_pic)
2886 continue;
2887 else
2888 goto convert_branch;
2889 }
2890 else
2891 {
2892 /* We can convert load of address 0 to R_386_32. */
2893 to_reloc_32 = TRUE;
2894 goto convert_load;
2895 }
2896 }
2897
2898 if (opcode == 0xff)
2899 {
2900 /* We have "call/jmp *foo@GOT[(%reg)]". */
2901 if ((h->root.type == bfd_link_hash_defined
2902 || h->root.type == bfd_link_hash_defweak)
2903 && SYMBOL_REFERENCES_LOCAL (link_info, h))
2904 {
2905 /* The function is locally defined. */
2906 convert_branch:
2907 /* Convert R_386_GOT32X to R_386_PC32. */
2908 if (modrm == 0x15 || (modrm & 0xf8) == 0x90)
2909 {
2910 /* Convert to "nop call foo". ADDR_PREFIX_OPCODE
2911 is a nop prefix. */
2912 modrm = 0xe8;
2913 nop = link_info->call_nop_byte;
2914 if (link_info->call_nop_as_suffix)
2915 {
2916 nop_offset = roff + 3;
2917 irel->r_offset -= 1;
2918 }
2919 else
2920 nop_offset = roff - 2;
2921 }
2922 else
2923 {
2924 /* Convert to "jmp foo nop". */
2925 modrm = 0xe9;
2926 nop = NOP_OPCODE;
2927 nop_offset = roff + 3;
2928 irel->r_offset -= 1;
2929 }
2930
2931 bfd_put_8 (abfd, nop, contents + nop_offset);
2932 bfd_put_8 (abfd, modrm, contents + irel->r_offset - 1);
2933 /* When converting to PC-relative relocation, we
2934 need to adjust addend by -4. */
2935 bfd_put_32 (abfd, -4, contents + irel->r_offset);
2936 irel->r_info = ELF32_R_INFO (r_symndx, R_386_PC32);
2937
2938 if (h)
2939 {
2940 if (h->got.refcount > 0)
2941 h->got.refcount -= 1;
2942 }
2943 else
2944 {
2945 if (local_got_refcounts != NULL
2946 && local_got_refcounts[r_symndx] > 0)
2947 local_got_refcounts[r_symndx] -= 1;
2948 }
2949
2950 changed_contents = TRUE;
2951 changed_relocs = TRUE;
2952 }
2953 }
2954 else
2955 {
2956 /* We have "mov foo@GOT[(%re1g)], %reg2",
2957 "test %reg1, foo@GOT(%reg2)" and
2958 "binop foo@GOT[(%reg1)], %reg2".
2959
2960 Avoid optimizing _DYNAMIC since ld.so may use its
2961 link-time address. */
2962 if (h == htab->elf.hdynamic)
2963 continue;
2964
2965 /* def_regular is set by an assignment in a linker script in
2966 bfd_elf_record_link_assignment. */
2967 if ((h->def_regular
2968 || h->root.type == bfd_link_hash_defined
2969 || h->root.type == bfd_link_hash_defweak)
2970 && SYMBOL_REFERENCES_LOCAL (link_info, h))
2971 {
2972 convert_load:
2973 if (opcode == 0x8b)
2974 {
2975 if (to_reloc_32)
2976 {
2977 /* Convert "mov foo@GOT[(%reg1)], %reg2" to
2978 "mov $foo, %reg2" with R_386_32. */
2979 r_type = R_386_32;
2980 modrm = 0xc0 | (modrm & 0x38) >> 3;
2981 bfd_put_8 (abfd, modrm, contents + roff - 1);
2982 opcode = 0xc7;
2983 }
2984 else
2985 {
2986 /* Convert "mov foo@GOT(%reg1), %reg2" to
2987 "lea foo@GOTOFF(%reg1), %reg2". */
2988 r_type = R_386_GOTOFF;
2989 opcode = 0x8d;
2990 }
2991 }
2992 else
2993 {
2994 /* Only R_386_32 is supported. */
2995 if (!to_reloc_32)
2996 continue;
2997
2998 if (opcode == 0x85)
2999 {
3000 /* Convert "test %reg1, foo@GOT(%reg2)" to
3001 "test $foo, %reg1". */
3002 modrm = 0xc0 | (modrm & 0x38) >> 3;
3003 opcode = 0xf7;
3004 }
3005 else
3006 {
3007 /* Convert "binop foo@GOT(%reg1), %reg2" to
3008 "binop $foo, %reg2". */
3009 modrm = (0xc0
3010 | (modrm & 0x38) >> 3
3011 | (opcode & 0x3c));
3012 opcode = 0x81;
3013 }
3014 bfd_put_8 (abfd, modrm, contents + roff - 1);
3015 r_type = R_386_32;
3016 }
3017
3018 bfd_put_8 (abfd, opcode, contents + roff - 2);
3019 irel->r_info = ELF32_R_INFO (r_symndx, r_type);
3020
3021 if (h)
3022 {
3023 if (h->got.refcount > 0)
3024 h->got.refcount -= 1;
3025 }
3026 else
3027 {
3028 if (local_got_refcounts != NULL
3029 && local_got_refcounts[r_symndx] > 0)
3030 local_got_refcounts[r_symndx] -= 1;
3031 }
3032
3033 changed_contents = TRUE;
3034 changed_relocs = TRUE;
3035 }
3036 }
3037 }
3038
3039 if (contents != NULL
3040 && elf_section_data (sec)->this_hdr.contents != contents)
3041 {
3042 if (!changed_contents && !link_info->keep_memory)
3043 free (contents);
3044 else
3045 {
3046 /* Cache the section contents for elf_link_input_bfd. */
3047 elf_section_data (sec)->this_hdr.contents = contents;
3048 }
3049 }
3050
3051 if (elf_section_data (sec)->relocs != internal_relocs)
3052 {
3053 if (!changed_relocs)
3054 free (internal_relocs);
3055 else
3056 elf_section_data (sec)->relocs = internal_relocs;
3057 }
3058
3059 return TRUE;
3060
3061 error_return:
3062 if (contents != NULL
3063 && elf_section_data (sec)->this_hdr.contents != contents)
3064 free (contents);
3065 if (internal_relocs != NULL
3066 && elf_section_data (sec)->relocs != internal_relocs)
3067 free (internal_relocs);
3068 return FALSE;
3069 }
3070
3071 /* Set the sizes of the dynamic sections. */
3072
3073 static bfd_boolean
3074 elf_i386_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
3075 {
3076 struct elf_i386_link_hash_table *htab;
3077 bfd *dynobj;
3078 asection *s;
3079 bfd_boolean relocs;
3080 bfd *ibfd;
3081
3082 htab = elf_i386_hash_table (info);
3083 if (htab == NULL)
3084 return FALSE;
3085 dynobj = htab->elf.dynobj;
3086 if (dynobj == NULL)
3087 abort ();
3088
3089 if (htab->elf.dynamic_sections_created)
3090 {
3091 /* Set the contents of the .interp section to the interpreter. */
3092 if (bfd_link_executable (info) && !info->nointerp)
3093 {
3094 s = bfd_get_linker_section (dynobj, ".interp");
3095 if (s == NULL)
3096 abort ();
3097 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
3098 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
3099 htab->interp = s;
3100 }
3101 }
3102
3103 /* Set up .got offsets for local syms, and space for local dynamic
3104 relocs. */
3105 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
3106 {
3107 bfd_signed_vma *local_got;
3108 bfd_signed_vma *end_local_got;
3109 char *local_tls_type;
3110 bfd_vma *local_tlsdesc_gotent;
3111 bfd_size_type locsymcount;
3112 Elf_Internal_Shdr *symtab_hdr;
3113 asection *srel;
3114
3115 if (! is_i386_elf (ibfd))
3116 continue;
3117
3118 for (s = ibfd->sections; s != NULL; s = s->next)
3119 {
3120 struct elf_dyn_relocs *p;
3121
3122 if (!elf_i386_convert_load (ibfd, s, info))
3123 return FALSE;
3124
3125 for (p = ((struct elf_dyn_relocs *)
3126 elf_section_data (s)->local_dynrel);
3127 p != NULL;
3128 p = p->next)
3129 {
3130 if (!bfd_is_abs_section (p->sec)
3131 && bfd_is_abs_section (p->sec->output_section))
3132 {
3133 /* Input section has been discarded, either because
3134 it is a copy of a linkonce section or due to
3135 linker script /DISCARD/, so we'll be discarding
3136 the relocs too. */
3137 }
3138 else if (get_elf_i386_backend_data (output_bfd)->is_vxworks
3139 && strcmp (p->sec->output_section->name,
3140 ".tls_vars") == 0)
3141 {
3142 /* Relocations in vxworks .tls_vars sections are
3143 handled specially by the loader. */
3144 }
3145 else if (p->count != 0)
3146 {
3147 srel = elf_section_data (p->sec)->sreloc;
3148 srel->size += p->count * sizeof (Elf32_External_Rel);
3149 if ((p->sec->output_section->flags & SEC_READONLY) != 0
3150 && (info->flags & DF_TEXTREL) == 0)
3151 {
3152 info->flags |= DF_TEXTREL;
3153 if ((info->warn_shared_textrel && bfd_link_pic (info))
3154 || info->error_textrel)
3155 info->callbacks->einfo (_("%P: %B: warning: relocation in readonly section `%A'\n"),
3156 p->sec->owner, p->sec);
3157 }
3158 }
3159 }
3160 }
3161
3162 local_got = elf_local_got_refcounts (ibfd);
3163 if (!local_got)
3164 continue;
3165
3166 symtab_hdr = &elf_symtab_hdr (ibfd);
3167 locsymcount = symtab_hdr->sh_info;
3168 end_local_got = local_got + locsymcount;
3169 local_tls_type = elf_i386_local_got_tls_type (ibfd);
3170 local_tlsdesc_gotent = elf_i386_local_tlsdesc_gotent (ibfd);
3171 s = htab->elf.sgot;
3172 srel = htab->elf.srelgot;
3173 for (; local_got < end_local_got;
3174 ++local_got, ++local_tls_type, ++local_tlsdesc_gotent)
3175 {
3176 *local_tlsdesc_gotent = (bfd_vma) -1;
3177 if (*local_got > 0)
3178 {
3179 if (GOT_TLS_GDESC_P (*local_tls_type))
3180 {
3181 *local_tlsdesc_gotent = htab->elf.sgotplt->size
3182 - elf_i386_compute_jump_table_size (htab);
3183 htab->elf.sgotplt->size += 8;
3184 *local_got = (bfd_vma) -2;
3185 }
3186 if (! GOT_TLS_GDESC_P (*local_tls_type)
3187 || GOT_TLS_GD_P (*local_tls_type))
3188 {
3189 *local_got = s->size;
3190 s->size += 4;
3191 if (GOT_TLS_GD_P (*local_tls_type)
3192 || *local_tls_type == GOT_TLS_IE_BOTH)
3193 s->size += 4;
3194 }
3195 if (bfd_link_pic (info)
3196 || GOT_TLS_GD_ANY_P (*local_tls_type)
3197 || (*local_tls_type & GOT_TLS_IE))
3198 {
3199 if (*local_tls_type == GOT_TLS_IE_BOTH)
3200 srel->size += 2 * sizeof (Elf32_External_Rel);
3201 else if (GOT_TLS_GD_P (*local_tls_type)
3202 || ! GOT_TLS_GDESC_P (*local_tls_type))
3203 srel->size += sizeof (Elf32_External_Rel);
3204 if (GOT_TLS_GDESC_P (*local_tls_type))
3205 htab->elf.srelplt->size += sizeof (Elf32_External_Rel);
3206 }
3207 }
3208 else
3209 *local_got = (bfd_vma) -1;
3210 }
3211 }
3212
3213 if (htab->tls_ldm_got.refcount > 0)
3214 {
3215 /* Allocate 2 got entries and 1 dynamic reloc for R_386_TLS_LDM
3216 relocs. */
3217 htab->tls_ldm_got.offset = htab->elf.sgot->size;
3218 htab->elf.sgot->size += 8;
3219 htab->elf.srelgot->size += sizeof (Elf32_External_Rel);
3220 }
3221 else
3222 htab->tls_ldm_got.offset = -1;
3223
3224 /* Allocate global sym .plt and .got entries, and space for global
3225 sym dynamic relocs. */
3226 elf_link_hash_traverse (&htab->elf, elf_i386_allocate_dynrelocs, info);
3227
3228 /* Allocate .plt and .got entries, and space for local symbols. */
3229 htab_traverse (htab->loc_hash_table,
3230 elf_i386_allocate_local_dynrelocs,
3231 info);
3232
3233 /* For every jump slot reserved in the sgotplt, reloc_count is
3234 incremented. However, when we reserve space for TLS descriptors,
3235 it's not incremented, so in order to compute the space reserved
3236 for them, it suffices to multiply the reloc count by the jump
3237 slot size.
3238
3239 PR ld/13302: We start next_irelative_index at the end of .rela.plt
3240 so that R_386_IRELATIVE entries come last. */
3241 if (htab->elf.srelplt)
3242 {
3243 htab->next_tls_desc_index = htab->elf.srelplt->reloc_count;
3244 htab->sgotplt_jump_table_size = htab->next_tls_desc_index * 4;
3245 htab->next_irelative_index = htab->elf.srelplt->reloc_count - 1;
3246 }
3247 else if (htab->elf.irelplt)
3248 htab->next_irelative_index = htab->elf.irelplt->reloc_count - 1;
3249
3250
3251 if (htab->elf.sgotplt)
3252 {
3253 /* Don't allocate .got.plt section if there are no GOT nor PLT
3254 entries and there is no reference to _GLOBAL_OFFSET_TABLE_. */
3255 if ((htab->elf.hgot == NULL
3256 || !htab->elf.hgot->ref_regular_nonweak)
3257 && (htab->elf.sgotplt->size
3258 == get_elf_backend_data (output_bfd)->got_header_size)
3259 && (htab->elf.splt == NULL
3260 || htab->elf.splt->size == 0)
3261 && (htab->elf.sgot == NULL
3262 || htab->elf.sgot->size == 0)
3263 && (htab->elf.iplt == NULL
3264 || htab->elf.iplt->size == 0)
3265 && (htab->elf.igotplt == NULL
3266 || htab->elf.igotplt->size == 0))
3267 htab->elf.sgotplt->size = 0;
3268 }
3269
3270
3271 if (htab->plt_eh_frame != NULL
3272 && htab->elf.splt != NULL
3273 && htab->elf.splt->size != 0
3274 && !bfd_is_abs_section (htab->elf.splt->output_section)
3275 && _bfd_elf_eh_frame_present (info))
3276 htab->plt_eh_frame->size = sizeof (elf_i386_eh_frame_plt);
3277
3278 /* We now have determined the sizes of the various dynamic sections.
3279 Allocate memory for them. */
3280 relocs = FALSE;
3281 for (s = dynobj->sections; s != NULL; s = s->next)
3282 {
3283 bfd_boolean strip_section = TRUE;
3284
3285 if ((s->flags & SEC_LINKER_CREATED) == 0)
3286 continue;
3287
3288 if (s == htab->elf.splt
3289 || s == htab->elf.sgot)
3290 {
3291 /* Strip this section if we don't need it; see the
3292 comment below. */
3293 /* We'd like to strip these sections if they aren't needed, but if
3294 we've exported dynamic symbols from them we must leave them.
3295 It's too late to tell BFD to get rid of the symbols. */
3296
3297 if (htab->elf.hplt != NULL)
3298 strip_section = FALSE;
3299 }
3300 else if (s == htab->elf.sgotplt
3301 || s == htab->elf.iplt
3302 || s == htab->elf.igotplt
3303 || s == htab->plt_got
3304 || s == htab->plt_eh_frame
3305 || s == htab->sdynbss)
3306 {
3307 /* Strip these too. */
3308 }
3309 else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rel"))
3310 {
3311 if (s->size != 0
3312 && s != htab->elf.srelplt
3313 && s != htab->srelplt2)
3314 relocs = TRUE;
3315
3316 /* We use the reloc_count field as a counter if we need
3317 to copy relocs into the output file. */
3318 s->reloc_count = 0;
3319 }
3320 else
3321 {
3322 /* It's not one of our sections, so don't allocate space. */
3323 continue;
3324 }
3325
3326 if (s->size == 0)
3327 {
3328 /* If we don't need this section, strip it from the
3329 output file. This is mostly to handle .rel.bss and
3330 .rel.plt. We must create both sections in
3331 create_dynamic_sections, because they must be created
3332 before the linker maps input sections to output
3333 sections. The linker does that before
3334 adjust_dynamic_symbol is called, and it is that
3335 function which decides whether anything needs to go
3336 into these sections. */
3337 if (strip_section)
3338 s->flags |= SEC_EXCLUDE;
3339 continue;
3340 }
3341
3342 if ((s->flags & SEC_HAS_CONTENTS) == 0)
3343 continue;
3344
3345 /* Allocate memory for the section contents. We use bfd_zalloc
3346 here in case unused entries are not reclaimed before the
3347 section's contents are written out. This should not happen,
3348 but this way if it does, we get a R_386_NONE reloc instead
3349 of garbage. */
3350 s->contents = (unsigned char *) bfd_zalloc (dynobj, s->size);
3351 if (s->contents == NULL)
3352 return FALSE;
3353 }
3354
3355 if (htab->plt_eh_frame != NULL
3356 && htab->plt_eh_frame->contents != NULL)
3357 {
3358 memcpy (htab->plt_eh_frame->contents, elf_i386_eh_frame_plt,
3359 sizeof (elf_i386_eh_frame_plt));
3360 bfd_put_32 (dynobj, htab->elf.splt->size,
3361 htab->plt_eh_frame->contents + PLT_FDE_LEN_OFFSET);
3362 }
3363
3364 if (htab->elf.dynamic_sections_created)
3365 {
3366 /* Add some entries to the .dynamic section. We fill in the
3367 values later, in elf_i386_finish_dynamic_sections, but we
3368 must add the entries now so that we get the correct size for
3369 the .dynamic section. The DT_DEBUG entry is filled in by the
3370 dynamic linker and used by the debugger. */
3371 #define add_dynamic_entry(TAG, VAL) \
3372 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
3373
3374 if (bfd_link_executable (info))
3375 {
3376 if (!add_dynamic_entry (DT_DEBUG, 0))
3377 return FALSE;
3378 }
3379
3380 if (htab->elf.splt->size != 0)
3381 {
3382 /* DT_PLTGOT is used by prelink even if there is no PLT
3383 relocation. */
3384 if (!add_dynamic_entry (DT_PLTGOT, 0))
3385 return FALSE;
3386
3387 if (htab->elf.srelplt->size != 0)
3388 {
3389 if (!add_dynamic_entry (DT_PLTRELSZ, 0)
3390 || !add_dynamic_entry (DT_PLTREL, DT_REL)
3391 || !add_dynamic_entry (DT_JMPREL, 0))
3392 return FALSE;
3393 }
3394 }
3395
3396 if (relocs)
3397 {
3398 if (!add_dynamic_entry (DT_REL, 0)
3399 || !add_dynamic_entry (DT_RELSZ, 0)
3400 || !add_dynamic_entry (DT_RELENT, sizeof (Elf32_External_Rel)))
3401 return FALSE;
3402
3403 /* If any dynamic relocs apply to a read-only section,
3404 then we need a DT_TEXTREL entry. */
3405 if ((info->flags & DF_TEXTREL) == 0)
3406 elf_link_hash_traverse (&htab->elf,
3407 elf_i386_readonly_dynrelocs, info);
3408
3409 if ((info->flags & DF_TEXTREL) != 0)
3410 {
3411 if (htab->readonly_dynrelocs_against_ifunc)
3412 {
3413 info->callbacks->einfo
3414 (_("%P%X: read-only segment has dynamic IFUNC relocations; recompile with -fPIC\n"));
3415 bfd_set_error (bfd_error_bad_value);
3416 return FALSE;
3417 }
3418
3419 if (!add_dynamic_entry (DT_TEXTREL, 0))
3420 return FALSE;
3421 }
3422 }
3423 if (get_elf_i386_backend_data (output_bfd)->is_vxworks
3424 && !elf_vxworks_add_dynamic_entries (output_bfd, info))
3425 return FALSE;
3426 }
3427 #undef add_dynamic_entry
3428
3429 return TRUE;
3430 }
3431
3432 static bfd_boolean
3433 elf_i386_always_size_sections (bfd *output_bfd,
3434 struct bfd_link_info *info)
3435 {
3436 asection *tls_sec = elf_hash_table (info)->tls_sec;
3437
3438 if (tls_sec)
3439 {
3440 struct elf_link_hash_entry *tlsbase;
3441
3442 tlsbase = elf_link_hash_lookup (elf_hash_table (info),
3443 "_TLS_MODULE_BASE_",
3444 FALSE, FALSE, FALSE);
3445
3446 if (tlsbase && tlsbase->type == STT_TLS)
3447 {
3448 struct elf_i386_link_hash_table *htab;
3449 struct bfd_link_hash_entry *bh = NULL;
3450 const struct elf_backend_data *bed
3451 = get_elf_backend_data (output_bfd);
3452
3453 htab = elf_i386_hash_table (info);
3454 if (htab == NULL)
3455 return FALSE;
3456
3457 if (!(_bfd_generic_link_add_one_symbol
3458 (info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL,
3459 tls_sec, 0, NULL, FALSE,
3460 bed->collect, &bh)))
3461 return FALSE;
3462
3463 htab->tls_module_base = bh;
3464
3465 tlsbase = (struct elf_link_hash_entry *)bh;
3466 tlsbase->def_regular = 1;
3467 tlsbase->other = STV_HIDDEN;
3468 tlsbase->root.linker_def = 1;
3469 (*bed->elf_backend_hide_symbol) (info, tlsbase, TRUE);
3470 }
3471 }
3472
3473 return TRUE;
3474 }
3475
3476 /* Set the correct type for an x86 ELF section. We do this by the
3477 section name, which is a hack, but ought to work. */
3478
3479 static bfd_boolean
3480 elf_i386_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
3481 Elf_Internal_Shdr *hdr,
3482 asection *sec)
3483 {
3484 const char *name;
3485
3486 name = bfd_get_section_name (abfd, sec);
3487
3488 /* This is an ugly, but unfortunately necessary hack that is
3489 needed when producing EFI binaries on x86. It tells
3490 elf.c:elf_fake_sections() not to consider ".reloc" as a section
3491 containing ELF relocation info. We need this hack in order to
3492 be able to generate ELF binaries that can be translated into
3493 EFI applications (which are essentially COFF objects). Those
3494 files contain a COFF ".reloc" section inside an ELFNN object,
3495 which would normally cause BFD to segfault because it would
3496 attempt to interpret this section as containing relocation
3497 entries for section "oc". With this hack enabled, ".reloc"
3498 will be treated as a normal data section, which will avoid the
3499 segfault. However, you won't be able to create an ELFNN binary
3500 with a section named "oc" that needs relocations, but that's
3501 the kind of ugly side-effects you get when detecting section
3502 types based on their names... In practice, this limitation is
3503 unlikely to bite. */
3504 if (strcmp (name, ".reloc") == 0)
3505 hdr->sh_type = SHT_PROGBITS;
3506
3507 return TRUE;
3508 }
3509
3510 /* _TLS_MODULE_BASE_ needs to be treated especially when linking
3511 executables. Rather than setting it to the beginning of the TLS
3512 section, we have to set it to the end. This function may be called
3513 multiple times, it is idempotent. */
3514
3515 static void
3516 elf_i386_set_tls_module_base (struct bfd_link_info *info)
3517 {
3518 struct elf_i386_link_hash_table *htab;
3519 struct bfd_link_hash_entry *base;
3520
3521 if (!bfd_link_executable (info))
3522 return;
3523
3524 htab = elf_i386_hash_table (info);
3525 if (htab == NULL)
3526 return;
3527
3528 base = htab->tls_module_base;
3529 if (base == NULL)
3530 return;
3531
3532 base->u.def.value = htab->elf.tls_size;
3533 }
3534
3535 /* Return the base VMA address which should be subtracted from real addresses
3536 when resolving @dtpoff relocation.
3537 This is PT_TLS segment p_vaddr. */
3538
3539 static bfd_vma
3540 elf_i386_dtpoff_base (struct bfd_link_info *info)
3541 {
3542 /* If tls_sec is NULL, we should have signalled an error already. */
3543 if (elf_hash_table (info)->tls_sec == NULL)
3544 return 0;
3545 return elf_hash_table (info)->tls_sec->vma;
3546 }
3547
3548 /* Return the relocation value for @tpoff relocation
3549 if STT_TLS virtual address is ADDRESS. */
3550
3551 static bfd_vma
3552 elf_i386_tpoff (struct bfd_link_info *info, bfd_vma address)
3553 {
3554 struct elf_link_hash_table *htab = elf_hash_table (info);
3555 const struct elf_backend_data *bed = get_elf_backend_data (info->output_bfd);
3556 bfd_vma static_tls_size;
3557
3558 /* If tls_sec is NULL, we should have signalled an error already. */
3559 if (htab->tls_sec == NULL)
3560 return 0;
3561
3562 /* Consider special static TLS alignment requirements. */
3563 static_tls_size = BFD_ALIGN (htab->tls_size, bed->static_tls_alignment);
3564 return static_tls_size + htab->tls_sec->vma - address;
3565 }
3566
3567 /* Relocate an i386 ELF section. */
3568
3569 static bfd_boolean
3570 elf_i386_relocate_section (bfd *output_bfd,
3571 struct bfd_link_info *info,
3572 bfd *input_bfd,
3573 asection *input_section,
3574 bfd_byte *contents,
3575 Elf_Internal_Rela *relocs,
3576 Elf_Internal_Sym *local_syms,
3577 asection **local_sections)
3578 {
3579 struct elf_i386_link_hash_table *htab;
3580 Elf_Internal_Shdr *symtab_hdr;
3581 struct elf_link_hash_entry **sym_hashes;
3582 bfd_vma *local_got_offsets;
3583 bfd_vma *local_tlsdesc_gotents;
3584 Elf_Internal_Rela *rel;
3585 Elf_Internal_Rela *wrel;
3586 Elf_Internal_Rela *relend;
3587 bfd_boolean is_vxworks_tls;
3588 unsigned plt_entry_size;
3589
3590 BFD_ASSERT (is_i386_elf (input_bfd));
3591
3592 /* Skip if check_relocs failed. */
3593 if (input_section->check_relocs_failed)
3594 return FALSE;
3595
3596 htab = elf_i386_hash_table (info);
3597 if (htab == NULL)
3598 return FALSE;
3599 symtab_hdr = &elf_symtab_hdr (input_bfd);
3600 sym_hashes = elf_sym_hashes (input_bfd);
3601 local_got_offsets = elf_local_got_offsets (input_bfd);
3602 local_tlsdesc_gotents = elf_i386_local_tlsdesc_gotent (input_bfd);
3603 /* We have to handle relocations in vxworks .tls_vars sections
3604 specially, because the dynamic loader is 'weird'. */
3605 is_vxworks_tls = (get_elf_i386_backend_data (output_bfd)->is_vxworks
3606 && bfd_link_pic (info)
3607 && !strcmp (input_section->output_section->name,
3608 ".tls_vars"));
3609
3610 elf_i386_set_tls_module_base (info);
3611
3612 plt_entry_size = GET_PLT_ENTRY_SIZE (output_bfd);
3613
3614 rel = wrel = relocs;
3615 relend = relocs + input_section->reloc_count;
3616 for (; rel < relend; wrel++, rel++)
3617 {
3618 unsigned int r_type;
3619 reloc_howto_type *howto;
3620 unsigned long r_symndx;
3621 struct elf_link_hash_entry *h;
3622 struct elf_i386_link_hash_entry *eh;
3623 Elf_Internal_Sym *sym;
3624 asection *sec;
3625 bfd_vma off, offplt, plt_offset;
3626 bfd_vma relocation;
3627 bfd_boolean unresolved_reloc;
3628 bfd_reloc_status_type r;
3629 unsigned int indx;
3630 int tls_type;
3631 bfd_vma st_size;
3632 asection *resolved_plt;
3633 bfd_boolean resolved_to_zero;
3634
3635 r_type = ELF32_R_TYPE (rel->r_info);
3636 if (r_type == R_386_GNU_VTINHERIT
3637 || r_type == R_386_GNU_VTENTRY)
3638 {
3639 if (wrel != rel)
3640 *wrel = *rel;
3641 continue;
3642 }
3643
3644 if ((indx = r_type) >= R_386_standard
3645 && ((indx = r_type - R_386_ext_offset) - R_386_standard
3646 >= R_386_ext - R_386_standard)
3647 && ((indx = r_type - R_386_tls_offset) - R_386_ext
3648 >= R_386_ext2 - R_386_ext))
3649 {
3650 (*_bfd_error_handler)
3651 (_("%B: unrecognized relocation (0x%x) in section `%A'"),
3652 input_bfd, input_section, r_type);
3653 bfd_set_error (bfd_error_bad_value);
3654 return FALSE;
3655 }
3656 howto = elf_howto_table + indx;
3657
3658 r_symndx = ELF32_R_SYM (rel->r_info);
3659 h = NULL;
3660 sym = NULL;
3661 sec = NULL;
3662 unresolved_reloc = FALSE;
3663 if (r_symndx < symtab_hdr->sh_info)
3664 {
3665 sym = local_syms + r_symndx;
3666 sec = local_sections[r_symndx];
3667 relocation = (sec->output_section->vma
3668 + sec->output_offset
3669 + sym->st_value);
3670 st_size = sym->st_size;
3671
3672 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION
3673 && ((sec->flags & SEC_MERGE) != 0
3674 || (bfd_link_relocatable (info)
3675 && sec->output_offset != 0)))
3676 {
3677 bfd_vma addend;
3678 bfd_byte *where = contents + rel->r_offset;
3679
3680 switch (howto->size)
3681 {
3682 case 0:
3683 addend = bfd_get_8 (input_bfd, where);
3684 if (howto->pc_relative)
3685 {
3686 addend = (addend ^ 0x80) - 0x80;
3687 addend += 1;
3688 }
3689 break;
3690 case 1:
3691 addend = bfd_get_16 (input_bfd, where);
3692 if (howto->pc_relative)
3693 {
3694 addend = (addend ^ 0x8000) - 0x8000;
3695 addend += 2;
3696 }
3697 break;
3698 case 2:
3699 addend = bfd_get_32 (input_bfd, where);
3700 if (howto->pc_relative)
3701 {
3702 addend = (addend ^ 0x80000000) - 0x80000000;
3703 addend += 4;
3704 }
3705 break;
3706 default:
3707 abort ();
3708 }
3709
3710 if (bfd_link_relocatable (info))
3711 addend += sec->output_offset;
3712 else
3713 {
3714 asection *msec = sec;
3715 addend = _bfd_elf_rel_local_sym (output_bfd, sym, &msec,
3716 addend);
3717 addend -= relocation;
3718 addend += msec->output_section->vma + msec->output_offset;
3719 }
3720
3721 switch (howto->size)
3722 {
3723 case 0:
3724 /* FIXME: overflow checks. */
3725 if (howto->pc_relative)
3726 addend -= 1;
3727 bfd_put_8 (input_bfd, addend, where);
3728 break;
3729 case 1:
3730 if (howto->pc_relative)
3731 addend -= 2;
3732 bfd_put_16 (input_bfd, addend, where);
3733 break;
3734 case 2:
3735 if (howto->pc_relative)
3736 addend -= 4;
3737 bfd_put_32 (input_bfd, addend, where);
3738 break;
3739 }
3740 }
3741 else if (!bfd_link_relocatable (info)
3742 && ELF32_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
3743 {
3744 /* Relocate against local STT_GNU_IFUNC symbol. */
3745 h = elf_i386_get_local_sym_hash (htab, input_bfd, rel,
3746 FALSE);
3747 if (h == NULL)
3748 abort ();
3749
3750 /* Set STT_GNU_IFUNC symbol value. */
3751 h->root.u.def.value = sym->st_value;
3752 h->root.u.def.section = sec;
3753 }
3754 }
3755 else
3756 {
3757 bfd_boolean warned ATTRIBUTE_UNUSED;
3758 bfd_boolean ignored ATTRIBUTE_UNUSED;
3759
3760 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
3761 r_symndx, symtab_hdr, sym_hashes,
3762 h, sec, relocation,
3763 unresolved_reloc, warned, ignored);
3764 st_size = h->size;
3765 }
3766
3767 if (sec != NULL && discarded_section (sec))
3768 {
3769 _bfd_clear_contents (howto, input_bfd, input_section,
3770 contents + rel->r_offset);
3771 wrel->r_offset = rel->r_offset;
3772 wrel->r_info = 0;
3773 wrel->r_addend = 0;
3774
3775 /* For ld -r, remove relocations in debug sections against
3776 sections defined in discarded sections. Not done for
3777 eh_frame editing code expects to be present. */
3778 if (bfd_link_relocatable (info)
3779 && (input_section->flags & SEC_DEBUGGING))
3780 wrel--;
3781
3782 continue;
3783 }
3784
3785 if (bfd_link_relocatable (info))
3786 {
3787 if (wrel != rel)
3788 *wrel = *rel;
3789 continue;
3790 }
3791
3792 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle
3793 it here if it is defined in a non-shared object. */
3794 if (h != NULL
3795 && h->type == STT_GNU_IFUNC
3796 && h->def_regular)
3797 {
3798 asection *plt, *gotplt, *base_got;
3799 bfd_vma plt_index;
3800 const char *name;
3801
3802 if ((input_section->flags & SEC_ALLOC) == 0)
3803 {
3804 /* Dynamic relocs are not propagated for SEC_DEBUGGING
3805 sections because such sections are not SEC_ALLOC and
3806 thus ld.so will not process them. */
3807 if ((input_section->flags & SEC_DEBUGGING) != 0)
3808 continue;
3809 abort ();
3810 }
3811 else if (h->plt.offset == (bfd_vma) -1)
3812 abort ();
3813
3814 /* STT_GNU_IFUNC symbol must go through PLT. */
3815 if (htab->elf.splt != NULL)
3816 {
3817 plt = htab->elf.splt;
3818 gotplt = htab->elf.sgotplt;
3819 }
3820 else
3821 {
3822 plt = htab->elf.iplt;
3823 gotplt = htab->elf.igotplt;
3824 }
3825
3826 relocation = (plt->output_section->vma
3827 + plt->output_offset + h->plt.offset);
3828
3829 switch (r_type)
3830 {
3831 default:
3832 if (h->root.root.string)
3833 name = h->root.root.string;
3834 else
3835 name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
3836 NULL);
3837 (*_bfd_error_handler)
3838 (_("%B: relocation %s against STT_GNU_IFUNC "
3839 "symbol `%s' isn't handled by %s"), input_bfd,
3840 elf_howto_table[r_type].name,
3841 name, __FUNCTION__);
3842 bfd_set_error (bfd_error_bad_value);
3843 return FALSE;
3844
3845 case R_386_32:
3846 /* Generate dynamic relcoation only when there is a
3847 non-GOT reference in a shared object. */
3848 if (bfd_link_pic (info) && h->non_got_ref)
3849 {
3850 Elf_Internal_Rela outrel;
3851 asection *sreloc;
3852 bfd_vma offset;
3853
3854 /* Need a dynamic relocation to get the real function
3855 adddress. */
3856 offset = _bfd_elf_section_offset (output_bfd,
3857 info,
3858 input_section,
3859 rel->r_offset);
3860 if (offset == (bfd_vma) -1
3861 || offset == (bfd_vma) -2)
3862 abort ();
3863
3864 outrel.r_offset = (input_section->output_section->vma
3865 + input_section->output_offset
3866 + offset);
3867
3868 if (h->dynindx == -1
3869 || h->forced_local
3870 || bfd_link_executable (info))
3871 {
3872 /* This symbol is resolved locally. */
3873 outrel.r_info = ELF32_R_INFO (0, R_386_IRELATIVE);
3874 bfd_put_32 (output_bfd,
3875 (h->root.u.def.value
3876 + h->root.u.def.section->output_section->vma
3877 + h->root.u.def.section->output_offset),
3878 contents + offset);
3879 }
3880 else
3881 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
3882
3883 sreloc = htab->elf.irelifunc;
3884 elf_append_rel (output_bfd, sreloc, &outrel);
3885
3886 /* If this reloc is against an external symbol, we
3887 do not want to fiddle with the addend. Otherwise,
3888 we need to include the symbol value so that it
3889 becomes an addend for the dynamic reloc. For an
3890 internal symbol, we have updated addend. */
3891 continue;
3892 }
3893 /* FALLTHROUGH */
3894 case R_386_PC32:
3895 case R_386_PLT32:
3896 goto do_relocation;
3897
3898 case R_386_GOT32:
3899 case R_386_GOT32X:
3900 base_got = htab->elf.sgot;
3901 off = h->got.offset;
3902
3903 if (base_got == NULL)
3904 abort ();
3905
3906 if (off == (bfd_vma) -1)
3907 {
3908 /* We can't use h->got.offset here to save state, or
3909 even just remember the offset, as finish_dynamic_symbol
3910 would use that as offset into .got. */
3911
3912 if (htab->elf.splt != NULL)
3913 {
3914 plt_index = h->plt.offset / plt_entry_size - 1;
3915 off = (plt_index + 3) * 4;
3916 base_got = htab->elf.sgotplt;
3917 }
3918 else
3919 {
3920 plt_index = h->plt.offset / plt_entry_size;
3921 off = plt_index * 4;
3922 base_got = htab->elf.igotplt;
3923 }
3924
3925 if (h->dynindx == -1
3926 || h->forced_local
3927 || info->symbolic)
3928 {
3929 /* This references the local defitionion. We must
3930 initialize this entry in the global offset table.
3931 Since the offset must always be a multiple of 8,
3932 we use the least significant bit to record
3933 whether we have initialized it already.
3934
3935 When doing a dynamic link, we create a .rela.got
3936 relocation entry to initialize the value. This
3937 is done in the finish_dynamic_symbol routine. */
3938 if ((off & 1) != 0)
3939 off &= ~1;
3940 else
3941 {
3942 bfd_put_32 (output_bfd, relocation,
3943 base_got->contents + off);
3944 h->got.offset |= 1;
3945 }
3946 }
3947
3948 relocation = off;
3949
3950 /* Adjust for static executables. */
3951 if (htab->elf.splt == NULL)
3952 relocation += gotplt->output_offset;
3953 }
3954 else
3955 {
3956 relocation = (base_got->output_section->vma
3957 + base_got->output_offset + off
3958 - gotplt->output_section->vma
3959 - gotplt->output_offset);
3960 /* Adjust for static executables. */
3961 if (htab->elf.splt == NULL)
3962 relocation += gotplt->output_offset;
3963 }
3964
3965 goto do_relocation;
3966
3967 case R_386_GOTOFF:
3968 relocation -= (gotplt->output_section->vma
3969 + gotplt->output_offset);
3970 goto do_relocation;
3971 }
3972 }
3973
3974 eh = (struct elf_i386_link_hash_entry *) h;
3975 resolved_to_zero = (eh != NULL
3976 && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh));
3977
3978 switch (r_type)
3979 {
3980 case R_386_GOT32X:
3981 /* Avoid optimizing _DYNAMIC since ld.so may use its
3982 link-time address. */
3983 if (h == htab->elf.hdynamic)
3984 goto r_386_got32;
3985
3986 if (bfd_link_pic (info))
3987 {
3988 /* It is OK to convert mov to lea and convert indirect
3989 branch to direct branch. It is OK to convert adc,
3990 add, and, cmp, or, sbb, sub, test, xor only when PIC
3991 is false. */
3992 unsigned int opcode, addend;
3993 addend = bfd_get_32 (input_bfd, contents + rel->r_offset);
3994 if (addend != 0)
3995 goto r_386_got32;
3996 opcode = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
3997 if (opcode != 0x8b && opcode != 0xff)
3998 goto r_386_got32;
3999 }
4000
4001 /* Resolve "mov GOT[(%reg)], %reg",
4002 "call/jmp *GOT[(%reg)]", "test %reg, foo@GOT[(%reg)]"
4003 and "binop foo@GOT[(%reg)], %reg". */
4004 if (h == NULL
4005 || (h->plt.offset == (bfd_vma) -1
4006 && h->got.offset == (bfd_vma) -1)
4007 || htab->elf.sgotplt == NULL)
4008 abort ();
4009
4010 offplt = (htab->elf.sgotplt->output_section->vma
4011 + htab->elf.sgotplt->output_offset);
4012
4013 /* It is relative to .got.plt section. */
4014 if (h->got.offset != (bfd_vma) -1)
4015 /* Use GOT entry. Mask off the least significant bit in
4016 GOT offset which may be set by R_386_GOT32 processing
4017 below. */
4018 relocation = (htab->elf.sgot->output_section->vma
4019 + htab->elf.sgot->output_offset
4020 + (h->got.offset & ~1) - offplt);
4021 else
4022 /* Use GOTPLT entry. */
4023 relocation = (h->plt.offset / plt_entry_size - 1 + 3) * 4;
4024
4025 if (!bfd_link_pic (info))
4026 {
4027 /* If not PIC, add the .got.plt section address for
4028 baseless addressing. */
4029 unsigned int modrm;
4030 modrm = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
4031 if ((modrm & 0xc7) == 0x5)
4032 relocation += offplt;
4033 }
4034
4035 unresolved_reloc = FALSE;
4036 break;
4037
4038 case R_386_GOT32:
4039 r_386_got32:
4040 /* Relocation is to the entry for this symbol in the global
4041 offset table. */
4042 if (htab->elf.sgot == NULL)
4043 abort ();
4044
4045 if (h != NULL)
4046 {
4047 bfd_boolean dyn;
4048
4049 off = h->got.offset;
4050 dyn = htab->elf.dynamic_sections_created;
4051 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
4052 bfd_link_pic (info),
4053 h)
4054 || (bfd_link_pic (info)
4055 && SYMBOL_REFERENCES_LOCAL (info, h))
4056 || (ELF_ST_VISIBILITY (h->other)
4057 && h->root.type == bfd_link_hash_undefweak))
4058 {
4059 /* This is actually a static link, or it is a
4060 -Bsymbolic link and the symbol is defined
4061 locally, or the symbol was forced to be local
4062 because of a version file. We must initialize
4063 this entry in the global offset table. Since the
4064 offset must always be a multiple of 4, we use the
4065 least significant bit to record whether we have
4066 initialized it already.
4067
4068 When doing a dynamic link, we create a .rel.got
4069 relocation entry to initialize the value. This
4070 is done in the finish_dynamic_symbol routine. */
4071 if ((off & 1) != 0)
4072 off &= ~1;
4073 else
4074 {
4075 bfd_put_32 (output_bfd, relocation,
4076 htab->elf.sgot->contents + off);
4077 h->got.offset |= 1;
4078 }
4079 }
4080 else
4081 unresolved_reloc = FALSE;
4082 }
4083 else
4084 {
4085 if (local_got_offsets == NULL)
4086 abort ();
4087
4088 off = local_got_offsets[r_symndx];
4089
4090 /* The offset must always be a multiple of 4. We use
4091 the least significant bit to record whether we have
4092 already generated the necessary reloc. */
4093 if ((off & 1) != 0)
4094 off &= ~1;
4095 else
4096 {
4097 bfd_put_32 (output_bfd, relocation,
4098 htab->elf.sgot->contents + off);
4099
4100 if (bfd_link_pic (info))
4101 {
4102 asection *s;
4103 Elf_Internal_Rela outrel;
4104
4105 s = htab->elf.srelgot;
4106 if (s == NULL)
4107 abort ();
4108
4109 outrel.r_offset = (htab->elf.sgot->output_section->vma
4110 + htab->elf.sgot->output_offset
4111 + off);
4112 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
4113 elf_append_rel (output_bfd, s, &outrel);
4114 }
4115
4116 local_got_offsets[r_symndx] |= 1;
4117 }
4118 }
4119
4120 if (off >= (bfd_vma) -2)
4121 abort ();
4122
4123 relocation = htab->elf.sgot->output_section->vma
4124 + htab->elf.sgot->output_offset + off
4125 - htab->elf.sgotplt->output_section->vma
4126 - htab->elf.sgotplt->output_offset;
4127 break;
4128
4129 case R_386_GOTOFF:
4130 /* Relocation is relative to the start of the global offset
4131 table. */
4132
4133 /* Check to make sure it isn't a protected function or data
4134 symbol for shared library since it may not be local when
4135 used as function address or with copy relocation. We also
4136 need to make sure that a symbol is referenced locally. */
4137 if (!bfd_link_executable (info) && h)
4138 {
4139 if (!h->def_regular)
4140 {
4141 const char *v;
4142
4143 switch (ELF_ST_VISIBILITY (h->other))
4144 {
4145 case STV_HIDDEN:
4146 v = _("hidden symbol");
4147 break;
4148 case STV_INTERNAL:
4149 v = _("internal symbol");
4150 break;
4151 case STV_PROTECTED:
4152 v = _("protected symbol");
4153 break;
4154 default:
4155 v = _("symbol");
4156 break;
4157 }
4158
4159 (*_bfd_error_handler)
4160 (_("%B: relocation R_386_GOTOFF against undefined %s `%s' can not be used when making a shared object"),
4161 input_bfd, v, h->root.root.string);
4162 bfd_set_error (bfd_error_bad_value);
4163 return FALSE;
4164 }
4165 else if (!SYMBOL_REFERENCES_LOCAL (info, h)
4166 && (h->type == STT_FUNC
4167 || h->type == STT_OBJECT)
4168 && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
4169 {
4170 (*_bfd_error_handler)
4171 (_("%B: relocation R_386_GOTOFF against protected %s `%s' can not be used when making a shared object"),
4172 input_bfd,
4173 h->type == STT_FUNC ? "function" : "data",
4174 h->root.root.string);
4175 bfd_set_error (bfd_error_bad_value);
4176 return FALSE;
4177 }
4178 }
4179
4180 /* Note that sgot is not involved in this
4181 calculation. We always want the start of .got.plt. If we
4182 defined _GLOBAL_OFFSET_TABLE_ in a different way, as is
4183 permitted by the ABI, we might have to change this
4184 calculation. */
4185 relocation -= htab->elf.sgotplt->output_section->vma
4186 + htab->elf.sgotplt->output_offset;
4187 break;
4188
4189 case R_386_GOTPC:
4190 /* Use global offset table as symbol value. */
4191 relocation = htab->elf.sgotplt->output_section->vma
4192 + htab->elf.sgotplt->output_offset;
4193 unresolved_reloc = FALSE;
4194 break;
4195
4196 case R_386_PLT32:
4197 /* Relocation is to the entry for this symbol in the
4198 procedure linkage table. */
4199
4200 /* Resolve a PLT32 reloc against a local symbol directly,
4201 without using the procedure linkage table. */
4202 if (h == NULL)
4203 break;
4204
4205 if ((h->plt.offset == (bfd_vma) -1
4206 && eh->plt_got.offset == (bfd_vma) -1)
4207 || htab->elf.splt == NULL)
4208 {
4209 /* We didn't make a PLT entry for this symbol. This
4210 happens when statically linking PIC code, or when
4211 using -Bsymbolic. */
4212 break;
4213 }
4214
4215 if (h->plt.offset != (bfd_vma) -1)
4216 {
4217 resolved_plt = htab->elf.splt;
4218 plt_offset = h->plt.offset;
4219 }
4220 else
4221 {
4222 resolved_plt = htab->plt_got;
4223 plt_offset = eh->plt_got.offset;
4224 }
4225
4226 relocation = (resolved_plt->output_section->vma
4227 + resolved_plt->output_offset
4228 + plt_offset);
4229 unresolved_reloc = FALSE;
4230 break;
4231
4232 case R_386_SIZE32:
4233 /* Set to symbol size. */
4234 relocation = st_size;
4235 /* Fall through. */
4236
4237 case R_386_32:
4238 case R_386_PC32:
4239 if ((input_section->flags & SEC_ALLOC) == 0
4240 || is_vxworks_tls)
4241 break;
4242
4243 /* Copy dynamic function pointer relocations. Don't generate
4244 dynamic relocations against resolved undefined weak symbols
4245 in PIE, except for R_386_PC32. */
4246 if ((bfd_link_pic (info)
4247 && (h == NULL
4248 || ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4249 && (!resolved_to_zero
4250 || r_type == R_386_PC32))
4251 || h->root.type != bfd_link_hash_undefweak))
4252 && ((r_type != R_386_PC32 && r_type != R_386_SIZE32)
4253 || !SYMBOL_CALLS_LOCAL (info, h)))
4254 || (ELIMINATE_COPY_RELOCS
4255 && !bfd_link_pic (info)
4256 && h != NULL
4257 && h->dynindx != -1
4258 && (!h->non_got_ref
4259 || eh->func_pointer_refcount > 0
4260 || (h->root.type == bfd_link_hash_undefweak
4261 && !resolved_to_zero))
4262 && ((h->def_dynamic && !h->def_regular)
4263 /* Undefined weak symbol is bound locally when
4264 PIC is false. */
4265 || h->root.type == bfd_link_hash_undefweak)))
4266 {
4267 Elf_Internal_Rela outrel;
4268 bfd_boolean skip, relocate;
4269 asection *sreloc;
4270
4271 /* When generating a shared object, these relocations
4272 are copied into the output file to be resolved at run
4273 time. */
4274
4275 skip = FALSE;
4276 relocate = FALSE;
4277
4278 outrel.r_offset =
4279 _bfd_elf_section_offset (output_bfd, info, input_section,
4280 rel->r_offset);
4281 if (outrel.r_offset == (bfd_vma) -1)
4282 skip = TRUE;
4283 else if (outrel.r_offset == (bfd_vma) -2)
4284 skip = TRUE, relocate = TRUE;
4285 outrel.r_offset += (input_section->output_section->vma
4286 + input_section->output_offset);
4287
4288 if (skip)
4289 memset (&outrel, 0, sizeof outrel);
4290 else if (h != NULL
4291 && h->dynindx != -1
4292 && (r_type == R_386_PC32
4293 || !(bfd_link_executable (info)
4294 || SYMBOLIC_BIND (info, h))
4295 || !h->def_regular))
4296 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
4297 else
4298 {
4299 /* This symbol is local, or marked to become local. */
4300 relocate = TRUE;
4301 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
4302 }
4303
4304 sreloc = elf_section_data (input_section)->sreloc;
4305
4306 if (sreloc == NULL || sreloc->contents == NULL)
4307 {
4308 r = bfd_reloc_notsupported;
4309 goto check_relocation_error;
4310 }
4311
4312 elf_append_rel (output_bfd, sreloc, &outrel);
4313
4314 /* If this reloc is against an external symbol, we do
4315 not want to fiddle with the addend. Otherwise, we
4316 need to include the symbol value so that it becomes
4317 an addend for the dynamic reloc. */
4318 if (! relocate)
4319 continue;
4320 }
4321 break;
4322
4323 case R_386_TLS_IE:
4324 if (!bfd_link_executable (info))
4325 {
4326 Elf_Internal_Rela outrel;
4327 asection *sreloc;
4328
4329 outrel.r_offset = rel->r_offset
4330 + input_section->output_section->vma
4331 + input_section->output_offset;
4332 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
4333 sreloc = elf_section_data (input_section)->sreloc;
4334 if (sreloc == NULL)
4335 abort ();
4336 elf_append_rel (output_bfd, sreloc, &outrel);
4337 }
4338 /* Fall through */
4339
4340 case R_386_TLS_GD:
4341 case R_386_TLS_GOTDESC:
4342 case R_386_TLS_DESC_CALL:
4343 case R_386_TLS_IE_32:
4344 case R_386_TLS_GOTIE:
4345 tls_type = GOT_UNKNOWN;
4346 if (h == NULL && local_got_offsets)
4347 tls_type = elf_i386_local_got_tls_type (input_bfd) [r_symndx];
4348 else if (h != NULL)
4349 tls_type = elf_i386_hash_entry(h)->tls_type;
4350 if (tls_type == GOT_TLS_IE)
4351 tls_type = GOT_TLS_IE_NEG;
4352
4353 if (! elf_i386_tls_transition (info, input_bfd,
4354 input_section, contents,
4355 symtab_hdr, sym_hashes,
4356 &r_type, tls_type, rel,
4357 relend, h, r_symndx))
4358 return FALSE;
4359
4360 if (r_type == R_386_TLS_LE_32)
4361 {
4362 BFD_ASSERT (! unresolved_reloc);
4363 if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GD)
4364 {
4365 unsigned int type;
4366 bfd_vma roff;
4367
4368 /* GD->LE transition. */
4369 type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
4370 if (type == 0x04)
4371 {
4372 /* leal foo(,%reg,1), %eax; call ___tls_get_addr
4373 Change it into:
4374 movl %gs:0, %eax; subl $foo@tpoff, %eax
4375 (6 byte form of subl). */
4376 memcpy (contents + rel->r_offset - 3,
4377 "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12);
4378 roff = rel->r_offset + 5;
4379 }
4380 else
4381 {
4382 /* leal foo(%reg), %eax; call ___tls_get_addr; nop
4383 Change it into:
4384 movl %gs:0, %eax; subl $foo@tpoff, %eax
4385 (6 byte form of subl). */
4386 memcpy (contents + rel->r_offset - 2,
4387 "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12);
4388 roff = rel->r_offset + 6;
4389 }
4390 bfd_put_32 (output_bfd, elf_i386_tpoff (info, relocation),
4391 contents + roff);
4392 /* Skip R_386_PC32/R_386_PLT32. */
4393 rel++;
4394 wrel++;
4395 continue;
4396 }
4397 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GOTDESC)
4398 {
4399 /* GDesc -> LE transition.
4400 It's originally something like:
4401 leal x@tlsdesc(%ebx), %eax
4402
4403 leal x@ntpoff, %eax
4404
4405 Registers other than %eax may be set up here. */
4406
4407 unsigned int val;
4408 bfd_vma roff;
4409
4410 roff = rel->r_offset;
4411 val = bfd_get_8 (input_bfd, contents + roff - 1);
4412
4413 /* Now modify the instruction as appropriate. */
4414 /* aoliva FIXME: remove the above and xor the byte
4415 below with 0x86. */
4416 bfd_put_8 (output_bfd, val ^ 0x86,
4417 contents + roff - 1);
4418 bfd_put_32 (output_bfd, -elf_i386_tpoff (info, relocation),
4419 contents + roff);
4420 continue;
4421 }
4422 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_DESC_CALL)
4423 {
4424 /* GDesc -> LE transition.
4425 It's originally:
4426 call *(%eax)
4427 Turn it into:
4428 xchg %ax,%ax */
4429
4430 bfd_vma roff;
4431
4432 roff = rel->r_offset;
4433 bfd_put_8 (output_bfd, 0x66, contents + roff);
4434 bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
4435 continue;
4436 }
4437 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_IE)
4438 {
4439 unsigned int val;
4440
4441 /* IE->LE transition:
4442 Originally it can be one of:
4443 movl foo, %eax
4444 movl foo, %reg
4445 addl foo, %reg
4446 We change it into:
4447 movl $foo, %eax
4448 movl $foo, %reg
4449 addl $foo, %reg. */
4450 val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
4451 if (val == 0xa1)
4452 {
4453 /* movl foo, %eax. */
4454 bfd_put_8 (output_bfd, 0xb8,
4455 contents + rel->r_offset - 1);
4456 }
4457 else
4458 {
4459 unsigned int type;
4460
4461 type = bfd_get_8 (input_bfd,
4462 contents + rel->r_offset - 2);
4463 switch (type)
4464 {
4465 case 0x8b:
4466 /* movl */
4467 bfd_put_8 (output_bfd, 0xc7,
4468 contents + rel->r_offset - 2);
4469 bfd_put_8 (output_bfd,
4470 0xc0 | ((val >> 3) & 7),
4471 contents + rel->r_offset - 1);
4472 break;
4473 case 0x03:
4474 /* addl */
4475 bfd_put_8 (output_bfd, 0x81,
4476 contents + rel->r_offset - 2);
4477 bfd_put_8 (output_bfd,
4478 0xc0 | ((val >> 3) & 7),
4479 contents + rel->r_offset - 1);
4480 break;
4481 default:
4482 BFD_FAIL ();
4483 break;
4484 }
4485 }
4486 bfd_put_32 (output_bfd, -elf_i386_tpoff (info, relocation),
4487 contents + rel->r_offset);
4488 continue;
4489 }
4490 else
4491 {
4492 unsigned int val, type;
4493
4494 /* {IE_32,GOTIE}->LE transition:
4495 Originally it can be one of:
4496 subl foo(%reg1), %reg2
4497 movl foo(%reg1), %reg2
4498 addl foo(%reg1), %reg2
4499 We change it into:
4500 subl $foo, %reg2
4501 movl $foo, %reg2 (6 byte form)
4502 addl $foo, %reg2. */
4503 type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
4504 val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
4505 if (type == 0x8b)
4506 {
4507 /* movl */
4508 bfd_put_8 (output_bfd, 0xc7,
4509 contents + rel->r_offset - 2);
4510 bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
4511 contents + rel->r_offset - 1);
4512 }
4513 else if (type == 0x2b)
4514 {
4515 /* subl */
4516 bfd_put_8 (output_bfd, 0x81,
4517 contents + rel->r_offset - 2);
4518 bfd_put_8 (output_bfd, 0xe8 | ((val >> 3) & 7),
4519 contents + rel->r_offset - 1);
4520 }
4521 else if (type == 0x03)
4522 {
4523 /* addl */
4524 bfd_put_8 (output_bfd, 0x81,
4525 contents + rel->r_offset - 2);
4526 bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
4527 contents + rel->r_offset - 1);
4528 }
4529 else
4530 BFD_FAIL ();
4531 if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GOTIE)
4532 bfd_put_32 (output_bfd, -elf_i386_tpoff (info, relocation),
4533 contents + rel->r_offset);
4534 else
4535 bfd_put_32 (output_bfd, elf_i386_tpoff (info, relocation),
4536 contents + rel->r_offset);
4537 continue;
4538 }
4539 }
4540
4541 if (htab->elf.sgot == NULL)
4542 abort ();
4543
4544 if (h != NULL)
4545 {
4546 off = h->got.offset;
4547 offplt = elf_i386_hash_entry (h)->tlsdesc_got;
4548 }
4549 else
4550 {
4551 if (local_got_offsets == NULL)
4552 abort ();
4553
4554 off = local_got_offsets[r_symndx];
4555 offplt = local_tlsdesc_gotents[r_symndx];
4556 }
4557
4558 if ((off & 1) != 0)
4559 off &= ~1;
4560 else
4561 {
4562 Elf_Internal_Rela outrel;
4563 int dr_type;
4564 asection *sreloc;
4565
4566 if (htab->elf.srelgot == NULL)
4567 abort ();
4568
4569 indx = h && h->dynindx != -1 ? h->dynindx : 0;
4570
4571 if (GOT_TLS_GDESC_P (tls_type))
4572 {
4573 bfd_byte *loc;
4574 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_DESC);
4575 BFD_ASSERT (htab->sgotplt_jump_table_size + offplt + 8
4576 <= htab->elf.sgotplt->size);
4577 outrel.r_offset = (htab->elf.sgotplt->output_section->vma
4578 + htab->elf.sgotplt->output_offset
4579 + offplt
4580 + htab->sgotplt_jump_table_size);
4581 sreloc = htab->elf.srelplt;
4582 loc = sreloc->contents;
4583 loc += (htab->next_tls_desc_index++
4584 * sizeof (Elf32_External_Rel));
4585 BFD_ASSERT (loc + sizeof (Elf32_External_Rel)
4586 <= sreloc->contents + sreloc->size);
4587 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
4588 if (indx == 0)
4589 {
4590 BFD_ASSERT (! unresolved_reloc);
4591 bfd_put_32 (output_bfd,
4592 relocation - elf_i386_dtpoff_base (info),
4593 htab->elf.sgotplt->contents + offplt
4594 + htab->sgotplt_jump_table_size + 4);
4595 }
4596 else
4597 {
4598 bfd_put_32 (output_bfd, 0,
4599 htab->elf.sgotplt->contents + offplt
4600 + htab->sgotplt_jump_table_size + 4);
4601 }
4602 }
4603
4604 sreloc = htab->elf.srelgot;
4605
4606 outrel.r_offset = (htab->elf.sgot->output_section->vma
4607 + htab->elf.sgot->output_offset + off);
4608
4609 if (GOT_TLS_GD_P (tls_type))
4610 dr_type = R_386_TLS_DTPMOD32;
4611 else if (GOT_TLS_GDESC_P (tls_type))
4612 goto dr_done;
4613 else if (tls_type == GOT_TLS_IE_POS)
4614 dr_type = R_386_TLS_TPOFF;
4615 else
4616 dr_type = R_386_TLS_TPOFF32;
4617
4618 if (dr_type == R_386_TLS_TPOFF && indx == 0)
4619 bfd_put_32 (output_bfd,
4620 relocation - elf_i386_dtpoff_base (info),
4621 htab->elf.sgot->contents + off);
4622 else if (dr_type == R_386_TLS_TPOFF32 && indx == 0)
4623 bfd_put_32 (output_bfd,
4624 elf_i386_dtpoff_base (info) - relocation,
4625 htab->elf.sgot->contents + off);
4626 else if (dr_type != R_386_TLS_DESC)
4627 bfd_put_32 (output_bfd, 0,
4628 htab->elf.sgot->contents + off);
4629 outrel.r_info = ELF32_R_INFO (indx, dr_type);
4630
4631 elf_append_rel (output_bfd, sreloc, &outrel);
4632
4633 if (GOT_TLS_GD_P (tls_type))
4634 {
4635 if (indx == 0)
4636 {
4637 BFD_ASSERT (! unresolved_reloc);
4638 bfd_put_32 (output_bfd,
4639 relocation - elf_i386_dtpoff_base (info),
4640 htab->elf.sgot->contents + off + 4);
4641 }
4642 else
4643 {
4644 bfd_put_32 (output_bfd, 0,
4645 htab->elf.sgot->contents + off + 4);
4646 outrel.r_info = ELF32_R_INFO (indx,
4647 R_386_TLS_DTPOFF32);
4648 outrel.r_offset += 4;
4649 elf_append_rel (output_bfd, sreloc, &outrel);
4650 }
4651 }
4652 else if (tls_type == GOT_TLS_IE_BOTH)
4653 {
4654 bfd_put_32 (output_bfd,
4655 (indx == 0
4656 ? relocation - elf_i386_dtpoff_base (info)
4657 : 0),
4658 htab->elf.sgot->contents + off + 4);
4659 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF);
4660 outrel.r_offset += 4;
4661 elf_append_rel (output_bfd, sreloc, &outrel);
4662 }
4663
4664 dr_done:
4665 if (h != NULL)
4666 h->got.offset |= 1;
4667 else
4668 local_got_offsets[r_symndx] |= 1;
4669 }
4670
4671 if (off >= (bfd_vma) -2
4672 && ! GOT_TLS_GDESC_P (tls_type))
4673 abort ();
4674 if (r_type == R_386_TLS_GOTDESC
4675 || r_type == R_386_TLS_DESC_CALL)
4676 {
4677 relocation = htab->sgotplt_jump_table_size + offplt;
4678 unresolved_reloc = FALSE;
4679 }
4680 else if (r_type == ELF32_R_TYPE (rel->r_info))
4681 {
4682 bfd_vma g_o_t = htab->elf.sgotplt->output_section->vma
4683 + htab->elf.sgotplt->output_offset;
4684 relocation = htab->elf.sgot->output_section->vma
4685 + htab->elf.sgot->output_offset + off - g_o_t;
4686 if ((r_type == R_386_TLS_IE || r_type == R_386_TLS_GOTIE)
4687 && tls_type == GOT_TLS_IE_BOTH)
4688 relocation += 4;
4689 if (r_type == R_386_TLS_IE)
4690 relocation += g_o_t;
4691 unresolved_reloc = FALSE;
4692 }
4693 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GD)
4694 {
4695 unsigned int val, type;
4696 bfd_vma roff;
4697
4698 /* GD->IE transition. */
4699 type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
4700 val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
4701 if (type == 0x04)
4702 {
4703 /* leal foo(,%reg,1), %eax; call ___tls_get_addr
4704 Change it into:
4705 movl %gs:0, %eax; subl $foo@gottpoff(%reg), %eax. */
4706 val >>= 3;
4707 roff = rel->r_offset - 3;
4708 }
4709 else
4710 {
4711 /* leal foo(%reg), %eax; call ___tls_get_addr; nop
4712 Change it into:
4713 movl %gs:0, %eax; subl $foo@gottpoff(%reg), %eax. */
4714 roff = rel->r_offset - 2;
4715 }
4716 memcpy (contents + roff,
4717 "\x65\xa1\0\0\0\0\x2b\x80\0\0\0", 12);
4718 contents[roff + 7] = 0x80 | (val & 7);
4719 /* If foo is used only with foo@gotntpoff(%reg) and
4720 foo@indntpoff, but not with foo@gottpoff(%reg), change
4721 subl $foo@gottpoff(%reg), %eax
4722 into:
4723 addl $foo@gotntpoff(%reg), %eax. */
4724 if (tls_type == GOT_TLS_IE_POS)
4725 contents[roff + 6] = 0x03;
4726 bfd_put_32 (output_bfd,
4727 htab->elf.sgot->output_section->vma
4728 + htab->elf.sgot->output_offset + off
4729 - htab->elf.sgotplt->output_section->vma
4730 - htab->elf.sgotplt->output_offset,
4731 contents + roff + 8);
4732 /* Skip R_386_PLT32. */
4733 rel++;
4734 wrel++;
4735 continue;
4736 }
4737 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GOTDESC)
4738 {
4739 /* GDesc -> IE transition.
4740 It's originally something like:
4741 leal x@tlsdesc(%ebx), %eax
4742
4743 Change it to:
4744 movl x@gotntpoff(%ebx), %eax # before xchg %ax,%ax
4745 or:
4746 movl x@gottpoff(%ebx), %eax # before negl %eax
4747
4748 Registers other than %eax may be set up here. */
4749
4750 bfd_vma roff;
4751
4752 /* First, make sure it's a leal adding ebx to a 32-bit
4753 offset into any register, although it's probably
4754 almost always going to be eax. */
4755 roff = rel->r_offset;
4756
4757 /* Now modify the instruction as appropriate. */
4758 /* To turn a leal into a movl in the form we use it, it
4759 suffices to change the first byte from 0x8d to 0x8b.
4760 aoliva FIXME: should we decide to keep the leal, all
4761 we have to do is remove the statement below, and
4762 adjust the relaxation of R_386_TLS_DESC_CALL. */
4763 bfd_put_8 (output_bfd, 0x8b, contents + roff - 2);
4764
4765 if (tls_type == GOT_TLS_IE_BOTH)
4766 off += 4;
4767
4768 bfd_put_32 (output_bfd,
4769 htab->elf.sgot->output_section->vma
4770 + htab->elf.sgot->output_offset + off
4771 - htab->elf.sgotplt->output_section->vma
4772 - htab->elf.sgotplt->output_offset,
4773 contents + roff);
4774 continue;
4775 }
4776 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_DESC_CALL)
4777 {
4778 /* GDesc -> IE transition.
4779 It's originally:
4780 call *(%eax)
4781
4782 Change it to:
4783 xchg %ax,%ax
4784 or
4785 negl %eax
4786 depending on how we transformed the TLS_GOTDESC above.
4787 */
4788
4789 bfd_vma roff;
4790
4791 roff = rel->r_offset;
4792
4793 /* Now modify the instruction as appropriate. */
4794 if (tls_type != GOT_TLS_IE_NEG)
4795 {
4796 /* xchg %ax,%ax */
4797 bfd_put_8 (output_bfd, 0x66, contents + roff);
4798 bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
4799 }
4800 else
4801 {
4802 /* negl %eax */
4803 bfd_put_8 (output_bfd, 0xf7, contents + roff);
4804 bfd_put_8 (output_bfd, 0xd8, contents + roff + 1);
4805 }
4806
4807 continue;
4808 }
4809 else
4810 BFD_ASSERT (FALSE);
4811 break;
4812
4813 case R_386_TLS_LDM:
4814 if (! elf_i386_tls_transition (info, input_bfd,
4815 input_section, contents,
4816 symtab_hdr, sym_hashes,
4817 &r_type, GOT_UNKNOWN, rel,
4818 relend, h, r_symndx))
4819 return FALSE;
4820
4821 if (r_type != R_386_TLS_LDM)
4822 {
4823 /* LD->LE transition:
4824 leal foo(%reg), %eax; call ___tls_get_addr.
4825 We change it into:
4826 movl %gs:0, %eax; nop; leal 0(%esi,1), %esi. */
4827 BFD_ASSERT (r_type == R_386_TLS_LE_32);
4828 memcpy (contents + rel->r_offset - 2,
4829 "\x65\xa1\0\0\0\0\x90\x8d\x74\x26", 11);
4830 /* Skip R_386_PC32/R_386_PLT32. */
4831 rel++;
4832 wrel++;
4833 continue;
4834 }
4835
4836 if (htab->elf.sgot == NULL)
4837 abort ();
4838
4839 off = htab->tls_ldm_got.offset;
4840 if (off & 1)
4841 off &= ~1;
4842 else
4843 {
4844 Elf_Internal_Rela outrel;
4845
4846 if (htab->elf.srelgot == NULL)
4847 abort ();
4848
4849 outrel.r_offset = (htab->elf.sgot->output_section->vma
4850 + htab->elf.sgot->output_offset + off);
4851
4852 bfd_put_32 (output_bfd, 0,
4853 htab->elf.sgot->contents + off);
4854 bfd_put_32 (output_bfd, 0,
4855 htab->elf.sgot->contents + off + 4);
4856 outrel.r_info = ELF32_R_INFO (0, R_386_TLS_DTPMOD32);
4857 elf_append_rel (output_bfd, htab->elf.srelgot, &outrel);
4858 htab->tls_ldm_got.offset |= 1;
4859 }
4860 relocation = htab->elf.sgot->output_section->vma
4861 + htab->elf.sgot->output_offset + off
4862 - htab->elf.sgotplt->output_section->vma
4863 - htab->elf.sgotplt->output_offset;
4864 unresolved_reloc = FALSE;
4865 break;
4866
4867 case R_386_TLS_LDO_32:
4868 if (!bfd_link_executable (info)
4869 || (input_section->flags & SEC_CODE) == 0)
4870 relocation -= elf_i386_dtpoff_base (info);
4871 else
4872 /* When converting LDO to LE, we must negate. */
4873 relocation = -elf_i386_tpoff (info, relocation);
4874 break;
4875
4876 case R_386_TLS_LE_32:
4877 case R_386_TLS_LE:
4878 if (!bfd_link_executable (info))
4879 {
4880 Elf_Internal_Rela outrel;
4881 asection *sreloc;
4882
4883 outrel.r_offset = rel->r_offset
4884 + input_section->output_section->vma
4885 + input_section->output_offset;
4886 if (h != NULL && h->dynindx != -1)
4887 indx = h->dynindx;
4888 else
4889 indx = 0;
4890 if (r_type == R_386_TLS_LE_32)
4891 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF32);
4892 else
4893 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF);
4894 sreloc = elf_section_data (input_section)->sreloc;
4895 if (sreloc == NULL)
4896 abort ();
4897 elf_append_rel (output_bfd, sreloc, &outrel);
4898 if (indx)
4899 continue;
4900 else if (r_type == R_386_TLS_LE_32)
4901 relocation = elf_i386_dtpoff_base (info) - relocation;
4902 else
4903 relocation -= elf_i386_dtpoff_base (info);
4904 }
4905 else if (r_type == R_386_TLS_LE_32)
4906 relocation = elf_i386_tpoff (info, relocation);
4907 else
4908 relocation = -elf_i386_tpoff (info, relocation);
4909 break;
4910
4911 default:
4912 break;
4913 }
4914
4915 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
4916 because such sections are not SEC_ALLOC and thus ld.so will
4917 not process them. */
4918 if (unresolved_reloc
4919 && !((input_section->flags & SEC_DEBUGGING) != 0
4920 && h->def_dynamic)
4921 && _bfd_elf_section_offset (output_bfd, info, input_section,
4922 rel->r_offset) != (bfd_vma) -1)
4923 {
4924 (*_bfd_error_handler)
4925 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
4926 input_bfd,
4927 input_section,
4928 (long) rel->r_offset,
4929 howto->name,
4930 h->root.root.string);
4931 return FALSE;
4932 }
4933
4934 do_relocation:
4935 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4936 contents, rel->r_offset,
4937 relocation, 0);
4938
4939 check_relocation_error:
4940 if (r != bfd_reloc_ok)
4941 {
4942 const char *name;
4943
4944 if (h != NULL)
4945 name = h->root.root.string;
4946 else
4947 {
4948 name = bfd_elf_string_from_elf_section (input_bfd,
4949 symtab_hdr->sh_link,
4950 sym->st_name);
4951 if (name == NULL)
4952 return FALSE;
4953 if (*name == '\0')
4954 name = bfd_section_name (input_bfd, sec);
4955 }
4956
4957 if (r == bfd_reloc_overflow)
4958 {
4959 if (! ((*info->callbacks->reloc_overflow)
4960 (info, (h ? &h->root : NULL), name, howto->name,
4961 (bfd_vma) 0, input_bfd, input_section,
4962 rel->r_offset)))
4963 return FALSE;
4964 }
4965 else
4966 {
4967 (*_bfd_error_handler)
4968 (_("%B(%A+0x%lx): reloc against `%s': error %d"),
4969 input_bfd, input_section,
4970 (long) rel->r_offset, name, (int) r);
4971 return FALSE;
4972 }
4973 }
4974
4975 if (wrel != rel)
4976 *wrel = *rel;
4977 }
4978
4979 if (wrel != rel)
4980 {
4981 Elf_Internal_Shdr *rel_hdr;
4982 size_t deleted = rel - wrel;
4983
4984 rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section);
4985 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
4986 if (rel_hdr->sh_size == 0)
4987 {
4988 /* It is too late to remove an empty reloc section. Leave
4989 one NONE reloc.
4990 ??? What is wrong with an empty section??? */
4991 rel_hdr->sh_size = rel_hdr->sh_entsize;
4992 deleted -= 1;
4993 }
4994 rel_hdr = _bfd_elf_single_rel_hdr (input_section);
4995 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
4996 input_section->reloc_count -= deleted;
4997 }
4998
4999 return TRUE;
5000 }
5001
5002 /* Finish up dynamic symbol handling. We set the contents of various
5003 dynamic sections here. */
5004
5005 static bfd_boolean
5006 elf_i386_finish_dynamic_symbol (bfd *output_bfd,
5007 struct bfd_link_info *info,
5008 struct elf_link_hash_entry *h,
5009 Elf_Internal_Sym *sym)
5010 {
5011 struct elf_i386_link_hash_table *htab;
5012 unsigned plt_entry_size;
5013 const struct elf_i386_backend_data *abed;
5014 struct elf_i386_link_hash_entry *eh;
5015 bfd_boolean local_undefweak;
5016
5017 htab = elf_i386_hash_table (info);
5018 if (htab == NULL)
5019 return FALSE;
5020
5021 abed = get_elf_i386_backend_data (output_bfd);
5022 plt_entry_size = GET_PLT_ENTRY_SIZE (output_bfd);
5023
5024 eh = (struct elf_i386_link_hash_entry *) h;
5025
5026 /* We keep PLT/GOT entries without dynamic PLT/GOT relocations for
5027 resolved undefined weak symbols in executable so that their
5028 references have value 0 at run-time. */
5029 local_undefweak = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
5030
5031 if (h->plt.offset != (bfd_vma) -1)
5032 {
5033 bfd_vma plt_index;
5034 bfd_vma got_offset;
5035 Elf_Internal_Rela rel;
5036 bfd_byte *loc;
5037 asection *plt, *gotplt, *relplt;
5038
5039 /* When building a static executable, use .iplt, .igot.plt and
5040 .rel.iplt sections for STT_GNU_IFUNC symbols. */
5041 if (htab->elf.splt != NULL)
5042 {
5043 plt = htab->elf.splt;
5044 gotplt = htab->elf.sgotplt;
5045 relplt = htab->elf.srelplt;
5046 }
5047 else
5048 {
5049 plt = htab->elf.iplt;
5050 gotplt = htab->elf.igotplt;
5051 relplt = htab->elf.irelplt;
5052 }
5053
5054 /* This symbol has an entry in the procedure linkage table. Set
5055 it up. */
5056
5057 if ((h->dynindx == -1
5058 && !local_undefweak
5059 && !((h->forced_local || bfd_link_executable (info))
5060 && h->def_regular
5061 && h->type == STT_GNU_IFUNC))
5062 || plt == NULL
5063 || gotplt == NULL
5064 || relplt == NULL)
5065 abort ();
5066
5067 /* Get the index in the procedure linkage table which
5068 corresponds to this symbol. This is the index of this symbol
5069 in all the symbols for which we are making plt entries. The
5070 first entry in the procedure linkage table is reserved.
5071
5072 Get the offset into the .got table of the entry that
5073 corresponds to this function. Each .got entry is 4 bytes.
5074 The first three are reserved.
5075
5076 For static executables, we don't reserve anything. */
5077
5078 if (plt == htab->elf.splt)
5079 {
5080 got_offset = h->plt.offset / plt_entry_size - 1;
5081 got_offset = (got_offset + 3) * 4;
5082 }
5083 else
5084 {
5085 got_offset = h->plt.offset / plt_entry_size;
5086 got_offset = got_offset * 4;
5087 }
5088
5089 /* Fill in the entry in the procedure linkage table. */
5090 if (! bfd_link_pic (info))
5091 {
5092 memcpy (plt->contents + h->plt.offset, abed->plt->plt_entry,
5093 abed->plt->plt_entry_size);
5094 bfd_put_32 (output_bfd,
5095 (gotplt->output_section->vma
5096 + gotplt->output_offset
5097 + got_offset),
5098 plt->contents + h->plt.offset
5099 + abed->plt->plt_got_offset);
5100
5101 if (abed->is_vxworks)
5102 {
5103 int s, k, reloc_index;
5104
5105 /* Create the R_386_32 relocation referencing the GOT
5106 for this PLT entry. */
5107
5108 /* S: Current slot number (zero-based). */
5109 s = ((h->plt.offset - abed->plt->plt_entry_size)
5110 / abed->plt->plt_entry_size);
5111 /* K: Number of relocations for PLTResolve. */
5112 if (bfd_link_pic (info))
5113 k = PLTRESOLVE_RELOCS_SHLIB;
5114 else
5115 k = PLTRESOLVE_RELOCS;
5116 /* Skip the PLTresolve relocations, and the relocations for
5117 the other PLT slots. */
5118 reloc_index = k + s * PLT_NON_JUMP_SLOT_RELOCS;
5119 loc = (htab->srelplt2->contents + reloc_index
5120 * sizeof (Elf32_External_Rel));
5121
5122 rel.r_offset = (htab->elf.splt->output_section->vma
5123 + htab->elf.splt->output_offset
5124 + h->plt.offset + 2),
5125 rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
5126 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
5127
5128 /* Create the R_386_32 relocation referencing the beginning of
5129 the PLT for this GOT entry. */
5130 rel.r_offset = (htab->elf.sgotplt->output_section->vma
5131 + htab->elf.sgotplt->output_offset
5132 + got_offset);
5133 rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_386_32);
5134 bfd_elf32_swap_reloc_out (output_bfd, &rel,
5135 loc + sizeof (Elf32_External_Rel));
5136 }
5137 }
5138 else
5139 {
5140 memcpy (plt->contents + h->plt.offset, abed->plt->pic_plt_entry,
5141 abed->plt->plt_entry_size);
5142 bfd_put_32 (output_bfd, got_offset,
5143 plt->contents + h->plt.offset
5144 + abed->plt->plt_got_offset);
5145 }
5146
5147 /* Fill in the entry in the global offset table. Leave the entry
5148 as zero for undefined weak symbol in PIE. No PLT relocation
5149 against undefined weak symbol in PIE. */
5150 if (!local_undefweak)
5151 {
5152 bfd_put_32 (output_bfd,
5153 (plt->output_section->vma
5154 + plt->output_offset
5155 + h->plt.offset
5156 + abed->plt->plt_lazy_offset),
5157 gotplt->contents + got_offset);
5158
5159 /* Fill in the entry in the .rel.plt section. */
5160 rel.r_offset = (gotplt->output_section->vma
5161 + gotplt->output_offset
5162 + got_offset);
5163 if (h->dynindx == -1
5164 || ((bfd_link_executable (info)
5165 || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
5166 && h->def_regular
5167 && h->type == STT_GNU_IFUNC))
5168 {
5169 /* If an STT_GNU_IFUNC symbol is locally defined, generate
5170 R_386_IRELATIVE instead of R_386_JUMP_SLOT. Store addend
5171 in the .got.plt section. */
5172 bfd_put_32 (output_bfd,
5173 (h->root.u.def.value
5174 + h->root.u.def.section->output_section->vma
5175 + h->root.u.def.section->output_offset),
5176 gotplt->contents + got_offset);
5177 rel.r_info = ELF32_R_INFO (0, R_386_IRELATIVE);
5178 /* R_386_IRELATIVE comes last. */
5179 plt_index = htab->next_irelative_index--;
5180 }
5181 else
5182 {
5183 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_JUMP_SLOT);
5184 plt_index = htab->next_jump_slot_index++;
5185 }
5186
5187 loc = relplt->contents + plt_index * sizeof (Elf32_External_Rel);
5188 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
5189
5190 /* Don't fill PLT entry for static executables. */
5191 if (plt == htab->elf.splt)
5192 {
5193 bfd_put_32 (output_bfd,
5194 plt_index * sizeof (Elf32_External_Rel),
5195 plt->contents + h->plt.offset
5196 + abed->plt->plt_reloc_offset);
5197 bfd_put_32 (output_bfd, - (h->plt.offset
5198 + abed->plt->plt_plt_offset + 4),
5199 plt->contents + h->plt.offset
5200 + abed->plt->plt_plt_offset);
5201 }
5202 }
5203 }
5204 else if (eh->plt_got.offset != (bfd_vma) -1)
5205 {
5206 bfd_vma got_offset, plt_offset;
5207 asection *plt, *got, *gotplt;
5208 const bfd_byte *got_plt_entry;
5209
5210 /* Offset of displacement of the indirect jump. */
5211 bfd_vma plt_got_offset = 2;
5212
5213 /* Set the entry in the GOT procedure linkage table. */
5214 plt = htab->plt_got;
5215 got = htab->elf.sgot;
5216 gotplt = htab->elf.sgotplt;
5217 got_offset = h->got.offset;
5218
5219 if (got_offset == (bfd_vma) -1
5220 || plt == NULL
5221 || got == NULL
5222 || gotplt == NULL)
5223 abort ();
5224
5225 /* Fill in the entry in the GOT procedure linkage table. */
5226 if (! bfd_link_pic (info))
5227 {
5228 got_plt_entry = elf_i386_got_plt_entry;
5229 got_offset += got->output_section->vma + got->output_offset;
5230 }
5231 else
5232 {
5233 got_plt_entry = elf_i386_pic_got_plt_entry;
5234 got_offset += (got->output_section->vma
5235 + got->output_offset
5236 - gotplt->output_section->vma
5237 - gotplt->output_offset);
5238 }
5239
5240 plt_offset = eh->plt_got.offset;
5241 memcpy (plt->contents + plt_offset, got_plt_entry,
5242 sizeof (elf_i386_got_plt_entry));
5243 bfd_put_32 (output_bfd, got_offset,
5244 plt->contents + plt_offset + plt_got_offset);
5245 }
5246
5247 if (!local_undefweak
5248 && !h->def_regular
5249 && (h->plt.offset != (bfd_vma) -1
5250 || eh->plt_got.offset != (bfd_vma) -1))
5251 {
5252 /* Mark the symbol as undefined, rather than as defined in
5253 the .plt section. Leave the value if there were any
5254 relocations where pointer equality matters (this is a clue
5255 for the dynamic linker, to make function pointer
5256 comparisons work between an application and shared
5257 library), otherwise set it to zero. If a function is only
5258 called from a binary, there is no need to slow down
5259 shared libraries because of that. */
5260 sym->st_shndx = SHN_UNDEF;
5261 if (!h->pointer_equality_needed)
5262 sym->st_value = 0;
5263 }
5264
5265 /* Don't generate dynamic GOT relocation against undefined weak
5266 symbol in executable. */
5267 if (h->got.offset != (bfd_vma) -1
5268 && ! GOT_TLS_GD_ANY_P (elf_i386_hash_entry(h)->tls_type)
5269 && (elf_i386_hash_entry(h)->tls_type & GOT_TLS_IE) == 0
5270 && !local_undefweak)
5271 {
5272 Elf_Internal_Rela rel;
5273
5274 /* This symbol has an entry in the global offset table. Set it
5275 up. */
5276
5277 if (htab->elf.sgot == NULL || htab->elf.srelgot == NULL)
5278 abort ();
5279
5280 rel.r_offset = (htab->elf.sgot->output_section->vma
5281 + htab->elf.sgot->output_offset
5282 + (h->got.offset & ~(bfd_vma) 1));
5283
5284 /* If this is a static link, or it is a -Bsymbolic link and the
5285 symbol is defined locally or was forced to be local because
5286 of a version file, we just want to emit a RELATIVE reloc.
5287 The entry in the global offset table will already have been
5288 initialized in the relocate_section function. */
5289 if (h->def_regular
5290 && h->type == STT_GNU_IFUNC)
5291 {
5292 if (bfd_link_pic (info))
5293 {
5294 /* Generate R_386_GLOB_DAT. */
5295 goto do_glob_dat;
5296 }
5297 else
5298 {
5299 asection *plt;
5300
5301 if (!h->pointer_equality_needed)
5302 abort ();
5303
5304 /* For non-shared object, we can't use .got.plt, which
5305 contains the real function addres if we need pointer
5306 equality. We load the GOT entry with the PLT entry. */
5307 plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt;
5308 bfd_put_32 (output_bfd,
5309 (plt->output_section->vma
5310 + plt->output_offset + h->plt.offset),
5311 htab->elf.sgot->contents + h->got.offset);
5312 return TRUE;
5313 }
5314 }
5315 else if (bfd_link_pic (info)
5316 && SYMBOL_REFERENCES_LOCAL (info, h))
5317 {
5318 BFD_ASSERT((h->got.offset & 1) != 0);
5319 rel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
5320 }
5321 else
5322 {
5323 BFD_ASSERT((h->got.offset & 1) == 0);
5324 do_glob_dat:
5325 bfd_put_32 (output_bfd, (bfd_vma) 0,
5326 htab->elf.sgot->contents + h->got.offset);
5327 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_GLOB_DAT);
5328 }
5329
5330 elf_append_rel (output_bfd, htab->elf.srelgot, &rel);
5331 }
5332
5333 if (h->needs_copy)
5334 {
5335 Elf_Internal_Rela rel;
5336
5337 /* This symbol needs a copy reloc. Set it up. */
5338
5339 if (h->dynindx == -1
5340 || (h->root.type != bfd_link_hash_defined
5341 && h->root.type != bfd_link_hash_defweak)
5342 || htab->srelbss == NULL)
5343 abort ();
5344
5345 rel.r_offset = (h->root.u.def.value
5346 + h->root.u.def.section->output_section->vma
5347 + h->root.u.def.section->output_offset);
5348 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_COPY);
5349 elf_append_rel (output_bfd, htab->srelbss, &rel);
5350 }
5351
5352 return TRUE;
5353 }
5354
5355 /* Finish up local dynamic symbol handling. We set the contents of
5356 various dynamic sections here. */
5357
5358 static bfd_boolean
5359 elf_i386_finish_local_dynamic_symbol (void **slot, void *inf)
5360 {
5361 struct elf_link_hash_entry *h
5362 = (struct elf_link_hash_entry *) *slot;
5363 struct bfd_link_info *info
5364 = (struct bfd_link_info *) inf;
5365
5366 return elf_i386_finish_dynamic_symbol (info->output_bfd, info,
5367 h, NULL);
5368 }
5369
5370 /* Finish up undefined weak symbol handling in PIE. Fill its PLT entry
5371 here since undefined weak symbol may not be dynamic and may not be
5372 called for elf_i386_finish_dynamic_symbol. */
5373
5374 static bfd_boolean
5375 elf_i386_pie_finish_undefweak_symbol (struct bfd_hash_entry *bh,
5376 void *inf)
5377 {
5378 struct elf_link_hash_entry *h = (struct elf_link_hash_entry *) bh;
5379 struct bfd_link_info *info = (struct bfd_link_info *) inf;
5380
5381 if (h->root.type != bfd_link_hash_undefweak
5382 || h->dynindx != -1)
5383 return TRUE;
5384
5385 return elf_i386_finish_dynamic_symbol (info->output_bfd,
5386 info, h, NULL);
5387 }
5388
5389 /* Used to decide how to sort relocs in an optimal manner for the
5390 dynamic linker, before writing them out. */
5391
5392 static enum elf_reloc_type_class
5393 elf_i386_reloc_type_class (const struct bfd_link_info *info,
5394 const asection *rel_sec ATTRIBUTE_UNUSED,
5395 const Elf_Internal_Rela *rela)
5396 {
5397 bfd *abfd = info->output_bfd;
5398 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
5399 struct elf_link_hash_table *htab = elf_hash_table (info);
5400
5401 if (htab->dynsym != NULL
5402 && htab->dynsym->contents != NULL)
5403 {
5404 /* Check relocation against STT_GNU_IFUNC symbol if there are
5405 dynamic symbols. */
5406 unsigned long r_symndx = ELF32_R_SYM (rela->r_info);
5407 Elf_Internal_Sym sym;
5408 if (!bed->s->swap_symbol_in (abfd,
5409 (htab->dynsym->contents
5410 + r_symndx * sizeof (Elf32_External_Sym)),
5411 0, &sym))
5412 abort ();
5413
5414 if (ELF32_ST_TYPE (sym.st_info) == STT_GNU_IFUNC)
5415 return reloc_class_ifunc;
5416 }
5417
5418 switch (ELF32_R_TYPE (rela->r_info))
5419 {
5420 case R_386_RELATIVE:
5421 return reloc_class_relative;
5422 case R_386_JUMP_SLOT:
5423 return reloc_class_plt;
5424 case R_386_COPY:
5425 return reloc_class_copy;
5426 default:
5427 return reloc_class_normal;
5428 }
5429 }
5430
5431 /* Finish up the dynamic sections. */
5432
5433 static bfd_boolean
5434 elf_i386_finish_dynamic_sections (bfd *output_bfd,
5435 struct bfd_link_info *info)
5436 {
5437 struct elf_i386_link_hash_table *htab;
5438 bfd *dynobj;
5439 asection *sdyn;
5440 const struct elf_i386_backend_data *abed;
5441
5442 htab = elf_i386_hash_table (info);
5443 if (htab == NULL)
5444 return FALSE;
5445
5446 dynobj = htab->elf.dynobj;
5447 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
5448 abed = get_elf_i386_backend_data (output_bfd);
5449
5450 if (htab->elf.dynamic_sections_created)
5451 {
5452 Elf32_External_Dyn *dyncon, *dynconend;
5453
5454 if (sdyn == NULL || htab->elf.sgot == NULL)
5455 abort ();
5456
5457 dyncon = (Elf32_External_Dyn *) sdyn->contents;
5458 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
5459 for (; dyncon < dynconend; dyncon++)
5460 {
5461 Elf_Internal_Dyn dyn;
5462 asection *s;
5463
5464 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
5465
5466 switch (dyn.d_tag)
5467 {
5468 default:
5469 if (abed->is_vxworks
5470 && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
5471 break;
5472 continue;
5473
5474 case DT_PLTGOT:
5475 s = htab->elf.sgotplt;
5476 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
5477 break;
5478
5479 case DT_JMPREL:
5480 s = htab->elf.srelplt;
5481 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
5482 break;
5483
5484 case DT_PLTRELSZ:
5485 s = htab->elf.srelplt;
5486 dyn.d_un.d_val = s->size;
5487 break;
5488
5489 case DT_RELSZ:
5490 /* My reading of the SVR4 ABI indicates that the
5491 procedure linkage table relocs (DT_JMPREL) should be
5492 included in the overall relocs (DT_REL). This is
5493 what Solaris does. However, UnixWare can not handle
5494 that case. Therefore, we override the DT_RELSZ entry
5495 here to make it not include the JMPREL relocs. */
5496 s = htab->elf.srelplt;
5497 if (s == NULL)
5498 continue;
5499 dyn.d_un.d_val -= s->size;
5500 break;
5501
5502 case DT_REL:
5503 /* We may not be using the standard ELF linker script.
5504 If .rel.plt is the first .rel section, we adjust
5505 DT_REL to not include it. */
5506 s = htab->elf.srelplt;
5507 if (s == NULL)
5508 continue;
5509 if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
5510 continue;
5511 dyn.d_un.d_ptr += s->size;
5512 break;
5513 }
5514
5515 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5516 }
5517
5518 /* Fill in the first entry in the procedure linkage table. */
5519 if (htab->elf.splt && htab->elf.splt->size > 0)
5520 {
5521 if (bfd_link_pic (info))
5522 {
5523 memcpy (htab->elf.splt->contents, abed->plt->pic_plt0_entry,
5524 abed->plt->plt0_entry_size);
5525 memset (htab->elf.splt->contents + abed->plt->plt0_entry_size,
5526 abed->plt0_pad_byte,
5527 abed->plt->plt_entry_size - abed->plt->plt0_entry_size);
5528 }
5529 else
5530 {
5531 memcpy (htab->elf.splt->contents, abed->plt->plt0_entry,
5532 abed->plt->plt0_entry_size);
5533 memset (htab->elf.splt->contents + abed->plt->plt0_entry_size,
5534 abed->plt0_pad_byte,
5535 abed->plt->plt_entry_size - abed->plt->plt0_entry_size);
5536 bfd_put_32 (output_bfd,
5537 (htab->elf.sgotplt->output_section->vma
5538 + htab->elf.sgotplt->output_offset
5539 + 4),
5540 htab->elf.splt->contents
5541 + abed->plt->plt0_got1_offset);
5542 bfd_put_32 (output_bfd,
5543 (htab->elf.sgotplt->output_section->vma
5544 + htab->elf.sgotplt->output_offset
5545 + 8),
5546 htab->elf.splt->contents
5547 + abed->plt->plt0_got2_offset);
5548
5549 if (abed->is_vxworks)
5550 {
5551 Elf_Internal_Rela rel;
5552
5553 /* Generate a relocation for _GLOBAL_OFFSET_TABLE_ + 4.
5554 On IA32 we use REL relocations so the addend goes in
5555 the PLT directly. */
5556 rel.r_offset = (htab->elf.splt->output_section->vma
5557 + htab->elf.splt->output_offset
5558 + abed->plt->plt0_got1_offset);
5559 rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
5560 bfd_elf32_swap_reloc_out (output_bfd, &rel,
5561 htab->srelplt2->contents);
5562 /* Generate a relocation for _GLOBAL_OFFSET_TABLE_ + 8. */
5563 rel.r_offset = (htab->elf.splt->output_section->vma
5564 + htab->elf.splt->output_offset
5565 + abed->plt->plt0_got2_offset);
5566 rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
5567 bfd_elf32_swap_reloc_out (output_bfd, &rel,
5568 htab->srelplt2->contents +
5569 sizeof (Elf32_External_Rel));
5570 }
5571 }
5572
5573 /* UnixWare sets the entsize of .plt to 4, although that doesn't
5574 really seem like the right value. */
5575 elf_section_data (htab->elf.splt->output_section)
5576 ->this_hdr.sh_entsize = 4;
5577
5578 /* Correct the .rel.plt.unloaded relocations. */
5579 if (abed->is_vxworks && !bfd_link_pic (info))
5580 {
5581 int num_plts = (htab->elf.splt->size
5582 / abed->plt->plt_entry_size) - 1;
5583 unsigned char *p;
5584
5585 p = htab->srelplt2->contents;
5586 if (bfd_link_pic (info))
5587 p += PLTRESOLVE_RELOCS_SHLIB * sizeof (Elf32_External_Rel);
5588 else
5589 p += PLTRESOLVE_RELOCS * sizeof (Elf32_External_Rel);
5590
5591 for (; num_plts; num_plts--)
5592 {
5593 Elf_Internal_Rela rel;
5594 bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
5595 rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
5596 bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
5597 p += sizeof (Elf32_External_Rel);
5598
5599 bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
5600 rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_386_32);
5601 bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
5602 p += sizeof (Elf32_External_Rel);
5603 }
5604 }
5605 }
5606 }
5607
5608 if (htab->elf.sgotplt)
5609 {
5610 if (bfd_is_abs_section (htab->elf.sgotplt->output_section))
5611 {
5612 (*_bfd_error_handler)
5613 (_("discarded output section: `%A'"), htab->elf.sgotplt);
5614 return FALSE;
5615 }
5616
5617 /* Fill in the first three entries in the global offset table. */
5618 if (htab->elf.sgotplt->size > 0)
5619 {
5620 bfd_put_32 (output_bfd,
5621 (sdyn == NULL ? 0
5622 : sdyn->output_section->vma + sdyn->output_offset),
5623 htab->elf.sgotplt->contents);
5624 bfd_put_32 (output_bfd, 0, htab->elf.sgotplt->contents + 4);
5625 bfd_put_32 (output_bfd, 0, htab->elf.sgotplt->contents + 8);
5626 }
5627
5628 elf_section_data (htab->elf.sgotplt->output_section)->this_hdr.sh_entsize = 4;
5629 }
5630
5631 /* Adjust .eh_frame for .plt section. */
5632 if (htab->plt_eh_frame != NULL
5633 && htab->plt_eh_frame->contents != NULL)
5634 {
5635 if (htab->elf.splt != NULL
5636 && htab->elf.splt->size != 0
5637 && (htab->elf.splt->flags & SEC_EXCLUDE) == 0
5638 && htab->elf.splt->output_section != NULL
5639 && htab->plt_eh_frame->output_section != NULL)
5640 {
5641 bfd_vma plt_start = htab->elf.splt->output_section->vma;
5642 bfd_vma eh_frame_start = htab->plt_eh_frame->output_section->vma
5643 + htab->plt_eh_frame->output_offset
5644 + PLT_FDE_START_OFFSET;
5645 bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
5646 htab->plt_eh_frame->contents
5647 + PLT_FDE_START_OFFSET);
5648 }
5649 if (htab->plt_eh_frame->sec_info_type
5650 == SEC_INFO_TYPE_EH_FRAME)
5651 {
5652 if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
5653 htab->plt_eh_frame,
5654 htab->plt_eh_frame->contents))
5655 return FALSE;
5656 }
5657 }
5658
5659 if (htab->elf.sgot && htab->elf.sgot->size > 0)
5660 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize = 4;
5661
5662 /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols. */
5663 htab_traverse (htab->loc_hash_table,
5664 elf_i386_finish_local_dynamic_symbol,
5665 info);
5666
5667 /* Fill PLT entries for undefined weak symbols in PIE. */
5668 if (bfd_link_pie (info))
5669 bfd_hash_traverse (&info->hash->table,
5670 elf_i386_pie_finish_undefweak_symbol,
5671 info);
5672
5673 return TRUE;
5674 }
5675
5676 /* Return an array of PLT entry symbol values. */
5677
5678 static bfd_vma *
5679 elf_i386_get_plt_sym_val (bfd *abfd, asymbol **dynsyms, asection *plt,
5680 asection *relplt)
5681 {
5682 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
5683 arelent *p;
5684 long count, i;
5685 bfd_vma *plt_sym_val;
5686 bfd_vma plt_offset;
5687 bfd_byte *plt_contents;
5688 const struct elf_i386_backend_data *bed
5689 = get_elf_i386_backend_data (abfd);
5690 Elf_Internal_Shdr *hdr;
5691
5692 /* Get the .plt section contents. */
5693 plt_contents = (bfd_byte *) bfd_malloc (plt->size);
5694 if (plt_contents == NULL)
5695 return NULL;
5696 if (!bfd_get_section_contents (abfd, (asection *) plt,
5697 plt_contents, 0, plt->size))
5698 {
5699 bad_return:
5700 free (plt_contents);
5701 return NULL;
5702 }
5703
5704 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
5705 if (! (*slurp_relocs) (abfd, relplt, dynsyms, TRUE))
5706 goto bad_return;
5707
5708 hdr = &elf_section_data (relplt)->this_hdr;
5709 count = relplt->size / hdr->sh_entsize;
5710
5711 plt_sym_val = (bfd_vma *) bfd_malloc (sizeof (bfd_vma) * count);
5712 if (plt_sym_val == NULL)
5713 goto bad_return;
5714
5715 for (i = 0; i < count; i++)
5716 plt_sym_val[i] = -1;
5717
5718 plt_offset = bed->plt->plt_entry_size;
5719 p = relplt->relocation;
5720 for (i = 0; i < count; i++, p++)
5721 {
5722 long reloc_index;
5723
5724 /* Skip unknown relocation. PR 17512: file: bc9d6cf5. */
5725 if (p->howto == NULL)
5726 continue;
5727
5728 if (p->howto->type != R_386_JUMP_SLOT
5729 && p->howto->type != R_386_IRELATIVE)
5730 continue;
5731
5732 reloc_index = H_GET_32 (abfd, (plt_contents + plt_offset
5733 + bed->plt->plt_reloc_offset));
5734 reloc_index /= sizeof (Elf32_External_Rel);
5735 if (reloc_index < count)
5736 plt_sym_val[reloc_index] = plt->vma + plt_offset;
5737
5738 plt_offset += bed->plt->plt_entry_size;
5739
5740 /* PR binutils/18437: Skip extra relocations in the .rel.plt
5741 section. */
5742 if (plt_offset >= plt->size)
5743 break;
5744 }
5745
5746 free (plt_contents);
5747
5748 return plt_sym_val;
5749 }
5750
5751 /* Similar to _bfd_elf_get_synthetic_symtab. */
5752
5753 static long
5754 elf_i386_get_synthetic_symtab (bfd *abfd,
5755 long symcount,
5756 asymbol **syms,
5757 long dynsymcount,
5758 asymbol **dynsyms,
5759 asymbol **ret)
5760 {
5761 asection *plt = bfd_get_section_by_name (abfd, ".plt");
5762 return _bfd_elf_ifunc_get_synthetic_symtab (abfd, symcount, syms,
5763 dynsymcount, dynsyms, ret,
5764 plt,
5765 elf_i386_get_plt_sym_val);
5766 }
5767
5768 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
5769
5770 static bfd_boolean
5771 elf_i386_hash_symbol (struct elf_link_hash_entry *h)
5772 {
5773 if (h->plt.offset != (bfd_vma) -1
5774 && !h->def_regular
5775 && !h->pointer_equality_needed)
5776 return FALSE;
5777
5778 return _bfd_elf_hash_symbol (h);
5779 }
5780
5781 /* Hook called by the linker routine which adds symbols from an object
5782 file. */
5783
5784 static bfd_boolean
5785 elf_i386_add_symbol_hook (bfd * abfd,
5786 struct bfd_link_info * info,
5787 Elf_Internal_Sym * sym,
5788 const char ** namep ATTRIBUTE_UNUSED,
5789 flagword * flagsp ATTRIBUTE_UNUSED,
5790 asection ** secp ATTRIBUTE_UNUSED,
5791 bfd_vma * valp ATTRIBUTE_UNUSED)
5792 {
5793 if (ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE
5794 && (abfd->flags & DYNAMIC) == 0
5795 && bfd_get_flavour (info->output_bfd) == bfd_target_elf_flavour)
5796 elf_tdata (info->output_bfd)->has_gnu_symbols
5797 |= elf_gnu_symbol_unique;
5798
5799 return TRUE;
5800 }
5801
5802 #define TARGET_LITTLE_SYM i386_elf32_vec
5803 #define TARGET_LITTLE_NAME "elf32-i386"
5804 #define ELF_ARCH bfd_arch_i386
5805 #define ELF_TARGET_ID I386_ELF_DATA
5806 #define ELF_MACHINE_CODE EM_386
5807 #define ELF_MAXPAGESIZE 0x1000
5808
5809 #define elf_backend_can_gc_sections 1
5810 #define elf_backend_can_refcount 1
5811 #define elf_backend_want_got_plt 1
5812 #define elf_backend_plt_readonly 1
5813 #define elf_backend_want_plt_sym 0
5814 #define elf_backend_got_header_size 12
5815 #define elf_backend_plt_alignment 4
5816 #define elf_backend_extern_protected_data 1
5817
5818 /* Support RELA for objdump of prelink objects. */
5819 #define elf_info_to_howto elf_i386_info_to_howto_rel
5820 #define elf_info_to_howto_rel elf_i386_info_to_howto_rel
5821
5822 #define bfd_elf32_mkobject elf_i386_mkobject
5823
5824 #define bfd_elf32_bfd_is_local_label_name elf_i386_is_local_label_name
5825 #define bfd_elf32_bfd_link_hash_table_create elf_i386_link_hash_table_create
5826 #define bfd_elf32_bfd_reloc_type_lookup elf_i386_reloc_type_lookup
5827 #define bfd_elf32_bfd_reloc_name_lookup elf_i386_reloc_name_lookup
5828 #define bfd_elf32_get_synthetic_symtab elf_i386_get_synthetic_symtab
5829
5830 #define elf_backend_adjust_dynamic_symbol elf_i386_adjust_dynamic_symbol
5831 #define elf_backend_relocs_compatible _bfd_elf_relocs_compatible
5832 #define elf_backend_check_relocs elf_i386_check_relocs
5833 #define elf_backend_copy_indirect_symbol elf_i386_copy_indirect_symbol
5834 #define elf_backend_create_dynamic_sections elf_i386_create_dynamic_sections
5835 #define elf_backend_fake_sections elf_i386_fake_sections
5836 #define elf_backend_finish_dynamic_sections elf_i386_finish_dynamic_sections
5837 #define elf_backend_finish_dynamic_symbol elf_i386_finish_dynamic_symbol
5838 #define elf_backend_gc_mark_hook elf_i386_gc_mark_hook
5839 #define elf_backend_grok_prstatus elf_i386_grok_prstatus
5840 #define elf_backend_grok_psinfo elf_i386_grok_psinfo
5841 #define elf_backend_reloc_type_class elf_i386_reloc_type_class
5842 #define elf_backend_relocate_section elf_i386_relocate_section
5843 #define elf_backend_size_dynamic_sections elf_i386_size_dynamic_sections
5844 #define elf_backend_always_size_sections elf_i386_always_size_sections
5845 #define elf_backend_omit_section_dynsym \
5846 ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
5847 #define elf_backend_hash_symbol elf_i386_hash_symbol
5848 #define elf_backend_add_symbol_hook elf_i386_add_symbol_hook
5849 #define elf_backend_fixup_symbol elf_i386_fixup_symbol
5850
5851 #include "elf32-target.h"
5852
5853 /* FreeBSD support. */
5854
5855 #undef TARGET_LITTLE_SYM
5856 #define TARGET_LITTLE_SYM i386_elf32_fbsd_vec
5857 #undef TARGET_LITTLE_NAME
5858 #define TARGET_LITTLE_NAME "elf32-i386-freebsd"
5859 #undef ELF_OSABI
5860 #define ELF_OSABI ELFOSABI_FREEBSD
5861
5862 /* The kernel recognizes executables as valid only if they carry a
5863 "FreeBSD" label in the ELF header. So we put this label on all
5864 executables and (for simplicity) also all other object files. */
5865
5866 static void
5867 elf_i386_fbsd_post_process_headers (bfd *abfd, struct bfd_link_info *info)
5868 {
5869 _bfd_elf_post_process_headers (abfd, info);
5870
5871 #ifdef OLD_FREEBSD_ABI_LABEL
5872 {
5873 /* The ABI label supported by FreeBSD <= 4.0 is quite nonstandard. */
5874 Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
5875 memcpy (&i_ehdrp->e_ident[EI_ABIVERSION], "FreeBSD", 8);
5876 }
5877 #endif
5878 }
5879
5880 #undef elf_backend_post_process_headers
5881 #define elf_backend_post_process_headers elf_i386_fbsd_post_process_headers
5882 #undef elf32_bed
5883 #define elf32_bed elf32_i386_fbsd_bed
5884
5885 #undef elf_backend_add_symbol_hook
5886
5887 #include "elf32-target.h"
5888
5889 /* Solaris 2. */
5890
5891 #undef TARGET_LITTLE_SYM
5892 #define TARGET_LITTLE_SYM i386_elf32_sol2_vec
5893 #undef TARGET_LITTLE_NAME
5894 #define TARGET_LITTLE_NAME "elf32-i386-sol2"
5895
5896 #undef elf_backend_post_process_headers
5897
5898 /* Restore default: we cannot use ELFOSABI_SOLARIS, otherwise ELFOSABI_NONE
5899 objects won't be recognized. */
5900 #undef ELF_OSABI
5901
5902 #undef elf32_bed
5903 #define elf32_bed elf32_i386_sol2_bed
5904
5905 /* The 32-bit static TLS arena size is rounded to the nearest 8-byte
5906 boundary. */
5907 #undef elf_backend_static_tls_alignment
5908 #define elf_backend_static_tls_alignment 8
5909
5910 /* The Solaris 2 ABI requires a plt symbol on all platforms.
5911
5912 Cf. Linker and Libraries Guide, Ch. 2, Link-Editor, Generating the Output
5913 File, p.63. */
5914 #undef elf_backend_want_plt_sym
5915 #define elf_backend_want_plt_sym 1
5916
5917 #undef elf_backend_strtab_flags
5918 #define elf_backend_strtab_flags SHF_STRINGS
5919
5920 /* Called to set the sh_flags, sh_link and sh_info fields of OSECTION which
5921 has a type >= SHT_LOOS. Returns TRUE if these fields were initialised
5922 FALSE otherwise. ISECTION is the best guess matching section from the
5923 input bfd IBFD, but it might be NULL. */
5924
5925 static bfd_boolean
5926 elf32_i386_copy_solaris_special_section_fields (const bfd *ibfd ATTRIBUTE_UNUSED,
5927 bfd *obfd ATTRIBUTE_UNUSED,
5928 const Elf_Internal_Shdr *isection ATTRIBUTE_UNUSED,
5929 Elf_Internal_Shdr *osection ATTRIBUTE_UNUSED)
5930 {
5931 /* PR 19938: FIXME: Need to add code for setting the sh_info
5932 and sh_link fields of Solaris specific section types. */
5933 return FALSE;
5934
5935 /* Based upon Oracle Solaris 11.3 Linkers and Libraries Guide, Ch. 13,
5936 Object File Format, Table 13-9 ELF sh_link and sh_info Interpretation:
5937
5938 http://docs.oracle.com/cd/E53394_01/html/E54813/chapter6-94076.html#scrolltoc
5939
5940 The following values should be set:
5941
5942 Type Link Info
5943 -----------------------------------------------------------------------------
5944 SHT_SUNW_ancillary The section header index of 0
5945 [0x6fffffee] the associated string table.
5946
5947 SHT_SUNW_capinfo The section header index of For a dynamic object, the
5948 [0x6ffffff0] the associated symbol table. section header index of
5949 the associated
5950 SHT_SUNW_capchain table,
5951 otherwise 0.
5952
5953 SHT_SUNW_symsort The section header index of 0
5954 [0x6ffffff1] the associated symbol table.
5955
5956 SHT_SUNW_tlssort The section header index of 0
5957 [0x6ffffff2] the associated symbol table.
5958
5959 SHT_SUNW_LDYNSYM The section header index of One greater than the
5960 [0x6ffffff3] the associated string table. symbol table index of the
5961 This index is the same string last local symbol,
5962 table used by the SHT_DYNSYM STB_LOCAL. Since
5963 section. SHT_SUNW_LDYNSYM only
5964 contains local symbols,
5965 sh_info is equivalent to
5966 the number of symbols in
5967 the table.
5968
5969 SHT_SUNW_cap If symbol capabilities exist, If any capabilities refer
5970 [0x6ffffff5] the section header index of to named strings, the
5971 the associated section header index of
5972 SHT_SUNW_capinfo table, the associated string
5973 otherwise 0. table, otherwise 0.
5974
5975 SHT_SUNW_move The section header index of 0
5976 [0x6ffffffa] the associated symbol table.
5977
5978 SHT_SUNW_COMDAT 0 0
5979 [0x6ffffffb]
5980
5981 SHT_SUNW_syminfo The section header index of The section header index
5982 [0x6ffffffc] the associated symbol table. of the associated
5983 .dynamic section.
5984
5985 SHT_SUNW_verdef The section header index of The number of version
5986 [0x6ffffffd] the associated string table. definitions within the
5987 section.
5988
5989 SHT_SUNW_verneed The section header index of The number of version
5990 [0x6ffffffe] the associated string table. dependencies within the
5991 section.
5992
5993 SHT_SUNW_versym The section header index of 0
5994 [0x6fffffff] the associated symbol table. */
5995 }
5996
5997 #undef elf_backend_copy_special_section_fields
5998 #define elf_backend_copy_special_section_fields elf32_i386_copy_solaris_special_section_fields
5999
6000 #include "elf32-target.h"
6001
6002 /* Intel MCU support. */
6003
6004 static bfd_boolean
6005 elf32_iamcu_elf_object_p (bfd *abfd)
6006 {
6007 /* Set the right machine number for an IAMCU elf32 file. */
6008 bfd_default_set_arch_mach (abfd, bfd_arch_iamcu, bfd_mach_i386_iamcu);
6009 return TRUE;
6010 }
6011
6012 #undef TARGET_LITTLE_SYM
6013 #define TARGET_LITTLE_SYM iamcu_elf32_vec
6014 #undef TARGET_LITTLE_NAME
6015 #define TARGET_LITTLE_NAME "elf32-iamcu"
6016 #undef ELF_ARCH
6017 #define ELF_ARCH bfd_arch_iamcu
6018
6019 #undef ELF_MACHINE_CODE
6020 #define ELF_MACHINE_CODE EM_IAMCU
6021
6022 #undef ELF_OSABI
6023
6024 #undef elf32_bed
6025 #define elf32_bed elf32_iamcu_bed
6026
6027 #undef elf_backend_object_p
6028 #define elf_backend_object_p elf32_iamcu_elf_object_p
6029
6030 #undef elf_backend_static_tls_alignment
6031
6032 #undef elf_backend_want_plt_sym
6033 #define elf_backend_want_plt_sym 0
6034
6035 #undef elf_backend_strtab_flags
6036 #undef elf_backend_copy_special_section_fields
6037
6038 #include "elf32-target.h"
6039
6040 /* Restore defaults. */
6041 #undef ELF_ARCH
6042 #define ELF_ARCH bfd_arch_i386
6043 #undef ELF_MACHINE_CODE
6044 #define ELF_MACHINE_CODE EM_386
6045
6046 /* Native Client support. */
6047
6048 #undef TARGET_LITTLE_SYM
6049 #define TARGET_LITTLE_SYM i386_elf32_nacl_vec
6050 #undef TARGET_LITTLE_NAME
6051 #define TARGET_LITTLE_NAME "elf32-i386-nacl"
6052 #undef elf32_bed
6053 #define elf32_bed elf32_i386_nacl_bed
6054
6055 #undef ELF_MAXPAGESIZE
6056 #define ELF_MAXPAGESIZE 0x10000
6057
6058 /* Restore defaults. */
6059 #undef ELF_OSABI
6060 #undef elf_backend_want_plt_sym
6061 #define elf_backend_want_plt_sym 0
6062 #undef elf_backend_post_process_headers
6063 #undef elf_backend_static_tls_alignment
6064
6065 /* NaCl uses substantially different PLT entries for the same effects. */
6066
6067 #undef elf_backend_plt_alignment
6068 #define elf_backend_plt_alignment 5
6069 #define NACL_PLT_ENTRY_SIZE 64
6070 #define NACLMASK 0xe0 /* 32-byte alignment mask. */
6071
6072 static const bfd_byte elf_i386_nacl_plt0_entry[] =
6073 {
6074 0xff, 0x35, /* pushl contents of address */
6075 0, 0, 0, 0, /* replaced with address of .got + 4. */
6076 0x8b, 0x0d, /* movl contents of address, %ecx */
6077 0, 0, 0, 0, /* replaced with address of .got + 8. */
6078 0x83, 0xe1, NACLMASK, /* andl $NACLMASK, %ecx */
6079 0xff, 0xe1 /* jmp *%ecx */
6080 };
6081
6082 static const bfd_byte elf_i386_nacl_plt_entry[NACL_PLT_ENTRY_SIZE] =
6083 {
6084 0x8b, 0x0d, /* movl contents of address, %ecx */
6085 0, 0, 0, 0, /* replaced with GOT slot address. */
6086 0x83, 0xe1, NACLMASK, /* andl $NACLMASK, %ecx */
6087 0xff, 0xe1, /* jmp *%ecx */
6088
6089 /* Pad to the next 32-byte boundary with nop instructions. */
6090 0x90,
6091 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6092 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6093
6094 /* Lazy GOT entries point here (32-byte aligned). */
6095 0x68, /* pushl immediate */
6096 0, 0, 0, 0, /* replaced with reloc offset. */
6097 0xe9, /* jmp relative */
6098 0, 0, 0, 0, /* replaced with offset to .plt. */
6099
6100 /* Pad to the next 32-byte boundary with nop instructions. */
6101 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6102 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6103 0x90, 0x90
6104 };
6105
6106 static const bfd_byte
6107 elf_i386_nacl_pic_plt0_entry[sizeof (elf_i386_nacl_plt0_entry)] =
6108 {
6109 0xff, 0x73, 0x04, /* pushl 4(%ebx) */
6110 0x8b, 0x4b, 0x08, /* mov 0x8(%ebx), %ecx */
6111 0x83, 0xe1, 0xe0, /* and $NACLMASK, %ecx */
6112 0xff, 0xe1, /* jmp *%ecx */
6113
6114 /* This is expected to be the same size as elf_i386_nacl_plt0_entry,
6115 so pad to that size with nop instructions. */
6116 0x90, 0x90, 0x90, 0x90, 0x90, 0x90
6117 };
6118
6119 static const bfd_byte elf_i386_nacl_pic_plt_entry[NACL_PLT_ENTRY_SIZE] =
6120 {
6121 0x8b, 0x8b, /* movl offset(%ebx), %ecx */
6122 0, 0, 0, 0, /* replaced with offset of this symbol in .got. */
6123 0x83, 0xe1, 0xe0, /* andl $NACLMASK, %ecx */
6124 0xff, 0xe1, /* jmp *%ecx */
6125
6126 /* Pad to the next 32-byte boundary with nop instructions. */
6127 0x90,
6128 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6129 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6130
6131 /* Lazy GOT entries point here (32-byte aligned). */
6132 0x68, /* pushl immediate */
6133 0, 0, 0, 0, /* replaced with offset into relocation table. */
6134 0xe9, /* jmp relative */
6135 0, 0, 0, 0, /* replaced with offset to start of .plt. */
6136
6137 /* Pad to the next 32-byte boundary with nop instructions. */
6138 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6139 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6140 0x90, 0x90
6141 };
6142
6143 static const bfd_byte elf_i386_nacl_eh_frame_plt[] =
6144 {
6145 #if (PLT_CIE_LENGTH != 20 \
6146 || PLT_FDE_LENGTH != 36 \
6147 || PLT_FDE_START_OFFSET != 4 + PLT_CIE_LENGTH + 8 \
6148 || PLT_FDE_LEN_OFFSET != 4 + PLT_CIE_LENGTH + 12)
6149 # error "Need elf_i386_backend_data parameters for eh_frame_plt offsets!"
6150 #endif
6151 PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
6152 0, 0, 0, 0, /* CIE ID */
6153 1, /* CIE version */
6154 'z', 'R', 0, /* Augmentation string */
6155 1, /* Code alignment factor */
6156 0x7c, /* Data alignment factor: -4 */
6157 8, /* Return address column */
6158 1, /* Augmentation size */
6159 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
6160 DW_CFA_def_cfa, 4, 4, /* DW_CFA_def_cfa: r4 (esp) ofs 4 */
6161 DW_CFA_offset + 8, 1, /* DW_CFA_offset: r8 (eip) at cfa-4 */
6162 DW_CFA_nop, DW_CFA_nop,
6163
6164 PLT_FDE_LENGTH, 0, 0, 0, /* FDE length */
6165 PLT_CIE_LENGTH + 8, 0, 0, 0, /* CIE pointer */
6166 0, 0, 0, 0, /* R_386_PC32 .plt goes here */
6167 0, 0, 0, 0, /* .plt size goes here */
6168 0, /* Augmentation size */
6169 DW_CFA_def_cfa_offset, 8, /* DW_CFA_def_cfa_offset: 8 */
6170 DW_CFA_advance_loc + 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */
6171 DW_CFA_def_cfa_offset, 12, /* DW_CFA_def_cfa_offset: 12 */
6172 DW_CFA_advance_loc + 58, /* DW_CFA_advance_loc: 58 to __PLT__+64 */
6173 DW_CFA_def_cfa_expression, /* DW_CFA_def_cfa_expression */
6174 13, /* Block length */
6175 DW_OP_breg4, 4, /* DW_OP_breg4 (esp): 4 */
6176 DW_OP_breg8, 0, /* DW_OP_breg8 (eip): 0 */
6177 DW_OP_const1u, 63, DW_OP_and, DW_OP_const1u, 37, DW_OP_ge,
6178 DW_OP_lit2, DW_OP_shl, DW_OP_plus,
6179 DW_CFA_nop, DW_CFA_nop
6180 };
6181
6182 static const struct elf_i386_plt_layout elf_i386_nacl_plt =
6183 {
6184 elf_i386_nacl_plt0_entry, /* plt0_entry */
6185 sizeof (elf_i386_nacl_plt0_entry), /* plt0_entry_size */
6186 2, /* plt0_got1_offset */
6187 8, /* plt0_got2_offset */
6188 elf_i386_nacl_plt_entry, /* plt_entry */
6189 NACL_PLT_ENTRY_SIZE, /* plt_entry_size */
6190 2, /* plt_got_offset */
6191 33, /* plt_reloc_offset */
6192 38, /* plt_plt_offset */
6193 32, /* plt_lazy_offset */
6194 elf_i386_nacl_pic_plt0_entry, /* pic_plt0_entry */
6195 elf_i386_nacl_pic_plt_entry, /* pic_plt_entry */
6196 elf_i386_nacl_eh_frame_plt, /* eh_frame_plt */
6197 sizeof (elf_i386_nacl_eh_frame_plt),/* eh_frame_plt_size */
6198 };
6199
6200 static const struct elf_i386_backend_data elf_i386_nacl_arch_bed =
6201 {
6202 &elf_i386_nacl_plt, /* plt */
6203 0x90, /* plt0_pad_byte: nop insn */
6204 0, /* is_vxworks */
6205 };
6206
6207 static bfd_boolean
6208 elf32_i386_nacl_elf_object_p (bfd *abfd)
6209 {
6210 /* Set the right machine number for a NaCl i386 ELF32 file. */
6211 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_i386_i386_nacl);
6212 return TRUE;
6213 }
6214
6215 #undef elf_backend_arch_data
6216 #define elf_backend_arch_data &elf_i386_nacl_arch_bed
6217
6218 #undef elf_backend_object_p
6219 #define elf_backend_object_p elf32_i386_nacl_elf_object_p
6220 #undef elf_backend_modify_segment_map
6221 #define elf_backend_modify_segment_map nacl_modify_segment_map
6222 #undef elf_backend_modify_program_headers
6223 #define elf_backend_modify_program_headers nacl_modify_program_headers
6224 #undef elf_backend_final_write_processing
6225 #define elf_backend_final_write_processing nacl_final_write_processing
6226
6227 #include "elf32-target.h"
6228
6229 /* Restore defaults. */
6230 #undef elf_backend_object_p
6231 #undef elf_backend_modify_segment_map
6232 #undef elf_backend_modify_program_headers
6233 #undef elf_backend_final_write_processing
6234
6235 /* VxWorks support. */
6236
6237 #undef TARGET_LITTLE_SYM
6238 #define TARGET_LITTLE_SYM i386_elf32_vxworks_vec
6239 #undef TARGET_LITTLE_NAME
6240 #define TARGET_LITTLE_NAME "elf32-i386-vxworks"
6241 #undef ELF_OSABI
6242 #undef elf_backend_plt_alignment
6243 #define elf_backend_plt_alignment 4
6244
6245 static const struct elf_i386_backend_data elf_i386_vxworks_arch_bed =
6246 {
6247 &elf_i386_plt, /* plt */
6248 0x90, /* plt0_pad_byte */
6249 1, /* is_vxworks */
6250 };
6251
6252 #undef elf_backend_arch_data
6253 #define elf_backend_arch_data &elf_i386_vxworks_arch_bed
6254
6255 #undef elf_backend_relocs_compatible
6256 #undef elf_backend_add_symbol_hook
6257 #define elf_backend_add_symbol_hook \
6258 elf_vxworks_add_symbol_hook
6259 #undef elf_backend_link_output_symbol_hook
6260 #define elf_backend_link_output_symbol_hook \
6261 elf_vxworks_link_output_symbol_hook
6262 #undef elf_backend_emit_relocs
6263 #define elf_backend_emit_relocs elf_vxworks_emit_relocs
6264 #undef elf_backend_final_write_processing
6265 #define elf_backend_final_write_processing \
6266 elf_vxworks_final_write_processing
6267 #undef elf_backend_static_tls_alignment
6268
6269 /* On VxWorks, we emit relocations against _PROCEDURE_LINKAGE_TABLE_, so
6270 define it. */
6271 #undef elf_backend_want_plt_sym
6272 #define elf_backend_want_plt_sym 1
6273
6274 #undef elf32_bed
6275 #define elf32_bed elf32_i386_vxworks_bed
6276
6277 #include "elf32-target.h"
This page took 0.150789 seconds and 5 git commands to generate.