1 /* Intel 80386/80486-specific support for 32-bit ELF
2 Copyright (C) 1993-2016 Free Software Foundation, Inc.
4 This file is part of BFD, the Binary File Descriptor library.
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.
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.
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. */
27 #include "elf-vxworks.h"
28 #include "bfd_stdint.h"
32 #include "opcode/i386.h"
34 /* 386 uses REL relocations instead of RELA. */
39 static reloc_howto_type elf_howto_table[]=
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),
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)
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),
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",
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),
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)
158 /* GNU extension to record C++ vtable hierarchy. */
159 HOWTO (R_386_GNU_VTINHERIT, /* type */
161 2, /* size (0 = byte, 1 = short, 2 = long) */
163 FALSE, /* pc_relative */
165 complain_overflow_dont, /* complain_on_overflow */
166 NULL, /* special_function */
167 "R_386_GNU_VTINHERIT", /* name */
168 FALSE, /* partial_inplace */
171 FALSE), /* pcrel_offset */
173 /* GNU extension to record C++ vtable member usage. */
174 HOWTO (R_386_GNU_VTENTRY, /* type */
176 2, /* size (0 = byte, 1 = short, 2 = long) */
178 FALSE, /* pc_relative */
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 */
186 FALSE) /* pcrel_offset */
188 #define R_386_vt (R_386_GNU_VTENTRY + 1 - R_386_vt_offset)
192 #ifdef DEBUG_GEN_RELOC
194 fprintf (stderr, "i386 bfd reloc lookup %d (%s)\n", code, str)
199 static reloc_howto_type *
200 elf_i386_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
201 bfd_reloc_code_real_type code)
206 TRACE ("BFD_RELOC_NONE");
207 return &elf_howto_table[R_386_NONE];
210 TRACE ("BFD_RELOC_32");
211 return &elf_howto_table[R_386_32];
214 TRACE ("BFD_RELOC_CTOR");
215 return &elf_howto_table[R_386_32];
217 case BFD_RELOC_32_PCREL:
218 TRACE ("BFD_RELOC_PC32");
219 return &elf_howto_table[R_386_PC32];
221 case BFD_RELOC_386_GOT32:
222 TRACE ("BFD_RELOC_386_GOT32");
223 return &elf_howto_table[R_386_GOT32];
225 case BFD_RELOC_386_PLT32:
226 TRACE ("BFD_RELOC_386_PLT32");
227 return &elf_howto_table[R_386_PLT32];
229 case BFD_RELOC_386_COPY:
230 TRACE ("BFD_RELOC_386_COPY");
231 return &elf_howto_table[R_386_COPY];
233 case BFD_RELOC_386_GLOB_DAT:
234 TRACE ("BFD_RELOC_386_GLOB_DAT");
235 return &elf_howto_table[R_386_GLOB_DAT];
237 case BFD_RELOC_386_JUMP_SLOT:
238 TRACE ("BFD_RELOC_386_JUMP_SLOT");
239 return &elf_howto_table[R_386_JUMP_SLOT];
241 case BFD_RELOC_386_RELATIVE:
242 TRACE ("BFD_RELOC_386_RELATIVE");
243 return &elf_howto_table[R_386_RELATIVE];
245 case BFD_RELOC_386_GOTOFF:
246 TRACE ("BFD_RELOC_386_GOTOFF");
247 return &elf_howto_table[R_386_GOTOFF];
249 case BFD_RELOC_386_GOTPC:
250 TRACE ("BFD_RELOC_386_GOTPC");
251 return &elf_howto_table[R_386_GOTPC];
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];
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];
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];
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];
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];
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];
279 TRACE ("BFD_RELOC_16");
280 return &elf_howto_table[R_386_16 - R_386_ext_offset];
282 case BFD_RELOC_16_PCREL:
283 TRACE ("BFD_RELOC_16_PCREL");
284 return &elf_howto_table[R_386_PC16 - R_386_ext_offset];
287 TRACE ("BFD_RELOC_8");
288 return &elf_howto_table[R_386_8 - R_386_ext_offset];
290 case BFD_RELOC_8_PCREL:
291 TRACE ("BFD_RELOC_8_PCREL");
292 return &elf_howto_table[R_386_PC8 - R_386_ext_offset];
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];
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];
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];
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];
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];
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];
319 case BFD_RELOC_SIZE32:
320 TRACE ("BFD_RELOC_SIZE32");
321 return &elf_howto_table[R_386_SIZE32 - R_386_tls_offset];
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];
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];
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];
335 case BFD_RELOC_386_IRELATIVE:
336 TRACE ("BFD_RELOC_386_IRELATIVE");
337 return &elf_howto_table[R_386_IRELATIVE - R_386_tls_offset];
339 case BFD_RELOC_386_GOT32X:
340 TRACE ("BFD_RELOC_386_GOT32X");
341 return &elf_howto_table[R_386_GOT32X - R_386_tls_offset];
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];
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];
359 static reloc_howto_type *
360 elf_i386_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
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];
373 static reloc_howto_type *
374 elf_i386_rtype_to_howto (bfd *abfd, unsigned r_type)
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))
386 (*_bfd_error_handler) (_("%B: invalid relocation type %d"),
390 /* PR 17512: file: 0f67f69d. */
391 if (elf_howto_table [indx].type != r_type)
393 return &elf_howto_table[indx];
397 elf_i386_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
399 Elf_Internal_Rela *dst)
401 unsigned int r_type = ELF32_R_TYPE (dst->r_info);
402 cache_ptr->howto = elf_i386_rtype_to_howto (abfd, r_type);
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. */
412 elf_i386_is_local_label_name (bfd *abfd, const char *name)
414 if (name[0] == '.' && name[1] == 'X')
417 return _bfd_elf_is_local_label_name (abfd, name);
420 /* Support for core dump NOTE sections. */
423 elf_i386_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
428 if (note->namesz == 8 && strcmp (note->namedata, "FreeBSD") == 0)
430 int pr_version = bfd_get_32 (abfd, note->descdata);
436 elf_tdata (abfd)->core->signal = bfd_get_32 (abfd, note->descdata + 20);
439 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
443 size = bfd_get_32 (abfd, note->descdata + 8);
447 switch (note->descsz)
452 case 144: /* Linux/i386 */
454 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
457 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
467 /* Make a ".reg/999" section. */
468 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
469 size, note->descpos + offset);
473 elf_i386_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
475 if (note->namesz == 8 && strcmp (note->namedata, "FreeBSD") == 0)
477 int pr_version = bfd_get_32 (abfd, note->descdata);
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);
489 switch (note->descsz)
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);
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. */
508 char *command = elf_tdata (abfd)->core->command;
509 int n = strlen (command);
511 if (0 < n && command[n - 1] == ' ')
512 command[n - 1] = '\0';
518 /* Functions for the i386 ELF linker.
520 In order to gain some understanding of code in this file without
521 knowing all the intricate details of the linker, note the
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. */
532 /* The name of the dynamic interpreter. This is put in the .interp
535 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1"
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
541 #define ELIMINATE_COPY_RELOCS 1
543 /* The size in bytes of an entry in the procedure linkage table. */
545 #define PLT_ENTRY_SIZE 16
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. */
551 static const bfd_byte elf_i386_plt0_entry[12] =
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. */
559 /* Subsequent entries in an absolute procedure linkage table look like
562 static const bfd_byte elf_i386_plt_entry[PLT_ENTRY_SIZE] =
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. */
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. */
575 static const bfd_byte elf_i386_pic_plt0_entry[12] =
577 0xff, 0xb3, 4, 0, 0, 0, /* pushl 4(%ebx) */
578 0xff, 0xa3, 8, 0, 0, 0 /* jmp *8(%ebx) */
581 /* Subsequent entries in a PIC procedure linkage table look like this. */
583 static const bfd_byte elf_i386_pic_plt_entry[PLT_ENTRY_SIZE] =
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. */
593 /* Entries in the GOT procedure linkage table look like this. */
595 static const bfd_byte elf_i386_got_plt_entry[8] =
597 0xff, 0x25, /* jmp indirect */
598 0, 0, 0, 0, /* replaced with offset of this symbol in .got. */
599 0x66, 0x90 /* xchg %ax,%ax */
602 /* Entries in the PIC GOT procedure linkage table look like this. */
604 static const bfd_byte elf_i386_pic_got_plt_entry[8] =
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 */
611 /* .eh_frame covering the .plt section. */
613 static const bfd_byte elf_i386_eh_frame_plt[] =
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 */
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,
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
650 struct elf_i386_plt_layout
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;
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;
660 /* Later entries in an absolute procedure linkage table look like this. */
661 const bfd_byte *plt_entry;
662 unsigned int plt_entry_size;
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. */
669 /* Offset into plt_entry where the initial value of the GOT entry points. */
670 unsigned int plt_lazy_offset;
672 /* The first entry in a PIC procedure linkage table looks like this. */
673 const bfd_byte *pic_plt0_entry;
675 /* Subsequent entries in a PIC procedure linkage table look like this. */
676 const bfd_byte *pic_plt_entry;
678 /* .eh_frame covering the .plt section. */
679 const bfd_byte *eh_frame_plt;
680 unsigned int eh_frame_plt_size;
683 #define GET_PLT_ENTRY_SIZE(abfd) \
684 get_elf_i386_backend_data (abfd)->plt->plt_entry_size
686 /* These are the standard parameters. */
687 static const struct elf_i386_plt_layout elf_i386_plt =
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 */
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
712 /* Architecture-specific backend data for i386. */
714 struct elf_i386_backend_data
716 /* Parameters describing PLT generation. */
717 const struct elf_i386_plt_layout *plt;
719 /* Value used to fill the unused bytes of the first PLT entry. */
720 bfd_byte plt0_pad_byte;
722 /* True if the target system is VxWorks. */
726 #define get_elf_i386_backend_data(abfd) \
727 ((const struct elf_i386_backend_data *) \
728 get_elf_backend_data (abfd)->arch_data)
730 /* These are the standard parameters. */
731 static const struct elf_i386_backend_data elf_i386_arch_bed =
733 &elf_i386_plt, /* plt */
734 0, /* plt0_pad_byte */
738 #define elf_backend_arch_data &elf_i386_arch_bed
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
743 1. Has non-GOT/non-PLT relocations in text section. Or
744 2. Has no GOT/PLT relocation.
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))
754 /* i386 ELF linker hash entry. */
756 struct elf_i386_link_hash_entry
758 struct elf_link_hash_entry elf;
760 /* Track dynamic relocs copied for this symbol. */
761 struct elf_dyn_relocs *dyn_relocs;
763 #define GOT_UNKNOWN 0
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;
781 /* Symbol is referenced by R_386_GOTOFF relocation. */
782 unsigned int gotoff_ref : 1;
784 /* Symbol has GOT or PLT relocations. */
785 unsigned int has_got_reloc : 1;
787 /* Symbol has non-GOT/non-PLT relocations in text sections. */
788 unsigned int has_non_got_reloc : 1;
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;
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;
798 /* Offset of the GOTPLT entry reserved for the TLS descriptor,
799 starting at the end of the jump table. */
803 #define elf_i386_hash_entry(ent) ((struct elf_i386_link_hash_entry *)(ent))
805 struct elf_i386_obj_tdata
807 struct elf_obj_tdata root;
809 /* tls_type for each local got entry. */
810 char *local_got_tls_type;
812 /* GOTPLT entries for TLS descriptors. */
813 bfd_vma *local_tlsdesc_gotent;
816 #define elf_i386_tdata(abfd) \
817 ((struct elf_i386_obj_tdata *) (abfd)->tdata.any)
819 #define elf_i386_local_got_tls_type(abfd) \
820 (elf_i386_tdata (abfd)->local_got_tls_type)
822 #define elf_i386_local_tlsdesc_gotent(abfd) \
823 (elf_i386_tdata (abfd)->local_tlsdesc_gotent)
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)
831 elf_i386_mkobject (bfd *abfd)
833 return bfd_elf_allocate_object (abfd, sizeof (struct elf_i386_obj_tdata),
837 /* i386 ELF linker hash table. */
839 struct elf_i386_link_hash_table
841 struct elf_link_hash_table elf;
843 /* Short-cuts to get to dynamic linker sections. */
847 asection *plt_eh_frame;
852 bfd_signed_vma refcount;
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;
860 /* Small local sym cache. */
861 struct sym_cache sym_cache;
863 /* _TLS_MODULE_BASE_ symbol. */
864 struct bfd_link_hash_entry *tls_module_base;
866 /* Used by local STT_GNU_IFUNC symbols. */
867 htab_t loc_hash_table;
868 void * loc_hash_memory;
870 /* The (unloaded but important) .rel.plt.unloaded section on VxWorks. */
873 /* The index of the next unused R_386_TLS_DESC slot in .rel.plt. */
874 bfd_vma next_tls_desc_index;
876 /* The index of the next unused R_386_JUMP_SLOT slot in .rel.plt. */
877 bfd_vma next_jump_slot_index;
879 /* The index of the next unused R_386_IRELATIVE slot in .rel.plt. */
880 bfd_vma next_irelative_index;
883 /* Get the i386 ELF linker hash table from a link_info structure. */
885 #define elf_i386_hash_table(p) \
886 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
887 == I386_ELF_DATA ? ((struct elf_i386_link_hash_table *) ((p)->hash)) : NULL)
889 #define elf_i386_compute_jump_table_size(htab) \
890 ((htab)->elf.srelplt->reloc_count * 4)
892 /* Create an entry in an i386 ELF linker hash table. */
894 static struct bfd_hash_entry *
895 elf_i386_link_hash_newfunc (struct bfd_hash_entry *entry,
896 struct bfd_hash_table *table,
899 /* Allocate the structure if it has not already been allocated by a
903 entry = (struct bfd_hash_entry *)
904 bfd_hash_allocate (table, sizeof (struct elf_i386_link_hash_entry));
909 /* Call the allocation method of the superclass. */
910 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
913 struct elf_i386_link_hash_entry *eh;
915 eh = (struct elf_i386_link_hash_entry *) entry;
916 eh->dyn_relocs = NULL;
917 eh->tls_type = GOT_UNKNOWN;
919 eh->has_got_reloc = 0;
920 eh->has_non_got_reloc = 0;
921 eh->func_pointer_refcount = 0;
922 eh->plt_got.offset = (bfd_vma) -1;
923 eh->tlsdesc_got = (bfd_vma) -1;
929 /* Compute a hash of a local hash entry. We use elf_link_hash_entry
930 for local symbol so that we can handle local STT_GNU_IFUNC symbols
931 as global symbol. We reuse indx and dynstr_index for local symbol
932 hash since they aren't used by global symbols in this backend. */
935 elf_i386_local_htab_hash (const void *ptr)
937 struct elf_link_hash_entry *h
938 = (struct elf_link_hash_entry *) ptr;
939 return ELF_LOCAL_SYMBOL_HASH (h->indx, h->dynstr_index);
942 /* Compare local hash entries. */
945 elf_i386_local_htab_eq (const void *ptr1, const void *ptr2)
947 struct elf_link_hash_entry *h1
948 = (struct elf_link_hash_entry *) ptr1;
949 struct elf_link_hash_entry *h2
950 = (struct elf_link_hash_entry *) ptr2;
952 return h1->indx == h2->indx && h1->dynstr_index == h2->dynstr_index;
955 /* Find and/or create a hash entry for local symbol. */
957 static struct elf_link_hash_entry *
958 elf_i386_get_local_sym_hash (struct elf_i386_link_hash_table *htab,
959 bfd *abfd, const Elf_Internal_Rela *rel,
962 struct elf_i386_link_hash_entry e, *ret;
963 asection *sec = abfd->sections;
964 hashval_t h = ELF_LOCAL_SYMBOL_HASH (sec->id,
965 ELF32_R_SYM (rel->r_info));
968 e.elf.indx = sec->id;
969 e.elf.dynstr_index = ELF32_R_SYM (rel->r_info);
970 slot = htab_find_slot_with_hash (htab->loc_hash_table, &e, h,
971 create ? INSERT : NO_INSERT);
978 ret = (struct elf_i386_link_hash_entry *) *slot;
982 ret = (struct elf_i386_link_hash_entry *)
983 objalloc_alloc ((struct objalloc *) htab->loc_hash_memory,
984 sizeof (struct elf_i386_link_hash_entry));
987 memset (ret, 0, sizeof (*ret));
988 ret->elf.indx = sec->id;
989 ret->elf.dynstr_index = ELF32_R_SYM (rel->r_info);
990 ret->elf.dynindx = -1;
991 ret->func_pointer_refcount = 0;
992 ret->plt_got.offset = (bfd_vma) -1;
998 /* Destroy an i386 ELF linker hash table. */
1001 elf_i386_link_hash_table_free (bfd *obfd)
1003 struct elf_i386_link_hash_table *htab
1004 = (struct elf_i386_link_hash_table *) obfd->link.hash;
1006 if (htab->loc_hash_table)
1007 htab_delete (htab->loc_hash_table);
1008 if (htab->loc_hash_memory)
1009 objalloc_free ((struct objalloc *) htab->loc_hash_memory);
1010 _bfd_elf_link_hash_table_free (obfd);
1013 /* Create an i386 ELF linker hash table. */
1015 static struct bfd_link_hash_table *
1016 elf_i386_link_hash_table_create (bfd *abfd)
1018 struct elf_i386_link_hash_table *ret;
1019 bfd_size_type amt = sizeof (struct elf_i386_link_hash_table);
1021 ret = (struct elf_i386_link_hash_table *) bfd_zmalloc (amt);
1025 if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd,
1026 elf_i386_link_hash_newfunc,
1027 sizeof (struct elf_i386_link_hash_entry),
1034 ret->loc_hash_table = htab_try_create (1024,
1035 elf_i386_local_htab_hash,
1036 elf_i386_local_htab_eq,
1038 ret->loc_hash_memory = objalloc_create ();
1039 if (!ret->loc_hash_table || !ret->loc_hash_memory)
1041 elf_i386_link_hash_table_free (abfd);
1044 ret->elf.root.hash_table_free = elf_i386_link_hash_table_free;
1046 return &ret->elf.root;
1049 /* Create .plt, .rel.plt, .got, .got.plt, .rel.got, .dynbss, and
1050 .rel.bss sections in DYNOBJ, and set up shortcuts to them in our
1054 elf_i386_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
1056 struct elf_i386_link_hash_table *htab;
1058 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
1061 htab = elf_i386_hash_table (info);
1065 htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss");
1069 if (bfd_link_executable (info))
1071 /* Always allow copy relocs for building executables. */
1072 asection *s = bfd_get_linker_section (dynobj, ".rel.bss");
1075 const struct elf_backend_data *bed = get_elf_backend_data (dynobj);
1076 s = bfd_make_section_anyway_with_flags (dynobj,
1078 (bed->dynamic_sec_flags
1081 || ! bfd_set_section_alignment (dynobj, s,
1082 bed->s->log_file_align))
1088 if (get_elf_i386_backend_data (dynobj)->is_vxworks
1089 && !elf_vxworks_create_dynamic_sections (dynobj, info,
1093 if (!info->no_ld_generated_unwind_info
1094 && htab->plt_eh_frame == NULL
1095 && htab->elf.splt != NULL)
1097 flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
1098 | SEC_HAS_CONTENTS | SEC_IN_MEMORY
1099 | SEC_LINKER_CREATED);
1101 = bfd_make_section_anyway_with_flags (dynobj, ".eh_frame", flags);
1102 if (htab->plt_eh_frame == NULL
1103 || !bfd_set_section_alignment (dynobj, htab->plt_eh_frame, 2))
1110 /* Copy the extra info we tack onto an elf_link_hash_entry. */
1113 elf_i386_copy_indirect_symbol (struct bfd_link_info *info,
1114 struct elf_link_hash_entry *dir,
1115 struct elf_link_hash_entry *ind)
1117 struct elf_i386_link_hash_entry *edir, *eind;
1119 edir = (struct elf_i386_link_hash_entry *) dir;
1120 eind = (struct elf_i386_link_hash_entry *) ind;
1122 if (eind->dyn_relocs != NULL)
1124 if (edir->dyn_relocs != NULL)
1126 struct elf_dyn_relocs **pp;
1127 struct elf_dyn_relocs *p;
1129 /* Add reloc counts against the indirect sym to the direct sym
1130 list. Merge any entries against the same section. */
1131 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
1133 struct elf_dyn_relocs *q;
1135 for (q = edir->dyn_relocs; q != NULL; q = q->next)
1136 if (q->sec == p->sec)
1138 q->pc_count += p->pc_count;
1139 q->count += p->count;
1146 *pp = edir->dyn_relocs;
1149 edir->dyn_relocs = eind->dyn_relocs;
1150 eind->dyn_relocs = NULL;
1153 if (ind->root.type == bfd_link_hash_indirect
1154 && dir->got.refcount <= 0)
1156 edir->tls_type = eind->tls_type;
1157 eind->tls_type = GOT_UNKNOWN;
1160 /* Copy gotoff_ref so that elf_i386_adjust_dynamic_symbol will
1161 generate a R_386_COPY reloc. */
1162 edir->gotoff_ref |= eind->gotoff_ref;
1164 edir->has_got_reloc |= eind->has_got_reloc;
1165 edir->has_non_got_reloc |= eind->has_non_got_reloc;
1167 if (ELIMINATE_COPY_RELOCS
1168 && ind->root.type != bfd_link_hash_indirect
1169 && dir->dynamic_adjusted)
1171 /* If called to transfer flags for a weakdef during processing
1172 of elf_adjust_dynamic_symbol, don't copy non_got_ref.
1173 We clear it ourselves for ELIMINATE_COPY_RELOCS. */
1174 dir->ref_dynamic |= ind->ref_dynamic;
1175 dir->ref_regular |= ind->ref_regular;
1176 dir->ref_regular_nonweak |= ind->ref_regular_nonweak;
1177 dir->needs_plt |= ind->needs_plt;
1178 dir->pointer_equality_needed |= ind->pointer_equality_needed;
1182 if (eind->func_pointer_refcount > 0)
1184 edir->func_pointer_refcount += eind->func_pointer_refcount;
1185 eind->func_pointer_refcount = 0;
1188 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
1192 /* Return TRUE if the TLS access code sequence support transition
1196 elf_i386_check_tls_transition (bfd *abfd, asection *sec,
1198 Elf_Internal_Shdr *symtab_hdr,
1199 struct elf_link_hash_entry **sym_hashes,
1200 unsigned int r_type,
1201 const Elf_Internal_Rela *rel,
1202 const Elf_Internal_Rela *relend)
1204 unsigned int val, type;
1205 unsigned long r_symndx;
1206 struct elf_link_hash_entry *h;
1209 /* Get the section contents. */
1210 if (contents == NULL)
1212 if (elf_section_data (sec)->this_hdr.contents != NULL)
1213 contents = elf_section_data (sec)->this_hdr.contents;
1216 /* FIXME: How to better handle error condition? */
1217 if (!bfd_malloc_and_get_section (abfd, sec, &contents))
1220 /* Cache the section contents for elf_link_input_bfd. */
1221 elf_section_data (sec)->this_hdr.contents = contents;
1225 offset = rel->r_offset;
1230 if (offset < 2 || (rel + 1) >= relend)
1233 type = bfd_get_8 (abfd, contents + offset - 2);
1234 if (r_type == R_386_TLS_GD)
1236 /* Check transition from GD access model. Only
1237 leal foo@tlsgd(,%reg,1), %eax; call ___tls_get_addr
1238 leal foo@tlsgd(%reg), %eax; call ___tls_get_addr; nop
1239 can transit to different access model. */
1240 if ((offset + 10) > sec->size ||
1241 (type != 0x8d && type != 0x04))
1244 val = bfd_get_8 (abfd, contents + offset - 1);
1247 /* leal foo@tlsgd(,%reg,1), %eax; call ___tls_get_addr */
1251 if (bfd_get_8 (abfd, contents + offset - 3) != 0x8d)
1254 if ((val & 0xc7) != 0x05 || val == (4 << 3))
1259 /* leal foo@tlsgd(%reg), %eax; call ___tls_get_addr; nop */
1260 if ((val & 0xf8) != 0x80 || (val & 7) == 4)
1263 if (bfd_get_8 (abfd, contents + offset + 9) != 0x90)
1269 /* Check transition from LD access model. Only
1270 leal foo@tlsgd(%reg), %eax; call ___tls_get_addr
1271 can transit to different access model. */
1272 if (type != 0x8d || (offset + 9) > sec->size)
1275 val = bfd_get_8 (abfd, contents + offset - 1);
1276 if ((val & 0xf8) != 0x80 || (val & 7) == 4)
1280 if (bfd_get_8 (abfd, contents + offset + 4) != 0xe8)
1283 r_symndx = ELF32_R_SYM (rel[1].r_info);
1284 if (r_symndx < symtab_hdr->sh_info)
1287 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1288 /* Use strncmp to check ___tls_get_addr since ___tls_get_addr
1289 may be versioned. */
1291 && h->root.root.string != NULL
1292 && (ELF32_R_TYPE (rel[1].r_info) == R_386_PC32
1293 || ELF32_R_TYPE (rel[1].r_info) == R_386_PLT32)
1294 && (strncmp (h->root.root.string, "___tls_get_addr",
1298 /* Check transition from IE access model:
1299 movl foo@indntpoff(%rip), %eax
1300 movl foo@indntpoff(%rip), %reg
1301 addl foo@indntpoff(%rip), %reg
1304 if (offset < 1 || (offset + 4) > sec->size)
1307 /* Check "movl foo@tpoff(%rip), %eax" first. */
1308 val = bfd_get_8 (abfd, contents + offset - 1);
1315 /* Check movl|addl foo@tpoff(%rip), %reg. */
1316 type = bfd_get_8 (abfd, contents + offset - 2);
1317 return ((type == 0x8b || type == 0x03)
1318 && (val & 0xc7) == 0x05);
1320 case R_386_TLS_GOTIE:
1321 case R_386_TLS_IE_32:
1322 /* Check transition from {IE_32,GOTIE} access model:
1323 subl foo@{tpoff,gontoff}(%reg1), %reg2
1324 movl foo@{tpoff,gontoff}(%reg1), %reg2
1325 addl foo@{tpoff,gontoff}(%reg1), %reg2
1328 if (offset < 2 || (offset + 4) > sec->size)
1331 val = bfd_get_8 (abfd, contents + offset - 1);
1332 if ((val & 0xc0) != 0x80 || (val & 7) == 4)
1335 type = bfd_get_8 (abfd, contents + offset - 2);
1336 return type == 0x8b || type == 0x2b || type == 0x03;
1338 case R_386_TLS_GOTDESC:
1339 /* Check transition from GDesc access model:
1340 leal x@tlsdesc(%ebx), %eax
1342 Make sure it's a leal adding ebx to a 32-bit offset
1343 into any register, although it's probably almost always
1346 if (offset < 2 || (offset + 4) > sec->size)
1349 if (bfd_get_8 (abfd, contents + offset - 2) != 0x8d)
1352 val = bfd_get_8 (abfd, contents + offset - 1);
1353 return (val & 0xc7) == 0x83;
1355 case R_386_TLS_DESC_CALL:
1356 /* Check transition from GDesc access model:
1357 call *x@tlsdesc(%rax)
1359 if (offset + 2 <= sec->size)
1361 /* Make sure that it's a call *x@tlsdesc(%rax). */
1362 static const unsigned char call[] = { 0xff, 0x10 };
1363 return memcmp (contents + offset, call, 2) == 0;
1373 /* Return TRUE if the TLS access transition is OK or no transition
1374 will be performed. Update R_TYPE if there is a transition. */
1377 elf_i386_tls_transition (struct bfd_link_info *info, bfd *abfd,
1378 asection *sec, bfd_byte *contents,
1379 Elf_Internal_Shdr *symtab_hdr,
1380 struct elf_link_hash_entry **sym_hashes,
1381 unsigned int *r_type, int tls_type,
1382 const Elf_Internal_Rela *rel,
1383 const Elf_Internal_Rela *relend,
1384 struct elf_link_hash_entry *h,
1385 unsigned long r_symndx)
1387 unsigned int from_type = *r_type;
1388 unsigned int to_type = from_type;
1389 bfd_boolean check = TRUE;
1391 /* Skip TLS transition for functions. */
1393 && (h->type == STT_FUNC
1394 || h->type == STT_GNU_IFUNC))
1400 case R_386_TLS_GOTDESC:
1401 case R_386_TLS_DESC_CALL:
1402 case R_386_TLS_IE_32:
1404 case R_386_TLS_GOTIE:
1405 if (bfd_link_executable (info))
1408 to_type = R_386_TLS_LE_32;
1409 else if (from_type != R_386_TLS_IE
1410 && from_type != R_386_TLS_GOTIE)
1411 to_type = R_386_TLS_IE_32;
1414 /* When we are called from elf_i386_relocate_section, CONTENTS
1415 isn't NULL and there may be additional transitions based on
1417 if (contents != NULL)
1419 unsigned int new_to_type = to_type;
1421 if (bfd_link_executable (info)
1424 && (tls_type & GOT_TLS_IE))
1425 new_to_type = R_386_TLS_LE_32;
1427 if (to_type == R_386_TLS_GD
1428 || to_type == R_386_TLS_GOTDESC
1429 || to_type == R_386_TLS_DESC_CALL)
1431 if (tls_type == GOT_TLS_IE_POS)
1432 new_to_type = R_386_TLS_GOTIE;
1433 else if (tls_type & GOT_TLS_IE)
1434 new_to_type = R_386_TLS_IE_32;
1437 /* We checked the transition before when we were called from
1438 elf_i386_check_relocs. We only want to check the new
1439 transition which hasn't been checked before. */
1440 check = new_to_type != to_type && from_type == to_type;
1441 to_type = new_to_type;
1447 if (bfd_link_executable (info))
1448 to_type = R_386_TLS_LE_32;
1455 /* Return TRUE if there is no transition. */
1456 if (from_type == to_type)
1459 /* Check if the transition can be performed. */
1461 && ! elf_i386_check_tls_transition (abfd, sec, contents,
1462 symtab_hdr, sym_hashes,
1463 from_type, rel, relend))
1465 reloc_howto_type *from, *to;
1468 from = elf_i386_rtype_to_howto (abfd, from_type);
1469 to = elf_i386_rtype_to_howto (abfd, to_type);
1472 name = h->root.root.string;
1475 struct elf_i386_link_hash_table *htab;
1477 htab = elf_i386_hash_table (info);
1482 Elf_Internal_Sym *isym;
1484 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1486 name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
1490 (*_bfd_error_handler)
1491 (_("%B: TLS transition from %s to %s against `%s' at 0x%lx "
1492 "in section `%A' failed"),
1493 abfd, sec, from->name, to->name, name,
1494 (unsigned long) rel->r_offset);
1495 bfd_set_error (bfd_error_bad_value);
1503 /* Rename some of the generic section flags to better document how they
1505 #define need_convert_load sec_flg0
1507 /* Look through the relocs for a section during the first phase, and
1508 calculate needed space in the global offset table, procedure linkage
1509 table, and dynamic reloc sections. */
1512 elf_i386_check_relocs (bfd *abfd,
1513 struct bfd_link_info *info,
1515 const Elf_Internal_Rela *relocs)
1517 struct elf_i386_link_hash_table *htab;
1518 Elf_Internal_Shdr *symtab_hdr;
1519 struct elf_link_hash_entry **sym_hashes;
1520 const Elf_Internal_Rela *rel;
1521 const Elf_Internal_Rela *rel_end;
1523 bfd_boolean use_plt_got;
1525 if (bfd_link_relocatable (info))
1528 BFD_ASSERT (is_i386_elf (abfd));
1530 htab = elf_i386_hash_table (info);
1534 use_plt_got = (!get_elf_i386_backend_data (abfd)->is_vxworks
1535 && (get_elf_i386_backend_data (abfd)
1536 == &elf_i386_arch_bed));
1538 symtab_hdr = &elf_symtab_hdr (abfd);
1539 sym_hashes = elf_sym_hashes (abfd);
1543 rel_end = relocs + sec->reloc_count;
1544 for (rel = relocs; rel < rel_end; rel++)
1546 unsigned int r_type;
1547 unsigned long r_symndx;
1548 struct elf_link_hash_entry *h;
1549 struct elf_i386_link_hash_entry *eh;
1550 Elf_Internal_Sym *isym;
1552 bfd_boolean size_reloc;
1554 r_symndx = ELF32_R_SYM (rel->r_info);
1555 r_type = ELF32_R_TYPE (rel->r_info);
1557 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
1559 (*_bfd_error_handler) (_("%B: bad symbol index: %d"),
1565 if (r_symndx < symtab_hdr->sh_info)
1567 /* A local symbol. */
1568 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1573 /* Check relocation against local STT_GNU_IFUNC symbol. */
1574 if (ELF32_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
1576 h = elf_i386_get_local_sym_hash (htab, abfd, rel, TRUE);
1580 /* Fake a STT_GNU_IFUNC symbol. */
1581 h->type = STT_GNU_IFUNC;
1584 h->forced_local = 1;
1585 h->root.type = bfd_link_hash_defined;
1593 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1594 while (h->root.type == bfd_link_hash_indirect
1595 || h->root.type == bfd_link_hash_warning)
1596 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1599 eh = (struct elf_i386_link_hash_entry *) h;
1602 /* Create the ifunc sections for static executables. If we
1603 never see an indirect function symbol nor we are building
1604 a static executable, those sections will be empty and
1605 won't appear in output. */
1618 if (htab->elf.dynobj == NULL)
1619 htab->elf.dynobj = abfd;
1620 if (!_bfd_elf_create_ifunc_sections (htab->elf.dynobj, info))
1625 /* It is referenced by a non-shared object. */
1627 h->root.non_ir_ref = 1;
1629 if (h->type == STT_GNU_IFUNC)
1630 elf_tdata (info->output_bfd)->has_gnu_symbols
1631 |= elf_gnu_symbol_ifunc;
1634 if (! elf_i386_tls_transition (info, abfd, sec, NULL,
1635 symtab_hdr, sym_hashes,
1636 &r_type, GOT_UNKNOWN,
1637 rel, rel_end, h, r_symndx))
1643 htab->tls_ldm_got.refcount += 1;
1647 /* This symbol requires a procedure linkage table entry. We
1648 actually build the entry in adjust_dynamic_symbol,
1649 because this might be a case of linking PIC code which is
1650 never referenced by a dynamic object, in which case we
1651 don't need to generate a procedure linkage table entry
1654 /* If this is a local symbol, we resolve it directly without
1655 creating a procedure linkage table entry. */
1659 eh->has_got_reloc = 1;
1661 h->plt.refcount += 1;
1668 case R_386_TLS_IE_32:
1670 case R_386_TLS_GOTIE:
1671 if (!bfd_link_executable (info))
1672 info->flags |= DF_STATIC_TLS;
1678 case R_386_TLS_GOTDESC:
1679 case R_386_TLS_DESC_CALL:
1680 /* This symbol requires a global offset table entry. */
1682 int tls_type, old_tls_type;
1689 tls_type = GOT_NORMAL;
1691 case R_386_TLS_GD: tls_type = GOT_TLS_GD; break;
1692 case R_386_TLS_GOTDESC:
1693 case R_386_TLS_DESC_CALL:
1694 tls_type = GOT_TLS_GDESC; break;
1695 case R_386_TLS_IE_32:
1696 if (ELF32_R_TYPE (rel->r_info) == r_type)
1697 tls_type = GOT_TLS_IE_NEG;
1699 /* If this is a GD->IE transition, we may use either of
1700 R_386_TLS_TPOFF and R_386_TLS_TPOFF32. */
1701 tls_type = GOT_TLS_IE;
1704 case R_386_TLS_GOTIE:
1705 tls_type = GOT_TLS_IE_POS; break;
1710 h->got.refcount += 1;
1711 old_tls_type = elf_i386_hash_entry(h)->tls_type;
1715 bfd_signed_vma *local_got_refcounts;
1717 /* This is a global offset table entry for a local symbol. */
1718 local_got_refcounts = elf_local_got_refcounts (abfd);
1719 if (local_got_refcounts == NULL)
1723 size = symtab_hdr->sh_info;
1724 size *= (sizeof (bfd_signed_vma)
1725 + sizeof (bfd_vma) + sizeof(char));
1726 local_got_refcounts = (bfd_signed_vma *)
1727 bfd_zalloc (abfd, size);
1728 if (local_got_refcounts == NULL)
1730 elf_local_got_refcounts (abfd) = local_got_refcounts;
1731 elf_i386_local_tlsdesc_gotent (abfd)
1732 = (bfd_vma *) (local_got_refcounts + symtab_hdr->sh_info);
1733 elf_i386_local_got_tls_type (abfd)
1734 = (char *) (local_got_refcounts + 2 * symtab_hdr->sh_info);
1736 local_got_refcounts[r_symndx] += 1;
1737 old_tls_type = elf_i386_local_got_tls_type (abfd) [r_symndx];
1740 if ((old_tls_type & GOT_TLS_IE) && (tls_type & GOT_TLS_IE))
1741 tls_type |= old_tls_type;
1742 /* If a TLS symbol is accessed using IE at least once,
1743 there is no point to use dynamic model for it. */
1744 else if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
1745 && (! GOT_TLS_GD_ANY_P (old_tls_type)
1746 || (tls_type & GOT_TLS_IE) == 0))
1748 if ((old_tls_type & GOT_TLS_IE) && GOT_TLS_GD_ANY_P (tls_type))
1749 tls_type = old_tls_type;
1750 else if (GOT_TLS_GD_ANY_P (old_tls_type)
1751 && GOT_TLS_GD_ANY_P (tls_type))
1752 tls_type |= old_tls_type;
1756 name = h->root.root.string;
1758 name = bfd_elf_sym_name (abfd, symtab_hdr, isym,
1760 (*_bfd_error_handler)
1761 (_("%B: `%s' accessed both as normal and "
1762 "thread local symbol"),
1764 bfd_set_error (bfd_error_bad_value);
1769 if (old_tls_type != tls_type)
1772 elf_i386_hash_entry (h)->tls_type = tls_type;
1774 elf_i386_local_got_tls_type (abfd) [r_symndx] = tls_type;
1782 if (htab->elf.sgot == NULL)
1784 if (htab->elf.dynobj == NULL)
1785 htab->elf.dynobj = abfd;
1786 if (!_bfd_elf_create_got_section (htab->elf.dynobj, info))
1789 if (r_type != R_386_TLS_IE)
1792 eh->has_got_reloc = 1;
1797 case R_386_TLS_LE_32:
1800 eh->has_got_reloc = 1;
1801 if (bfd_link_executable (info))
1803 info->flags |= DF_STATIC_TLS;
1808 if (eh != NULL && (sec->flags & SEC_CODE) != 0)
1809 eh->has_non_got_reloc = 1;
1811 if (h != NULL && bfd_link_executable (info))
1813 /* If this reloc is in a read-only section, we might
1814 need a copy reloc. We can't check reliably at this
1815 stage whether the section is read-only, as input
1816 sections have not yet been mapped to output sections.
1817 Tentatively set the flag for now, and correct in
1818 adjust_dynamic_symbol. */
1821 /* We may need a .plt entry if the function this reloc
1822 refers to is in a shared lib. */
1823 h->plt.refcount += 1;
1824 if (r_type == R_386_PC32)
1826 /* Since something like ".long foo - ." may be used
1827 as pointer, make sure that PLT is used if foo is
1828 a function defined in a shared library. */
1829 if ((sec->flags & SEC_CODE) == 0)
1830 h->pointer_equality_needed = 1;
1834 h->pointer_equality_needed = 1;
1835 /* R_386_32 can be resolved at run-time. */
1836 if (r_type == R_386_32
1837 && (sec->flags & SEC_READONLY) == 0)
1838 eh->func_pointer_refcount += 1;
1844 /* If we are creating a shared library, and this is a reloc
1845 against a global symbol, or a non PC relative reloc
1846 against a local symbol, then we need to copy the reloc
1847 into the shared library. However, if we are linking with
1848 -Bsymbolic, we do not need to copy a reloc against a
1849 global symbol which is defined in an object we are
1850 including in the link (i.e., DEF_REGULAR is set). At
1851 this point we have not seen all the input files, so it is
1852 possible that DEF_REGULAR is not set now but will be set
1853 later (it is never cleared). In case of a weak definition,
1854 DEF_REGULAR may be cleared later by a strong definition in
1855 a shared library. We account for that possibility below by
1856 storing information in the relocs_copied field of the hash
1857 table entry. A similar situation occurs when creating
1858 shared libraries and symbol visibility changes render the
1861 If on the other hand, we are creating an executable, we
1862 may need to keep relocations for symbols satisfied by a
1863 dynamic library if we manage to avoid copy relocs for the
1865 if ((bfd_link_pic (info)
1866 && (sec->flags & SEC_ALLOC) != 0
1867 && (r_type != R_386_PC32
1869 && (! SYMBOLIC_BIND (info, h)
1870 || h->root.type == bfd_link_hash_defweak
1871 || !h->def_regular))))
1872 || (ELIMINATE_COPY_RELOCS
1873 && !bfd_link_pic (info)
1874 && (sec->flags & SEC_ALLOC) != 0
1876 && (h->root.type == bfd_link_hash_defweak
1877 || !h->def_regular)))
1879 struct elf_dyn_relocs *p;
1880 struct elf_dyn_relocs **head;
1882 /* We must copy these reloc types into the output file.
1883 Create a reloc section in dynobj and make room for
1887 if (htab->elf.dynobj == NULL)
1888 htab->elf.dynobj = abfd;
1890 sreloc = _bfd_elf_make_dynamic_reloc_section
1891 (sec, htab->elf.dynobj, 2, abfd, /*rela?*/ FALSE);
1897 /* If this is a global symbol, we count the number of
1898 relocations we need for this symbol. */
1901 head = &eh->dyn_relocs;
1905 /* Track dynamic relocs needed for local syms too.
1906 We really need local syms available to do this
1911 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1916 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
1920 vpp = &elf_section_data (s)->local_dynrel;
1921 head = (struct elf_dyn_relocs **)vpp;
1925 if (p == NULL || p->sec != sec)
1927 bfd_size_type amt = sizeof *p;
1928 p = (struct elf_dyn_relocs *) bfd_alloc (htab->elf.dynobj,
1940 /* Count size relocation as PC-relative relocation. */
1941 if (r_type == R_386_PC32 || size_reloc)
1946 /* This relocation describes the C++ object vtable hierarchy.
1947 Reconstruct it for later use during GC. */
1948 case R_386_GNU_VTINHERIT:
1949 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1953 /* This relocation describes which C++ vtable entries are actually
1954 used. Record for later use during GC. */
1955 case R_386_GNU_VTENTRY:
1956 BFD_ASSERT (h != NULL);
1958 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
1968 && h->plt.refcount > 0
1969 && (((info->flags & DF_BIND_NOW) && !h->pointer_equality_needed)
1970 || h->got.refcount > 0)
1971 && htab->plt_got == NULL)
1973 /* Create the GOT procedure linkage table. */
1974 unsigned int plt_got_align;
1975 const struct elf_backend_data *bed;
1977 bed = get_elf_backend_data (info->output_bfd);
1978 BFD_ASSERT (sizeof (elf_i386_got_plt_entry) == 8
1979 && (sizeof (elf_i386_got_plt_entry)
1980 == sizeof (elf_i386_pic_got_plt_entry)));
1983 if (htab->elf.dynobj == NULL)
1984 htab->elf.dynobj = abfd;
1986 = bfd_make_section_anyway_with_flags (htab->elf.dynobj,
1988 (bed->dynamic_sec_flags
1993 if (htab->plt_got == NULL
1994 || !bfd_set_section_alignment (htab->elf.dynobj,
2000 if ((r_type == R_386_GOT32 || r_type == R_386_GOT32X)
2001 && (h == NULL || h->type != STT_GNU_IFUNC))
2002 sec->need_convert_load = 1;
2008 /* Return the section that should be marked against GC for a given
2012 elf_i386_gc_mark_hook (asection *sec,
2013 struct bfd_link_info *info,
2014 Elf_Internal_Rela *rel,
2015 struct elf_link_hash_entry *h,
2016 Elf_Internal_Sym *sym)
2019 switch (ELF32_R_TYPE (rel->r_info))
2021 case R_386_GNU_VTINHERIT:
2022 case R_386_GNU_VTENTRY:
2026 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
2029 /* Update the got entry reference counts for the section being removed. */
2032 elf_i386_gc_sweep_hook (bfd *abfd,
2033 struct bfd_link_info *info,
2035 const Elf_Internal_Rela *relocs)
2037 struct elf_i386_link_hash_table *htab;
2038 Elf_Internal_Shdr *symtab_hdr;
2039 struct elf_link_hash_entry **sym_hashes;
2040 bfd_signed_vma *local_got_refcounts;
2041 const Elf_Internal_Rela *rel, *relend;
2043 if (bfd_link_relocatable (info))
2046 htab = elf_i386_hash_table (info);
2050 elf_section_data (sec)->local_dynrel = NULL;
2052 symtab_hdr = &elf_symtab_hdr (abfd);
2053 sym_hashes = elf_sym_hashes (abfd);
2054 local_got_refcounts = elf_local_got_refcounts (abfd);
2056 relend = relocs + sec->reloc_count;
2057 for (rel = relocs; rel < relend; rel++)
2059 unsigned long r_symndx;
2060 unsigned int r_type;
2061 struct elf_link_hash_entry *h = NULL;
2063 r_symndx = ELF32_R_SYM (rel->r_info);
2064 if (r_symndx >= symtab_hdr->sh_info)
2066 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2067 while (h->root.type == bfd_link_hash_indirect
2068 || h->root.type == bfd_link_hash_warning)
2069 h = (struct elf_link_hash_entry *) h->root.u.i.link;
2073 /* A local symbol. */
2074 Elf_Internal_Sym *isym;
2076 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
2079 /* Check relocation against local STT_GNU_IFUNC symbol. */
2081 && ELF32_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
2083 h = elf_i386_get_local_sym_hash (htab, abfd, rel, FALSE);
2091 struct elf_i386_link_hash_entry *eh;
2092 struct elf_dyn_relocs **pp;
2093 struct elf_dyn_relocs *p;
2095 eh = (struct elf_i386_link_hash_entry *) h;
2096 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
2099 /* Everything must go for SEC. */
2105 r_type = ELF32_R_TYPE (rel->r_info);
2106 if (! elf_i386_tls_transition (info, abfd, sec, NULL,
2107 symtab_hdr, sym_hashes,
2108 &r_type, GOT_UNKNOWN,
2109 rel, relend, h, r_symndx))
2115 if (htab->tls_ldm_got.refcount > 0)
2116 htab->tls_ldm_got.refcount -= 1;
2120 case R_386_TLS_GOTDESC:
2121 case R_386_TLS_DESC_CALL:
2122 case R_386_TLS_IE_32:
2124 case R_386_TLS_GOTIE:
2129 if (h->got.refcount > 0)
2130 h->got.refcount -= 1;
2131 if (h->type == STT_GNU_IFUNC)
2133 if (h->plt.refcount > 0)
2134 h->plt.refcount -= 1;
2137 else if (local_got_refcounts != NULL)
2139 if (local_got_refcounts[r_symndx] > 0)
2140 local_got_refcounts[r_symndx] -= 1;
2147 if (bfd_link_pic (info)
2148 && (h == NULL || h->type != STT_GNU_IFUNC))
2155 if (h->plt.refcount > 0)
2156 h->plt.refcount -= 1;
2157 if (r_type == R_386_32
2158 && (sec->flags & SEC_READONLY) == 0)
2160 struct elf_i386_link_hash_entry *eh
2161 = (struct elf_i386_link_hash_entry *) h;
2162 if (eh->func_pointer_refcount > 0)
2163 eh->func_pointer_refcount -= 1;
2169 if (h != NULL && h->type == STT_GNU_IFUNC)
2171 if (h->got.refcount > 0)
2172 h->got.refcount -= 1;
2173 if (h->plt.refcount > 0)
2174 h->plt.refcount -= 1;
2186 /* Remove undefined weak symbol from the dynamic symbol table if it
2187 is resolved to 0. */
2190 elf_i386_fixup_symbol (struct bfd_link_info *info,
2191 struct elf_link_hash_entry *h)
2193 if (h->dynindx != -1
2194 && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info,
2195 elf_i386_hash_entry (h)))
2198 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
2204 /* Adjust a symbol defined by a dynamic object and referenced by a
2205 regular object. The current definition is in some section of the
2206 dynamic object, but we're not including those sections. We have to
2207 change the definition to something the rest of the link can
2211 elf_i386_adjust_dynamic_symbol (struct bfd_link_info *info,
2212 struct elf_link_hash_entry *h)
2214 struct elf_i386_link_hash_table *htab;
2216 struct elf_i386_link_hash_entry *eh;
2217 struct elf_dyn_relocs *p;
2219 /* STT_GNU_IFUNC symbol must go through PLT. */
2220 if (h->type == STT_GNU_IFUNC)
2222 /* All local STT_GNU_IFUNC references must be treate as local
2223 calls via local PLT. */
2225 && SYMBOL_CALLS_LOCAL (info, h))
2227 bfd_size_type pc_count = 0, count = 0;
2228 struct elf_dyn_relocs **pp;
2230 eh = (struct elf_i386_link_hash_entry *) h;
2231 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2233 pc_count += p->pc_count;
2234 p->count -= p->pc_count;
2243 if (pc_count || count)
2247 if (h->plt.refcount <= 0)
2248 h->plt.refcount = 1;
2250 h->plt.refcount += 1;
2254 if (h->plt.refcount <= 0)
2256 h->plt.offset = (bfd_vma) -1;
2262 /* If this is a function, put it in the procedure linkage table. We
2263 will fill in the contents of the procedure linkage table later,
2264 when we know the address of the .got section. */
2265 if (h->type == STT_FUNC
2268 if (h->plt.refcount <= 0
2269 || SYMBOL_CALLS_LOCAL (info, h)
2270 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2271 && h->root.type == bfd_link_hash_undefweak))
2273 /* This case can occur if we saw a PLT32 reloc in an input
2274 file, but the symbol was never referred to by a dynamic
2275 object, or if all references were garbage collected. In
2276 such a case, we don't actually need to build a procedure
2277 linkage table, and we can just do a PC32 reloc instead. */
2278 h->plt.offset = (bfd_vma) -1;
2285 /* It's possible that we incorrectly decided a .plt reloc was
2286 needed for an R_386_PC32 reloc to a non-function sym in
2287 check_relocs. We can't decide accurately between function and
2288 non-function syms in check-relocs; Objects loaded later in
2289 the link may change h->type. So fix it now. */
2290 h->plt.offset = (bfd_vma) -1;
2292 /* If this is a weak symbol, and there is a real definition, the
2293 processor independent code will have arranged for us to see the
2294 real definition first, and we can just use the same value. */
2295 if (h->u.weakdef != NULL)
2297 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
2298 || h->u.weakdef->root.type == bfd_link_hash_defweak);
2299 h->root.u.def.section = h->u.weakdef->root.u.def.section;
2300 h->root.u.def.value = h->u.weakdef->root.u.def.value;
2301 if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
2302 h->non_got_ref = h->u.weakdef->non_got_ref;
2306 /* This is a reference to a symbol defined by a dynamic object which
2307 is not a function. */
2309 /* If we are creating a shared library, we must presume that the
2310 only references to the symbol are via the global offset table.
2311 For such cases we need not do anything here; the relocations will
2312 be handled correctly by relocate_section. */
2313 if (!bfd_link_executable (info))
2316 /* If there are no references to this symbol that do not use the
2317 GOT nor R_386_GOTOFF relocation, we don't need to generate a copy
2319 eh = (struct elf_i386_link_hash_entry *) h;
2320 if (!h->non_got_ref && !eh->gotoff_ref)
2323 /* If -z nocopyreloc was given, we won't generate them either. */
2324 if (info->nocopyreloc)
2330 htab = elf_i386_hash_table (info);
2334 /* If there aren't any dynamic relocs in read-only sections nor
2335 R_386_GOTOFF relocation, then we can keep the dynamic relocs and
2336 avoid the copy reloc. This doesn't work on VxWorks, where we can
2337 not have dynamic relocations (other than copy and jump slot
2338 relocations) in an executable. */
2339 if (ELIMINATE_COPY_RELOCS
2341 && !get_elf_i386_backend_data (info->output_bfd)->is_vxworks)
2343 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2345 s = p->sec->output_section;
2346 if (s != NULL && (s->flags & SEC_READONLY) != 0)
2357 /* We must allocate the symbol in our .dynbss section, which will
2358 become part of the .bss section of the executable. There will be
2359 an entry for this symbol in the .dynsym section. The dynamic
2360 object will contain position independent code, so all references
2361 from the dynamic object to this symbol will go through the global
2362 offset table. The dynamic linker will use the .dynsym entry to
2363 determine the address it must put in the global offset table, so
2364 both the dynamic object and the regular object will refer to the
2365 same memory location for the variable. */
2367 /* We must generate a R_386_COPY reloc to tell the dynamic linker to
2368 copy the initial value out of the dynamic object and into the
2369 runtime process image. */
2370 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
2372 htab->srelbss->size += sizeof (Elf32_External_Rel);
2378 return _bfd_elf_adjust_dynamic_copy (info, h, s);
2381 /* Allocate space in .plt, .got and associated reloc sections for
2385 elf_i386_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
2387 struct bfd_link_info *info;
2388 struct elf_i386_link_hash_table *htab;
2389 struct elf_i386_link_hash_entry *eh;
2390 struct elf_dyn_relocs *p;
2391 unsigned plt_entry_size;
2392 bfd_boolean resolved_to_zero;
2394 if (h->root.type == bfd_link_hash_indirect)
2397 eh = (struct elf_i386_link_hash_entry *) h;
2399 info = (struct bfd_link_info *) inf;
2400 htab = elf_i386_hash_table (info);
2404 plt_entry_size = GET_PLT_ENTRY_SIZE (info->output_bfd);
2406 resolved_to_zero = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
2408 /* Clear the reference count of function pointer relocations if
2409 symbol isn't a normal function. */
2410 if (h->type != STT_FUNC)
2411 eh->func_pointer_refcount = 0;
2413 /* We can't use the GOT PLT if pointer equality is needed since
2414 finish_dynamic_symbol won't clear symbol value and the dynamic
2415 linker won't update the GOT slot. We will get into an infinite
2416 loop at run-time. */
2417 if (htab->plt_got != NULL
2418 && h->type != STT_GNU_IFUNC
2419 && !h->pointer_equality_needed
2420 && h->plt.refcount > 0
2421 && h->got.refcount > 0)
2423 /* Don't use the regular PLT if there are both GOT and GOTPLT
2425 h->plt.offset = (bfd_vma) -1;
2427 /* Use the GOT PLT. */
2428 eh->plt_got.refcount = 1;
2431 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it
2432 here if it is defined and referenced in a non-shared object. */
2433 if (h->type == STT_GNU_IFUNC
2435 return _bfd_elf_allocate_ifunc_dyn_relocs (info, h, &eh->dyn_relocs,
2438 /* Don't create the PLT entry if there are only function pointer
2439 relocations which can be resolved at run-time. */
2440 else if (htab->elf.dynamic_sections_created
2441 && (h->plt.refcount > eh->func_pointer_refcount
2442 || eh->plt_got.refcount > 0))
2444 bfd_boolean use_plt_got;
2446 /* Clear the reference count of function pointer relocations
2448 eh->func_pointer_refcount = 0;
2450 if ((info->flags & DF_BIND_NOW) && !h->pointer_equality_needed)
2452 /* Don't use the regular PLT for DF_BIND_NOW. */
2453 h->plt.offset = (bfd_vma) -1;
2455 /* Use the GOT PLT. */
2456 h->got.refcount = 1;
2457 eh->plt_got.refcount = 1;
2460 use_plt_got = eh->plt_got.refcount > 0;
2462 /* Make sure this symbol is output as a dynamic symbol.
2463 Undefined weak syms won't yet be marked as dynamic. */
2464 if (h->dynindx == -1
2466 && !resolved_to_zero)
2468 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2472 if (bfd_link_pic (info)
2473 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
2475 asection *s = htab->elf.splt;
2476 asection *got_s = htab->plt_got;
2478 /* If this is the first .plt entry, make room for the special
2479 first entry. The .plt section is used by prelink to undo
2480 prelinking for dynamic relocations. */
2482 s->size = plt_entry_size;
2485 eh->plt_got.offset = got_s->size;
2487 h->plt.offset = s->size;
2489 /* If this symbol is not defined in a regular file, and we are
2490 not generating a shared library, then set the symbol to this
2491 location in the .plt. This is required to make function
2492 pointers compare as equal between the normal executable and
2493 the shared library. */
2494 if (! bfd_link_pic (info)
2499 /* We need to make a call to the entry of the GOT PLT
2500 instead of regular PLT entry. */
2501 h->root.u.def.section = got_s;
2502 h->root.u.def.value = eh->plt_got.offset;
2506 h->root.u.def.section = s;
2507 h->root.u.def.value = h->plt.offset;
2511 /* Make room for this entry. */
2513 got_s->size += sizeof (elf_i386_got_plt_entry);
2516 s->size += plt_entry_size;
2518 /* We also need to make an entry in the .got.plt section,
2519 which will be placed in the .got section by the linker
2521 htab->elf.sgotplt->size += 4;
2523 /* There should be no PLT relocation against resolved
2524 undefined weak symbol in executable. */
2525 if (!resolved_to_zero)
2527 /* We also need to make an entry in the .rel.plt
2529 htab->elf.srelplt->size += sizeof (Elf32_External_Rel);
2530 htab->elf.srelplt->reloc_count++;
2534 if (get_elf_i386_backend_data (info->output_bfd)->is_vxworks
2535 && !bfd_link_pic (info))
2537 /* VxWorks has a second set of relocations for each PLT entry
2538 in executables. They go in a separate relocation section,
2539 which is processed by the kernel loader. */
2541 /* There are two relocations for the initial PLT entry: an
2542 R_386_32 relocation for _GLOBAL_OFFSET_TABLE_ + 4 and an
2543 R_386_32 relocation for _GLOBAL_OFFSET_TABLE_ + 8. */
2545 if (h->plt.offset == plt_entry_size)
2546 htab->srelplt2->size += (sizeof (Elf32_External_Rel) * 2);
2548 /* There are two extra relocations for each subsequent PLT entry:
2549 an R_386_32 relocation for the GOT entry, and an R_386_32
2550 relocation for the PLT entry. */
2552 htab->srelplt2->size += (sizeof (Elf32_External_Rel) * 2);
2557 eh->plt_got.offset = (bfd_vma) -1;
2558 h->plt.offset = (bfd_vma) -1;
2564 eh->plt_got.offset = (bfd_vma) -1;
2565 h->plt.offset = (bfd_vma) -1;
2569 eh->tlsdesc_got = (bfd_vma) -1;
2571 /* If R_386_TLS_{IE_32,IE,GOTIE} symbol is now local to the binary,
2572 make it a R_386_TLS_LE_32 requiring no TLS entry. */
2573 if (h->got.refcount > 0
2574 && bfd_link_executable (info)
2576 && (elf_i386_hash_entry(h)->tls_type & GOT_TLS_IE))
2577 h->got.offset = (bfd_vma) -1;
2578 else if (h->got.refcount > 0)
2582 int tls_type = elf_i386_hash_entry(h)->tls_type;
2584 /* Make sure this symbol is output as a dynamic symbol.
2585 Undefined weak syms won't yet be marked as dynamic. */
2586 if (h->dynindx == -1
2588 && !resolved_to_zero)
2590 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2595 if (GOT_TLS_GDESC_P (tls_type))
2597 eh->tlsdesc_got = htab->elf.sgotplt->size
2598 - elf_i386_compute_jump_table_size (htab);
2599 htab->elf.sgotplt->size += 8;
2600 h->got.offset = (bfd_vma) -2;
2602 if (! GOT_TLS_GDESC_P (tls_type)
2603 || GOT_TLS_GD_P (tls_type))
2605 h->got.offset = s->size;
2607 /* R_386_TLS_GD needs 2 consecutive GOT slots. */
2608 if (GOT_TLS_GD_P (tls_type) || tls_type == GOT_TLS_IE_BOTH)
2611 dyn = htab->elf.dynamic_sections_created;
2612 /* R_386_TLS_IE_32 needs one dynamic relocation,
2613 R_386_TLS_IE resp. R_386_TLS_GOTIE needs one dynamic relocation,
2614 (but if both R_386_TLS_IE_32 and R_386_TLS_IE is present, we
2615 need two), R_386_TLS_GD needs one if local symbol and two if
2616 global. No dynamic relocation against resolved undefined weak
2617 symbol in executable. */
2618 if (tls_type == GOT_TLS_IE_BOTH)
2619 htab->elf.srelgot->size += 2 * sizeof (Elf32_External_Rel);
2620 else if ((GOT_TLS_GD_P (tls_type) && h->dynindx == -1)
2621 || (tls_type & GOT_TLS_IE))
2622 htab->elf.srelgot->size += sizeof (Elf32_External_Rel);
2623 else if (GOT_TLS_GD_P (tls_type))
2624 htab->elf.srelgot->size += 2 * sizeof (Elf32_External_Rel);
2625 else if (! GOT_TLS_GDESC_P (tls_type)
2626 && ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2627 && !resolved_to_zero)
2628 || h->root.type != bfd_link_hash_undefweak)
2629 && (bfd_link_pic (info)
2630 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
2631 htab->elf.srelgot->size += sizeof (Elf32_External_Rel);
2632 if (GOT_TLS_GDESC_P (tls_type))
2633 htab->elf.srelplt->size += sizeof (Elf32_External_Rel);
2636 h->got.offset = (bfd_vma) -1;
2638 if (eh->dyn_relocs == NULL)
2641 /* In the shared -Bsymbolic case, discard space allocated for
2642 dynamic pc-relative relocs against symbols which turn out to be
2643 defined in regular objects. For the normal shared case, discard
2644 space for pc-relative relocs that have become local due to symbol
2645 visibility changes. */
2647 if (bfd_link_pic (info))
2649 /* The only reloc that uses pc_count is R_386_PC32, which will
2650 appear on a call or on something like ".long foo - .". We
2651 want calls to protected symbols to resolve directly to the
2652 function rather than going via the plt. If people want
2653 function pointer comparisons to work as expected then they
2654 should avoid writing assembly like ".long foo - .". */
2655 if (SYMBOL_CALLS_LOCAL (info, h))
2657 struct elf_dyn_relocs **pp;
2659 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2661 p->count -= p->pc_count;
2670 if (get_elf_i386_backend_data (info->output_bfd)->is_vxworks)
2672 struct elf_dyn_relocs **pp;
2673 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2675 if (strcmp (p->sec->output_section->name, ".tls_vars") == 0)
2682 /* Also discard relocs on undefined weak syms with non-default
2683 visibility or in PIE. */
2684 if (eh->dyn_relocs != NULL
2685 && h->root.type == bfd_link_hash_undefweak)
2687 /* Undefined weak symbol is never bound locally in shared
2689 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2690 || resolved_to_zero)
2694 /* Keep dynamic non-GOT/non-PLT relocation so that we
2695 can branch to 0 without PLT. */
2696 struct elf_dyn_relocs **pp;
2698 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2699 if (p->pc_count == 0)
2703 /* Remove non-R_386_PC32 relocation. */
2704 p->count = p->pc_count;
2708 if (eh->dyn_relocs != NULL)
2710 /* Make sure undefined weak symbols are output
2711 as dynamic symbols in PIEs for dynamic non-GOT
2712 non-PLT reloations. */
2713 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2718 eh->dyn_relocs = NULL;
2720 else if (h->dynindx == -1
2721 && !h->forced_local)
2723 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2728 else if (ELIMINATE_COPY_RELOCS)
2730 /* For the non-shared case, discard space for relocs against
2731 symbols which turn out to need copy relocs or are not
2732 dynamic. Keep dynamic relocations for run-time function
2733 pointer initialization. */
2735 if ((!h->non_got_ref
2736 || eh->func_pointer_refcount > 0
2737 || (h->root.type == bfd_link_hash_undefweak
2738 && !resolved_to_zero))
2741 || (htab->elf.dynamic_sections_created
2742 && (h->root.type == bfd_link_hash_undefweak
2743 || h->root.type == bfd_link_hash_undefined))))
2745 /* Make sure this symbol is output as a dynamic symbol.
2746 Undefined weak syms won't yet be marked as dynamic. */
2747 if (h->dynindx == -1
2749 && !resolved_to_zero)
2751 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2755 /* If that succeeded, we know we'll be keeping all the
2757 if (h->dynindx != -1)
2761 eh->dyn_relocs = NULL;
2762 eh->func_pointer_refcount = 0;
2767 /* Finally, allocate space. */
2768 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2772 sreloc = elf_section_data (p->sec)->sreloc;
2774 BFD_ASSERT (sreloc != NULL);
2775 sreloc->size += p->count * sizeof (Elf32_External_Rel);
2781 /* Allocate space in .plt, .got and associated reloc sections for
2782 local dynamic relocs. */
2785 elf_i386_allocate_local_dynrelocs (void **slot, void *inf)
2787 struct elf_link_hash_entry *h
2788 = (struct elf_link_hash_entry *) *slot;
2790 if (h->type != STT_GNU_IFUNC
2794 || h->root.type != bfd_link_hash_defined)
2797 return elf_i386_allocate_dynrelocs (h, inf);
2800 /* Find any dynamic relocs that apply to read-only sections. */
2803 elf_i386_readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
2805 struct elf_i386_link_hash_entry *eh;
2806 struct elf_dyn_relocs *p;
2808 /* Skip local IFUNC symbols. */
2809 if (h->forced_local && h->type == STT_GNU_IFUNC)
2812 eh = (struct elf_i386_link_hash_entry *) h;
2813 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2815 asection *s = p->sec->output_section;
2817 if (s != NULL && (s->flags & SEC_READONLY) != 0)
2819 struct bfd_link_info *info = (struct bfd_link_info *) inf;
2821 info->flags |= DF_TEXTREL;
2823 if ((info->warn_shared_textrel && bfd_link_pic (info))
2824 || info->error_textrel)
2825 info->callbacks->einfo (_("%P: %B: warning: relocation against `%s' in readonly section `%A'\n"),
2826 p->sec->owner, h->root.root.string,
2829 /* Not an error, just cut short the traversal. */
2836 /* With the local symbol, foo, we convert
2837 mov foo@GOT[(%reg1)], %reg2
2839 lea foo[@GOTOFF(%reg1)], %reg2
2841 call/jmp *foo@GOT[(%reg)]
2843 nop call foo/jmp foo nop
2844 When PIC is false, convert
2845 test %reg1, foo@GOT[(%reg2)]
2849 binop foo@GOT[(%reg1)], %reg2
2852 where binop is one of adc, add, and, cmp, or, sbb, sub, xor
2856 elf_i386_convert_load (bfd *abfd, asection *sec,
2857 struct bfd_link_info *link_info)
2859 Elf_Internal_Shdr *symtab_hdr;
2860 Elf_Internal_Rela *internal_relocs;
2861 Elf_Internal_Rela *irel, *irelend;
2863 struct elf_i386_link_hash_table *htab;
2864 bfd_boolean changed_contents;
2865 bfd_boolean changed_relocs;
2866 bfd_signed_vma *local_got_refcounts;
2868 /* Don't even try to convert non-ELF outputs. */
2869 if (!is_elf_hash_table (link_info->hash))
2872 /* Nothing to do if there is no need or no output. */
2873 if ((sec->flags & (SEC_CODE | SEC_RELOC)) != (SEC_CODE | SEC_RELOC)
2874 || sec->need_convert_load == 0
2875 || bfd_is_abs_section (sec->output_section))
2878 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2880 /* Load the relocations for this section. */
2881 internal_relocs = (_bfd_elf_link_read_relocs
2882 (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
2883 link_info->keep_memory));
2884 if (internal_relocs == NULL)
2887 htab = elf_i386_hash_table (link_info);
2888 changed_contents = FALSE;
2889 changed_relocs = FALSE;
2890 local_got_refcounts = elf_local_got_refcounts (abfd);
2892 /* Get the section contents. */
2893 if (elf_section_data (sec)->this_hdr.contents != NULL)
2894 contents = elf_section_data (sec)->this_hdr.contents;
2897 if (!bfd_malloc_and_get_section (abfd, sec, &contents))
2901 irelend = internal_relocs + sec->reloc_count;
2902 for (irel = internal_relocs; irel < irelend; irel++)
2904 unsigned int r_type = ELF32_R_TYPE (irel->r_info);
2905 unsigned int r_symndx = ELF32_R_SYM (irel->r_info);
2907 struct elf_link_hash_entry *h;
2908 unsigned int opcode;
2911 bfd_boolean baseless;
2912 Elf_Internal_Sym *isym;
2913 unsigned int addend;
2917 if (r_type != R_386_GOT32 && r_type != R_386_GOT32X)
2920 roff = irel->r_offset;
2924 /* Addend for R_386_GOT32 and R_386_GOT32X relocations must be 0. */
2925 addend = bfd_get_32 (abfd, contents + roff);
2929 modrm = bfd_get_8 (abfd, contents + roff - 1);
2930 baseless = (modrm & 0xc7) == 0x5;
2932 if (r_type == R_386_GOT32X
2934 && bfd_link_pic (link_info))
2936 /* For PIC, disallow R_386_GOT32X without a base register
2937 since we don't know what the GOT base is. Allow
2938 R_386_GOT32 for existing object files. */
2941 if (r_symndx < symtab_hdr->sh_info)
2943 isym = bfd_sym_from_r_symndx (&htab->sym_cache, abfd,
2945 name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
2949 indx = r_symndx - symtab_hdr->sh_info;
2950 h = elf_sym_hashes (abfd)[indx];
2951 BFD_ASSERT (h != NULL);
2952 name = h->root.root.string;
2955 (*_bfd_error_handler)
2956 (_("%B: direct GOT relocation R_386_GOT32X against `%s' without base register can not be used when making a shared object"),
2961 opcode = bfd_get_8 (abfd, contents + roff - 2);
2963 /* It is OK to convert mov to lea. */
2966 /* Only convert R_386_GOT32X relocation for call, jmp or
2967 one of adc, add, and, cmp, or, sbb, sub, test, xor
2969 if (r_type != R_386_GOT32X)
2972 /* It is OK to convert indirect branch to direct branch. It
2973 is OK to convert adc, add, and, cmp, or, sbb, sub, test,
2974 xor only when PIC is false. */
2975 if (opcode != 0xff && bfd_link_pic (link_info))
2979 /* Try to convert R_386_GOT32 and R_386_GOT32X. Get the symbol
2980 referred to by the reloc. */
2981 if (r_symndx < symtab_hdr->sh_info)
2983 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
2986 /* STT_GNU_IFUNC must keep GOT32 relocations. */
2987 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
2991 if (opcode == 0x0ff)
2992 /* Convert "call/jmp *foo@GOT[(%reg)]". */
2993 goto convert_branch;
2995 /* Convert "mov foo@GOT[(%reg1)], %reg2",
2996 "test %reg1, foo@GOT(%reg2)" and
2997 "binop foo@GOT[(%reg1)], %reg2". */
3001 indx = r_symndx - symtab_hdr->sh_info;
3002 h = elf_sym_hashes (abfd)[indx];
3003 BFD_ASSERT (h != NULL);
3005 while (h->root.type == bfd_link_hash_indirect
3006 || h->root.type == bfd_link_hash_warning)
3007 h = (struct elf_link_hash_entry *) h->root.u.i.link;
3009 /* STT_GNU_IFUNC must keep GOT32 relocations. */
3010 if (h->type == STT_GNU_IFUNC)
3015 /* We have "call/jmp *foo@GOT[(%reg)]". */
3016 if ((h->root.type == bfd_link_hash_defined
3017 || h->root.type == bfd_link_hash_defweak)
3018 && SYMBOL_REFERENCES_LOCAL (link_info, h))
3020 /* The function is locally defined. */
3022 /* Convert R_386_GOT32X to R_386_PC32. */
3023 if (modrm == 0x15 || (modrm & 0xf8) == 0x90)
3025 /* Convert to "nop call foo". ADDR_PREFIX_OPCODE
3028 nop = link_info->call_nop_byte;
3029 if (link_info->call_nop_as_suffix)
3031 nop_offset = roff + 3;
3032 irel->r_offset -= 1;
3035 nop_offset = roff - 2;
3039 /* Convert to "jmp foo nop". */
3042 nop_offset = roff + 3;
3043 irel->r_offset -= 1;
3046 bfd_put_8 (abfd, nop, contents + nop_offset);
3047 bfd_put_8 (abfd, modrm, contents + irel->r_offset - 1);
3048 /* When converting to PC-relative relocation, we
3049 need to adjust addend by -4. */
3050 bfd_put_32 (abfd, -4, contents + irel->r_offset);
3051 irel->r_info = ELF32_R_INFO (r_symndx, R_386_PC32);
3055 if (h->got.refcount > 0)
3056 h->got.refcount -= 1;
3060 if (local_got_refcounts != NULL
3061 && local_got_refcounts[r_symndx] > 0)
3062 local_got_refcounts[r_symndx] -= 1;
3065 changed_contents = TRUE;
3066 changed_relocs = TRUE;
3071 /* We have "mov foo@GOT[(%re1g)], %reg2",
3072 "test %reg1, foo@GOT(%reg2)" and
3073 "binop foo@GOT[(%reg1)], %reg2".
3075 Avoid optimizing _DYNAMIC since ld.so may use its
3076 link-time address. */
3077 if (h == htab->elf.hdynamic)
3080 /* def_regular is set by an assignment in a linker script in
3081 bfd_elf_record_link_assignment. */
3083 || h->root.type == bfd_link_hash_defined
3084 || h->root.type == bfd_link_hash_defweak)
3085 && SYMBOL_REFERENCES_LOCAL (link_info, h))
3090 /* Convert "mov foo@GOT(%reg1), %reg2" to
3091 "lea foo@GOTOFF(%reg1), %reg2". */
3092 if (r_type == R_386_GOT32X
3093 && (baseless || !bfd_link_pic (link_info)))
3096 /* For R_386_32, convert
3097 "lea foo@GOTOFF(%reg1), %reg2" to
3098 "lea foo@GOT, %reg2". */
3101 modrm = 0x5 | (modrm & 0x38);
3102 bfd_put_8 (abfd, modrm, contents + roff - 1);
3106 r_type = R_386_GOTOFF;
3113 /* Convert "test %reg1, foo@GOT(%reg2)" to
3114 "test $foo, %reg1". */
3115 modrm = 0xc0 | (modrm & 0x38) >> 3;
3120 /* Convert "binop foo@GOT(%reg1), %reg2" to
3121 "binop $foo, %reg2". */
3123 | (modrm & 0x38) >> 3
3127 bfd_put_8 (abfd, modrm, contents + roff - 1);
3131 bfd_put_8 (abfd, opcode, contents + roff - 2);
3132 irel->r_info = ELF32_R_INFO (r_symndx, r_type);
3136 if (h->got.refcount > 0)
3137 h->got.refcount -= 1;
3141 if (local_got_refcounts != NULL
3142 && local_got_refcounts[r_symndx] > 0)
3143 local_got_refcounts[r_symndx] -= 1;
3146 changed_contents = TRUE;
3147 changed_relocs = TRUE;
3152 if (contents != NULL
3153 && elf_section_data (sec)->this_hdr.contents != contents)
3155 if (!changed_contents && !link_info->keep_memory)
3159 /* Cache the section contents for elf_link_input_bfd. */
3160 elf_section_data (sec)->this_hdr.contents = contents;
3164 if (elf_section_data (sec)->relocs != internal_relocs)
3166 if (!changed_relocs)
3167 free (internal_relocs);
3169 elf_section_data (sec)->relocs = internal_relocs;
3175 if (contents != NULL
3176 && elf_section_data (sec)->this_hdr.contents != contents)
3178 if (internal_relocs != NULL
3179 && elf_section_data (sec)->relocs != internal_relocs)
3180 free (internal_relocs);
3184 /* Set the sizes of the dynamic sections. */
3187 elf_i386_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
3189 struct elf_i386_link_hash_table *htab;
3195 htab = elf_i386_hash_table (info);
3198 dynobj = htab->elf.dynobj;
3202 if (htab->elf.dynamic_sections_created)
3204 /* Set the contents of the .interp section to the interpreter. */
3205 if (bfd_link_executable (info) && !info->nointerp)
3207 s = bfd_get_linker_section (dynobj, ".interp");
3210 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
3211 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
3216 /* Set up .got offsets for local syms, and space for local dynamic
3218 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
3220 bfd_signed_vma *local_got;
3221 bfd_signed_vma *end_local_got;
3222 char *local_tls_type;
3223 bfd_vma *local_tlsdesc_gotent;
3224 bfd_size_type locsymcount;
3225 Elf_Internal_Shdr *symtab_hdr;
3228 if (! is_i386_elf (ibfd))
3231 for (s = ibfd->sections; s != NULL; s = s->next)
3233 struct elf_dyn_relocs *p;
3235 if (!elf_i386_convert_load (ibfd, s, info))
3238 for (p = ((struct elf_dyn_relocs *)
3239 elf_section_data (s)->local_dynrel);
3243 if (!bfd_is_abs_section (p->sec)
3244 && bfd_is_abs_section (p->sec->output_section))
3246 /* Input section has been discarded, either because
3247 it is a copy of a linkonce section or due to
3248 linker script /DISCARD/, so we'll be discarding
3251 else if (get_elf_i386_backend_data (output_bfd)->is_vxworks
3252 && strcmp (p->sec->output_section->name,
3255 /* Relocations in vxworks .tls_vars sections are
3256 handled specially by the loader. */
3258 else if (p->count != 0)
3260 srel = elf_section_data (p->sec)->sreloc;
3261 srel->size += p->count * sizeof (Elf32_External_Rel);
3262 if ((p->sec->output_section->flags & SEC_READONLY) != 0
3263 && (info->flags & DF_TEXTREL) == 0)
3265 info->flags |= DF_TEXTREL;
3266 if ((info->warn_shared_textrel && bfd_link_pic (info))
3267 || info->error_textrel)
3268 info->callbacks->einfo (_("%P: %B: warning: relocation in readonly section `%A'\n"),
3269 p->sec->owner, p->sec);
3275 local_got = elf_local_got_refcounts (ibfd);
3279 symtab_hdr = &elf_symtab_hdr (ibfd);
3280 locsymcount = symtab_hdr->sh_info;
3281 end_local_got = local_got + locsymcount;
3282 local_tls_type = elf_i386_local_got_tls_type (ibfd);
3283 local_tlsdesc_gotent = elf_i386_local_tlsdesc_gotent (ibfd);
3285 srel = htab->elf.srelgot;
3286 for (; local_got < end_local_got;
3287 ++local_got, ++local_tls_type, ++local_tlsdesc_gotent)
3289 *local_tlsdesc_gotent = (bfd_vma) -1;
3292 if (GOT_TLS_GDESC_P (*local_tls_type))
3294 *local_tlsdesc_gotent = htab->elf.sgotplt->size
3295 - elf_i386_compute_jump_table_size (htab);
3296 htab->elf.sgotplt->size += 8;
3297 *local_got = (bfd_vma) -2;
3299 if (! GOT_TLS_GDESC_P (*local_tls_type)
3300 || GOT_TLS_GD_P (*local_tls_type))
3302 *local_got = s->size;
3304 if (GOT_TLS_GD_P (*local_tls_type)
3305 || *local_tls_type == GOT_TLS_IE_BOTH)
3308 if (bfd_link_pic (info)
3309 || GOT_TLS_GD_ANY_P (*local_tls_type)
3310 || (*local_tls_type & GOT_TLS_IE))
3312 if (*local_tls_type == GOT_TLS_IE_BOTH)
3313 srel->size += 2 * sizeof (Elf32_External_Rel);
3314 else if (GOT_TLS_GD_P (*local_tls_type)
3315 || ! GOT_TLS_GDESC_P (*local_tls_type))
3316 srel->size += sizeof (Elf32_External_Rel);
3317 if (GOT_TLS_GDESC_P (*local_tls_type))
3318 htab->elf.srelplt->size += sizeof (Elf32_External_Rel);
3322 *local_got = (bfd_vma) -1;
3326 if (htab->tls_ldm_got.refcount > 0)
3328 /* Allocate 2 got entries and 1 dynamic reloc for R_386_TLS_LDM
3330 htab->tls_ldm_got.offset = htab->elf.sgot->size;
3331 htab->elf.sgot->size += 8;
3332 htab->elf.srelgot->size += sizeof (Elf32_External_Rel);
3335 htab->tls_ldm_got.offset = -1;
3337 /* Allocate global sym .plt and .got entries, and space for global
3338 sym dynamic relocs. */
3339 elf_link_hash_traverse (&htab->elf, elf_i386_allocate_dynrelocs, info);
3341 /* Allocate .plt and .got entries, and space for local symbols. */
3342 htab_traverse (htab->loc_hash_table,
3343 elf_i386_allocate_local_dynrelocs,
3346 /* For every jump slot reserved in the sgotplt, reloc_count is
3347 incremented. However, when we reserve space for TLS descriptors,
3348 it's not incremented, so in order to compute the space reserved
3349 for them, it suffices to multiply the reloc count by the jump
3352 PR ld/13302: We start next_irelative_index at the end of .rela.plt
3353 so that R_386_IRELATIVE entries come last. */
3354 if (htab->elf.srelplt)
3356 htab->next_tls_desc_index = htab->elf.srelplt->reloc_count;
3357 htab->sgotplt_jump_table_size = htab->next_tls_desc_index * 4;
3358 htab->next_irelative_index = htab->elf.srelplt->reloc_count - 1;
3360 else if (htab->elf.irelplt)
3361 htab->next_irelative_index = htab->elf.irelplt->reloc_count - 1;
3364 if (htab->elf.sgotplt)
3366 /* Don't allocate .got.plt section if there are no GOT nor PLT
3367 entries and there is no reference to _GLOBAL_OFFSET_TABLE_. */
3368 if ((htab->elf.hgot == NULL
3369 || !htab->elf.hgot->ref_regular_nonweak)
3370 && (htab->elf.sgotplt->size
3371 == get_elf_backend_data (output_bfd)->got_header_size)
3372 && (htab->elf.splt == NULL
3373 || htab->elf.splt->size == 0)
3374 && (htab->elf.sgot == NULL
3375 || htab->elf.sgot->size == 0)
3376 && (htab->elf.iplt == NULL
3377 || htab->elf.iplt->size == 0)
3378 && (htab->elf.igotplt == NULL
3379 || htab->elf.igotplt->size == 0))
3380 htab->elf.sgotplt->size = 0;
3384 if (htab->plt_eh_frame != NULL
3385 && htab->elf.splt != NULL
3386 && htab->elf.splt->size != 0
3387 && !bfd_is_abs_section (htab->elf.splt->output_section)
3388 && _bfd_elf_eh_frame_present (info))
3389 htab->plt_eh_frame->size = sizeof (elf_i386_eh_frame_plt);
3391 /* We now have determined the sizes of the various dynamic sections.
3392 Allocate memory for them. */
3394 for (s = dynobj->sections; s != NULL; s = s->next)
3396 bfd_boolean strip_section = TRUE;
3398 if ((s->flags & SEC_LINKER_CREATED) == 0)
3401 if (s == htab->elf.splt
3402 || s == htab->elf.sgot)
3404 /* Strip this section if we don't need it; see the
3406 /* We'd like to strip these sections if they aren't needed, but if
3407 we've exported dynamic symbols from them we must leave them.
3408 It's too late to tell BFD to get rid of the symbols. */
3410 if (htab->elf.hplt != NULL)
3411 strip_section = FALSE;
3413 else if (s == htab->elf.sgotplt
3414 || s == htab->elf.iplt
3415 || s == htab->elf.igotplt
3416 || s == htab->plt_got
3417 || s == htab->plt_eh_frame
3418 || s == htab->sdynbss)
3420 /* Strip these too. */
3422 else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rel"))
3425 && s != htab->elf.srelplt
3426 && s != htab->srelplt2)
3429 /* We use the reloc_count field as a counter if we need
3430 to copy relocs into the output file. */
3435 /* It's not one of our sections, so don't allocate space. */
3441 /* If we don't need this section, strip it from the
3442 output file. This is mostly to handle .rel.bss and
3443 .rel.plt. We must create both sections in
3444 create_dynamic_sections, because they must be created
3445 before the linker maps input sections to output
3446 sections. The linker does that before
3447 adjust_dynamic_symbol is called, and it is that
3448 function which decides whether anything needs to go
3449 into these sections. */
3451 s->flags |= SEC_EXCLUDE;
3455 if ((s->flags & SEC_HAS_CONTENTS) == 0)
3458 /* Allocate memory for the section contents. We use bfd_zalloc
3459 here in case unused entries are not reclaimed before the
3460 section's contents are written out. This should not happen,
3461 but this way if it does, we get a R_386_NONE reloc instead
3463 s->contents = (unsigned char *) bfd_zalloc (dynobj, s->size);
3464 if (s->contents == NULL)
3468 if (htab->plt_eh_frame != NULL
3469 && htab->plt_eh_frame->contents != NULL)
3471 memcpy (htab->plt_eh_frame->contents, elf_i386_eh_frame_plt,
3472 sizeof (elf_i386_eh_frame_plt));
3473 bfd_put_32 (dynobj, htab->elf.splt->size,
3474 htab->plt_eh_frame->contents + PLT_FDE_LEN_OFFSET);
3477 if (htab->elf.dynamic_sections_created)
3479 /* Add some entries to the .dynamic section. We fill in the
3480 values later, in elf_i386_finish_dynamic_sections, but we
3481 must add the entries now so that we get the correct size for
3482 the .dynamic section. The DT_DEBUG entry is filled in by the
3483 dynamic linker and used by the debugger. */
3484 #define add_dynamic_entry(TAG, VAL) \
3485 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
3487 if (bfd_link_executable (info))
3489 if (!add_dynamic_entry (DT_DEBUG, 0))
3493 if (htab->elf.splt->size != 0)
3495 /* DT_PLTGOT is used by prelink even if there is no PLT
3497 if (!add_dynamic_entry (DT_PLTGOT, 0))
3500 if (htab->elf.srelplt->size != 0)
3502 if (!add_dynamic_entry (DT_PLTRELSZ, 0)
3503 || !add_dynamic_entry (DT_PLTREL, DT_REL)
3504 || !add_dynamic_entry (DT_JMPREL, 0))
3511 if (!add_dynamic_entry (DT_REL, 0)
3512 || !add_dynamic_entry (DT_RELSZ, 0)
3513 || !add_dynamic_entry (DT_RELENT, sizeof (Elf32_External_Rel)))
3516 /* If any dynamic relocs apply to a read-only section,
3517 then we need a DT_TEXTREL entry. */
3518 if ((info->flags & DF_TEXTREL) == 0)
3519 elf_link_hash_traverse (&htab->elf,
3520 elf_i386_readonly_dynrelocs, info);
3522 if ((info->flags & DF_TEXTREL) != 0)
3524 if ((elf_tdata (output_bfd)->has_gnu_symbols
3525 & elf_gnu_symbol_ifunc) == elf_gnu_symbol_ifunc)
3527 info->callbacks->einfo
3528 (_("%P%X: read-only segment has dynamic IFUNC relocations; recompile with -fPIC\n"));
3529 bfd_set_error (bfd_error_bad_value);
3533 if (!add_dynamic_entry (DT_TEXTREL, 0))
3537 if (get_elf_i386_backend_data (output_bfd)->is_vxworks
3538 && !elf_vxworks_add_dynamic_entries (output_bfd, info))
3541 #undef add_dynamic_entry
3547 elf_i386_always_size_sections (bfd *output_bfd,
3548 struct bfd_link_info *info)
3550 asection *tls_sec = elf_hash_table (info)->tls_sec;
3554 struct elf_link_hash_entry *tlsbase;
3556 tlsbase = elf_link_hash_lookup (elf_hash_table (info),
3557 "_TLS_MODULE_BASE_",
3558 FALSE, FALSE, FALSE);
3560 if (tlsbase && tlsbase->type == STT_TLS)
3562 struct elf_i386_link_hash_table *htab;
3563 struct bfd_link_hash_entry *bh = NULL;
3564 const struct elf_backend_data *bed
3565 = get_elf_backend_data (output_bfd);
3567 htab = elf_i386_hash_table (info);
3571 if (!(_bfd_generic_link_add_one_symbol
3572 (info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL,
3573 tls_sec, 0, NULL, FALSE,
3574 bed->collect, &bh)))
3577 htab->tls_module_base = bh;
3579 tlsbase = (struct elf_link_hash_entry *)bh;
3580 tlsbase->def_regular = 1;
3581 tlsbase->other = STV_HIDDEN;
3582 tlsbase->root.linker_def = 1;
3583 (*bed->elf_backend_hide_symbol) (info, tlsbase, TRUE);
3590 /* Set the correct type for an x86 ELF section. We do this by the
3591 section name, which is a hack, but ought to work. */
3594 elf_i386_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
3595 Elf_Internal_Shdr *hdr,
3600 name = bfd_get_section_name (abfd, sec);
3602 /* This is an ugly, but unfortunately necessary hack that is
3603 needed when producing EFI binaries on x86. It tells
3604 elf.c:elf_fake_sections() not to consider ".reloc" as a section
3605 containing ELF relocation info. We need this hack in order to
3606 be able to generate ELF binaries that can be translated into
3607 EFI applications (which are essentially COFF objects). Those
3608 files contain a COFF ".reloc" section inside an ELFNN object,
3609 which would normally cause BFD to segfault because it would
3610 attempt to interpret this section as containing relocation
3611 entries for section "oc". With this hack enabled, ".reloc"
3612 will be treated as a normal data section, which will avoid the
3613 segfault. However, you won't be able to create an ELFNN binary
3614 with a section named "oc" that needs relocations, but that's
3615 the kind of ugly side-effects you get when detecting section
3616 types based on their names... In practice, this limitation is
3617 unlikely to bite. */
3618 if (strcmp (name, ".reloc") == 0)
3619 hdr->sh_type = SHT_PROGBITS;
3624 /* _TLS_MODULE_BASE_ needs to be treated especially when linking
3625 executables. Rather than setting it to the beginning of the TLS
3626 section, we have to set it to the end. This function may be called
3627 multiple times, it is idempotent. */
3630 elf_i386_set_tls_module_base (struct bfd_link_info *info)
3632 struct elf_i386_link_hash_table *htab;
3633 struct bfd_link_hash_entry *base;
3635 if (!bfd_link_executable (info))
3638 htab = elf_i386_hash_table (info);
3642 base = htab->tls_module_base;
3646 base->u.def.value = htab->elf.tls_size;
3649 /* Return the base VMA address which should be subtracted from real addresses
3650 when resolving @dtpoff relocation.
3651 This is PT_TLS segment p_vaddr. */
3654 elf_i386_dtpoff_base (struct bfd_link_info *info)
3656 /* If tls_sec is NULL, we should have signalled an error already. */
3657 if (elf_hash_table (info)->tls_sec == NULL)
3659 return elf_hash_table (info)->tls_sec->vma;
3662 /* Return the relocation value for @tpoff relocation
3663 if STT_TLS virtual address is ADDRESS. */
3666 elf_i386_tpoff (struct bfd_link_info *info, bfd_vma address)
3668 struct elf_link_hash_table *htab = elf_hash_table (info);
3669 const struct elf_backend_data *bed = get_elf_backend_data (info->output_bfd);
3670 bfd_vma static_tls_size;
3672 /* If tls_sec is NULL, we should have signalled an error already. */
3673 if (htab->tls_sec == NULL)
3676 /* Consider special static TLS alignment requirements. */
3677 static_tls_size = BFD_ALIGN (htab->tls_size, bed->static_tls_alignment);
3678 return static_tls_size + htab->tls_sec->vma - address;
3681 /* Relocate an i386 ELF section. */
3684 elf_i386_relocate_section (bfd *output_bfd,
3685 struct bfd_link_info *info,
3687 asection *input_section,
3689 Elf_Internal_Rela *relocs,
3690 Elf_Internal_Sym *local_syms,
3691 asection **local_sections)
3693 struct elf_i386_link_hash_table *htab;
3694 Elf_Internal_Shdr *symtab_hdr;
3695 struct elf_link_hash_entry **sym_hashes;
3696 bfd_vma *local_got_offsets;
3697 bfd_vma *local_tlsdesc_gotents;
3698 Elf_Internal_Rela *rel;
3699 Elf_Internal_Rela *wrel;
3700 Elf_Internal_Rela *relend;
3701 bfd_boolean is_vxworks_tls;
3702 unsigned plt_entry_size;
3704 BFD_ASSERT (is_i386_elf (input_bfd));
3706 htab = elf_i386_hash_table (info);
3709 symtab_hdr = &elf_symtab_hdr (input_bfd);
3710 sym_hashes = elf_sym_hashes (input_bfd);
3711 local_got_offsets = elf_local_got_offsets (input_bfd);
3712 local_tlsdesc_gotents = elf_i386_local_tlsdesc_gotent (input_bfd);
3713 /* We have to handle relocations in vxworks .tls_vars sections
3714 specially, because the dynamic loader is 'weird'. */
3715 is_vxworks_tls = (get_elf_i386_backend_data (output_bfd)->is_vxworks
3716 && bfd_link_pic (info)
3717 && !strcmp (input_section->output_section->name,
3720 elf_i386_set_tls_module_base (info);
3722 plt_entry_size = GET_PLT_ENTRY_SIZE (output_bfd);
3724 rel = wrel = relocs;
3725 relend = relocs + input_section->reloc_count;
3726 for (; rel < relend; wrel++, rel++)
3728 unsigned int r_type;
3729 reloc_howto_type *howto;
3730 unsigned long r_symndx;
3731 struct elf_link_hash_entry *h;
3732 struct elf_i386_link_hash_entry *eh;
3733 Elf_Internal_Sym *sym;
3735 bfd_vma off, offplt, plt_offset;
3737 bfd_boolean unresolved_reloc;
3738 bfd_reloc_status_type r;
3742 asection *resolved_plt;
3743 bfd_boolean resolved_to_zero;
3745 r_type = ELF32_R_TYPE (rel->r_info);
3746 if (r_type == R_386_GNU_VTINHERIT
3747 || r_type == R_386_GNU_VTENTRY)
3754 if ((indx = r_type) >= R_386_standard
3755 && ((indx = r_type - R_386_ext_offset) - R_386_standard
3756 >= R_386_ext - R_386_standard)
3757 && ((indx = r_type - R_386_tls_offset) - R_386_ext
3758 >= R_386_ext2 - R_386_ext))
3760 (*_bfd_error_handler)
3761 (_("%B: unrecognized relocation (0x%x) in section `%A'"),
3762 input_bfd, input_section, r_type);
3763 bfd_set_error (bfd_error_bad_value);
3766 howto = elf_howto_table + indx;
3768 r_symndx = ELF32_R_SYM (rel->r_info);
3772 unresolved_reloc = FALSE;
3773 if (r_symndx < symtab_hdr->sh_info)
3775 sym = local_syms + r_symndx;
3776 sec = local_sections[r_symndx];
3777 relocation = (sec->output_section->vma
3778 + sec->output_offset
3780 st_size = sym->st_size;
3782 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION
3783 && ((sec->flags & SEC_MERGE) != 0
3784 || (bfd_link_relocatable (info)
3785 && sec->output_offset != 0)))
3788 bfd_byte *where = contents + rel->r_offset;
3790 switch (howto->size)
3793 addend = bfd_get_8 (input_bfd, where);
3794 if (howto->pc_relative)
3796 addend = (addend ^ 0x80) - 0x80;
3801 addend = bfd_get_16 (input_bfd, where);
3802 if (howto->pc_relative)
3804 addend = (addend ^ 0x8000) - 0x8000;
3809 addend = bfd_get_32 (input_bfd, where);
3810 if (howto->pc_relative)
3812 addend = (addend ^ 0x80000000) - 0x80000000;
3820 if (bfd_link_relocatable (info))
3821 addend += sec->output_offset;
3824 asection *msec = sec;
3825 addend = _bfd_elf_rel_local_sym (output_bfd, sym, &msec,
3827 addend -= relocation;
3828 addend += msec->output_section->vma + msec->output_offset;
3831 switch (howto->size)
3834 /* FIXME: overflow checks. */
3835 if (howto->pc_relative)
3837 bfd_put_8 (input_bfd, addend, where);
3840 if (howto->pc_relative)
3842 bfd_put_16 (input_bfd, addend, where);
3845 if (howto->pc_relative)
3847 bfd_put_32 (input_bfd, addend, where);
3851 else if (!bfd_link_relocatable (info)
3852 && ELF32_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
3854 /* Relocate against local STT_GNU_IFUNC symbol. */
3855 h = elf_i386_get_local_sym_hash (htab, input_bfd, rel,
3860 /* Set STT_GNU_IFUNC symbol value. */
3861 h->root.u.def.value = sym->st_value;
3862 h->root.u.def.section = sec;
3867 bfd_boolean warned ATTRIBUTE_UNUSED;
3868 bfd_boolean ignored ATTRIBUTE_UNUSED;
3870 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
3871 r_symndx, symtab_hdr, sym_hashes,
3873 unresolved_reloc, warned, ignored);
3877 if (sec != NULL && discarded_section (sec))
3879 _bfd_clear_contents (howto, input_bfd, input_section,
3880 contents + rel->r_offset);
3881 wrel->r_offset = rel->r_offset;
3885 /* For ld -r, remove relocations in debug sections against
3886 sections defined in discarded sections. Not done for
3887 eh_frame editing code expects to be present. */
3888 if (bfd_link_relocatable (info)
3889 && (input_section->flags & SEC_DEBUGGING))
3895 if (bfd_link_relocatable (info))
3902 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle
3903 it here if it is defined in a non-shared object. */
3905 && h->type == STT_GNU_IFUNC
3908 asection *plt, *gotplt, *base_got;
3912 if ((input_section->flags & SEC_ALLOC) == 0)
3914 /* Dynamic relocs are not propagated for SEC_DEBUGGING
3915 sections because such sections are not SEC_ALLOC and
3916 thus ld.so will not process them. */
3917 if ((input_section->flags & SEC_DEBUGGING) != 0)
3921 else if (h->plt.offset == (bfd_vma) -1)
3924 /* STT_GNU_IFUNC symbol must go through PLT. */
3925 if (htab->elf.splt != NULL)
3927 plt = htab->elf.splt;
3928 gotplt = htab->elf.sgotplt;
3932 plt = htab->elf.iplt;
3933 gotplt = htab->elf.igotplt;
3936 relocation = (plt->output_section->vma
3937 + plt->output_offset + h->plt.offset);
3942 if (h->root.root.string)
3943 name = h->root.root.string;
3945 name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
3947 (*_bfd_error_handler)
3948 (_("%B: relocation %s against STT_GNU_IFUNC "
3949 "symbol `%s' isn't handled by %s"), input_bfd,
3950 elf_howto_table[r_type].name,
3951 name, __FUNCTION__);
3952 bfd_set_error (bfd_error_bad_value);
3956 /* Generate dynamic relcoation only when there is a
3957 non-GOT reference in a shared object. */
3958 if (bfd_link_pic (info) && h->non_got_ref)
3960 Elf_Internal_Rela outrel;
3964 /* Need a dynamic relocation to get the real function
3966 offset = _bfd_elf_section_offset (output_bfd,
3970 if (offset == (bfd_vma) -1
3971 || offset == (bfd_vma) -2)
3974 outrel.r_offset = (input_section->output_section->vma
3975 + input_section->output_offset
3978 if (h->dynindx == -1
3980 || bfd_link_executable (info))
3982 /* This symbol is resolved locally. */
3983 outrel.r_info = ELF32_R_INFO (0, R_386_IRELATIVE);
3984 bfd_put_32 (output_bfd,
3985 (h->root.u.def.value
3986 + h->root.u.def.section->output_section->vma
3987 + h->root.u.def.section->output_offset),
3991 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
3993 sreloc = htab->elf.irelifunc;
3994 elf_append_rel (output_bfd, sreloc, &outrel);
3996 /* If this reloc is against an external symbol, we
3997 do not want to fiddle with the addend. Otherwise,
3998 we need to include the symbol value so that it
3999 becomes an addend for the dynamic reloc. For an
4000 internal symbol, we have updated addend. */
4010 base_got = htab->elf.sgot;
4011 off = h->got.offset;
4013 if (base_got == NULL)
4016 if (off == (bfd_vma) -1)
4018 /* We can't use h->got.offset here to save state, or
4019 even just remember the offset, as finish_dynamic_symbol
4020 would use that as offset into .got. */
4022 if (htab->elf.splt != NULL)
4024 plt_index = h->plt.offset / plt_entry_size - 1;
4025 off = (plt_index + 3) * 4;
4026 base_got = htab->elf.sgotplt;
4030 plt_index = h->plt.offset / plt_entry_size;
4031 off = plt_index * 4;
4032 base_got = htab->elf.igotplt;
4035 if (h->dynindx == -1
4039 /* This references the local defitionion. We must
4040 initialize this entry in the global offset table.
4041 Since the offset must always be a multiple of 8,
4042 we use the least significant bit to record
4043 whether we have initialized it already.
4045 When doing a dynamic link, we create a .rela.got
4046 relocation entry to initialize the value. This
4047 is done in the finish_dynamic_symbol routine. */
4052 bfd_put_32 (output_bfd, relocation,
4053 base_got->contents + off);
4060 /* Adjust for static executables. */
4061 if (htab->elf.splt == NULL)
4062 relocation += gotplt->output_offset;
4066 relocation = (base_got->output_section->vma
4067 + base_got->output_offset + off
4068 - gotplt->output_section->vma
4069 - gotplt->output_offset);
4070 /* Adjust for static executables. */
4071 if (htab->elf.splt == NULL)
4072 relocation += gotplt->output_offset;
4078 relocation -= (gotplt->output_section->vma
4079 + gotplt->output_offset);
4084 eh = (struct elf_i386_link_hash_entry *) h;
4085 resolved_to_zero = (eh != NULL
4086 && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh));
4091 /* Avoid optimizing _DYNAMIC since ld.so may use its
4092 link-time address. */
4093 if (h == htab->elf.hdynamic)
4096 if (bfd_link_pic (info))
4098 /* It is OK to convert mov to lea and convert indirect
4099 branch to direct branch. It is OK to convert adc,
4100 add, and, cmp, or, sbb, sub, test, xor only when PIC
4102 unsigned int opcode, addend;
4103 addend = bfd_get_32 (input_bfd, contents + rel->r_offset);
4106 opcode = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
4107 if (opcode != 0x8b && opcode != 0xff)
4111 /* Resolve "mov GOT[(%reg)], %reg",
4112 "call/jmp *GOT[(%reg)]", "test %reg, foo@GOT[(%reg)]"
4113 and "binop foo@GOT[(%reg)], %reg". */
4115 || (h->plt.offset == (bfd_vma) -1
4116 && h->got.offset == (bfd_vma) -1)
4117 || htab->elf.sgotplt == NULL)
4120 offplt = (htab->elf.sgotplt->output_section->vma
4121 + htab->elf.sgotplt->output_offset);
4123 /* It is relative to .got.plt section. */
4124 if (h->got.offset != (bfd_vma) -1)
4125 /* Use GOT entry. Mask off the least significant bit in
4126 GOT offset which may be set by R_386_GOT32 processing
4128 relocation = (htab->elf.sgot->output_section->vma
4129 + htab->elf.sgot->output_offset
4130 + (h->got.offset & ~1) - offplt);
4132 /* Use GOTPLT entry. */
4133 relocation = (h->plt.offset / plt_entry_size - 1 + 3) * 4;
4135 if (!bfd_link_pic (info))
4137 /* If not PIC, add the .got.plt section address for
4138 baseless addressing. */
4140 modrm = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
4141 if ((modrm & 0xc7) == 0x5)
4142 relocation += offplt;
4145 unresolved_reloc = FALSE;
4150 /* Relocation is to the entry for this symbol in the global
4152 if (htab->elf.sgot == NULL)
4159 off = h->got.offset;
4160 dyn = htab->elf.dynamic_sections_created;
4161 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
4162 bfd_link_pic (info),
4164 || (bfd_link_pic (info)
4165 && SYMBOL_REFERENCES_LOCAL (info, h))
4166 || (ELF_ST_VISIBILITY (h->other)
4167 && h->root.type == bfd_link_hash_undefweak))
4169 /* This is actually a static link, or it is a
4170 -Bsymbolic link and the symbol is defined
4171 locally, or the symbol was forced to be local
4172 because of a version file. We must initialize
4173 this entry in the global offset table. Since the
4174 offset must always be a multiple of 4, we use the
4175 least significant bit to record whether we have
4176 initialized it already.
4178 When doing a dynamic link, we create a .rel.got
4179 relocation entry to initialize the value. This
4180 is done in the finish_dynamic_symbol routine. */
4185 bfd_put_32 (output_bfd, relocation,
4186 htab->elf.sgot->contents + off);
4191 unresolved_reloc = FALSE;
4195 if (local_got_offsets == NULL)
4198 off = local_got_offsets[r_symndx];
4200 /* The offset must always be a multiple of 4. We use
4201 the least significant bit to record whether we have
4202 already generated the necessary reloc. */
4207 bfd_put_32 (output_bfd, relocation,
4208 htab->elf.sgot->contents + off);
4210 if (bfd_link_pic (info))
4213 Elf_Internal_Rela outrel;
4215 s = htab->elf.srelgot;
4219 outrel.r_offset = (htab->elf.sgot->output_section->vma
4220 + htab->elf.sgot->output_offset
4222 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
4223 elf_append_rel (output_bfd, s, &outrel);
4226 local_got_offsets[r_symndx] |= 1;
4230 if (off >= (bfd_vma) -2)
4233 relocation = htab->elf.sgot->output_section->vma
4234 + htab->elf.sgot->output_offset + off
4235 - htab->elf.sgotplt->output_section->vma
4236 - htab->elf.sgotplt->output_offset;
4240 /* Relocation is relative to the start of the global offset
4243 /* Check to make sure it isn't a protected function or data
4244 symbol for shared library since it may not be local when
4245 used as function address or with copy relocation. We also
4246 need to make sure that a symbol is referenced locally. */
4247 if (!bfd_link_executable (info) && h)
4249 if (!h->def_regular)
4253 switch (ELF_ST_VISIBILITY (h->other))
4256 v = _("hidden symbol");
4259 v = _("internal symbol");
4262 v = _("protected symbol");
4269 (*_bfd_error_handler)
4270 (_("%B: relocation R_386_GOTOFF against undefined %s `%s' can not be used when making a shared object"),
4271 input_bfd, v, h->root.root.string);
4272 bfd_set_error (bfd_error_bad_value);
4275 else if (!SYMBOL_REFERENCES_LOCAL (info, h)
4276 && (h->type == STT_FUNC
4277 || h->type == STT_OBJECT)
4278 && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
4280 (*_bfd_error_handler)
4281 (_("%B: relocation R_386_GOTOFF against protected %s `%s' can not be used when making a shared object"),
4283 h->type == STT_FUNC ? "function" : "data",
4284 h->root.root.string);
4285 bfd_set_error (bfd_error_bad_value);
4290 /* Note that sgot is not involved in this
4291 calculation. We always want the start of .got.plt. If we
4292 defined _GLOBAL_OFFSET_TABLE_ in a different way, as is
4293 permitted by the ABI, we might have to change this
4295 relocation -= htab->elf.sgotplt->output_section->vma
4296 + htab->elf.sgotplt->output_offset;
4300 /* Use global offset table as symbol value. */
4301 relocation = htab->elf.sgotplt->output_section->vma
4302 + htab->elf.sgotplt->output_offset;
4303 unresolved_reloc = FALSE;
4307 /* Relocation is to the entry for this symbol in the
4308 procedure linkage table. */
4310 /* Resolve a PLT32 reloc against a local symbol directly,
4311 without using the procedure linkage table. */
4315 if ((h->plt.offset == (bfd_vma) -1
4316 && eh->plt_got.offset == (bfd_vma) -1)
4317 || htab->elf.splt == NULL)
4319 /* We didn't make a PLT entry for this symbol. This
4320 happens when statically linking PIC code, or when
4321 using -Bsymbolic. */
4325 if (h->plt.offset != (bfd_vma) -1)
4327 resolved_plt = htab->elf.splt;
4328 plt_offset = h->plt.offset;
4332 resolved_plt = htab->plt_got;
4333 plt_offset = eh->plt_got.offset;
4336 relocation = (resolved_plt->output_section->vma
4337 + resolved_plt->output_offset
4339 unresolved_reloc = FALSE;
4343 /* Set to symbol size. */
4344 relocation = st_size;
4349 if ((input_section->flags & SEC_ALLOC) == 0
4353 /* Copy dynamic function pointer relocations. Don't generate
4354 dynamic relocations against resolved undefined weak symbols
4355 in PIE, except for R_386_PC32. */
4356 if ((bfd_link_pic (info)
4358 || ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4359 && (!resolved_to_zero
4360 || r_type == R_386_PC32))
4361 || h->root.type != bfd_link_hash_undefweak))
4362 && ((r_type != R_386_PC32 && r_type != R_386_SIZE32)
4363 || !SYMBOL_CALLS_LOCAL (info, h)))
4364 || (ELIMINATE_COPY_RELOCS
4365 && !bfd_link_pic (info)
4369 || eh->func_pointer_refcount > 0
4370 || (h->root.type == bfd_link_hash_undefweak
4371 && !resolved_to_zero))
4374 || h->root.type == bfd_link_hash_undefweak
4375 || h->root.type == bfd_link_hash_undefined)))
4377 Elf_Internal_Rela outrel;
4378 bfd_boolean skip, relocate;
4381 /* When generating a shared object, these relocations
4382 are copied into the output file to be resolved at run
4389 _bfd_elf_section_offset (output_bfd, info, input_section,
4391 if (outrel.r_offset == (bfd_vma) -1)
4393 else if (outrel.r_offset == (bfd_vma) -2)
4394 skip = TRUE, relocate = TRUE;
4395 outrel.r_offset += (input_section->output_section->vma
4396 + input_section->output_offset);
4399 memset (&outrel, 0, sizeof outrel);
4402 && (r_type == R_386_PC32
4403 || !bfd_link_pic (info)
4404 || !SYMBOLIC_BIND (info, h)
4405 || !h->def_regular))
4406 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
4409 /* This symbol is local, or marked to become local. */
4411 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
4414 sreloc = elf_section_data (input_section)->sreloc;
4416 if (sreloc == NULL || sreloc->contents == NULL)
4418 r = bfd_reloc_notsupported;
4419 goto check_relocation_error;
4422 elf_append_rel (output_bfd, sreloc, &outrel);
4424 /* If this reloc is against an external symbol, we do
4425 not want to fiddle with the addend. Otherwise, we
4426 need to include the symbol value so that it becomes
4427 an addend for the dynamic reloc. */
4434 if (!bfd_link_executable (info))
4436 Elf_Internal_Rela outrel;
4439 outrel.r_offset = rel->r_offset
4440 + input_section->output_section->vma
4441 + input_section->output_offset;
4442 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
4443 sreloc = elf_section_data (input_section)->sreloc;
4446 elf_append_rel (output_bfd, sreloc, &outrel);
4451 case R_386_TLS_GOTDESC:
4452 case R_386_TLS_DESC_CALL:
4453 case R_386_TLS_IE_32:
4454 case R_386_TLS_GOTIE:
4455 tls_type = GOT_UNKNOWN;
4456 if (h == NULL && local_got_offsets)
4457 tls_type = elf_i386_local_got_tls_type (input_bfd) [r_symndx];
4459 tls_type = elf_i386_hash_entry(h)->tls_type;
4460 if (tls_type == GOT_TLS_IE)
4461 tls_type = GOT_TLS_IE_NEG;
4463 if (! elf_i386_tls_transition (info, input_bfd,
4464 input_section, contents,
4465 symtab_hdr, sym_hashes,
4466 &r_type, tls_type, rel,
4467 relend, h, r_symndx))
4470 if (r_type == R_386_TLS_LE_32)
4472 BFD_ASSERT (! unresolved_reloc);
4473 if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GD)
4478 /* GD->LE transition. */
4479 type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
4482 /* leal foo(,%reg,1), %eax; call ___tls_get_addr
4484 movl %gs:0, %eax; subl $foo@tpoff, %eax
4485 (6 byte form of subl). */
4486 memcpy (contents + rel->r_offset - 3,
4487 "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12);
4488 roff = rel->r_offset + 5;
4492 /* leal foo(%reg), %eax; call ___tls_get_addr; nop
4494 movl %gs:0, %eax; subl $foo@tpoff, %eax
4495 (6 byte form of subl). */
4496 memcpy (contents + rel->r_offset - 2,
4497 "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12);
4498 roff = rel->r_offset + 6;
4500 bfd_put_32 (output_bfd, elf_i386_tpoff (info, relocation),
4502 /* Skip R_386_PC32/R_386_PLT32. */
4507 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GOTDESC)
4509 /* GDesc -> LE transition.
4510 It's originally something like:
4511 leal x@tlsdesc(%ebx), %eax
4515 Registers other than %eax may be set up here. */
4520 roff = rel->r_offset;
4521 val = bfd_get_8 (input_bfd, contents + roff - 1);
4523 /* Now modify the instruction as appropriate. */
4524 /* aoliva FIXME: remove the above and xor the byte
4526 bfd_put_8 (output_bfd, val ^ 0x86,
4527 contents + roff - 1);
4528 bfd_put_32 (output_bfd, -elf_i386_tpoff (info, relocation),
4532 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_DESC_CALL)
4534 /* GDesc -> LE transition.
4542 roff = rel->r_offset;
4543 bfd_put_8 (output_bfd, 0x66, contents + roff);
4544 bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
4547 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_IE)
4551 /* IE->LE transition:
4552 Originally it can be one of:
4560 val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
4563 /* movl foo, %eax. */
4564 bfd_put_8 (output_bfd, 0xb8,
4565 contents + rel->r_offset - 1);
4571 type = bfd_get_8 (input_bfd,
4572 contents + rel->r_offset - 2);
4577 bfd_put_8 (output_bfd, 0xc7,
4578 contents + rel->r_offset - 2);
4579 bfd_put_8 (output_bfd,
4580 0xc0 | ((val >> 3) & 7),
4581 contents + rel->r_offset - 1);
4585 bfd_put_8 (output_bfd, 0x81,
4586 contents + rel->r_offset - 2);
4587 bfd_put_8 (output_bfd,
4588 0xc0 | ((val >> 3) & 7),
4589 contents + rel->r_offset - 1);
4596 bfd_put_32 (output_bfd, -elf_i386_tpoff (info, relocation),
4597 contents + rel->r_offset);
4602 unsigned int val, type;
4604 /* {IE_32,GOTIE}->LE transition:
4605 Originally it can be one of:
4606 subl foo(%reg1), %reg2
4607 movl foo(%reg1), %reg2
4608 addl foo(%reg1), %reg2
4611 movl $foo, %reg2 (6 byte form)
4612 addl $foo, %reg2. */
4613 type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
4614 val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
4618 bfd_put_8 (output_bfd, 0xc7,
4619 contents + rel->r_offset - 2);
4620 bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
4621 contents + rel->r_offset - 1);
4623 else if (type == 0x2b)
4626 bfd_put_8 (output_bfd, 0x81,
4627 contents + rel->r_offset - 2);
4628 bfd_put_8 (output_bfd, 0xe8 | ((val >> 3) & 7),
4629 contents + rel->r_offset - 1);
4631 else if (type == 0x03)
4634 bfd_put_8 (output_bfd, 0x81,
4635 contents + rel->r_offset - 2);
4636 bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
4637 contents + rel->r_offset - 1);
4641 if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GOTIE)
4642 bfd_put_32 (output_bfd, -elf_i386_tpoff (info, relocation),
4643 contents + rel->r_offset);
4645 bfd_put_32 (output_bfd, elf_i386_tpoff (info, relocation),
4646 contents + rel->r_offset);
4651 if (htab->elf.sgot == NULL)
4656 off = h->got.offset;
4657 offplt = elf_i386_hash_entry (h)->tlsdesc_got;
4661 if (local_got_offsets == NULL)
4664 off = local_got_offsets[r_symndx];
4665 offplt = local_tlsdesc_gotents[r_symndx];
4672 Elf_Internal_Rela outrel;
4676 if (htab->elf.srelgot == NULL)
4679 indx = h && h->dynindx != -1 ? h->dynindx : 0;
4681 if (GOT_TLS_GDESC_P (tls_type))
4684 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_DESC);
4685 BFD_ASSERT (htab->sgotplt_jump_table_size + offplt + 8
4686 <= htab->elf.sgotplt->size);
4687 outrel.r_offset = (htab->elf.sgotplt->output_section->vma
4688 + htab->elf.sgotplt->output_offset
4690 + htab->sgotplt_jump_table_size);
4691 sreloc = htab->elf.srelplt;
4692 loc = sreloc->contents;
4693 loc += (htab->next_tls_desc_index++
4694 * sizeof (Elf32_External_Rel));
4695 BFD_ASSERT (loc + sizeof (Elf32_External_Rel)
4696 <= sreloc->contents + sreloc->size);
4697 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
4700 BFD_ASSERT (! unresolved_reloc);
4701 bfd_put_32 (output_bfd,
4702 relocation - elf_i386_dtpoff_base (info),
4703 htab->elf.sgotplt->contents + offplt
4704 + htab->sgotplt_jump_table_size + 4);
4708 bfd_put_32 (output_bfd, 0,
4709 htab->elf.sgotplt->contents + offplt
4710 + htab->sgotplt_jump_table_size + 4);
4714 sreloc = htab->elf.srelgot;
4716 outrel.r_offset = (htab->elf.sgot->output_section->vma
4717 + htab->elf.sgot->output_offset + off);
4719 if (GOT_TLS_GD_P (tls_type))
4720 dr_type = R_386_TLS_DTPMOD32;
4721 else if (GOT_TLS_GDESC_P (tls_type))
4723 else if (tls_type == GOT_TLS_IE_POS)
4724 dr_type = R_386_TLS_TPOFF;
4726 dr_type = R_386_TLS_TPOFF32;
4728 if (dr_type == R_386_TLS_TPOFF && indx == 0)
4729 bfd_put_32 (output_bfd,
4730 relocation - elf_i386_dtpoff_base (info),
4731 htab->elf.sgot->contents + off);
4732 else if (dr_type == R_386_TLS_TPOFF32 && indx == 0)
4733 bfd_put_32 (output_bfd,
4734 elf_i386_dtpoff_base (info) - relocation,
4735 htab->elf.sgot->contents + off);
4736 else if (dr_type != R_386_TLS_DESC)
4737 bfd_put_32 (output_bfd, 0,
4738 htab->elf.sgot->contents + off);
4739 outrel.r_info = ELF32_R_INFO (indx, dr_type);
4741 elf_append_rel (output_bfd, sreloc, &outrel);
4743 if (GOT_TLS_GD_P (tls_type))
4747 BFD_ASSERT (! unresolved_reloc);
4748 bfd_put_32 (output_bfd,
4749 relocation - elf_i386_dtpoff_base (info),
4750 htab->elf.sgot->contents + off + 4);
4754 bfd_put_32 (output_bfd, 0,
4755 htab->elf.sgot->contents + off + 4);
4756 outrel.r_info = ELF32_R_INFO (indx,
4757 R_386_TLS_DTPOFF32);
4758 outrel.r_offset += 4;
4759 elf_append_rel (output_bfd, sreloc, &outrel);
4762 else if (tls_type == GOT_TLS_IE_BOTH)
4764 bfd_put_32 (output_bfd,
4766 ? relocation - elf_i386_dtpoff_base (info)
4768 htab->elf.sgot->contents + off + 4);
4769 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF);
4770 outrel.r_offset += 4;
4771 elf_append_rel (output_bfd, sreloc, &outrel);
4778 local_got_offsets[r_symndx] |= 1;
4781 if (off >= (bfd_vma) -2
4782 && ! GOT_TLS_GDESC_P (tls_type))
4784 if (r_type == R_386_TLS_GOTDESC
4785 || r_type == R_386_TLS_DESC_CALL)
4787 relocation = htab->sgotplt_jump_table_size + offplt;
4788 unresolved_reloc = FALSE;
4790 else if (r_type == ELF32_R_TYPE (rel->r_info))
4792 bfd_vma g_o_t = htab->elf.sgotplt->output_section->vma
4793 + htab->elf.sgotplt->output_offset;
4794 relocation = htab->elf.sgot->output_section->vma
4795 + htab->elf.sgot->output_offset + off - g_o_t;
4796 if ((r_type == R_386_TLS_IE || r_type == R_386_TLS_GOTIE)
4797 && tls_type == GOT_TLS_IE_BOTH)
4799 if (r_type == R_386_TLS_IE)
4800 relocation += g_o_t;
4801 unresolved_reloc = FALSE;
4803 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GD)
4805 unsigned int val, type;
4808 /* GD->IE transition. */
4809 type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
4810 val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
4813 /* leal foo(,%reg,1), %eax; call ___tls_get_addr
4815 movl %gs:0, %eax; subl $foo@gottpoff(%reg), %eax. */
4817 roff = rel->r_offset - 3;
4821 /* leal foo(%reg), %eax; call ___tls_get_addr; nop
4823 movl %gs:0, %eax; subl $foo@gottpoff(%reg), %eax. */
4824 roff = rel->r_offset - 2;
4826 memcpy (contents + roff,
4827 "\x65\xa1\0\0\0\0\x2b\x80\0\0\0", 12);
4828 contents[roff + 7] = 0x80 | (val & 7);
4829 /* If foo is used only with foo@gotntpoff(%reg) and
4830 foo@indntpoff, but not with foo@gottpoff(%reg), change
4831 subl $foo@gottpoff(%reg), %eax
4833 addl $foo@gotntpoff(%reg), %eax. */
4834 if (tls_type == GOT_TLS_IE_POS)
4835 contents[roff + 6] = 0x03;
4836 bfd_put_32 (output_bfd,
4837 htab->elf.sgot->output_section->vma
4838 + htab->elf.sgot->output_offset + off
4839 - htab->elf.sgotplt->output_section->vma
4840 - htab->elf.sgotplt->output_offset,
4841 contents + roff + 8);
4842 /* Skip R_386_PLT32. */
4847 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GOTDESC)
4849 /* GDesc -> IE transition.
4850 It's originally something like:
4851 leal x@tlsdesc(%ebx), %eax
4854 movl x@gotntpoff(%ebx), %eax # before xchg %ax,%ax
4856 movl x@gottpoff(%ebx), %eax # before negl %eax
4858 Registers other than %eax may be set up here. */
4862 /* First, make sure it's a leal adding ebx to a 32-bit
4863 offset into any register, although it's probably
4864 almost always going to be eax. */
4865 roff = rel->r_offset;
4867 /* Now modify the instruction as appropriate. */
4868 /* To turn a leal into a movl in the form we use it, it
4869 suffices to change the first byte from 0x8d to 0x8b.
4870 aoliva FIXME: should we decide to keep the leal, all
4871 we have to do is remove the statement below, and
4872 adjust the relaxation of R_386_TLS_DESC_CALL. */
4873 bfd_put_8 (output_bfd, 0x8b, contents + roff - 2);
4875 if (tls_type == GOT_TLS_IE_BOTH)
4878 bfd_put_32 (output_bfd,
4879 htab->elf.sgot->output_section->vma
4880 + htab->elf.sgot->output_offset + off
4881 - htab->elf.sgotplt->output_section->vma
4882 - htab->elf.sgotplt->output_offset,
4886 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_DESC_CALL)
4888 /* GDesc -> IE transition.
4896 depending on how we transformed the TLS_GOTDESC above.
4901 roff = rel->r_offset;
4903 /* Now modify the instruction as appropriate. */
4904 if (tls_type != GOT_TLS_IE_NEG)
4907 bfd_put_8 (output_bfd, 0x66, contents + roff);
4908 bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
4913 bfd_put_8 (output_bfd, 0xf7, contents + roff);
4914 bfd_put_8 (output_bfd, 0xd8, contents + roff + 1);
4924 if (! elf_i386_tls_transition (info, input_bfd,
4925 input_section, contents,
4926 symtab_hdr, sym_hashes,
4927 &r_type, GOT_UNKNOWN, rel,
4928 relend, h, r_symndx))
4931 if (r_type != R_386_TLS_LDM)
4933 /* LD->LE transition:
4934 leal foo(%reg), %eax; call ___tls_get_addr.
4936 movl %gs:0, %eax; nop; leal 0(%esi,1), %esi. */
4937 BFD_ASSERT (r_type == R_386_TLS_LE_32);
4938 memcpy (contents + rel->r_offset - 2,
4939 "\x65\xa1\0\0\0\0\x90\x8d\x74\x26", 11);
4940 /* Skip R_386_PC32/R_386_PLT32. */
4946 if (htab->elf.sgot == NULL)
4949 off = htab->tls_ldm_got.offset;
4954 Elf_Internal_Rela outrel;
4956 if (htab->elf.srelgot == NULL)
4959 outrel.r_offset = (htab->elf.sgot->output_section->vma
4960 + htab->elf.sgot->output_offset + off);
4962 bfd_put_32 (output_bfd, 0,
4963 htab->elf.sgot->contents + off);
4964 bfd_put_32 (output_bfd, 0,
4965 htab->elf.sgot->contents + off + 4);
4966 outrel.r_info = ELF32_R_INFO (0, R_386_TLS_DTPMOD32);
4967 elf_append_rel (output_bfd, htab->elf.srelgot, &outrel);
4968 htab->tls_ldm_got.offset |= 1;
4970 relocation = htab->elf.sgot->output_section->vma
4971 + htab->elf.sgot->output_offset + off
4972 - htab->elf.sgotplt->output_section->vma
4973 - htab->elf.sgotplt->output_offset;
4974 unresolved_reloc = FALSE;
4977 case R_386_TLS_LDO_32:
4978 if (!bfd_link_executable (info)
4979 || (input_section->flags & SEC_CODE) == 0)
4980 relocation -= elf_i386_dtpoff_base (info);
4982 /* When converting LDO to LE, we must negate. */
4983 relocation = -elf_i386_tpoff (info, relocation);
4986 case R_386_TLS_LE_32:
4988 if (!bfd_link_executable (info))
4990 Elf_Internal_Rela outrel;
4993 outrel.r_offset = rel->r_offset
4994 + input_section->output_section->vma
4995 + input_section->output_offset;
4996 if (h != NULL && h->dynindx != -1)
5000 if (r_type == R_386_TLS_LE_32)
5001 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF32);
5003 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF);
5004 sreloc = elf_section_data (input_section)->sreloc;
5007 elf_append_rel (output_bfd, sreloc, &outrel);
5010 else if (r_type == R_386_TLS_LE_32)
5011 relocation = elf_i386_dtpoff_base (info) - relocation;
5013 relocation -= elf_i386_dtpoff_base (info);
5015 else if (r_type == R_386_TLS_LE_32)
5016 relocation = elf_i386_tpoff (info, relocation);
5018 relocation = -elf_i386_tpoff (info, relocation);
5025 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
5026 because such sections are not SEC_ALLOC and thus ld.so will
5027 not process them. */
5028 if (unresolved_reloc
5029 && !((input_section->flags & SEC_DEBUGGING) != 0
5031 && _bfd_elf_section_offset (output_bfd, info, input_section,
5032 rel->r_offset) != (bfd_vma) -1)
5034 (*_bfd_error_handler)
5035 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
5038 (long) rel->r_offset,
5040 h->root.root.string);
5045 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
5046 contents, rel->r_offset,
5049 check_relocation_error:
5050 if (r != bfd_reloc_ok)
5055 name = h->root.root.string;
5058 name = bfd_elf_string_from_elf_section (input_bfd,
5059 symtab_hdr->sh_link,
5064 name = bfd_section_name (input_bfd, sec);
5067 if (r == bfd_reloc_overflow)
5069 if (! ((*info->callbacks->reloc_overflow)
5070 (info, (h ? &h->root : NULL), name, howto->name,
5071 (bfd_vma) 0, input_bfd, input_section,
5077 (*_bfd_error_handler)
5078 (_("%B(%A+0x%lx): reloc against `%s': error %d"),
5079 input_bfd, input_section,
5080 (long) rel->r_offset, name, (int) r);
5091 Elf_Internal_Shdr *rel_hdr;
5092 size_t deleted = rel - wrel;
5094 rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section);
5095 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
5096 if (rel_hdr->sh_size == 0)
5098 /* It is too late to remove an empty reloc section. Leave
5100 ??? What is wrong with an empty section??? */
5101 rel_hdr->sh_size = rel_hdr->sh_entsize;
5104 rel_hdr = _bfd_elf_single_rel_hdr (input_section);
5105 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
5106 input_section->reloc_count -= deleted;
5112 /* Finish up dynamic symbol handling. We set the contents of various
5113 dynamic sections here. */
5116 elf_i386_finish_dynamic_symbol (bfd *output_bfd,
5117 struct bfd_link_info *info,
5118 struct elf_link_hash_entry *h,
5119 Elf_Internal_Sym *sym)
5121 struct elf_i386_link_hash_table *htab;
5122 unsigned plt_entry_size;
5123 const struct elf_i386_backend_data *abed;
5124 struct elf_i386_link_hash_entry *eh;
5125 bfd_boolean local_undefweak;
5127 htab = elf_i386_hash_table (info);
5131 abed = get_elf_i386_backend_data (output_bfd);
5132 plt_entry_size = GET_PLT_ENTRY_SIZE (output_bfd);
5134 eh = (struct elf_i386_link_hash_entry *) h;
5136 /* We keep PLT/GOT entries without dynamic PLT/GOT relocations for
5137 resolved undefined weak symbols in executable so that their
5138 references have value 0 at run-time. */
5139 local_undefweak = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
5141 if (h->plt.offset != (bfd_vma) -1)
5145 Elf_Internal_Rela rel;
5147 asection *plt, *gotplt, *relplt;
5149 /* When building a static executable, use .iplt, .igot.plt and
5150 .rel.iplt sections for STT_GNU_IFUNC symbols. */
5151 if (htab->elf.splt != NULL)
5153 plt = htab->elf.splt;
5154 gotplt = htab->elf.sgotplt;
5155 relplt = htab->elf.srelplt;
5159 plt = htab->elf.iplt;
5160 gotplt = htab->elf.igotplt;
5161 relplt = htab->elf.irelplt;
5164 /* This symbol has an entry in the procedure linkage table. Set
5167 if ((h->dynindx == -1
5169 && !((h->forced_local || bfd_link_executable (info))
5171 && h->type == STT_GNU_IFUNC))
5177 /* Get the index in the procedure linkage table which
5178 corresponds to this symbol. This is the index of this symbol
5179 in all the symbols for which we are making plt entries. The
5180 first entry in the procedure linkage table is reserved.
5182 Get the offset into the .got table of the entry that
5183 corresponds to this function. Each .got entry is 4 bytes.
5184 The first three are reserved.
5186 For static executables, we don't reserve anything. */
5188 if (plt == htab->elf.splt)
5190 got_offset = h->plt.offset / plt_entry_size - 1;
5191 got_offset = (got_offset + 3) * 4;
5195 got_offset = h->plt.offset / plt_entry_size;
5196 got_offset = got_offset * 4;
5199 /* Fill in the entry in the procedure linkage table. */
5200 if (! bfd_link_pic (info))
5202 memcpy (plt->contents + h->plt.offset, abed->plt->plt_entry,
5203 abed->plt->plt_entry_size);
5204 bfd_put_32 (output_bfd,
5205 (gotplt->output_section->vma
5206 + gotplt->output_offset
5208 plt->contents + h->plt.offset
5209 + abed->plt->plt_got_offset);
5211 if (abed->is_vxworks)
5213 int s, k, reloc_index;
5215 /* Create the R_386_32 relocation referencing the GOT
5216 for this PLT entry. */
5218 /* S: Current slot number (zero-based). */
5219 s = ((h->plt.offset - abed->plt->plt_entry_size)
5220 / abed->plt->plt_entry_size);
5221 /* K: Number of relocations for PLTResolve. */
5222 if (bfd_link_pic (info))
5223 k = PLTRESOLVE_RELOCS_SHLIB;
5225 k = PLTRESOLVE_RELOCS;
5226 /* Skip the PLTresolve relocations, and the relocations for
5227 the other PLT slots. */
5228 reloc_index = k + s * PLT_NON_JUMP_SLOT_RELOCS;
5229 loc = (htab->srelplt2->contents + reloc_index
5230 * sizeof (Elf32_External_Rel));
5232 rel.r_offset = (htab->elf.splt->output_section->vma
5233 + htab->elf.splt->output_offset
5234 + h->plt.offset + 2),
5235 rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
5236 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
5238 /* Create the R_386_32 relocation referencing the beginning of
5239 the PLT for this GOT entry. */
5240 rel.r_offset = (htab->elf.sgotplt->output_section->vma
5241 + htab->elf.sgotplt->output_offset
5243 rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_386_32);
5244 bfd_elf32_swap_reloc_out (output_bfd, &rel,
5245 loc + sizeof (Elf32_External_Rel));
5250 memcpy (plt->contents + h->plt.offset, abed->plt->pic_plt_entry,
5251 abed->plt->plt_entry_size);
5252 bfd_put_32 (output_bfd, got_offset,
5253 plt->contents + h->plt.offset
5254 + abed->plt->plt_got_offset);
5257 /* Fill in the entry in the global offset table. Leave the entry
5258 as zero for undefined weak symbol in PIE. No PLT relocation
5259 against undefined weak symbol in PIE. */
5260 if (!local_undefweak)
5262 bfd_put_32 (output_bfd,
5263 (plt->output_section->vma
5264 + plt->output_offset
5266 + abed->plt->plt_lazy_offset),
5267 gotplt->contents + got_offset);
5269 /* Fill in the entry in the .rel.plt section. */
5270 rel.r_offset = (gotplt->output_section->vma
5271 + gotplt->output_offset
5273 if (h->dynindx == -1
5274 || ((bfd_link_executable (info)
5275 || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
5277 && h->type == STT_GNU_IFUNC))
5279 /* If an STT_GNU_IFUNC symbol is locally defined, generate
5280 R_386_IRELATIVE instead of R_386_JUMP_SLOT. Store addend
5281 in the .got.plt section. */
5282 bfd_put_32 (output_bfd,
5283 (h->root.u.def.value
5284 + h->root.u.def.section->output_section->vma
5285 + h->root.u.def.section->output_offset),
5286 gotplt->contents + got_offset);
5287 rel.r_info = ELF32_R_INFO (0, R_386_IRELATIVE);
5288 /* R_386_IRELATIVE comes last. */
5289 plt_index = htab->next_irelative_index--;
5293 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_JUMP_SLOT);
5294 plt_index = htab->next_jump_slot_index++;
5297 loc = relplt->contents + plt_index * sizeof (Elf32_External_Rel);
5298 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
5300 /* Don't fill PLT entry for static executables. */
5301 if (plt == htab->elf.splt)
5303 bfd_put_32 (output_bfd,
5304 plt_index * sizeof (Elf32_External_Rel),
5305 plt->contents + h->plt.offset
5306 + abed->plt->plt_reloc_offset);
5307 bfd_put_32 (output_bfd, - (h->plt.offset
5308 + abed->plt->plt_plt_offset + 4),
5309 plt->contents + h->plt.offset
5310 + abed->plt->plt_plt_offset);
5314 else if (eh->plt_got.offset != (bfd_vma) -1)
5316 bfd_vma got_offset, plt_offset;
5317 asection *plt, *got, *gotplt;
5318 const bfd_byte *got_plt_entry;
5320 /* Offset of displacement of the indirect jump. */
5321 bfd_vma plt_got_offset = 2;
5323 /* Set the entry in the GOT procedure linkage table. */
5324 plt = htab->plt_got;
5325 got = htab->elf.sgot;
5326 gotplt = htab->elf.sgotplt;
5327 got_offset = h->got.offset;
5329 if (got_offset == (bfd_vma) -1
5335 /* Fill in the entry in the GOT procedure linkage table. */
5336 if (! bfd_link_pic (info))
5338 got_plt_entry = elf_i386_got_plt_entry;
5339 got_offset += got->output_section->vma + got->output_offset;
5343 got_plt_entry = elf_i386_pic_got_plt_entry;
5344 got_offset += (got->output_section->vma
5345 + got->output_offset
5346 - gotplt->output_section->vma
5347 - gotplt->output_offset);
5350 plt_offset = eh->plt_got.offset;
5351 memcpy (plt->contents + plt_offset, got_plt_entry,
5352 sizeof (elf_i386_got_plt_entry));
5353 bfd_put_32 (output_bfd, got_offset,
5354 plt->contents + plt_offset + plt_got_offset);
5357 if (!local_undefweak
5359 && (h->plt.offset != (bfd_vma) -1
5360 || eh->plt_got.offset != (bfd_vma) -1))
5362 /* Mark the symbol as undefined, rather than as defined in
5363 the .plt section. Leave the value if there were any
5364 relocations where pointer equality matters (this is a clue
5365 for the dynamic linker, to make function pointer
5366 comparisons work between an application and shared
5367 library), otherwise set it to zero. If a function is only
5368 called from a binary, there is no need to slow down
5369 shared libraries because of that. */
5370 sym->st_shndx = SHN_UNDEF;
5371 if (!h->pointer_equality_needed)
5375 /* Don't generate dynamic GOT relocation against undefined weak
5376 symbol in executable. */
5377 if (h->got.offset != (bfd_vma) -1
5378 && ! GOT_TLS_GD_ANY_P (elf_i386_hash_entry(h)->tls_type)
5379 && (elf_i386_hash_entry(h)->tls_type & GOT_TLS_IE) == 0
5380 && !local_undefweak)
5382 Elf_Internal_Rela rel;
5384 /* This symbol has an entry in the global offset table. Set it
5387 if (htab->elf.sgot == NULL || htab->elf.srelgot == NULL)
5390 rel.r_offset = (htab->elf.sgot->output_section->vma
5391 + htab->elf.sgot->output_offset
5392 + (h->got.offset & ~(bfd_vma) 1));
5394 /* If this is a static link, or it is a -Bsymbolic link and the
5395 symbol is defined locally or was forced to be local because
5396 of a version file, we just want to emit a RELATIVE reloc.
5397 The entry in the global offset table will already have been
5398 initialized in the relocate_section function. */
5400 && h->type == STT_GNU_IFUNC)
5402 if (bfd_link_pic (info))
5404 /* Generate R_386_GLOB_DAT. */
5411 if (!h->pointer_equality_needed)
5414 /* For non-shared object, we can't use .got.plt, which
5415 contains the real function addres if we need pointer
5416 equality. We load the GOT entry with the PLT entry. */
5417 plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt;
5418 bfd_put_32 (output_bfd,
5419 (plt->output_section->vma
5420 + plt->output_offset + h->plt.offset),
5421 htab->elf.sgot->contents + h->got.offset);
5425 else if (bfd_link_pic (info)
5426 && SYMBOL_REFERENCES_LOCAL (info, h))
5428 BFD_ASSERT((h->got.offset & 1) != 0);
5429 rel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
5433 BFD_ASSERT((h->got.offset & 1) == 0);
5435 bfd_put_32 (output_bfd, (bfd_vma) 0,
5436 htab->elf.sgot->contents + h->got.offset);
5437 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_GLOB_DAT);
5440 elf_append_rel (output_bfd, htab->elf.srelgot, &rel);
5445 Elf_Internal_Rela rel;
5447 /* This symbol needs a copy reloc. Set it up. */
5449 if (h->dynindx == -1
5450 || (h->root.type != bfd_link_hash_defined
5451 && h->root.type != bfd_link_hash_defweak)
5452 || htab->srelbss == NULL)
5455 rel.r_offset = (h->root.u.def.value
5456 + h->root.u.def.section->output_section->vma
5457 + h->root.u.def.section->output_offset);
5458 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_COPY);
5459 elf_append_rel (output_bfd, htab->srelbss, &rel);
5465 /* Finish up local dynamic symbol handling. We set the contents of
5466 various dynamic sections here. */
5469 elf_i386_finish_local_dynamic_symbol (void **slot, void *inf)
5471 struct elf_link_hash_entry *h
5472 = (struct elf_link_hash_entry *) *slot;
5473 struct bfd_link_info *info
5474 = (struct bfd_link_info *) inf;
5476 return elf_i386_finish_dynamic_symbol (info->output_bfd, info,
5480 /* Finish up undefined weak symbol handling in PIE. Fill its PLT entry
5481 here since undefined weak symbol may not be dynamic and may not be
5482 called for elf_i386_finish_dynamic_symbol. */
5485 elf_i386_pie_finish_undefweak_symbol (struct bfd_hash_entry *bh,
5488 struct elf_link_hash_entry *h = (struct elf_link_hash_entry *) bh;
5489 struct bfd_link_info *info = (struct bfd_link_info *) inf;
5491 if (h->root.type != bfd_link_hash_undefweak
5492 || h->dynindx != -1)
5495 return elf_i386_finish_dynamic_symbol (info->output_bfd,
5499 /* Used to decide how to sort relocs in an optimal manner for the
5500 dynamic linker, before writing them out. */
5502 static enum elf_reloc_type_class
5503 elf_i386_reloc_type_class (const struct bfd_link_info *info,
5504 const asection *rel_sec ATTRIBUTE_UNUSED,
5505 const Elf_Internal_Rela *rela)
5507 bfd *abfd = info->output_bfd;
5508 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
5509 struct elf_link_hash_table *htab = elf_hash_table (info);
5511 if (htab->dynsym != NULL
5512 && htab->dynsym->contents != NULL)
5514 /* Check relocation against STT_GNU_IFUNC symbol if there are
5516 unsigned long r_symndx = ELF32_R_SYM (rela->r_info);
5517 Elf_Internal_Sym sym;
5518 if (!bed->s->swap_symbol_in (abfd,
5519 (htab->dynsym->contents
5520 + r_symndx * sizeof (Elf32_External_Sym)),
5524 if (ELF32_ST_TYPE (sym.st_info) == STT_GNU_IFUNC)
5525 return reloc_class_ifunc;
5528 switch (ELF32_R_TYPE (rela->r_info))
5530 case R_386_RELATIVE:
5531 return reloc_class_relative;
5532 case R_386_JUMP_SLOT:
5533 return reloc_class_plt;
5535 return reloc_class_copy;
5537 return reloc_class_normal;
5541 /* Finish up the dynamic sections. */
5544 elf_i386_finish_dynamic_sections (bfd *output_bfd,
5545 struct bfd_link_info *info)
5547 struct elf_i386_link_hash_table *htab;
5550 const struct elf_i386_backend_data *abed;
5552 htab = elf_i386_hash_table (info);
5556 dynobj = htab->elf.dynobj;
5557 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
5558 abed = get_elf_i386_backend_data (output_bfd);
5560 if (htab->elf.dynamic_sections_created)
5562 Elf32_External_Dyn *dyncon, *dynconend;
5564 if (sdyn == NULL || htab->elf.sgot == NULL)
5567 dyncon = (Elf32_External_Dyn *) sdyn->contents;
5568 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
5569 for (; dyncon < dynconend; dyncon++)
5571 Elf_Internal_Dyn dyn;
5574 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
5579 if (abed->is_vxworks
5580 && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
5585 s = htab->elf.sgotplt;
5586 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
5590 s = htab->elf.srelplt;
5591 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
5595 s = htab->elf.srelplt;
5596 dyn.d_un.d_val = s->size;
5600 /* My reading of the SVR4 ABI indicates that the
5601 procedure linkage table relocs (DT_JMPREL) should be
5602 included in the overall relocs (DT_REL). This is
5603 what Solaris does. However, UnixWare can not handle
5604 that case. Therefore, we override the DT_RELSZ entry
5605 here to make it not include the JMPREL relocs. */
5606 s = htab->elf.srelplt;
5609 dyn.d_un.d_val -= s->size;
5613 /* We may not be using the standard ELF linker script.
5614 If .rel.plt is the first .rel section, we adjust
5615 DT_REL to not include it. */
5616 s = htab->elf.srelplt;
5619 if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
5621 dyn.d_un.d_ptr += s->size;
5625 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5628 /* Fill in the first entry in the procedure linkage table. */
5629 if (htab->elf.splt && htab->elf.splt->size > 0)
5631 if (bfd_link_pic (info))
5633 memcpy (htab->elf.splt->contents, abed->plt->pic_plt0_entry,
5634 abed->plt->plt0_entry_size);
5635 memset (htab->elf.splt->contents + abed->plt->plt0_entry_size,
5636 abed->plt0_pad_byte,
5637 abed->plt->plt_entry_size - abed->plt->plt0_entry_size);
5641 memcpy (htab->elf.splt->contents, abed->plt->plt0_entry,
5642 abed->plt->plt0_entry_size);
5643 memset (htab->elf.splt->contents + abed->plt->plt0_entry_size,
5644 abed->plt0_pad_byte,
5645 abed->plt->plt_entry_size - abed->plt->plt0_entry_size);
5646 bfd_put_32 (output_bfd,
5647 (htab->elf.sgotplt->output_section->vma
5648 + htab->elf.sgotplt->output_offset
5650 htab->elf.splt->contents
5651 + abed->plt->plt0_got1_offset);
5652 bfd_put_32 (output_bfd,
5653 (htab->elf.sgotplt->output_section->vma
5654 + htab->elf.sgotplt->output_offset
5656 htab->elf.splt->contents
5657 + abed->plt->plt0_got2_offset);
5659 if (abed->is_vxworks)
5661 Elf_Internal_Rela rel;
5663 /* Generate a relocation for _GLOBAL_OFFSET_TABLE_ + 4.
5664 On IA32 we use REL relocations so the addend goes in
5665 the PLT directly. */
5666 rel.r_offset = (htab->elf.splt->output_section->vma
5667 + htab->elf.splt->output_offset
5668 + abed->plt->plt0_got1_offset);
5669 rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
5670 bfd_elf32_swap_reloc_out (output_bfd, &rel,
5671 htab->srelplt2->contents);
5672 /* Generate a relocation for _GLOBAL_OFFSET_TABLE_ + 8. */
5673 rel.r_offset = (htab->elf.splt->output_section->vma
5674 + htab->elf.splt->output_offset
5675 + abed->plt->plt0_got2_offset);
5676 rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
5677 bfd_elf32_swap_reloc_out (output_bfd, &rel,
5678 htab->srelplt2->contents +
5679 sizeof (Elf32_External_Rel));
5683 /* UnixWare sets the entsize of .plt to 4, although that doesn't
5684 really seem like the right value. */
5685 elf_section_data (htab->elf.splt->output_section)
5686 ->this_hdr.sh_entsize = 4;
5688 /* Correct the .rel.plt.unloaded relocations. */
5689 if (abed->is_vxworks && !bfd_link_pic (info))
5691 int num_plts = (htab->elf.splt->size
5692 / abed->plt->plt_entry_size) - 1;
5695 p = htab->srelplt2->contents;
5696 if (bfd_link_pic (info))
5697 p += PLTRESOLVE_RELOCS_SHLIB * sizeof (Elf32_External_Rel);
5699 p += PLTRESOLVE_RELOCS * sizeof (Elf32_External_Rel);
5701 for (; num_plts; num_plts--)
5703 Elf_Internal_Rela rel;
5704 bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
5705 rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
5706 bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
5707 p += sizeof (Elf32_External_Rel);
5709 bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
5710 rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_386_32);
5711 bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
5712 p += sizeof (Elf32_External_Rel);
5718 if (htab->elf.sgotplt)
5720 if (bfd_is_abs_section (htab->elf.sgotplt->output_section))
5722 (*_bfd_error_handler)
5723 (_("discarded output section: `%A'"), htab->elf.sgotplt);
5727 /* Fill in the first three entries in the global offset table. */
5728 if (htab->elf.sgotplt->size > 0)
5730 bfd_put_32 (output_bfd,
5732 : sdyn->output_section->vma + sdyn->output_offset),
5733 htab->elf.sgotplt->contents);
5734 bfd_put_32 (output_bfd, 0, htab->elf.sgotplt->contents + 4);
5735 bfd_put_32 (output_bfd, 0, htab->elf.sgotplt->contents + 8);
5738 elf_section_data (htab->elf.sgotplt->output_section)->this_hdr.sh_entsize = 4;
5741 /* Adjust .eh_frame for .plt section. */
5742 if (htab->plt_eh_frame != NULL
5743 && htab->plt_eh_frame->contents != NULL)
5745 if (htab->elf.splt != NULL
5746 && htab->elf.splt->size != 0
5747 && (htab->elf.splt->flags & SEC_EXCLUDE) == 0
5748 && htab->elf.splt->output_section != NULL
5749 && htab->plt_eh_frame->output_section != NULL)
5751 bfd_vma plt_start = htab->elf.splt->output_section->vma;
5752 bfd_vma eh_frame_start = htab->plt_eh_frame->output_section->vma
5753 + htab->plt_eh_frame->output_offset
5754 + PLT_FDE_START_OFFSET;
5755 bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
5756 htab->plt_eh_frame->contents
5757 + PLT_FDE_START_OFFSET);
5759 if (htab->plt_eh_frame->sec_info_type
5760 == SEC_INFO_TYPE_EH_FRAME)
5762 if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
5764 htab->plt_eh_frame->contents))
5769 if (htab->elf.sgot && htab->elf.sgot->size > 0)
5770 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize = 4;
5772 /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols. */
5773 htab_traverse (htab->loc_hash_table,
5774 elf_i386_finish_local_dynamic_symbol,
5777 /* Fill PLT entries for undefined weak symbols in PIE. */
5778 if (bfd_link_pie (info))
5779 bfd_hash_traverse (&info->hash->table,
5780 elf_i386_pie_finish_undefweak_symbol,
5786 /* Return an array of PLT entry symbol values. */
5789 elf_i386_get_plt_sym_val (bfd *abfd, asymbol **dynsyms, asection *plt,
5792 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
5795 bfd_vma *plt_sym_val;
5797 bfd_byte *plt_contents;
5798 const struct elf_i386_backend_data *bed
5799 = get_elf_i386_backend_data (abfd);
5800 Elf_Internal_Shdr *hdr;
5802 /* Get the .plt section contents. */
5803 plt_contents = (bfd_byte *) bfd_malloc (plt->size);
5804 if (plt_contents == NULL)
5806 if (!bfd_get_section_contents (abfd, (asection *) plt,
5807 plt_contents, 0, plt->size))
5810 free (plt_contents);
5814 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
5815 if (! (*slurp_relocs) (abfd, relplt, dynsyms, TRUE))
5818 hdr = &elf_section_data (relplt)->this_hdr;
5819 count = relplt->size / hdr->sh_entsize;
5821 plt_sym_val = (bfd_vma *) bfd_malloc (sizeof (bfd_vma) * count);
5822 if (plt_sym_val == NULL)
5825 for (i = 0; i < count; i++)
5826 plt_sym_val[i] = -1;
5828 plt_offset = bed->plt->plt_entry_size;
5829 p = relplt->relocation;
5830 for (i = 0; i < count; i++, p++)
5834 /* Skip unknown relocation. PR 17512: file: bc9d6cf5. */
5835 if (p->howto == NULL)
5838 if (p->howto->type != R_386_JUMP_SLOT
5839 && p->howto->type != R_386_IRELATIVE)
5842 reloc_index = H_GET_32 (abfd, (plt_contents + plt_offset
5843 + bed->plt->plt_reloc_offset));
5844 reloc_index /= sizeof (Elf32_External_Rel);
5845 if (reloc_index < count)
5846 plt_sym_val[reloc_index] = plt->vma + plt_offset;
5848 plt_offset += bed->plt->plt_entry_size;
5850 /* PR binutils/18437: Skip extra relocations in the .rel.plt
5852 if (plt_offset >= plt->size)
5856 free (plt_contents);
5861 /* Similar to _bfd_elf_get_synthetic_symtab. */
5864 elf_i386_get_synthetic_symtab (bfd *abfd,
5871 asection *plt = bfd_get_section_by_name (abfd, ".plt");
5872 return _bfd_elf_ifunc_get_synthetic_symtab (abfd, symcount, syms,
5873 dynsymcount, dynsyms, ret,
5875 elf_i386_get_plt_sym_val);
5878 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
5881 elf_i386_hash_symbol (struct elf_link_hash_entry *h)
5883 if (h->plt.offset != (bfd_vma) -1
5885 && !h->pointer_equality_needed)
5888 return _bfd_elf_hash_symbol (h);
5891 /* Hook called by the linker routine which adds symbols from an object
5895 elf_i386_add_symbol_hook (bfd * abfd,
5896 struct bfd_link_info * info,
5897 Elf_Internal_Sym * sym,
5898 const char ** namep ATTRIBUTE_UNUSED,
5899 flagword * flagsp ATTRIBUTE_UNUSED,
5900 asection ** secp ATTRIBUTE_UNUSED,
5901 bfd_vma * valp ATTRIBUTE_UNUSED)
5903 if (ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE
5904 && (abfd->flags & DYNAMIC) == 0
5905 && bfd_get_flavour (info->output_bfd) == bfd_target_elf_flavour)
5906 elf_tdata (info->output_bfd)->has_gnu_symbols
5907 |= elf_gnu_symbol_unique;
5912 #define TARGET_LITTLE_SYM i386_elf32_vec
5913 #define TARGET_LITTLE_NAME "elf32-i386"
5914 #define ELF_ARCH bfd_arch_i386
5915 #define ELF_TARGET_ID I386_ELF_DATA
5916 #define ELF_MACHINE_CODE EM_386
5917 #define ELF_MAXPAGESIZE 0x1000
5919 #define elf_backend_can_gc_sections 1
5920 #define elf_backend_can_refcount 1
5921 #define elf_backend_want_got_plt 1
5922 #define elf_backend_plt_readonly 1
5923 #define elf_backend_want_plt_sym 0
5924 #define elf_backend_got_header_size 12
5925 #define elf_backend_plt_alignment 4
5926 #define elf_backend_extern_protected_data 1
5928 /* Support RELA for objdump of prelink objects. */
5929 #define elf_info_to_howto elf_i386_info_to_howto_rel
5930 #define elf_info_to_howto_rel elf_i386_info_to_howto_rel
5932 #define bfd_elf32_mkobject elf_i386_mkobject
5934 #define bfd_elf32_bfd_is_local_label_name elf_i386_is_local_label_name
5935 #define bfd_elf32_bfd_link_hash_table_create elf_i386_link_hash_table_create
5936 #define bfd_elf32_bfd_reloc_type_lookup elf_i386_reloc_type_lookup
5937 #define bfd_elf32_bfd_reloc_name_lookup elf_i386_reloc_name_lookup
5938 #define bfd_elf32_get_synthetic_symtab elf_i386_get_synthetic_symtab
5940 #define elf_backend_adjust_dynamic_symbol elf_i386_adjust_dynamic_symbol
5941 #define elf_backend_relocs_compatible _bfd_elf_relocs_compatible
5942 #define elf_backend_check_relocs elf_i386_check_relocs
5943 #define elf_backend_copy_indirect_symbol elf_i386_copy_indirect_symbol
5944 #define elf_backend_create_dynamic_sections elf_i386_create_dynamic_sections
5945 #define elf_backend_fake_sections elf_i386_fake_sections
5946 #define elf_backend_finish_dynamic_sections elf_i386_finish_dynamic_sections
5947 #define elf_backend_finish_dynamic_symbol elf_i386_finish_dynamic_symbol
5948 #define elf_backend_gc_mark_hook elf_i386_gc_mark_hook
5949 #define elf_backend_gc_sweep_hook elf_i386_gc_sweep_hook
5950 #define elf_backend_grok_prstatus elf_i386_grok_prstatus
5951 #define elf_backend_grok_psinfo elf_i386_grok_psinfo
5952 #define elf_backend_reloc_type_class elf_i386_reloc_type_class
5953 #define elf_backend_relocate_section elf_i386_relocate_section
5954 #define elf_backend_size_dynamic_sections elf_i386_size_dynamic_sections
5955 #define elf_backend_always_size_sections elf_i386_always_size_sections
5956 #define elf_backend_omit_section_dynsym \
5957 ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
5958 #define elf_backend_hash_symbol elf_i386_hash_symbol
5959 #define elf_backend_add_symbol_hook elf_i386_add_symbol_hook
5960 #define elf_backend_fixup_symbol elf_i386_fixup_symbol
5962 #include "elf32-target.h"
5964 /* FreeBSD support. */
5966 #undef TARGET_LITTLE_SYM
5967 #define TARGET_LITTLE_SYM i386_elf32_fbsd_vec
5968 #undef TARGET_LITTLE_NAME
5969 #define TARGET_LITTLE_NAME "elf32-i386-freebsd"
5971 #define ELF_OSABI ELFOSABI_FREEBSD
5973 /* The kernel recognizes executables as valid only if they carry a
5974 "FreeBSD" label in the ELF header. So we put this label on all
5975 executables and (for simplicity) also all other object files. */
5978 elf_i386_fbsd_post_process_headers (bfd *abfd, struct bfd_link_info *info)
5980 _bfd_elf_post_process_headers (abfd, info);
5982 #ifdef OLD_FREEBSD_ABI_LABEL
5984 /* The ABI label supported by FreeBSD <= 4.0 is quite nonstandard. */
5985 Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
5986 memcpy (&i_ehdrp->e_ident[EI_ABIVERSION], "FreeBSD", 8);
5991 #undef elf_backend_post_process_headers
5992 #define elf_backend_post_process_headers elf_i386_fbsd_post_process_headers
5994 #define elf32_bed elf32_i386_fbsd_bed
5996 #undef elf_backend_add_symbol_hook
5998 #include "elf32-target.h"
6002 #undef TARGET_LITTLE_SYM
6003 #define TARGET_LITTLE_SYM i386_elf32_sol2_vec
6004 #undef TARGET_LITTLE_NAME
6005 #define TARGET_LITTLE_NAME "elf32-i386-sol2"
6007 #undef elf_backend_post_process_headers
6009 /* Restore default: we cannot use ELFOSABI_SOLARIS, otherwise ELFOSABI_NONE
6010 objects won't be recognized. */
6014 #define elf32_bed elf32_i386_sol2_bed
6016 /* The 32-bit static TLS arena size is rounded to the nearest 8-byte
6018 #undef elf_backend_static_tls_alignment
6019 #define elf_backend_static_tls_alignment 8
6021 /* The Solaris 2 ABI requires a plt symbol on all platforms.
6023 Cf. Linker and Libraries Guide, Ch. 2, Link-Editor, Generating the Output
6025 #undef elf_backend_want_plt_sym
6026 #define elf_backend_want_plt_sym 1
6028 #include "elf32-target.h"
6030 /* Intel MCU support. */
6033 elf32_iamcu_elf_object_p (bfd *abfd)
6035 /* Set the right machine number for an IAMCU elf32 file. */
6036 bfd_default_set_arch_mach (abfd, bfd_arch_iamcu, bfd_mach_i386_iamcu);
6040 #undef TARGET_LITTLE_SYM
6041 #define TARGET_LITTLE_SYM iamcu_elf32_vec
6042 #undef TARGET_LITTLE_NAME
6043 #define TARGET_LITTLE_NAME "elf32-iamcu"
6045 #define ELF_ARCH bfd_arch_iamcu
6047 #undef ELF_MACHINE_CODE
6048 #define ELF_MACHINE_CODE EM_IAMCU
6053 #define elf32_bed elf32_iamcu_bed
6055 #undef elf_backend_object_p
6056 #define elf_backend_object_p elf32_iamcu_elf_object_p
6058 #undef elf_backend_static_tls_alignment
6060 #undef elf_backend_want_plt_sym
6061 #define elf_backend_want_plt_sym 0
6063 #include "elf32-target.h"
6065 /* Restore defaults. */
6067 #define ELF_ARCH bfd_arch_i386
6068 #undef ELF_MACHINE_CODE
6069 #define ELF_MACHINE_CODE EM_386
6071 /* Native Client support. */
6073 #undef TARGET_LITTLE_SYM
6074 #define TARGET_LITTLE_SYM i386_elf32_nacl_vec
6075 #undef TARGET_LITTLE_NAME
6076 #define TARGET_LITTLE_NAME "elf32-i386-nacl"
6078 #define elf32_bed elf32_i386_nacl_bed
6080 #undef ELF_MAXPAGESIZE
6081 #define ELF_MAXPAGESIZE 0x10000
6083 /* Restore defaults. */
6085 #undef elf_backend_want_plt_sym
6086 #define elf_backend_want_plt_sym 0
6087 #undef elf_backend_post_process_headers
6088 #undef elf_backend_static_tls_alignment
6090 /* NaCl uses substantially different PLT entries for the same effects. */
6092 #undef elf_backend_plt_alignment
6093 #define elf_backend_plt_alignment 5
6094 #define NACL_PLT_ENTRY_SIZE 64
6095 #define NACLMASK 0xe0 /* 32-byte alignment mask. */
6097 static const bfd_byte elf_i386_nacl_plt0_entry[] =
6099 0xff, 0x35, /* pushl contents of address */
6100 0, 0, 0, 0, /* replaced with address of .got + 4. */
6101 0x8b, 0x0d, /* movl contents of address, %ecx */
6102 0, 0, 0, 0, /* replaced with address of .got + 8. */
6103 0x83, 0xe1, NACLMASK, /* andl $NACLMASK, %ecx */
6104 0xff, 0xe1 /* jmp *%ecx */
6107 static const bfd_byte elf_i386_nacl_plt_entry[NACL_PLT_ENTRY_SIZE] =
6109 0x8b, 0x0d, /* movl contents of address, %ecx */
6110 0, 0, 0, 0, /* replaced with GOT slot address. */
6111 0x83, 0xe1, NACLMASK, /* andl $NACLMASK, %ecx */
6112 0xff, 0xe1, /* jmp *%ecx */
6114 /* Pad to the next 32-byte boundary with nop instructions. */
6116 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6117 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6119 /* Lazy GOT entries point here (32-byte aligned). */
6120 0x68, /* pushl immediate */
6121 0, 0, 0, 0, /* replaced with reloc offset. */
6122 0xe9, /* jmp relative */
6123 0, 0, 0, 0, /* replaced with offset to .plt. */
6125 /* Pad to the next 32-byte boundary with nop instructions. */
6126 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6127 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6131 static const bfd_byte
6132 elf_i386_nacl_pic_plt0_entry[sizeof (elf_i386_nacl_plt0_entry)] =
6134 0xff, 0x73, 0x04, /* pushl 4(%ebx) */
6135 0x8b, 0x4b, 0x08, /* mov 0x8(%ebx), %ecx */
6136 0x83, 0xe1, 0xe0, /* and $NACLMASK, %ecx */
6137 0xff, 0xe1, /* jmp *%ecx */
6139 /* This is expected to be the same size as elf_i386_nacl_plt0_entry,
6140 so pad to that size with nop instructions. */
6141 0x90, 0x90, 0x90, 0x90, 0x90, 0x90
6144 static const bfd_byte elf_i386_nacl_pic_plt_entry[NACL_PLT_ENTRY_SIZE] =
6146 0x8b, 0x8b, /* movl offset(%ebx), %ecx */
6147 0, 0, 0, 0, /* replaced with offset of this symbol in .got. */
6148 0x83, 0xe1, 0xe0, /* andl $NACLMASK, %ecx */
6149 0xff, 0xe1, /* jmp *%ecx */
6151 /* Pad to the next 32-byte boundary with nop instructions. */
6153 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6154 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6156 /* Lazy GOT entries point here (32-byte aligned). */
6157 0x68, /* pushl immediate */
6158 0, 0, 0, 0, /* replaced with offset into relocation table. */
6159 0xe9, /* jmp relative */
6160 0, 0, 0, 0, /* replaced with offset to start of .plt. */
6162 /* Pad to the next 32-byte boundary with nop instructions. */
6163 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6164 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6168 static const bfd_byte elf_i386_nacl_eh_frame_plt[] =
6170 #if (PLT_CIE_LENGTH != 20 \
6171 || PLT_FDE_LENGTH != 36 \
6172 || PLT_FDE_START_OFFSET != 4 + PLT_CIE_LENGTH + 8 \
6173 || PLT_FDE_LEN_OFFSET != 4 + PLT_CIE_LENGTH + 12)
6174 # error "Need elf_i386_backend_data parameters for eh_frame_plt offsets!"
6176 PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
6177 0, 0, 0, 0, /* CIE ID */
6178 1, /* CIE version */
6179 'z', 'R', 0, /* Augmentation string */
6180 1, /* Code alignment factor */
6181 0x7c, /* Data alignment factor: -4 */
6182 8, /* Return address column */
6183 1, /* Augmentation size */
6184 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
6185 DW_CFA_def_cfa, 4, 4, /* DW_CFA_def_cfa: r4 (esp) ofs 4 */
6186 DW_CFA_offset + 8, 1, /* DW_CFA_offset: r8 (eip) at cfa-4 */
6187 DW_CFA_nop, DW_CFA_nop,
6189 PLT_FDE_LENGTH, 0, 0, 0, /* FDE length */
6190 PLT_CIE_LENGTH + 8, 0, 0, 0, /* CIE pointer */
6191 0, 0, 0, 0, /* R_386_PC32 .plt goes here */
6192 0, 0, 0, 0, /* .plt size goes here */
6193 0, /* Augmentation size */
6194 DW_CFA_def_cfa_offset, 8, /* DW_CFA_def_cfa_offset: 8 */
6195 DW_CFA_advance_loc + 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */
6196 DW_CFA_def_cfa_offset, 12, /* DW_CFA_def_cfa_offset: 12 */
6197 DW_CFA_advance_loc + 58, /* DW_CFA_advance_loc: 58 to __PLT__+64 */
6198 DW_CFA_def_cfa_expression, /* DW_CFA_def_cfa_expression */
6199 13, /* Block length */
6200 DW_OP_breg4, 4, /* DW_OP_breg4 (esp): 4 */
6201 DW_OP_breg8, 0, /* DW_OP_breg8 (eip): 0 */
6202 DW_OP_const1u, 63, DW_OP_and, DW_OP_const1u, 37, DW_OP_ge,
6203 DW_OP_lit2, DW_OP_shl, DW_OP_plus,
6204 DW_CFA_nop, DW_CFA_nop
6207 static const struct elf_i386_plt_layout elf_i386_nacl_plt =
6209 elf_i386_nacl_plt0_entry, /* plt0_entry */
6210 sizeof (elf_i386_nacl_plt0_entry), /* plt0_entry_size */
6211 2, /* plt0_got1_offset */
6212 8, /* plt0_got2_offset */
6213 elf_i386_nacl_plt_entry, /* plt_entry */
6214 NACL_PLT_ENTRY_SIZE, /* plt_entry_size */
6215 2, /* plt_got_offset */
6216 33, /* plt_reloc_offset */
6217 38, /* plt_plt_offset */
6218 32, /* plt_lazy_offset */
6219 elf_i386_nacl_pic_plt0_entry, /* pic_plt0_entry */
6220 elf_i386_nacl_pic_plt_entry, /* pic_plt_entry */
6221 elf_i386_nacl_eh_frame_plt, /* eh_frame_plt */
6222 sizeof (elf_i386_nacl_eh_frame_plt),/* eh_frame_plt_size */
6225 static const struct elf_i386_backend_data elf_i386_nacl_arch_bed =
6227 &elf_i386_nacl_plt, /* plt */
6228 0x90, /* plt0_pad_byte: nop insn */
6233 elf32_i386_nacl_elf_object_p (bfd *abfd)
6235 /* Set the right machine number for a NaCl i386 ELF32 file. */
6236 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_i386_i386_nacl);
6240 #undef elf_backend_arch_data
6241 #define elf_backend_arch_data &elf_i386_nacl_arch_bed
6243 #undef elf_backend_object_p
6244 #define elf_backend_object_p elf32_i386_nacl_elf_object_p
6245 #undef elf_backend_modify_segment_map
6246 #define elf_backend_modify_segment_map nacl_modify_segment_map
6247 #undef elf_backend_modify_program_headers
6248 #define elf_backend_modify_program_headers nacl_modify_program_headers
6249 #undef elf_backend_final_write_processing
6250 #define elf_backend_final_write_processing nacl_final_write_processing
6252 #include "elf32-target.h"
6254 /* Restore defaults. */
6255 #undef elf_backend_object_p
6256 #undef elf_backend_modify_segment_map
6257 #undef elf_backend_modify_program_headers
6258 #undef elf_backend_final_write_processing
6260 /* VxWorks support. */
6262 #undef TARGET_LITTLE_SYM
6263 #define TARGET_LITTLE_SYM i386_elf32_vxworks_vec
6264 #undef TARGET_LITTLE_NAME
6265 #define TARGET_LITTLE_NAME "elf32-i386-vxworks"
6267 #undef elf_backend_plt_alignment
6268 #define elf_backend_plt_alignment 4
6270 static const struct elf_i386_backend_data elf_i386_vxworks_arch_bed =
6272 &elf_i386_plt, /* plt */
6273 0x90, /* plt0_pad_byte */
6277 #undef elf_backend_arch_data
6278 #define elf_backend_arch_data &elf_i386_vxworks_arch_bed
6280 #undef elf_backend_relocs_compatible
6281 #undef elf_backend_add_symbol_hook
6282 #define elf_backend_add_symbol_hook \
6283 elf_vxworks_add_symbol_hook
6284 #undef elf_backend_link_output_symbol_hook
6285 #define elf_backend_link_output_symbol_hook \
6286 elf_vxworks_link_output_symbol_hook
6287 #undef elf_backend_emit_relocs
6288 #define elf_backend_emit_relocs elf_vxworks_emit_relocs
6289 #undef elf_backend_final_write_processing
6290 #define elf_backend_final_write_processing \
6291 elf_vxworks_final_write_processing
6292 #undef elf_backend_static_tls_alignment
6294 /* On VxWorks, we emit relocations against _PROCEDURE_LINKAGE_TABLE_, so
6296 #undef elf_backend_want_plt_sym
6297 #define elf_backend_want_plt_sym 1
6300 #define elf32_bed elf32_i386_vxworks_bed
6302 #include "elf32-target.h"