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 /* STT_GNU_IFUNC symbol must go through PLT even if it is
1812 locally defined and undefined symbol may turn out to be
1813 a STT_GNU_IFUNC symbol later. */
1815 && (bfd_link_executable (info)
1816 || ((h->type == STT_GNU_IFUNC
1817 || h->root.type == bfd_link_hash_undefweak
1818 || h->root.type == bfd_link_hash_undefined)
1819 && SYMBOLIC_BIND (info, h))))
1821 /* If this reloc is in a read-only section, we might
1822 need a copy reloc. We can't check reliably at this
1823 stage whether the section is read-only, as input
1824 sections have not yet been mapped to output sections.
1825 Tentatively set the flag for now, and correct in
1826 adjust_dynamic_symbol. */
1829 /* We may need a .plt entry if the function this reloc
1830 refers to is in a shared lib. */
1831 h->plt.refcount += 1;
1832 if (r_type == R_386_PC32)
1834 /* Since something like ".long foo - ." may be used
1835 as pointer, make sure that PLT is used if foo is
1836 a function defined in a shared library. */
1837 if ((sec->flags & SEC_CODE) == 0)
1838 h->pointer_equality_needed = 1;
1842 h->pointer_equality_needed = 1;
1843 /* R_386_32 can be resolved at run-time. */
1844 if (r_type == R_386_32
1845 && (sec->flags & SEC_READONLY) == 0)
1846 eh->func_pointer_refcount += 1;
1852 /* If we are creating a shared library, and this is a reloc
1853 against a global symbol, or a non PC relative reloc
1854 against a local symbol, then we need to copy the reloc
1855 into the shared library. However, if we are linking with
1856 -Bsymbolic, we do not need to copy a reloc against a
1857 global symbol which is defined in an object we are
1858 including in the link (i.e., DEF_REGULAR is set). At
1859 this point we have not seen all the input files, so it is
1860 possible that DEF_REGULAR is not set now but will be set
1861 later (it is never cleared). In case of a weak definition,
1862 DEF_REGULAR may be cleared later by a strong definition in
1863 a shared library. We account for that possibility below by
1864 storing information in the relocs_copied field of the hash
1865 table entry. A similar situation occurs when creating
1866 shared libraries and symbol visibility changes render the
1869 If on the other hand, we are creating an executable, we
1870 may need to keep relocations for symbols satisfied by a
1871 dynamic library if we manage to avoid copy relocs for the
1873 if ((bfd_link_pic (info)
1874 && (sec->flags & SEC_ALLOC) != 0
1875 && (r_type != R_386_PC32
1877 && (! (bfd_link_pie (info)
1878 || SYMBOLIC_BIND (info, h))
1879 || h->root.type == bfd_link_hash_defweak
1880 || !h->def_regular))))
1881 || (ELIMINATE_COPY_RELOCS
1882 && !bfd_link_pic (info)
1883 && (sec->flags & SEC_ALLOC) != 0
1885 && (h->root.type == bfd_link_hash_defweak
1886 || !h->def_regular)))
1888 struct elf_dyn_relocs *p;
1889 struct elf_dyn_relocs **head;
1891 /* We must copy these reloc types into the output file.
1892 Create a reloc section in dynobj and make room for
1896 if (htab->elf.dynobj == NULL)
1897 htab->elf.dynobj = abfd;
1899 sreloc = _bfd_elf_make_dynamic_reloc_section
1900 (sec, htab->elf.dynobj, 2, abfd, /*rela?*/ FALSE);
1906 /* If this is a global symbol, we count the number of
1907 relocations we need for this symbol. */
1910 head = &eh->dyn_relocs;
1914 /* Track dynamic relocs needed for local syms too.
1915 We really need local syms available to do this
1920 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1925 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
1929 vpp = &elf_section_data (s)->local_dynrel;
1930 head = (struct elf_dyn_relocs **)vpp;
1934 if (p == NULL || p->sec != sec)
1936 bfd_size_type amt = sizeof *p;
1937 p = (struct elf_dyn_relocs *) bfd_alloc (htab->elf.dynobj,
1949 /* Count size relocation as PC-relative relocation. */
1950 if (r_type == R_386_PC32 || size_reloc)
1955 /* This relocation describes the C++ object vtable hierarchy.
1956 Reconstruct it for later use during GC. */
1957 case R_386_GNU_VTINHERIT:
1958 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1962 /* This relocation describes which C++ vtable entries are actually
1963 used. Record for later use during GC. */
1964 case R_386_GNU_VTENTRY:
1965 BFD_ASSERT (h != NULL);
1967 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
1977 && h->plt.refcount > 0
1978 && (((info->flags & DF_BIND_NOW) && !h->pointer_equality_needed)
1979 || h->got.refcount > 0)
1980 && htab->plt_got == NULL)
1982 /* Create the GOT procedure linkage table. */
1983 unsigned int plt_got_align;
1984 const struct elf_backend_data *bed;
1986 bed = get_elf_backend_data (info->output_bfd);
1987 BFD_ASSERT (sizeof (elf_i386_got_plt_entry) == 8
1988 && (sizeof (elf_i386_got_plt_entry)
1989 == sizeof (elf_i386_pic_got_plt_entry)));
1992 if (htab->elf.dynobj == NULL)
1993 htab->elf.dynobj = abfd;
1995 = bfd_make_section_anyway_with_flags (htab->elf.dynobj,
1997 (bed->dynamic_sec_flags
2002 if (htab->plt_got == NULL
2003 || !bfd_set_section_alignment (htab->elf.dynobj,
2009 if ((r_type == R_386_GOT32 || r_type == R_386_GOT32X)
2010 && (h == NULL || h->type != STT_GNU_IFUNC))
2011 sec->need_convert_load = 1;
2017 /* Return the section that should be marked against GC for a given
2021 elf_i386_gc_mark_hook (asection *sec,
2022 struct bfd_link_info *info,
2023 Elf_Internal_Rela *rel,
2024 struct elf_link_hash_entry *h,
2025 Elf_Internal_Sym *sym)
2028 switch (ELF32_R_TYPE (rel->r_info))
2030 case R_386_GNU_VTINHERIT:
2031 case R_386_GNU_VTENTRY:
2035 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
2038 /* Update the got entry reference counts for the section being removed. */
2041 elf_i386_gc_sweep_hook (bfd *abfd,
2042 struct bfd_link_info *info,
2044 const Elf_Internal_Rela *relocs)
2046 struct elf_i386_link_hash_table *htab;
2047 Elf_Internal_Shdr *symtab_hdr;
2048 struct elf_link_hash_entry **sym_hashes;
2049 bfd_signed_vma *local_got_refcounts;
2050 const Elf_Internal_Rela *rel, *relend;
2052 if (bfd_link_relocatable (info))
2055 htab = elf_i386_hash_table (info);
2059 elf_section_data (sec)->local_dynrel = NULL;
2061 symtab_hdr = &elf_symtab_hdr (abfd);
2062 sym_hashes = elf_sym_hashes (abfd);
2063 local_got_refcounts = elf_local_got_refcounts (abfd);
2065 relend = relocs + sec->reloc_count;
2066 for (rel = relocs; rel < relend; rel++)
2068 unsigned long r_symndx;
2069 unsigned int r_type;
2070 struct elf_link_hash_entry *h = NULL;
2072 r_symndx = ELF32_R_SYM (rel->r_info);
2073 if (r_symndx >= symtab_hdr->sh_info)
2075 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2076 while (h->root.type == bfd_link_hash_indirect
2077 || h->root.type == bfd_link_hash_warning)
2078 h = (struct elf_link_hash_entry *) h->root.u.i.link;
2082 /* A local symbol. */
2083 Elf_Internal_Sym *isym;
2085 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
2088 /* Check relocation against local STT_GNU_IFUNC symbol. */
2090 && ELF32_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
2092 h = elf_i386_get_local_sym_hash (htab, abfd, rel, FALSE);
2100 struct elf_i386_link_hash_entry *eh;
2101 struct elf_dyn_relocs **pp;
2102 struct elf_dyn_relocs *p;
2104 eh = (struct elf_i386_link_hash_entry *) h;
2105 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
2108 /* Everything must go for SEC. */
2114 r_type = ELF32_R_TYPE (rel->r_info);
2115 if (! elf_i386_tls_transition (info, abfd, sec, NULL,
2116 symtab_hdr, sym_hashes,
2117 &r_type, GOT_UNKNOWN,
2118 rel, relend, h, r_symndx))
2124 if (htab->tls_ldm_got.refcount > 0)
2125 htab->tls_ldm_got.refcount -= 1;
2129 case R_386_TLS_GOTDESC:
2130 case R_386_TLS_DESC_CALL:
2131 case R_386_TLS_IE_32:
2133 case R_386_TLS_GOTIE:
2138 if (h->got.refcount > 0)
2139 h->got.refcount -= 1;
2140 if (h->type == STT_GNU_IFUNC)
2142 if (h->plt.refcount > 0)
2143 h->plt.refcount -= 1;
2146 else if (local_got_refcounts != NULL)
2148 if (local_got_refcounts[r_symndx] > 0)
2149 local_got_refcounts[r_symndx] -= 1;
2156 if (bfd_link_pic (info)
2157 && (h == NULL || h->type != STT_GNU_IFUNC))
2164 if (h->plt.refcount > 0)
2165 h->plt.refcount -= 1;
2166 if (r_type == R_386_32
2167 && (sec->flags & SEC_READONLY) == 0)
2169 struct elf_i386_link_hash_entry *eh
2170 = (struct elf_i386_link_hash_entry *) h;
2171 if (eh->func_pointer_refcount > 0)
2172 eh->func_pointer_refcount -= 1;
2178 if (h != NULL && h->type == STT_GNU_IFUNC)
2180 if (h->got.refcount > 0)
2181 h->got.refcount -= 1;
2182 if (h->plt.refcount > 0)
2183 h->plt.refcount -= 1;
2195 /* Remove undefined weak symbol from the dynamic symbol table if it
2196 is resolved to 0. */
2199 elf_i386_fixup_symbol (struct bfd_link_info *info,
2200 struct elf_link_hash_entry *h)
2202 if (h->dynindx != -1
2203 && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info,
2204 elf_i386_hash_entry (h)))
2207 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
2213 /* Adjust a symbol defined by a dynamic object and referenced by a
2214 regular object. The current definition is in some section of the
2215 dynamic object, but we're not including those sections. We have to
2216 change the definition to something the rest of the link can
2220 elf_i386_adjust_dynamic_symbol (struct bfd_link_info *info,
2221 struct elf_link_hash_entry *h)
2223 struct elf_i386_link_hash_table *htab;
2225 struct elf_i386_link_hash_entry *eh;
2226 struct elf_dyn_relocs *p;
2228 /* STT_GNU_IFUNC symbol must go through PLT. */
2229 if (h->type == STT_GNU_IFUNC)
2231 /* All local STT_GNU_IFUNC references must be treate as local
2232 calls via local PLT. */
2234 && SYMBOL_CALLS_LOCAL (info, h))
2236 bfd_size_type pc_count = 0, count = 0;
2237 struct elf_dyn_relocs **pp;
2239 eh = (struct elf_i386_link_hash_entry *) h;
2240 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2242 pc_count += p->pc_count;
2243 p->count -= p->pc_count;
2252 if (pc_count || count)
2256 if (h->plt.refcount <= 0)
2257 h->plt.refcount = 1;
2259 h->plt.refcount += 1;
2263 if (h->plt.refcount <= 0)
2265 h->plt.offset = (bfd_vma) -1;
2271 /* If this is a function, put it in the procedure linkage table. We
2272 will fill in the contents of the procedure linkage table later,
2273 when we know the address of the .got section. */
2274 if (h->type == STT_FUNC
2277 if (h->plt.refcount <= 0
2278 || SYMBOL_CALLS_LOCAL (info, h)
2279 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2280 && h->root.type == bfd_link_hash_undefweak))
2282 /* This case can occur if we saw a PLT32 reloc in an input
2283 file, but the symbol was never referred to by a dynamic
2284 object, or if all references were garbage collected. In
2285 such a case, we don't actually need to build a procedure
2286 linkage table, and we can just do a PC32 reloc instead. */
2287 h->plt.offset = (bfd_vma) -1;
2294 /* It's possible that we incorrectly decided a .plt reloc was
2295 needed for an R_386_PC32 reloc to a non-function sym in
2296 check_relocs. We can't decide accurately between function and
2297 non-function syms in check-relocs; Objects loaded later in
2298 the link may change h->type. So fix it now. */
2299 h->plt.offset = (bfd_vma) -1;
2301 /* If this is a weak symbol, and there is a real definition, the
2302 processor independent code will have arranged for us to see the
2303 real definition first, and we can just use the same value. */
2304 if (h->u.weakdef != NULL)
2306 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
2307 || h->u.weakdef->root.type == bfd_link_hash_defweak);
2308 h->root.u.def.section = h->u.weakdef->root.u.def.section;
2309 h->root.u.def.value = h->u.weakdef->root.u.def.value;
2310 if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
2311 h->non_got_ref = h->u.weakdef->non_got_ref;
2315 /* This is a reference to a symbol defined by a dynamic object which
2316 is not a function. */
2318 /* If we are creating a shared library, we must presume that the
2319 only references to the symbol are via the global offset table.
2320 For such cases we need not do anything here; the relocations will
2321 be handled correctly by relocate_section. */
2322 if (!bfd_link_executable (info))
2325 /* If there are no references to this symbol that do not use the
2326 GOT nor R_386_GOTOFF relocation, we don't need to generate a copy
2328 eh = (struct elf_i386_link_hash_entry *) h;
2329 if (!h->non_got_ref && !eh->gotoff_ref)
2332 /* If -z nocopyreloc was given, we won't generate them either. */
2333 if (info->nocopyreloc)
2339 htab = elf_i386_hash_table (info);
2343 /* If there aren't any dynamic relocs in read-only sections nor
2344 R_386_GOTOFF relocation, then we can keep the dynamic relocs and
2345 avoid the copy reloc. This doesn't work on VxWorks, where we can
2346 not have dynamic relocations (other than copy and jump slot
2347 relocations) in an executable. */
2348 if (ELIMINATE_COPY_RELOCS
2350 && !get_elf_i386_backend_data (info->output_bfd)->is_vxworks)
2352 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2354 s = p->sec->output_section;
2355 if (s != NULL && (s->flags & SEC_READONLY) != 0)
2366 /* We must allocate the symbol in our .dynbss section, which will
2367 become part of the .bss section of the executable. There will be
2368 an entry for this symbol in the .dynsym section. The dynamic
2369 object will contain position independent code, so all references
2370 from the dynamic object to this symbol will go through the global
2371 offset table. The dynamic linker will use the .dynsym entry to
2372 determine the address it must put in the global offset table, so
2373 both the dynamic object and the regular object will refer to the
2374 same memory location for the variable. */
2376 /* We must generate a R_386_COPY reloc to tell the dynamic linker to
2377 copy the initial value out of the dynamic object and into the
2378 runtime process image. */
2379 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
2381 htab->srelbss->size += sizeof (Elf32_External_Rel);
2387 return _bfd_elf_adjust_dynamic_copy (info, h, s);
2390 /* Allocate space in .plt, .got and associated reloc sections for
2394 elf_i386_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
2396 struct bfd_link_info *info;
2397 struct elf_i386_link_hash_table *htab;
2398 struct elf_i386_link_hash_entry *eh;
2399 struct elf_dyn_relocs *p;
2400 unsigned plt_entry_size;
2401 bfd_boolean resolved_to_zero;
2403 if (h->root.type == bfd_link_hash_indirect)
2406 eh = (struct elf_i386_link_hash_entry *) h;
2408 info = (struct bfd_link_info *) inf;
2409 htab = elf_i386_hash_table (info);
2413 plt_entry_size = GET_PLT_ENTRY_SIZE (info->output_bfd);
2415 resolved_to_zero = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
2417 /* Clear the reference count of function pointer relocations if
2418 symbol isn't a normal function. */
2419 if (h->type != STT_FUNC)
2420 eh->func_pointer_refcount = 0;
2422 /* We can't use the GOT PLT if pointer equality is needed since
2423 finish_dynamic_symbol won't clear symbol value and the dynamic
2424 linker won't update the GOT slot. We will get into an infinite
2425 loop at run-time. */
2426 if (htab->plt_got != NULL
2427 && h->type != STT_GNU_IFUNC
2428 && !h->pointer_equality_needed
2429 && h->plt.refcount > 0
2430 && h->got.refcount > 0)
2432 /* Don't use the regular PLT if there are both GOT and GOTPLT
2434 h->plt.offset = (bfd_vma) -1;
2436 /* Use the GOT PLT. */
2437 eh->plt_got.refcount = 1;
2440 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it
2441 here if it is defined and referenced in a non-shared object. */
2442 if (h->type == STT_GNU_IFUNC
2444 return _bfd_elf_allocate_ifunc_dyn_relocs (info, h, &eh->dyn_relocs,
2447 /* Don't create the PLT entry if there are only function pointer
2448 relocations which can be resolved at run-time. */
2449 else if (htab->elf.dynamic_sections_created
2450 && (h->plt.refcount > eh->func_pointer_refcount
2451 || eh->plt_got.refcount > 0))
2453 bfd_boolean use_plt_got;
2455 /* Clear the reference count of function pointer relocations
2457 eh->func_pointer_refcount = 0;
2459 if ((info->flags & DF_BIND_NOW) && !h->pointer_equality_needed)
2461 /* Don't use the regular PLT for DF_BIND_NOW. */
2462 h->plt.offset = (bfd_vma) -1;
2464 /* Use the GOT PLT. */
2465 h->got.refcount = 1;
2466 eh->plt_got.refcount = 1;
2469 use_plt_got = eh->plt_got.refcount > 0;
2471 /* Make sure this symbol is output as a dynamic symbol.
2472 Undefined weak syms won't yet be marked as dynamic. */
2473 if (h->dynindx == -1
2475 && !resolved_to_zero)
2477 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2481 if (bfd_link_pic (info)
2482 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
2484 asection *s = htab->elf.splt;
2485 asection *got_s = htab->plt_got;
2487 /* If this is the first .plt entry, make room for the special
2488 first entry. The .plt section is used by prelink to undo
2489 prelinking for dynamic relocations. */
2491 s->size = plt_entry_size;
2494 eh->plt_got.offset = got_s->size;
2496 h->plt.offset = s->size;
2498 /* If this symbol is not defined in a regular file, and we are
2499 not generating a shared library, then set the symbol to this
2500 location in the .plt. This is required to make function
2501 pointers compare as equal between the normal executable and
2502 the shared library. */
2503 if (! bfd_link_pic (info)
2508 /* We need to make a call to the entry of the GOT PLT
2509 instead of regular PLT entry. */
2510 h->root.u.def.section = got_s;
2511 h->root.u.def.value = eh->plt_got.offset;
2515 h->root.u.def.section = s;
2516 h->root.u.def.value = h->plt.offset;
2520 /* Make room for this entry. */
2522 got_s->size += sizeof (elf_i386_got_plt_entry);
2525 s->size += plt_entry_size;
2527 /* We also need to make an entry in the .got.plt section,
2528 which will be placed in the .got section by the linker
2530 htab->elf.sgotplt->size += 4;
2532 /* There should be no PLT relocation against resolved
2533 undefined weak symbol in executable. */
2534 if (!resolved_to_zero)
2536 /* We also need to make an entry in the .rel.plt
2538 htab->elf.srelplt->size += sizeof (Elf32_External_Rel);
2539 htab->elf.srelplt->reloc_count++;
2543 if (get_elf_i386_backend_data (info->output_bfd)->is_vxworks
2544 && !bfd_link_pic (info))
2546 /* VxWorks has a second set of relocations for each PLT entry
2547 in executables. They go in a separate relocation section,
2548 which is processed by the kernel loader. */
2550 /* There are two relocations for the initial PLT entry: an
2551 R_386_32 relocation for _GLOBAL_OFFSET_TABLE_ + 4 and an
2552 R_386_32 relocation for _GLOBAL_OFFSET_TABLE_ + 8. */
2554 if (h->plt.offset == plt_entry_size)
2555 htab->srelplt2->size += (sizeof (Elf32_External_Rel) * 2);
2557 /* There are two extra relocations for each subsequent PLT entry:
2558 an R_386_32 relocation for the GOT entry, and an R_386_32
2559 relocation for the PLT entry. */
2561 htab->srelplt2->size += (sizeof (Elf32_External_Rel) * 2);
2566 eh->plt_got.offset = (bfd_vma) -1;
2567 h->plt.offset = (bfd_vma) -1;
2573 eh->plt_got.offset = (bfd_vma) -1;
2574 h->plt.offset = (bfd_vma) -1;
2578 eh->tlsdesc_got = (bfd_vma) -1;
2580 /* If R_386_TLS_{IE_32,IE,GOTIE} symbol is now local to the binary,
2581 make it a R_386_TLS_LE_32 requiring no TLS entry. */
2582 if (h->got.refcount > 0
2583 && bfd_link_executable (info)
2585 && (elf_i386_hash_entry(h)->tls_type & GOT_TLS_IE))
2586 h->got.offset = (bfd_vma) -1;
2587 else if (h->got.refcount > 0)
2591 int tls_type = elf_i386_hash_entry(h)->tls_type;
2593 /* Make sure this symbol is output as a dynamic symbol.
2594 Undefined weak syms won't yet be marked as dynamic. */
2595 if (h->dynindx == -1
2597 && !resolved_to_zero)
2599 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2604 if (GOT_TLS_GDESC_P (tls_type))
2606 eh->tlsdesc_got = htab->elf.sgotplt->size
2607 - elf_i386_compute_jump_table_size (htab);
2608 htab->elf.sgotplt->size += 8;
2609 h->got.offset = (bfd_vma) -2;
2611 if (! GOT_TLS_GDESC_P (tls_type)
2612 || GOT_TLS_GD_P (tls_type))
2614 h->got.offset = s->size;
2616 /* R_386_TLS_GD needs 2 consecutive GOT slots. */
2617 if (GOT_TLS_GD_P (tls_type) || tls_type == GOT_TLS_IE_BOTH)
2620 dyn = htab->elf.dynamic_sections_created;
2621 /* R_386_TLS_IE_32 needs one dynamic relocation,
2622 R_386_TLS_IE resp. R_386_TLS_GOTIE needs one dynamic relocation,
2623 (but if both R_386_TLS_IE_32 and R_386_TLS_IE is present, we
2624 need two), R_386_TLS_GD needs one if local symbol and two if
2625 global. No dynamic relocation against resolved undefined weak
2626 symbol in executable. */
2627 if (tls_type == GOT_TLS_IE_BOTH)
2628 htab->elf.srelgot->size += 2 * sizeof (Elf32_External_Rel);
2629 else if ((GOT_TLS_GD_P (tls_type) && h->dynindx == -1)
2630 || (tls_type & GOT_TLS_IE))
2631 htab->elf.srelgot->size += sizeof (Elf32_External_Rel);
2632 else if (GOT_TLS_GD_P (tls_type))
2633 htab->elf.srelgot->size += 2 * sizeof (Elf32_External_Rel);
2634 else if (! GOT_TLS_GDESC_P (tls_type)
2635 && ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2636 && !resolved_to_zero)
2637 || h->root.type != bfd_link_hash_undefweak)
2638 && (bfd_link_pic (info)
2639 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
2640 htab->elf.srelgot->size += sizeof (Elf32_External_Rel);
2641 if (GOT_TLS_GDESC_P (tls_type))
2642 htab->elf.srelplt->size += sizeof (Elf32_External_Rel);
2645 h->got.offset = (bfd_vma) -1;
2647 if (eh->dyn_relocs == NULL)
2650 /* In the shared -Bsymbolic case, discard space allocated for
2651 dynamic pc-relative relocs against symbols which turn out to be
2652 defined in regular objects. For the normal shared case, discard
2653 space for pc-relative relocs that have become local due to symbol
2654 visibility changes. */
2656 if (bfd_link_pic (info))
2658 /* The only reloc that uses pc_count is R_386_PC32, which will
2659 appear on a call or on something like ".long foo - .". We
2660 want calls to protected symbols to resolve directly to the
2661 function rather than going via the plt. If people want
2662 function pointer comparisons to work as expected then they
2663 should avoid writing assembly like ".long foo - .". */
2664 if (SYMBOL_CALLS_LOCAL (info, h))
2666 struct elf_dyn_relocs **pp;
2668 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2670 p->count -= p->pc_count;
2679 if (get_elf_i386_backend_data (info->output_bfd)->is_vxworks)
2681 struct elf_dyn_relocs **pp;
2682 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2684 if (strcmp (p->sec->output_section->name, ".tls_vars") == 0)
2691 /* Also discard relocs on undefined weak syms with non-default
2692 visibility or in PIE. */
2693 if (eh->dyn_relocs != NULL
2694 && h->root.type == bfd_link_hash_undefweak)
2696 /* Undefined weak symbol is never bound locally in shared
2698 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2699 || resolved_to_zero)
2703 /* Keep dynamic non-GOT/non-PLT relocation so that we
2704 can branch to 0 without PLT. */
2705 struct elf_dyn_relocs **pp;
2707 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2708 if (p->pc_count == 0)
2712 /* Remove non-R_386_PC32 relocation. */
2713 p->count = p->pc_count;
2717 if (eh->dyn_relocs != NULL)
2719 /* Make sure undefined weak symbols are output
2720 as dynamic symbols in PIEs for dynamic non-GOT
2721 non-PLT reloations. */
2722 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2727 eh->dyn_relocs = NULL;
2729 else if (h->dynindx == -1
2730 && !h->forced_local)
2732 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2737 else if (ELIMINATE_COPY_RELOCS)
2739 /* For the non-shared case, discard space for relocs against
2740 symbols which turn out to need copy relocs or are not
2741 dynamic. Keep dynamic relocations for run-time function
2742 pointer initialization. */
2744 if ((!h->non_got_ref
2745 || eh->func_pointer_refcount > 0
2746 || (h->root.type == bfd_link_hash_undefweak
2747 && !resolved_to_zero))
2750 || (htab->elf.dynamic_sections_created
2751 && (h->root.type == bfd_link_hash_undefweak
2752 || h->root.type == bfd_link_hash_undefined))))
2754 /* Make sure this symbol is output as a dynamic symbol.
2755 Undefined weak syms won't yet be marked as dynamic. */
2756 if (h->dynindx == -1
2758 && !resolved_to_zero)
2760 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2764 /* If that succeeded, we know we'll be keeping all the
2766 if (h->dynindx != -1)
2770 eh->dyn_relocs = NULL;
2771 eh->func_pointer_refcount = 0;
2776 /* Finally, allocate space. */
2777 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2781 sreloc = elf_section_data (p->sec)->sreloc;
2783 BFD_ASSERT (sreloc != NULL);
2784 sreloc->size += p->count * sizeof (Elf32_External_Rel);
2790 /* Allocate space in .plt, .got and associated reloc sections for
2791 local dynamic relocs. */
2794 elf_i386_allocate_local_dynrelocs (void **slot, void *inf)
2796 struct elf_link_hash_entry *h
2797 = (struct elf_link_hash_entry *) *slot;
2799 if (h->type != STT_GNU_IFUNC
2803 || h->root.type != bfd_link_hash_defined)
2806 return elf_i386_allocate_dynrelocs (h, inf);
2809 /* Find any dynamic relocs that apply to read-only sections. */
2812 elf_i386_readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
2814 struct elf_i386_link_hash_entry *eh;
2815 struct elf_dyn_relocs *p;
2817 /* Skip local IFUNC symbols. */
2818 if (h->forced_local && h->type == STT_GNU_IFUNC)
2821 eh = (struct elf_i386_link_hash_entry *) h;
2822 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2824 asection *s = p->sec->output_section;
2826 if (s != NULL && (s->flags & SEC_READONLY) != 0)
2828 struct bfd_link_info *info = (struct bfd_link_info *) inf;
2830 info->flags |= DF_TEXTREL;
2832 if ((info->warn_shared_textrel && bfd_link_pic (info))
2833 || info->error_textrel)
2834 info->callbacks->einfo (_("%P: %B: warning: relocation against `%s' in readonly section `%A'\n"),
2835 p->sec->owner, h->root.root.string,
2838 /* Not an error, just cut short the traversal. */
2845 /* With the local symbol, foo, we convert
2846 mov foo@GOT[(%reg1)], %reg2
2848 lea foo[@GOTOFF(%reg1)], %reg2
2850 call/jmp *foo@GOT[(%reg)]
2852 nop call foo/jmp foo nop
2853 When PIC is false, convert
2854 test %reg1, foo@GOT[(%reg2)]
2858 binop foo@GOT[(%reg1)], %reg2
2861 where binop is one of adc, add, and, cmp, or, sbb, sub, xor
2865 elf_i386_convert_load (bfd *abfd, asection *sec,
2866 struct bfd_link_info *link_info)
2868 Elf_Internal_Shdr *symtab_hdr;
2869 Elf_Internal_Rela *internal_relocs;
2870 Elf_Internal_Rela *irel, *irelend;
2872 struct elf_i386_link_hash_table *htab;
2873 bfd_boolean changed_contents;
2874 bfd_boolean changed_relocs;
2876 bfd_signed_vma *local_got_refcounts;
2878 /* Don't even try to convert non-ELF outputs. */
2879 if (!is_elf_hash_table (link_info->hash))
2882 /* Nothing to do if there is no need or no output. */
2883 if ((sec->flags & (SEC_CODE | SEC_RELOC)) != (SEC_CODE | SEC_RELOC)
2884 || sec->need_convert_load == 0
2885 || bfd_is_abs_section (sec->output_section))
2888 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2890 /* Load the relocations for this section. */
2891 internal_relocs = (_bfd_elf_link_read_relocs
2892 (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
2893 link_info->keep_memory));
2894 if (internal_relocs == NULL)
2897 htab = elf_i386_hash_table (link_info);
2898 changed_contents = FALSE;
2899 changed_relocs = FALSE;
2900 local_got_refcounts = elf_local_got_refcounts (abfd);
2902 is_pic = bfd_link_pic (link_info);
2904 /* Get the section contents. */
2905 if (elf_section_data (sec)->this_hdr.contents != NULL)
2906 contents = elf_section_data (sec)->this_hdr.contents;
2909 if (!bfd_malloc_and_get_section (abfd, sec, &contents))
2913 irelend = internal_relocs + sec->reloc_count;
2914 for (irel = internal_relocs; irel < irelend; irel++)
2916 unsigned int r_type = ELF32_R_TYPE (irel->r_info);
2917 unsigned int r_symndx = ELF32_R_SYM (irel->r_info);
2919 struct elf_link_hash_entry *h;
2920 unsigned int opcode;
2923 bfd_boolean baseless;
2924 Elf_Internal_Sym *isym;
2925 unsigned int addend;
2928 bfd_boolean to_reloc_32;
2930 if (r_type != R_386_GOT32 && r_type != R_386_GOT32X)
2933 roff = irel->r_offset;
2937 /* Addend for R_386_GOT32 and R_386_GOT32X relocations must be 0. */
2938 addend = bfd_get_32 (abfd, contents + roff);
2942 modrm = bfd_get_8 (abfd, contents + roff - 1);
2943 baseless = (modrm & 0xc7) == 0x5;
2945 if (r_type == R_386_GOT32X && baseless && is_pic)
2947 /* For PIC, disallow R_386_GOT32X without a base register
2948 since we don't know what the GOT base is. Allow
2949 R_386_GOT32 for existing object files. */
2952 if (r_symndx < symtab_hdr->sh_info)
2954 isym = bfd_sym_from_r_symndx (&htab->sym_cache, abfd,
2956 name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
2960 indx = r_symndx - symtab_hdr->sh_info;
2961 h = elf_sym_hashes (abfd)[indx];
2962 BFD_ASSERT (h != NULL);
2963 name = h->root.root.string;
2966 (*_bfd_error_handler)
2967 (_("%B: direct GOT relocation R_386_GOT32X against `%s' without base register can not be used when making a shared object"),
2972 opcode = bfd_get_8 (abfd, contents + roff - 2);
2974 /* Convert mov to lea since it has been done for a while. */
2977 /* Only convert R_386_GOT32X relocation for call, jmp or
2978 one of adc, add, and, cmp, or, sbb, sub, test, xor
2980 if (r_type != R_386_GOT32X)
2984 /* Convert to R_386_32 if PIC is false or there is no base
2986 to_reloc_32 = !is_pic || baseless;
2988 /* Try to convert R_386_GOT32 and R_386_GOT32X. Get the symbol
2989 referred to by the reloc. */
2990 if (r_symndx < symtab_hdr->sh_info)
2992 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
2995 /* STT_GNU_IFUNC must keep GOT32 relocations. */
2996 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
3000 if (opcode == 0x0ff)
3001 /* Convert "call/jmp *foo@GOT[(%reg)]". */
3002 goto convert_branch;
3004 /* Convert "mov foo@GOT[(%reg1)], %reg2",
3005 "test %reg1, foo@GOT(%reg2)" and
3006 "binop foo@GOT[(%reg1)], %reg2". */
3010 indx = r_symndx - symtab_hdr->sh_info;
3011 h = elf_sym_hashes (abfd)[indx];
3012 BFD_ASSERT (h != NULL);
3014 while (h->root.type == bfd_link_hash_indirect
3015 || h->root.type == bfd_link_hash_warning)
3016 h = (struct elf_link_hash_entry *) h->root.u.i.link;
3018 /* STT_GNU_IFUNC must keep GOT32 relocations. */
3019 if (h->type == STT_GNU_IFUNC)
3022 /* Undefined weak symbol is only bound locally in executable
3023 and its reference is resolved as 0. */
3024 if (UNDEFINED_WEAK_RESOLVED_TO_ZERO (link_info,
3025 elf_i386_hash_entry (h)))
3029 /* No direct branch to 0 for PIC. */
3033 goto convert_branch;
3037 /* We can convert load of address 0 to R_386_32. */
3045 /* We have "call/jmp *foo@GOT[(%reg)]". */
3046 if ((h->root.type == bfd_link_hash_defined
3047 || h->root.type == bfd_link_hash_defweak)
3048 && SYMBOL_REFERENCES_LOCAL (link_info, h))
3050 /* The function is locally defined. */
3052 /* Convert R_386_GOT32X to R_386_PC32. */
3053 if (modrm == 0x15 || (modrm & 0xf8) == 0x90)
3055 /* Convert to "nop call foo". ADDR_PREFIX_OPCODE
3058 nop = link_info->call_nop_byte;
3059 if (link_info->call_nop_as_suffix)
3061 nop_offset = roff + 3;
3062 irel->r_offset -= 1;
3065 nop_offset = roff - 2;
3069 /* Convert to "jmp foo nop". */
3072 nop_offset = roff + 3;
3073 irel->r_offset -= 1;
3076 bfd_put_8 (abfd, nop, contents + nop_offset);
3077 bfd_put_8 (abfd, modrm, contents + irel->r_offset - 1);
3078 /* When converting to PC-relative relocation, we
3079 need to adjust addend by -4. */
3080 bfd_put_32 (abfd, -4, contents + irel->r_offset);
3081 irel->r_info = ELF32_R_INFO (r_symndx, R_386_PC32);
3085 if (h->got.refcount > 0)
3086 h->got.refcount -= 1;
3090 if (local_got_refcounts != NULL
3091 && local_got_refcounts[r_symndx] > 0)
3092 local_got_refcounts[r_symndx] -= 1;
3095 changed_contents = TRUE;
3096 changed_relocs = TRUE;
3101 /* We have "mov foo@GOT[(%re1g)], %reg2",
3102 "test %reg1, foo@GOT(%reg2)" and
3103 "binop foo@GOT[(%reg1)], %reg2".
3105 Avoid optimizing _DYNAMIC since ld.so may use its
3106 link-time address. */
3107 if (h == htab->elf.hdynamic)
3110 /* def_regular is set by an assignment in a linker script in
3111 bfd_elf_record_link_assignment. */
3113 || h->root.type == bfd_link_hash_defined
3114 || h->root.type == bfd_link_hash_defweak)
3115 && SYMBOL_REFERENCES_LOCAL (link_info, h))
3122 /* Convert "mov foo@GOT[(%reg1)], %reg2" to
3123 "mov $foo, %reg2" with R_386_32. */
3125 modrm = 0xc0 | (modrm & 0x38) >> 3;
3126 bfd_put_8 (abfd, modrm, contents + roff - 1);
3131 /* Convert "mov foo@GOT(%reg1), %reg2" to
3132 "lea foo@GOTOFF(%reg1), %reg2". */
3133 r_type = R_386_GOTOFF;
3139 /* Only R_386_32 is supported. */
3145 /* Convert "test %reg1, foo@GOT(%reg2)" to
3146 "test $foo, %reg1". */
3147 modrm = 0xc0 | (modrm & 0x38) >> 3;
3152 /* Convert "binop foo@GOT(%reg1), %reg2" to
3153 "binop $foo, %reg2". */
3155 | (modrm & 0x38) >> 3
3159 bfd_put_8 (abfd, modrm, contents + roff - 1);
3163 bfd_put_8 (abfd, opcode, contents + roff - 2);
3164 irel->r_info = ELF32_R_INFO (r_symndx, r_type);
3168 if (h->got.refcount > 0)
3169 h->got.refcount -= 1;
3173 if (local_got_refcounts != NULL
3174 && local_got_refcounts[r_symndx] > 0)
3175 local_got_refcounts[r_symndx] -= 1;
3178 changed_contents = TRUE;
3179 changed_relocs = TRUE;
3184 if (contents != NULL
3185 && elf_section_data (sec)->this_hdr.contents != contents)
3187 if (!changed_contents && !link_info->keep_memory)
3191 /* Cache the section contents for elf_link_input_bfd. */
3192 elf_section_data (sec)->this_hdr.contents = contents;
3196 if (elf_section_data (sec)->relocs != internal_relocs)
3198 if (!changed_relocs)
3199 free (internal_relocs);
3201 elf_section_data (sec)->relocs = internal_relocs;
3207 if (contents != NULL
3208 && elf_section_data (sec)->this_hdr.contents != contents)
3210 if (internal_relocs != NULL
3211 && elf_section_data (sec)->relocs != internal_relocs)
3212 free (internal_relocs);
3216 /* Set the sizes of the dynamic sections. */
3219 elf_i386_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
3221 struct elf_i386_link_hash_table *htab;
3227 htab = elf_i386_hash_table (info);
3230 dynobj = htab->elf.dynobj;
3234 if (htab->elf.dynamic_sections_created)
3236 /* Set the contents of the .interp section to the interpreter. */
3237 if (bfd_link_executable (info) && !info->nointerp)
3239 s = bfd_get_linker_section (dynobj, ".interp");
3242 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
3243 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
3248 /* Set up .got offsets for local syms, and space for local dynamic
3250 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
3252 bfd_signed_vma *local_got;
3253 bfd_signed_vma *end_local_got;
3254 char *local_tls_type;
3255 bfd_vma *local_tlsdesc_gotent;
3256 bfd_size_type locsymcount;
3257 Elf_Internal_Shdr *symtab_hdr;
3260 if (! is_i386_elf (ibfd))
3263 for (s = ibfd->sections; s != NULL; s = s->next)
3265 struct elf_dyn_relocs *p;
3267 if (!elf_i386_convert_load (ibfd, s, info))
3270 for (p = ((struct elf_dyn_relocs *)
3271 elf_section_data (s)->local_dynrel);
3275 if (!bfd_is_abs_section (p->sec)
3276 && bfd_is_abs_section (p->sec->output_section))
3278 /* Input section has been discarded, either because
3279 it is a copy of a linkonce section or due to
3280 linker script /DISCARD/, so we'll be discarding
3283 else if (get_elf_i386_backend_data (output_bfd)->is_vxworks
3284 && strcmp (p->sec->output_section->name,
3287 /* Relocations in vxworks .tls_vars sections are
3288 handled specially by the loader. */
3290 else if (p->count != 0)
3292 srel = elf_section_data (p->sec)->sreloc;
3293 srel->size += p->count * sizeof (Elf32_External_Rel);
3294 if ((p->sec->output_section->flags & SEC_READONLY) != 0
3295 && (info->flags & DF_TEXTREL) == 0)
3297 info->flags |= DF_TEXTREL;
3298 if ((info->warn_shared_textrel && bfd_link_pic (info))
3299 || info->error_textrel)
3300 info->callbacks->einfo (_("%P: %B: warning: relocation in readonly section `%A'\n"),
3301 p->sec->owner, p->sec);
3307 local_got = elf_local_got_refcounts (ibfd);
3311 symtab_hdr = &elf_symtab_hdr (ibfd);
3312 locsymcount = symtab_hdr->sh_info;
3313 end_local_got = local_got + locsymcount;
3314 local_tls_type = elf_i386_local_got_tls_type (ibfd);
3315 local_tlsdesc_gotent = elf_i386_local_tlsdesc_gotent (ibfd);
3317 srel = htab->elf.srelgot;
3318 for (; local_got < end_local_got;
3319 ++local_got, ++local_tls_type, ++local_tlsdesc_gotent)
3321 *local_tlsdesc_gotent = (bfd_vma) -1;
3324 if (GOT_TLS_GDESC_P (*local_tls_type))
3326 *local_tlsdesc_gotent = htab->elf.sgotplt->size
3327 - elf_i386_compute_jump_table_size (htab);
3328 htab->elf.sgotplt->size += 8;
3329 *local_got = (bfd_vma) -2;
3331 if (! GOT_TLS_GDESC_P (*local_tls_type)
3332 || GOT_TLS_GD_P (*local_tls_type))
3334 *local_got = s->size;
3336 if (GOT_TLS_GD_P (*local_tls_type)
3337 || *local_tls_type == GOT_TLS_IE_BOTH)
3340 if (bfd_link_pic (info)
3341 || GOT_TLS_GD_ANY_P (*local_tls_type)
3342 || (*local_tls_type & GOT_TLS_IE))
3344 if (*local_tls_type == GOT_TLS_IE_BOTH)
3345 srel->size += 2 * sizeof (Elf32_External_Rel);
3346 else if (GOT_TLS_GD_P (*local_tls_type)
3347 || ! GOT_TLS_GDESC_P (*local_tls_type))
3348 srel->size += sizeof (Elf32_External_Rel);
3349 if (GOT_TLS_GDESC_P (*local_tls_type))
3350 htab->elf.srelplt->size += sizeof (Elf32_External_Rel);
3354 *local_got = (bfd_vma) -1;
3358 if (htab->tls_ldm_got.refcount > 0)
3360 /* Allocate 2 got entries and 1 dynamic reloc for R_386_TLS_LDM
3362 htab->tls_ldm_got.offset = htab->elf.sgot->size;
3363 htab->elf.sgot->size += 8;
3364 htab->elf.srelgot->size += sizeof (Elf32_External_Rel);
3367 htab->tls_ldm_got.offset = -1;
3369 /* Allocate global sym .plt and .got entries, and space for global
3370 sym dynamic relocs. */
3371 elf_link_hash_traverse (&htab->elf, elf_i386_allocate_dynrelocs, info);
3373 /* Allocate .plt and .got entries, and space for local symbols. */
3374 htab_traverse (htab->loc_hash_table,
3375 elf_i386_allocate_local_dynrelocs,
3378 /* For every jump slot reserved in the sgotplt, reloc_count is
3379 incremented. However, when we reserve space for TLS descriptors,
3380 it's not incremented, so in order to compute the space reserved
3381 for them, it suffices to multiply the reloc count by the jump
3384 PR ld/13302: We start next_irelative_index at the end of .rela.plt
3385 so that R_386_IRELATIVE entries come last. */
3386 if (htab->elf.srelplt)
3388 htab->next_tls_desc_index = htab->elf.srelplt->reloc_count;
3389 htab->sgotplt_jump_table_size = htab->next_tls_desc_index * 4;
3390 htab->next_irelative_index = htab->elf.srelplt->reloc_count - 1;
3392 else if (htab->elf.irelplt)
3393 htab->next_irelative_index = htab->elf.irelplt->reloc_count - 1;
3396 if (htab->elf.sgotplt)
3398 /* Don't allocate .got.plt section if there are no GOT nor PLT
3399 entries and there is no reference to _GLOBAL_OFFSET_TABLE_. */
3400 if ((htab->elf.hgot == NULL
3401 || !htab->elf.hgot->ref_regular_nonweak)
3402 && (htab->elf.sgotplt->size
3403 == get_elf_backend_data (output_bfd)->got_header_size)
3404 && (htab->elf.splt == NULL
3405 || htab->elf.splt->size == 0)
3406 && (htab->elf.sgot == NULL
3407 || htab->elf.sgot->size == 0)
3408 && (htab->elf.iplt == NULL
3409 || htab->elf.iplt->size == 0)
3410 && (htab->elf.igotplt == NULL
3411 || htab->elf.igotplt->size == 0))
3412 htab->elf.sgotplt->size = 0;
3416 if (htab->plt_eh_frame != NULL
3417 && htab->elf.splt != NULL
3418 && htab->elf.splt->size != 0
3419 && !bfd_is_abs_section (htab->elf.splt->output_section)
3420 && _bfd_elf_eh_frame_present (info))
3421 htab->plt_eh_frame->size = sizeof (elf_i386_eh_frame_plt);
3423 /* We now have determined the sizes of the various dynamic sections.
3424 Allocate memory for them. */
3426 for (s = dynobj->sections; s != NULL; s = s->next)
3428 bfd_boolean strip_section = TRUE;
3430 if ((s->flags & SEC_LINKER_CREATED) == 0)
3433 if (s == htab->elf.splt
3434 || s == htab->elf.sgot)
3436 /* Strip this section if we don't need it; see the
3438 /* We'd like to strip these sections if they aren't needed, but if
3439 we've exported dynamic symbols from them we must leave them.
3440 It's too late to tell BFD to get rid of the symbols. */
3442 if (htab->elf.hplt != NULL)
3443 strip_section = FALSE;
3445 else if (s == htab->elf.sgotplt
3446 || s == htab->elf.iplt
3447 || s == htab->elf.igotplt
3448 || s == htab->plt_got
3449 || s == htab->plt_eh_frame
3450 || s == htab->sdynbss)
3452 /* Strip these too. */
3454 else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rel"))
3457 && s != htab->elf.srelplt
3458 && s != htab->srelplt2)
3461 /* We use the reloc_count field as a counter if we need
3462 to copy relocs into the output file. */
3467 /* It's not one of our sections, so don't allocate space. */
3473 /* If we don't need this section, strip it from the
3474 output file. This is mostly to handle .rel.bss and
3475 .rel.plt. We must create both sections in
3476 create_dynamic_sections, because they must be created
3477 before the linker maps input sections to output
3478 sections. The linker does that before
3479 adjust_dynamic_symbol is called, and it is that
3480 function which decides whether anything needs to go
3481 into these sections. */
3483 s->flags |= SEC_EXCLUDE;
3487 if ((s->flags & SEC_HAS_CONTENTS) == 0)
3490 /* Allocate memory for the section contents. We use bfd_zalloc
3491 here in case unused entries are not reclaimed before the
3492 section's contents are written out. This should not happen,
3493 but this way if it does, we get a R_386_NONE reloc instead
3495 s->contents = (unsigned char *) bfd_zalloc (dynobj, s->size);
3496 if (s->contents == NULL)
3500 if (htab->plt_eh_frame != NULL
3501 && htab->plt_eh_frame->contents != NULL)
3503 memcpy (htab->plt_eh_frame->contents, elf_i386_eh_frame_plt,
3504 sizeof (elf_i386_eh_frame_plt));
3505 bfd_put_32 (dynobj, htab->elf.splt->size,
3506 htab->plt_eh_frame->contents + PLT_FDE_LEN_OFFSET);
3509 if (htab->elf.dynamic_sections_created)
3511 /* Add some entries to the .dynamic section. We fill in the
3512 values later, in elf_i386_finish_dynamic_sections, but we
3513 must add the entries now so that we get the correct size for
3514 the .dynamic section. The DT_DEBUG entry is filled in by the
3515 dynamic linker and used by the debugger. */
3516 #define add_dynamic_entry(TAG, VAL) \
3517 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
3519 if (bfd_link_executable (info))
3521 if (!add_dynamic_entry (DT_DEBUG, 0))
3525 if (htab->elf.splt->size != 0)
3527 /* DT_PLTGOT is used by prelink even if there is no PLT
3529 if (!add_dynamic_entry (DT_PLTGOT, 0))
3532 if (htab->elf.srelplt->size != 0)
3534 if (!add_dynamic_entry (DT_PLTRELSZ, 0)
3535 || !add_dynamic_entry (DT_PLTREL, DT_REL)
3536 || !add_dynamic_entry (DT_JMPREL, 0))
3543 if (!add_dynamic_entry (DT_REL, 0)
3544 || !add_dynamic_entry (DT_RELSZ, 0)
3545 || !add_dynamic_entry (DT_RELENT, sizeof (Elf32_External_Rel)))
3548 /* If any dynamic relocs apply to a read-only section,
3549 then we need a DT_TEXTREL entry. */
3550 if ((info->flags & DF_TEXTREL) == 0)
3551 elf_link_hash_traverse (&htab->elf,
3552 elf_i386_readonly_dynrelocs, info);
3554 if ((info->flags & DF_TEXTREL) != 0)
3556 if ((elf_tdata (output_bfd)->has_gnu_symbols
3557 & elf_gnu_symbol_ifunc) == elf_gnu_symbol_ifunc)
3559 info->callbacks->einfo
3560 (_("%P%X: read-only segment has dynamic IFUNC relocations; recompile with -fPIC\n"));
3561 bfd_set_error (bfd_error_bad_value);
3565 if (!add_dynamic_entry (DT_TEXTREL, 0))
3569 if (get_elf_i386_backend_data (output_bfd)->is_vxworks
3570 && !elf_vxworks_add_dynamic_entries (output_bfd, info))
3573 #undef add_dynamic_entry
3579 elf_i386_always_size_sections (bfd *output_bfd,
3580 struct bfd_link_info *info)
3582 asection *tls_sec = elf_hash_table (info)->tls_sec;
3586 struct elf_link_hash_entry *tlsbase;
3588 tlsbase = elf_link_hash_lookup (elf_hash_table (info),
3589 "_TLS_MODULE_BASE_",
3590 FALSE, FALSE, FALSE);
3592 if (tlsbase && tlsbase->type == STT_TLS)
3594 struct elf_i386_link_hash_table *htab;
3595 struct bfd_link_hash_entry *bh = NULL;
3596 const struct elf_backend_data *bed
3597 = get_elf_backend_data (output_bfd);
3599 htab = elf_i386_hash_table (info);
3603 if (!(_bfd_generic_link_add_one_symbol
3604 (info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL,
3605 tls_sec, 0, NULL, FALSE,
3606 bed->collect, &bh)))
3609 htab->tls_module_base = bh;
3611 tlsbase = (struct elf_link_hash_entry *)bh;
3612 tlsbase->def_regular = 1;
3613 tlsbase->other = STV_HIDDEN;
3614 tlsbase->root.linker_def = 1;
3615 (*bed->elf_backend_hide_symbol) (info, tlsbase, TRUE);
3622 /* Set the correct type for an x86 ELF section. We do this by the
3623 section name, which is a hack, but ought to work. */
3626 elf_i386_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
3627 Elf_Internal_Shdr *hdr,
3632 name = bfd_get_section_name (abfd, sec);
3634 /* This is an ugly, but unfortunately necessary hack that is
3635 needed when producing EFI binaries on x86. It tells
3636 elf.c:elf_fake_sections() not to consider ".reloc" as a section
3637 containing ELF relocation info. We need this hack in order to
3638 be able to generate ELF binaries that can be translated into
3639 EFI applications (which are essentially COFF objects). Those
3640 files contain a COFF ".reloc" section inside an ELFNN object,
3641 which would normally cause BFD to segfault because it would
3642 attempt to interpret this section as containing relocation
3643 entries for section "oc". With this hack enabled, ".reloc"
3644 will be treated as a normal data section, which will avoid the
3645 segfault. However, you won't be able to create an ELFNN binary
3646 with a section named "oc" that needs relocations, but that's
3647 the kind of ugly side-effects you get when detecting section
3648 types based on their names... In practice, this limitation is
3649 unlikely to bite. */
3650 if (strcmp (name, ".reloc") == 0)
3651 hdr->sh_type = SHT_PROGBITS;
3656 /* _TLS_MODULE_BASE_ needs to be treated especially when linking
3657 executables. Rather than setting it to the beginning of the TLS
3658 section, we have to set it to the end. This function may be called
3659 multiple times, it is idempotent. */
3662 elf_i386_set_tls_module_base (struct bfd_link_info *info)
3664 struct elf_i386_link_hash_table *htab;
3665 struct bfd_link_hash_entry *base;
3667 if (!bfd_link_executable (info))
3670 htab = elf_i386_hash_table (info);
3674 base = htab->tls_module_base;
3678 base->u.def.value = htab->elf.tls_size;
3681 /* Return the base VMA address which should be subtracted from real addresses
3682 when resolving @dtpoff relocation.
3683 This is PT_TLS segment p_vaddr. */
3686 elf_i386_dtpoff_base (struct bfd_link_info *info)
3688 /* If tls_sec is NULL, we should have signalled an error already. */
3689 if (elf_hash_table (info)->tls_sec == NULL)
3691 return elf_hash_table (info)->tls_sec->vma;
3694 /* Return the relocation value for @tpoff relocation
3695 if STT_TLS virtual address is ADDRESS. */
3698 elf_i386_tpoff (struct bfd_link_info *info, bfd_vma address)
3700 struct elf_link_hash_table *htab = elf_hash_table (info);
3701 const struct elf_backend_data *bed = get_elf_backend_data (info->output_bfd);
3702 bfd_vma static_tls_size;
3704 /* If tls_sec is NULL, we should have signalled an error already. */
3705 if (htab->tls_sec == NULL)
3708 /* Consider special static TLS alignment requirements. */
3709 static_tls_size = BFD_ALIGN (htab->tls_size, bed->static_tls_alignment);
3710 return static_tls_size + htab->tls_sec->vma - address;
3713 /* Relocate an i386 ELF section. */
3716 elf_i386_relocate_section (bfd *output_bfd,
3717 struct bfd_link_info *info,
3719 asection *input_section,
3721 Elf_Internal_Rela *relocs,
3722 Elf_Internal_Sym *local_syms,
3723 asection **local_sections)
3725 struct elf_i386_link_hash_table *htab;
3726 Elf_Internal_Shdr *symtab_hdr;
3727 struct elf_link_hash_entry **sym_hashes;
3728 bfd_vma *local_got_offsets;
3729 bfd_vma *local_tlsdesc_gotents;
3730 Elf_Internal_Rela *rel;
3731 Elf_Internal_Rela *wrel;
3732 Elf_Internal_Rela *relend;
3733 bfd_boolean is_vxworks_tls;
3734 unsigned plt_entry_size;
3736 BFD_ASSERT (is_i386_elf (input_bfd));
3738 htab = elf_i386_hash_table (info);
3741 symtab_hdr = &elf_symtab_hdr (input_bfd);
3742 sym_hashes = elf_sym_hashes (input_bfd);
3743 local_got_offsets = elf_local_got_offsets (input_bfd);
3744 local_tlsdesc_gotents = elf_i386_local_tlsdesc_gotent (input_bfd);
3745 /* We have to handle relocations in vxworks .tls_vars sections
3746 specially, because the dynamic loader is 'weird'. */
3747 is_vxworks_tls = (get_elf_i386_backend_data (output_bfd)->is_vxworks
3748 && bfd_link_pic (info)
3749 && !strcmp (input_section->output_section->name,
3752 elf_i386_set_tls_module_base (info);
3754 plt_entry_size = GET_PLT_ENTRY_SIZE (output_bfd);
3756 rel = wrel = relocs;
3757 relend = relocs + input_section->reloc_count;
3758 for (; rel < relend; wrel++, rel++)
3760 unsigned int r_type;
3761 reloc_howto_type *howto;
3762 unsigned long r_symndx;
3763 struct elf_link_hash_entry *h;
3764 struct elf_i386_link_hash_entry *eh;
3765 Elf_Internal_Sym *sym;
3767 bfd_vma off, offplt, plt_offset;
3769 bfd_boolean unresolved_reloc;
3770 bfd_reloc_status_type r;
3774 asection *resolved_plt;
3775 bfd_boolean resolved_to_zero;
3777 r_type = ELF32_R_TYPE (rel->r_info);
3778 if (r_type == R_386_GNU_VTINHERIT
3779 || r_type == R_386_GNU_VTENTRY)
3786 if ((indx = r_type) >= R_386_standard
3787 && ((indx = r_type - R_386_ext_offset) - R_386_standard
3788 >= R_386_ext - R_386_standard)
3789 && ((indx = r_type - R_386_tls_offset) - R_386_ext
3790 >= R_386_ext2 - R_386_ext))
3792 (*_bfd_error_handler)
3793 (_("%B: unrecognized relocation (0x%x) in section `%A'"),
3794 input_bfd, input_section, r_type);
3795 bfd_set_error (bfd_error_bad_value);
3798 howto = elf_howto_table + indx;
3800 r_symndx = ELF32_R_SYM (rel->r_info);
3804 unresolved_reloc = FALSE;
3805 if (r_symndx < symtab_hdr->sh_info)
3807 sym = local_syms + r_symndx;
3808 sec = local_sections[r_symndx];
3809 relocation = (sec->output_section->vma
3810 + sec->output_offset
3812 st_size = sym->st_size;
3814 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION
3815 && ((sec->flags & SEC_MERGE) != 0
3816 || (bfd_link_relocatable (info)
3817 && sec->output_offset != 0)))
3820 bfd_byte *where = contents + rel->r_offset;
3822 switch (howto->size)
3825 addend = bfd_get_8 (input_bfd, where);
3826 if (howto->pc_relative)
3828 addend = (addend ^ 0x80) - 0x80;
3833 addend = bfd_get_16 (input_bfd, where);
3834 if (howto->pc_relative)
3836 addend = (addend ^ 0x8000) - 0x8000;
3841 addend = bfd_get_32 (input_bfd, where);
3842 if (howto->pc_relative)
3844 addend = (addend ^ 0x80000000) - 0x80000000;
3852 if (bfd_link_relocatable (info))
3853 addend += sec->output_offset;
3856 asection *msec = sec;
3857 addend = _bfd_elf_rel_local_sym (output_bfd, sym, &msec,
3859 addend -= relocation;
3860 addend += msec->output_section->vma + msec->output_offset;
3863 switch (howto->size)
3866 /* FIXME: overflow checks. */
3867 if (howto->pc_relative)
3869 bfd_put_8 (input_bfd, addend, where);
3872 if (howto->pc_relative)
3874 bfd_put_16 (input_bfd, addend, where);
3877 if (howto->pc_relative)
3879 bfd_put_32 (input_bfd, addend, where);
3883 else if (!bfd_link_relocatable (info)
3884 && ELF32_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
3886 /* Relocate against local STT_GNU_IFUNC symbol. */
3887 h = elf_i386_get_local_sym_hash (htab, input_bfd, rel,
3892 /* Set STT_GNU_IFUNC symbol value. */
3893 h->root.u.def.value = sym->st_value;
3894 h->root.u.def.section = sec;
3899 bfd_boolean warned ATTRIBUTE_UNUSED;
3900 bfd_boolean ignored ATTRIBUTE_UNUSED;
3902 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
3903 r_symndx, symtab_hdr, sym_hashes,
3905 unresolved_reloc, warned, ignored);
3909 if (sec != NULL && discarded_section (sec))
3911 _bfd_clear_contents (howto, input_bfd, input_section,
3912 contents + rel->r_offset);
3913 wrel->r_offset = rel->r_offset;
3917 /* For ld -r, remove relocations in debug sections against
3918 sections defined in discarded sections. Not done for
3919 eh_frame editing code expects to be present. */
3920 if (bfd_link_relocatable (info)
3921 && (input_section->flags & SEC_DEBUGGING))
3927 if (bfd_link_relocatable (info))
3934 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle
3935 it here if it is defined in a non-shared object. */
3937 && h->type == STT_GNU_IFUNC
3940 asection *plt, *gotplt, *base_got;
3944 if ((input_section->flags & SEC_ALLOC) == 0)
3946 /* Dynamic relocs are not propagated for SEC_DEBUGGING
3947 sections because such sections are not SEC_ALLOC and
3948 thus ld.so will not process them. */
3949 if ((input_section->flags & SEC_DEBUGGING) != 0)
3953 else if (h->plt.offset == (bfd_vma) -1)
3956 /* STT_GNU_IFUNC symbol must go through PLT. */
3957 if (htab->elf.splt != NULL)
3959 plt = htab->elf.splt;
3960 gotplt = htab->elf.sgotplt;
3964 plt = htab->elf.iplt;
3965 gotplt = htab->elf.igotplt;
3968 relocation = (plt->output_section->vma
3969 + plt->output_offset + h->plt.offset);
3974 if (h->root.root.string)
3975 name = h->root.root.string;
3977 name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
3979 (*_bfd_error_handler)
3980 (_("%B: relocation %s against STT_GNU_IFUNC "
3981 "symbol `%s' isn't handled by %s"), input_bfd,
3982 elf_howto_table[r_type].name,
3983 name, __FUNCTION__);
3984 bfd_set_error (bfd_error_bad_value);
3988 /* Generate dynamic relcoation only when there is a
3989 non-GOT reference in a shared object. */
3990 if (bfd_link_pic (info) && h->non_got_ref)
3992 Elf_Internal_Rela outrel;
3996 /* Need a dynamic relocation to get the real function
3998 offset = _bfd_elf_section_offset (output_bfd,
4002 if (offset == (bfd_vma) -1
4003 || offset == (bfd_vma) -2)
4006 outrel.r_offset = (input_section->output_section->vma
4007 + input_section->output_offset
4010 if (h->dynindx == -1
4012 || bfd_link_executable (info))
4014 /* This symbol is resolved locally. */
4015 outrel.r_info = ELF32_R_INFO (0, R_386_IRELATIVE);
4016 bfd_put_32 (output_bfd,
4017 (h->root.u.def.value
4018 + h->root.u.def.section->output_section->vma
4019 + h->root.u.def.section->output_offset),
4023 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
4025 sreloc = htab->elf.irelifunc;
4026 elf_append_rel (output_bfd, sreloc, &outrel);
4028 /* If this reloc is against an external symbol, we
4029 do not want to fiddle with the addend. Otherwise,
4030 we need to include the symbol value so that it
4031 becomes an addend for the dynamic reloc. For an
4032 internal symbol, we have updated addend. */
4042 base_got = htab->elf.sgot;
4043 off = h->got.offset;
4045 if (base_got == NULL)
4048 if (off == (bfd_vma) -1)
4050 /* We can't use h->got.offset here to save state, or
4051 even just remember the offset, as finish_dynamic_symbol
4052 would use that as offset into .got. */
4054 if (htab->elf.splt != NULL)
4056 plt_index = h->plt.offset / plt_entry_size - 1;
4057 off = (plt_index + 3) * 4;
4058 base_got = htab->elf.sgotplt;
4062 plt_index = h->plt.offset / plt_entry_size;
4063 off = plt_index * 4;
4064 base_got = htab->elf.igotplt;
4067 if (h->dynindx == -1
4071 /* This references the local defitionion. We must
4072 initialize this entry in the global offset table.
4073 Since the offset must always be a multiple of 8,
4074 we use the least significant bit to record
4075 whether we have initialized it already.
4077 When doing a dynamic link, we create a .rela.got
4078 relocation entry to initialize the value. This
4079 is done in the finish_dynamic_symbol routine. */
4084 bfd_put_32 (output_bfd, relocation,
4085 base_got->contents + off);
4092 /* Adjust for static executables. */
4093 if (htab->elf.splt == NULL)
4094 relocation += gotplt->output_offset;
4098 relocation = (base_got->output_section->vma
4099 + base_got->output_offset + off
4100 - gotplt->output_section->vma
4101 - gotplt->output_offset);
4102 /* Adjust for static executables. */
4103 if (htab->elf.splt == NULL)
4104 relocation += gotplt->output_offset;
4110 relocation -= (gotplt->output_section->vma
4111 + gotplt->output_offset);
4116 eh = (struct elf_i386_link_hash_entry *) h;
4117 resolved_to_zero = (eh != NULL
4118 && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh));
4123 /* Avoid optimizing _DYNAMIC since ld.so may use its
4124 link-time address. */
4125 if (h == htab->elf.hdynamic)
4128 if (bfd_link_pic (info))
4130 /* It is OK to convert mov to lea and convert indirect
4131 branch to direct branch. It is OK to convert adc,
4132 add, and, cmp, or, sbb, sub, test, xor only when PIC
4134 unsigned int opcode, addend;
4135 addend = bfd_get_32 (input_bfd, contents + rel->r_offset);
4138 opcode = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
4139 if (opcode != 0x8b && opcode != 0xff)
4143 /* Resolve "mov GOT[(%reg)], %reg",
4144 "call/jmp *GOT[(%reg)]", "test %reg, foo@GOT[(%reg)]"
4145 and "binop foo@GOT[(%reg)], %reg". */
4147 || (h->plt.offset == (bfd_vma) -1
4148 && h->got.offset == (bfd_vma) -1)
4149 || htab->elf.sgotplt == NULL)
4152 offplt = (htab->elf.sgotplt->output_section->vma
4153 + htab->elf.sgotplt->output_offset);
4155 /* It is relative to .got.plt section. */
4156 if (h->got.offset != (bfd_vma) -1)
4157 /* Use GOT entry. Mask off the least significant bit in
4158 GOT offset which may be set by R_386_GOT32 processing
4160 relocation = (htab->elf.sgot->output_section->vma
4161 + htab->elf.sgot->output_offset
4162 + (h->got.offset & ~1) - offplt);
4164 /* Use GOTPLT entry. */
4165 relocation = (h->plt.offset / plt_entry_size - 1 + 3) * 4;
4167 if (!bfd_link_pic (info))
4169 /* If not PIC, add the .got.plt section address for
4170 baseless addressing. */
4172 modrm = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
4173 if ((modrm & 0xc7) == 0x5)
4174 relocation += offplt;
4177 unresolved_reloc = FALSE;
4182 /* Relocation is to the entry for this symbol in the global
4184 if (htab->elf.sgot == NULL)
4191 off = h->got.offset;
4192 dyn = htab->elf.dynamic_sections_created;
4193 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
4194 bfd_link_pic (info),
4196 || (bfd_link_pic (info)
4197 && SYMBOL_REFERENCES_LOCAL (info, h))
4198 || (ELF_ST_VISIBILITY (h->other)
4199 && h->root.type == bfd_link_hash_undefweak))
4201 /* This is actually a static link, or it is a
4202 -Bsymbolic link and the symbol is defined
4203 locally, or the symbol was forced to be local
4204 because of a version file. We must initialize
4205 this entry in the global offset table. Since the
4206 offset must always be a multiple of 4, we use the
4207 least significant bit to record whether we have
4208 initialized it already.
4210 When doing a dynamic link, we create a .rel.got
4211 relocation entry to initialize the value. This
4212 is done in the finish_dynamic_symbol routine. */
4217 bfd_put_32 (output_bfd, relocation,
4218 htab->elf.sgot->contents + off);
4223 unresolved_reloc = FALSE;
4227 if (local_got_offsets == NULL)
4230 off = local_got_offsets[r_symndx];
4232 /* The offset must always be a multiple of 4. We use
4233 the least significant bit to record whether we have
4234 already generated the necessary reloc. */
4239 bfd_put_32 (output_bfd, relocation,
4240 htab->elf.sgot->contents + off);
4242 if (bfd_link_pic (info))
4245 Elf_Internal_Rela outrel;
4247 s = htab->elf.srelgot;
4251 outrel.r_offset = (htab->elf.sgot->output_section->vma
4252 + htab->elf.sgot->output_offset
4254 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
4255 elf_append_rel (output_bfd, s, &outrel);
4258 local_got_offsets[r_symndx] |= 1;
4262 if (off >= (bfd_vma) -2)
4265 relocation = htab->elf.sgot->output_section->vma
4266 + htab->elf.sgot->output_offset + off
4267 - htab->elf.sgotplt->output_section->vma
4268 - htab->elf.sgotplt->output_offset;
4272 /* Relocation is relative to the start of the global offset
4275 /* Check to make sure it isn't a protected function or data
4276 symbol for shared library since it may not be local when
4277 used as function address or with copy relocation. We also
4278 need to make sure that a symbol is referenced locally. */
4279 if (!bfd_link_executable (info) && h)
4281 if (!h->def_regular)
4285 switch (ELF_ST_VISIBILITY (h->other))
4288 v = _("hidden symbol");
4291 v = _("internal symbol");
4294 v = _("protected symbol");
4301 (*_bfd_error_handler)
4302 (_("%B: relocation R_386_GOTOFF against undefined %s `%s' can not be used when making a shared object"),
4303 input_bfd, v, h->root.root.string);
4304 bfd_set_error (bfd_error_bad_value);
4307 else if (!SYMBOL_REFERENCES_LOCAL (info, h)
4308 && (h->type == STT_FUNC
4309 || h->type == STT_OBJECT)
4310 && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
4312 (*_bfd_error_handler)
4313 (_("%B: relocation R_386_GOTOFF against protected %s `%s' can not be used when making a shared object"),
4315 h->type == STT_FUNC ? "function" : "data",
4316 h->root.root.string);
4317 bfd_set_error (bfd_error_bad_value);
4322 /* Note that sgot is not involved in this
4323 calculation. We always want the start of .got.plt. If we
4324 defined _GLOBAL_OFFSET_TABLE_ in a different way, as is
4325 permitted by the ABI, we might have to change this
4327 relocation -= htab->elf.sgotplt->output_section->vma
4328 + htab->elf.sgotplt->output_offset;
4332 /* Use global offset table as symbol value. */
4333 relocation = htab->elf.sgotplt->output_section->vma
4334 + htab->elf.sgotplt->output_offset;
4335 unresolved_reloc = FALSE;
4339 /* Relocation is to the entry for this symbol in the
4340 procedure linkage table. */
4342 /* Resolve a PLT32 reloc against a local symbol directly,
4343 without using the procedure linkage table. */
4347 if ((h->plt.offset == (bfd_vma) -1
4348 && eh->plt_got.offset == (bfd_vma) -1)
4349 || htab->elf.splt == NULL)
4351 /* We didn't make a PLT entry for this symbol. This
4352 happens when statically linking PIC code, or when
4353 using -Bsymbolic. */
4357 if (h->plt.offset != (bfd_vma) -1)
4359 resolved_plt = htab->elf.splt;
4360 plt_offset = h->plt.offset;
4364 resolved_plt = htab->plt_got;
4365 plt_offset = eh->plt_got.offset;
4368 relocation = (resolved_plt->output_section->vma
4369 + resolved_plt->output_offset
4371 unresolved_reloc = FALSE;
4375 /* Set to symbol size. */
4376 relocation = st_size;
4381 if ((input_section->flags & SEC_ALLOC) == 0
4385 /* Copy dynamic function pointer relocations. Don't generate
4386 dynamic relocations against resolved undefined weak symbols
4387 in PIE, except for R_386_PC32. */
4388 if ((bfd_link_pic (info)
4390 || ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4391 && (!resolved_to_zero
4392 || r_type == R_386_PC32))
4393 || h->root.type != bfd_link_hash_undefweak))
4394 && ((r_type != R_386_PC32 && r_type != R_386_SIZE32)
4395 || !SYMBOL_CALLS_LOCAL (info, h)))
4396 || (ELIMINATE_COPY_RELOCS
4397 && !bfd_link_pic (info)
4401 || eh->func_pointer_refcount > 0
4402 || (h->root.type == bfd_link_hash_undefweak
4403 && !resolved_to_zero))
4404 && ((h->def_dynamic && !h->def_regular)
4405 /* Undefined weak symbol is bound locally when
4407 || h->root.type == bfd_link_hash_undefweak)))
4409 Elf_Internal_Rela outrel;
4410 bfd_boolean skip, relocate;
4413 /* When generating a shared object, these relocations
4414 are copied into the output file to be resolved at run
4421 _bfd_elf_section_offset (output_bfd, info, input_section,
4423 if (outrel.r_offset == (bfd_vma) -1)
4425 else if (outrel.r_offset == (bfd_vma) -2)
4426 skip = TRUE, relocate = TRUE;
4427 outrel.r_offset += (input_section->output_section->vma
4428 + input_section->output_offset);
4431 memset (&outrel, 0, sizeof outrel);
4434 && (r_type == R_386_PC32
4435 || !(bfd_link_executable (info)
4436 || SYMBOLIC_BIND (info, h))
4437 || !h->def_regular))
4438 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
4441 /* This symbol is local, or marked to become local. */
4443 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
4446 sreloc = elf_section_data (input_section)->sreloc;
4448 if (sreloc == NULL || sreloc->contents == NULL)
4450 r = bfd_reloc_notsupported;
4451 goto check_relocation_error;
4454 elf_append_rel (output_bfd, sreloc, &outrel);
4456 /* If this reloc is against an external symbol, we do
4457 not want to fiddle with the addend. Otherwise, we
4458 need to include the symbol value so that it becomes
4459 an addend for the dynamic reloc. */
4466 if (!bfd_link_executable (info))
4468 Elf_Internal_Rela outrel;
4471 outrel.r_offset = rel->r_offset
4472 + input_section->output_section->vma
4473 + input_section->output_offset;
4474 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
4475 sreloc = elf_section_data (input_section)->sreloc;
4478 elf_append_rel (output_bfd, sreloc, &outrel);
4483 case R_386_TLS_GOTDESC:
4484 case R_386_TLS_DESC_CALL:
4485 case R_386_TLS_IE_32:
4486 case R_386_TLS_GOTIE:
4487 tls_type = GOT_UNKNOWN;
4488 if (h == NULL && local_got_offsets)
4489 tls_type = elf_i386_local_got_tls_type (input_bfd) [r_symndx];
4491 tls_type = elf_i386_hash_entry(h)->tls_type;
4492 if (tls_type == GOT_TLS_IE)
4493 tls_type = GOT_TLS_IE_NEG;
4495 if (! elf_i386_tls_transition (info, input_bfd,
4496 input_section, contents,
4497 symtab_hdr, sym_hashes,
4498 &r_type, tls_type, rel,
4499 relend, h, r_symndx))
4502 if (r_type == R_386_TLS_LE_32)
4504 BFD_ASSERT (! unresolved_reloc);
4505 if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GD)
4510 /* GD->LE transition. */
4511 type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
4514 /* leal foo(,%reg,1), %eax; call ___tls_get_addr
4516 movl %gs:0, %eax; subl $foo@tpoff, %eax
4517 (6 byte form of subl). */
4518 memcpy (contents + rel->r_offset - 3,
4519 "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12);
4520 roff = rel->r_offset + 5;
4524 /* leal foo(%reg), %eax; call ___tls_get_addr; nop
4526 movl %gs:0, %eax; subl $foo@tpoff, %eax
4527 (6 byte form of subl). */
4528 memcpy (contents + rel->r_offset - 2,
4529 "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12);
4530 roff = rel->r_offset + 6;
4532 bfd_put_32 (output_bfd, elf_i386_tpoff (info, relocation),
4534 /* Skip R_386_PC32/R_386_PLT32. */
4539 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GOTDESC)
4541 /* GDesc -> LE transition.
4542 It's originally something like:
4543 leal x@tlsdesc(%ebx), %eax
4547 Registers other than %eax may be set up here. */
4552 roff = rel->r_offset;
4553 val = bfd_get_8 (input_bfd, contents + roff - 1);
4555 /* Now modify the instruction as appropriate. */
4556 /* aoliva FIXME: remove the above and xor the byte
4558 bfd_put_8 (output_bfd, val ^ 0x86,
4559 contents + roff - 1);
4560 bfd_put_32 (output_bfd, -elf_i386_tpoff (info, relocation),
4564 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_DESC_CALL)
4566 /* GDesc -> LE transition.
4574 roff = rel->r_offset;
4575 bfd_put_8 (output_bfd, 0x66, contents + roff);
4576 bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
4579 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_IE)
4583 /* IE->LE transition:
4584 Originally it can be one of:
4592 val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
4595 /* movl foo, %eax. */
4596 bfd_put_8 (output_bfd, 0xb8,
4597 contents + rel->r_offset - 1);
4603 type = bfd_get_8 (input_bfd,
4604 contents + rel->r_offset - 2);
4609 bfd_put_8 (output_bfd, 0xc7,
4610 contents + rel->r_offset - 2);
4611 bfd_put_8 (output_bfd,
4612 0xc0 | ((val >> 3) & 7),
4613 contents + rel->r_offset - 1);
4617 bfd_put_8 (output_bfd, 0x81,
4618 contents + rel->r_offset - 2);
4619 bfd_put_8 (output_bfd,
4620 0xc0 | ((val >> 3) & 7),
4621 contents + rel->r_offset - 1);
4628 bfd_put_32 (output_bfd, -elf_i386_tpoff (info, relocation),
4629 contents + rel->r_offset);
4634 unsigned int val, type;
4636 /* {IE_32,GOTIE}->LE transition:
4637 Originally it can be one of:
4638 subl foo(%reg1), %reg2
4639 movl foo(%reg1), %reg2
4640 addl foo(%reg1), %reg2
4643 movl $foo, %reg2 (6 byte form)
4644 addl $foo, %reg2. */
4645 type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
4646 val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
4650 bfd_put_8 (output_bfd, 0xc7,
4651 contents + rel->r_offset - 2);
4652 bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
4653 contents + rel->r_offset - 1);
4655 else if (type == 0x2b)
4658 bfd_put_8 (output_bfd, 0x81,
4659 contents + rel->r_offset - 2);
4660 bfd_put_8 (output_bfd, 0xe8 | ((val >> 3) & 7),
4661 contents + rel->r_offset - 1);
4663 else if (type == 0x03)
4666 bfd_put_8 (output_bfd, 0x81,
4667 contents + rel->r_offset - 2);
4668 bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
4669 contents + rel->r_offset - 1);
4673 if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GOTIE)
4674 bfd_put_32 (output_bfd, -elf_i386_tpoff (info, relocation),
4675 contents + rel->r_offset);
4677 bfd_put_32 (output_bfd, elf_i386_tpoff (info, relocation),
4678 contents + rel->r_offset);
4683 if (htab->elf.sgot == NULL)
4688 off = h->got.offset;
4689 offplt = elf_i386_hash_entry (h)->tlsdesc_got;
4693 if (local_got_offsets == NULL)
4696 off = local_got_offsets[r_symndx];
4697 offplt = local_tlsdesc_gotents[r_symndx];
4704 Elf_Internal_Rela outrel;
4708 if (htab->elf.srelgot == NULL)
4711 indx = h && h->dynindx != -1 ? h->dynindx : 0;
4713 if (GOT_TLS_GDESC_P (tls_type))
4716 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_DESC);
4717 BFD_ASSERT (htab->sgotplt_jump_table_size + offplt + 8
4718 <= htab->elf.sgotplt->size);
4719 outrel.r_offset = (htab->elf.sgotplt->output_section->vma
4720 + htab->elf.sgotplt->output_offset
4722 + htab->sgotplt_jump_table_size);
4723 sreloc = htab->elf.srelplt;
4724 loc = sreloc->contents;
4725 loc += (htab->next_tls_desc_index++
4726 * sizeof (Elf32_External_Rel));
4727 BFD_ASSERT (loc + sizeof (Elf32_External_Rel)
4728 <= sreloc->contents + sreloc->size);
4729 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
4732 BFD_ASSERT (! unresolved_reloc);
4733 bfd_put_32 (output_bfd,
4734 relocation - elf_i386_dtpoff_base (info),
4735 htab->elf.sgotplt->contents + offplt
4736 + htab->sgotplt_jump_table_size + 4);
4740 bfd_put_32 (output_bfd, 0,
4741 htab->elf.sgotplt->contents + offplt
4742 + htab->sgotplt_jump_table_size + 4);
4746 sreloc = htab->elf.srelgot;
4748 outrel.r_offset = (htab->elf.sgot->output_section->vma
4749 + htab->elf.sgot->output_offset + off);
4751 if (GOT_TLS_GD_P (tls_type))
4752 dr_type = R_386_TLS_DTPMOD32;
4753 else if (GOT_TLS_GDESC_P (tls_type))
4755 else if (tls_type == GOT_TLS_IE_POS)
4756 dr_type = R_386_TLS_TPOFF;
4758 dr_type = R_386_TLS_TPOFF32;
4760 if (dr_type == R_386_TLS_TPOFF && indx == 0)
4761 bfd_put_32 (output_bfd,
4762 relocation - elf_i386_dtpoff_base (info),
4763 htab->elf.sgot->contents + off);
4764 else if (dr_type == R_386_TLS_TPOFF32 && indx == 0)
4765 bfd_put_32 (output_bfd,
4766 elf_i386_dtpoff_base (info) - relocation,
4767 htab->elf.sgot->contents + off);
4768 else if (dr_type != R_386_TLS_DESC)
4769 bfd_put_32 (output_bfd, 0,
4770 htab->elf.sgot->contents + off);
4771 outrel.r_info = ELF32_R_INFO (indx, dr_type);
4773 elf_append_rel (output_bfd, sreloc, &outrel);
4775 if (GOT_TLS_GD_P (tls_type))
4779 BFD_ASSERT (! unresolved_reloc);
4780 bfd_put_32 (output_bfd,
4781 relocation - elf_i386_dtpoff_base (info),
4782 htab->elf.sgot->contents + off + 4);
4786 bfd_put_32 (output_bfd, 0,
4787 htab->elf.sgot->contents + off + 4);
4788 outrel.r_info = ELF32_R_INFO (indx,
4789 R_386_TLS_DTPOFF32);
4790 outrel.r_offset += 4;
4791 elf_append_rel (output_bfd, sreloc, &outrel);
4794 else if (tls_type == GOT_TLS_IE_BOTH)
4796 bfd_put_32 (output_bfd,
4798 ? relocation - elf_i386_dtpoff_base (info)
4800 htab->elf.sgot->contents + off + 4);
4801 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF);
4802 outrel.r_offset += 4;
4803 elf_append_rel (output_bfd, sreloc, &outrel);
4810 local_got_offsets[r_symndx] |= 1;
4813 if (off >= (bfd_vma) -2
4814 && ! GOT_TLS_GDESC_P (tls_type))
4816 if (r_type == R_386_TLS_GOTDESC
4817 || r_type == R_386_TLS_DESC_CALL)
4819 relocation = htab->sgotplt_jump_table_size + offplt;
4820 unresolved_reloc = FALSE;
4822 else if (r_type == ELF32_R_TYPE (rel->r_info))
4824 bfd_vma g_o_t = htab->elf.sgotplt->output_section->vma
4825 + htab->elf.sgotplt->output_offset;
4826 relocation = htab->elf.sgot->output_section->vma
4827 + htab->elf.sgot->output_offset + off - g_o_t;
4828 if ((r_type == R_386_TLS_IE || r_type == R_386_TLS_GOTIE)
4829 && tls_type == GOT_TLS_IE_BOTH)
4831 if (r_type == R_386_TLS_IE)
4832 relocation += g_o_t;
4833 unresolved_reloc = FALSE;
4835 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GD)
4837 unsigned int val, type;
4840 /* GD->IE transition. */
4841 type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
4842 val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
4845 /* leal foo(,%reg,1), %eax; call ___tls_get_addr
4847 movl %gs:0, %eax; subl $foo@gottpoff(%reg), %eax. */
4849 roff = rel->r_offset - 3;
4853 /* leal foo(%reg), %eax; call ___tls_get_addr; nop
4855 movl %gs:0, %eax; subl $foo@gottpoff(%reg), %eax. */
4856 roff = rel->r_offset - 2;
4858 memcpy (contents + roff,
4859 "\x65\xa1\0\0\0\0\x2b\x80\0\0\0", 12);
4860 contents[roff + 7] = 0x80 | (val & 7);
4861 /* If foo is used only with foo@gotntpoff(%reg) and
4862 foo@indntpoff, but not with foo@gottpoff(%reg), change
4863 subl $foo@gottpoff(%reg), %eax
4865 addl $foo@gotntpoff(%reg), %eax. */
4866 if (tls_type == GOT_TLS_IE_POS)
4867 contents[roff + 6] = 0x03;
4868 bfd_put_32 (output_bfd,
4869 htab->elf.sgot->output_section->vma
4870 + htab->elf.sgot->output_offset + off
4871 - htab->elf.sgotplt->output_section->vma
4872 - htab->elf.sgotplt->output_offset,
4873 contents + roff + 8);
4874 /* Skip R_386_PLT32. */
4879 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GOTDESC)
4881 /* GDesc -> IE transition.
4882 It's originally something like:
4883 leal x@tlsdesc(%ebx), %eax
4886 movl x@gotntpoff(%ebx), %eax # before xchg %ax,%ax
4888 movl x@gottpoff(%ebx), %eax # before negl %eax
4890 Registers other than %eax may be set up here. */
4894 /* First, make sure it's a leal adding ebx to a 32-bit
4895 offset into any register, although it's probably
4896 almost always going to be eax. */
4897 roff = rel->r_offset;
4899 /* Now modify the instruction as appropriate. */
4900 /* To turn a leal into a movl in the form we use it, it
4901 suffices to change the first byte from 0x8d to 0x8b.
4902 aoliva FIXME: should we decide to keep the leal, all
4903 we have to do is remove the statement below, and
4904 adjust the relaxation of R_386_TLS_DESC_CALL. */
4905 bfd_put_8 (output_bfd, 0x8b, contents + roff - 2);
4907 if (tls_type == GOT_TLS_IE_BOTH)
4910 bfd_put_32 (output_bfd,
4911 htab->elf.sgot->output_section->vma
4912 + htab->elf.sgot->output_offset + off
4913 - htab->elf.sgotplt->output_section->vma
4914 - htab->elf.sgotplt->output_offset,
4918 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_DESC_CALL)
4920 /* GDesc -> IE transition.
4928 depending on how we transformed the TLS_GOTDESC above.
4933 roff = rel->r_offset;
4935 /* Now modify the instruction as appropriate. */
4936 if (tls_type != GOT_TLS_IE_NEG)
4939 bfd_put_8 (output_bfd, 0x66, contents + roff);
4940 bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
4945 bfd_put_8 (output_bfd, 0xf7, contents + roff);
4946 bfd_put_8 (output_bfd, 0xd8, contents + roff + 1);
4956 if (! elf_i386_tls_transition (info, input_bfd,
4957 input_section, contents,
4958 symtab_hdr, sym_hashes,
4959 &r_type, GOT_UNKNOWN, rel,
4960 relend, h, r_symndx))
4963 if (r_type != R_386_TLS_LDM)
4965 /* LD->LE transition:
4966 leal foo(%reg), %eax; call ___tls_get_addr.
4968 movl %gs:0, %eax; nop; leal 0(%esi,1), %esi. */
4969 BFD_ASSERT (r_type == R_386_TLS_LE_32);
4970 memcpy (contents + rel->r_offset - 2,
4971 "\x65\xa1\0\0\0\0\x90\x8d\x74\x26", 11);
4972 /* Skip R_386_PC32/R_386_PLT32. */
4978 if (htab->elf.sgot == NULL)
4981 off = htab->tls_ldm_got.offset;
4986 Elf_Internal_Rela outrel;
4988 if (htab->elf.srelgot == NULL)
4991 outrel.r_offset = (htab->elf.sgot->output_section->vma
4992 + htab->elf.sgot->output_offset + off);
4994 bfd_put_32 (output_bfd, 0,
4995 htab->elf.sgot->contents + off);
4996 bfd_put_32 (output_bfd, 0,
4997 htab->elf.sgot->contents + off + 4);
4998 outrel.r_info = ELF32_R_INFO (0, R_386_TLS_DTPMOD32);
4999 elf_append_rel (output_bfd, htab->elf.srelgot, &outrel);
5000 htab->tls_ldm_got.offset |= 1;
5002 relocation = htab->elf.sgot->output_section->vma
5003 + htab->elf.sgot->output_offset + off
5004 - htab->elf.sgotplt->output_section->vma
5005 - htab->elf.sgotplt->output_offset;
5006 unresolved_reloc = FALSE;
5009 case R_386_TLS_LDO_32:
5010 if (!bfd_link_executable (info)
5011 || (input_section->flags & SEC_CODE) == 0)
5012 relocation -= elf_i386_dtpoff_base (info);
5014 /* When converting LDO to LE, we must negate. */
5015 relocation = -elf_i386_tpoff (info, relocation);
5018 case R_386_TLS_LE_32:
5020 if (!bfd_link_executable (info))
5022 Elf_Internal_Rela outrel;
5025 outrel.r_offset = rel->r_offset
5026 + input_section->output_section->vma
5027 + input_section->output_offset;
5028 if (h != NULL && h->dynindx != -1)
5032 if (r_type == R_386_TLS_LE_32)
5033 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF32);
5035 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF);
5036 sreloc = elf_section_data (input_section)->sreloc;
5039 elf_append_rel (output_bfd, sreloc, &outrel);
5042 else if (r_type == R_386_TLS_LE_32)
5043 relocation = elf_i386_dtpoff_base (info) - relocation;
5045 relocation -= elf_i386_dtpoff_base (info);
5047 else if (r_type == R_386_TLS_LE_32)
5048 relocation = elf_i386_tpoff (info, relocation);
5050 relocation = -elf_i386_tpoff (info, relocation);
5057 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
5058 because such sections are not SEC_ALLOC and thus ld.so will
5059 not process them. */
5060 if (unresolved_reloc
5061 && !((input_section->flags & SEC_DEBUGGING) != 0
5063 && _bfd_elf_section_offset (output_bfd, info, input_section,
5064 rel->r_offset) != (bfd_vma) -1)
5066 (*_bfd_error_handler)
5067 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
5070 (long) rel->r_offset,
5072 h->root.root.string);
5077 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
5078 contents, rel->r_offset,
5081 check_relocation_error:
5082 if (r != bfd_reloc_ok)
5087 name = h->root.root.string;
5090 name = bfd_elf_string_from_elf_section (input_bfd,
5091 symtab_hdr->sh_link,
5096 name = bfd_section_name (input_bfd, sec);
5099 if (r == bfd_reloc_overflow)
5101 if (! ((*info->callbacks->reloc_overflow)
5102 (info, (h ? &h->root : NULL), name, howto->name,
5103 (bfd_vma) 0, input_bfd, input_section,
5109 (*_bfd_error_handler)
5110 (_("%B(%A+0x%lx): reloc against `%s': error %d"),
5111 input_bfd, input_section,
5112 (long) rel->r_offset, name, (int) r);
5123 Elf_Internal_Shdr *rel_hdr;
5124 size_t deleted = rel - wrel;
5126 rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section);
5127 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
5128 if (rel_hdr->sh_size == 0)
5130 /* It is too late to remove an empty reloc section. Leave
5132 ??? What is wrong with an empty section??? */
5133 rel_hdr->sh_size = rel_hdr->sh_entsize;
5136 rel_hdr = _bfd_elf_single_rel_hdr (input_section);
5137 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
5138 input_section->reloc_count -= deleted;
5144 /* Finish up dynamic symbol handling. We set the contents of various
5145 dynamic sections here. */
5148 elf_i386_finish_dynamic_symbol (bfd *output_bfd,
5149 struct bfd_link_info *info,
5150 struct elf_link_hash_entry *h,
5151 Elf_Internal_Sym *sym)
5153 struct elf_i386_link_hash_table *htab;
5154 unsigned plt_entry_size;
5155 const struct elf_i386_backend_data *abed;
5156 struct elf_i386_link_hash_entry *eh;
5157 bfd_boolean local_undefweak;
5159 htab = elf_i386_hash_table (info);
5163 abed = get_elf_i386_backend_data (output_bfd);
5164 plt_entry_size = GET_PLT_ENTRY_SIZE (output_bfd);
5166 eh = (struct elf_i386_link_hash_entry *) h;
5168 /* We keep PLT/GOT entries without dynamic PLT/GOT relocations for
5169 resolved undefined weak symbols in executable so that their
5170 references have value 0 at run-time. */
5171 local_undefweak = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
5173 if (h->plt.offset != (bfd_vma) -1)
5177 Elf_Internal_Rela rel;
5179 asection *plt, *gotplt, *relplt;
5181 /* When building a static executable, use .iplt, .igot.plt and
5182 .rel.iplt sections for STT_GNU_IFUNC symbols. */
5183 if (htab->elf.splt != NULL)
5185 plt = htab->elf.splt;
5186 gotplt = htab->elf.sgotplt;
5187 relplt = htab->elf.srelplt;
5191 plt = htab->elf.iplt;
5192 gotplt = htab->elf.igotplt;
5193 relplt = htab->elf.irelplt;
5196 /* This symbol has an entry in the procedure linkage table. Set
5199 if ((h->dynindx == -1
5201 && !((h->forced_local || bfd_link_executable (info))
5203 && h->type == STT_GNU_IFUNC))
5209 /* Get the index in the procedure linkage table which
5210 corresponds to this symbol. This is the index of this symbol
5211 in all the symbols for which we are making plt entries. The
5212 first entry in the procedure linkage table is reserved.
5214 Get the offset into the .got table of the entry that
5215 corresponds to this function. Each .got entry is 4 bytes.
5216 The first three are reserved.
5218 For static executables, we don't reserve anything. */
5220 if (plt == htab->elf.splt)
5222 got_offset = h->plt.offset / plt_entry_size - 1;
5223 got_offset = (got_offset + 3) * 4;
5227 got_offset = h->plt.offset / plt_entry_size;
5228 got_offset = got_offset * 4;
5231 /* Fill in the entry in the procedure linkage table. */
5232 if (! bfd_link_pic (info))
5234 memcpy (plt->contents + h->plt.offset, abed->plt->plt_entry,
5235 abed->plt->plt_entry_size);
5236 bfd_put_32 (output_bfd,
5237 (gotplt->output_section->vma
5238 + gotplt->output_offset
5240 plt->contents + h->plt.offset
5241 + abed->plt->plt_got_offset);
5243 if (abed->is_vxworks)
5245 int s, k, reloc_index;
5247 /* Create the R_386_32 relocation referencing the GOT
5248 for this PLT entry. */
5250 /* S: Current slot number (zero-based). */
5251 s = ((h->plt.offset - abed->plt->plt_entry_size)
5252 / abed->plt->plt_entry_size);
5253 /* K: Number of relocations for PLTResolve. */
5254 if (bfd_link_pic (info))
5255 k = PLTRESOLVE_RELOCS_SHLIB;
5257 k = PLTRESOLVE_RELOCS;
5258 /* Skip the PLTresolve relocations, and the relocations for
5259 the other PLT slots. */
5260 reloc_index = k + s * PLT_NON_JUMP_SLOT_RELOCS;
5261 loc = (htab->srelplt2->contents + reloc_index
5262 * sizeof (Elf32_External_Rel));
5264 rel.r_offset = (htab->elf.splt->output_section->vma
5265 + htab->elf.splt->output_offset
5266 + h->plt.offset + 2),
5267 rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
5268 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
5270 /* Create the R_386_32 relocation referencing the beginning of
5271 the PLT for this GOT entry. */
5272 rel.r_offset = (htab->elf.sgotplt->output_section->vma
5273 + htab->elf.sgotplt->output_offset
5275 rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_386_32);
5276 bfd_elf32_swap_reloc_out (output_bfd, &rel,
5277 loc + sizeof (Elf32_External_Rel));
5282 memcpy (plt->contents + h->plt.offset, abed->plt->pic_plt_entry,
5283 abed->plt->plt_entry_size);
5284 bfd_put_32 (output_bfd, got_offset,
5285 plt->contents + h->plt.offset
5286 + abed->plt->plt_got_offset);
5289 /* Fill in the entry in the global offset table. Leave the entry
5290 as zero for undefined weak symbol in PIE. No PLT relocation
5291 against undefined weak symbol in PIE. */
5292 if (!local_undefweak)
5294 bfd_put_32 (output_bfd,
5295 (plt->output_section->vma
5296 + plt->output_offset
5298 + abed->plt->plt_lazy_offset),
5299 gotplt->contents + got_offset);
5301 /* Fill in the entry in the .rel.plt section. */
5302 rel.r_offset = (gotplt->output_section->vma
5303 + gotplt->output_offset
5305 if (h->dynindx == -1
5306 || ((bfd_link_executable (info)
5307 || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
5309 && h->type == STT_GNU_IFUNC))
5311 /* If an STT_GNU_IFUNC symbol is locally defined, generate
5312 R_386_IRELATIVE instead of R_386_JUMP_SLOT. Store addend
5313 in the .got.plt section. */
5314 bfd_put_32 (output_bfd,
5315 (h->root.u.def.value
5316 + h->root.u.def.section->output_section->vma
5317 + h->root.u.def.section->output_offset),
5318 gotplt->contents + got_offset);
5319 rel.r_info = ELF32_R_INFO (0, R_386_IRELATIVE);
5320 /* R_386_IRELATIVE comes last. */
5321 plt_index = htab->next_irelative_index--;
5325 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_JUMP_SLOT);
5326 plt_index = htab->next_jump_slot_index++;
5329 loc = relplt->contents + plt_index * sizeof (Elf32_External_Rel);
5330 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
5332 /* Don't fill PLT entry for static executables. */
5333 if (plt == htab->elf.splt)
5335 bfd_put_32 (output_bfd,
5336 plt_index * sizeof (Elf32_External_Rel),
5337 plt->contents + h->plt.offset
5338 + abed->plt->plt_reloc_offset);
5339 bfd_put_32 (output_bfd, - (h->plt.offset
5340 + abed->plt->plt_plt_offset + 4),
5341 plt->contents + h->plt.offset
5342 + abed->plt->plt_plt_offset);
5346 else if (eh->plt_got.offset != (bfd_vma) -1)
5348 bfd_vma got_offset, plt_offset;
5349 asection *plt, *got, *gotplt;
5350 const bfd_byte *got_plt_entry;
5352 /* Offset of displacement of the indirect jump. */
5353 bfd_vma plt_got_offset = 2;
5355 /* Set the entry in the GOT procedure linkage table. */
5356 plt = htab->plt_got;
5357 got = htab->elf.sgot;
5358 gotplt = htab->elf.sgotplt;
5359 got_offset = h->got.offset;
5361 if (got_offset == (bfd_vma) -1
5367 /* Fill in the entry in the GOT procedure linkage table. */
5368 if (! bfd_link_pic (info))
5370 got_plt_entry = elf_i386_got_plt_entry;
5371 got_offset += got->output_section->vma + got->output_offset;
5375 got_plt_entry = elf_i386_pic_got_plt_entry;
5376 got_offset += (got->output_section->vma
5377 + got->output_offset
5378 - gotplt->output_section->vma
5379 - gotplt->output_offset);
5382 plt_offset = eh->plt_got.offset;
5383 memcpy (plt->contents + plt_offset, got_plt_entry,
5384 sizeof (elf_i386_got_plt_entry));
5385 bfd_put_32 (output_bfd, got_offset,
5386 plt->contents + plt_offset + plt_got_offset);
5389 if (!local_undefweak
5391 && (h->plt.offset != (bfd_vma) -1
5392 || eh->plt_got.offset != (bfd_vma) -1))
5394 /* Mark the symbol as undefined, rather than as defined in
5395 the .plt section. Leave the value if there were any
5396 relocations where pointer equality matters (this is a clue
5397 for the dynamic linker, to make function pointer
5398 comparisons work between an application and shared
5399 library), otherwise set it to zero. If a function is only
5400 called from a binary, there is no need to slow down
5401 shared libraries because of that. */
5402 sym->st_shndx = SHN_UNDEF;
5403 if (!h->pointer_equality_needed)
5407 /* Don't generate dynamic GOT relocation against undefined weak
5408 symbol in executable. */
5409 if (h->got.offset != (bfd_vma) -1
5410 && ! GOT_TLS_GD_ANY_P (elf_i386_hash_entry(h)->tls_type)
5411 && (elf_i386_hash_entry(h)->tls_type & GOT_TLS_IE) == 0
5412 && !local_undefweak)
5414 Elf_Internal_Rela rel;
5416 /* This symbol has an entry in the global offset table. Set it
5419 if (htab->elf.sgot == NULL || htab->elf.srelgot == NULL)
5422 rel.r_offset = (htab->elf.sgot->output_section->vma
5423 + htab->elf.sgot->output_offset
5424 + (h->got.offset & ~(bfd_vma) 1));
5426 /* If this is a static link, or it is a -Bsymbolic link and the
5427 symbol is defined locally or was forced to be local because
5428 of a version file, we just want to emit a RELATIVE reloc.
5429 The entry in the global offset table will already have been
5430 initialized in the relocate_section function. */
5432 && h->type == STT_GNU_IFUNC)
5434 if (bfd_link_pic (info))
5436 /* Generate R_386_GLOB_DAT. */
5443 if (!h->pointer_equality_needed)
5446 /* For non-shared object, we can't use .got.plt, which
5447 contains the real function addres if we need pointer
5448 equality. We load the GOT entry with the PLT entry. */
5449 plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt;
5450 bfd_put_32 (output_bfd,
5451 (plt->output_section->vma
5452 + plt->output_offset + h->plt.offset),
5453 htab->elf.sgot->contents + h->got.offset);
5457 else if (bfd_link_pic (info)
5458 && SYMBOL_REFERENCES_LOCAL (info, h))
5460 BFD_ASSERT((h->got.offset & 1) != 0);
5461 rel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
5465 BFD_ASSERT((h->got.offset & 1) == 0);
5467 bfd_put_32 (output_bfd, (bfd_vma) 0,
5468 htab->elf.sgot->contents + h->got.offset);
5469 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_GLOB_DAT);
5472 elf_append_rel (output_bfd, htab->elf.srelgot, &rel);
5477 Elf_Internal_Rela rel;
5479 /* This symbol needs a copy reloc. Set it up. */
5481 if (h->dynindx == -1
5482 || (h->root.type != bfd_link_hash_defined
5483 && h->root.type != bfd_link_hash_defweak)
5484 || htab->srelbss == NULL)
5487 rel.r_offset = (h->root.u.def.value
5488 + h->root.u.def.section->output_section->vma
5489 + h->root.u.def.section->output_offset);
5490 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_COPY);
5491 elf_append_rel (output_bfd, htab->srelbss, &rel);
5497 /* Finish up local dynamic symbol handling. We set the contents of
5498 various dynamic sections here. */
5501 elf_i386_finish_local_dynamic_symbol (void **slot, void *inf)
5503 struct elf_link_hash_entry *h
5504 = (struct elf_link_hash_entry *) *slot;
5505 struct bfd_link_info *info
5506 = (struct bfd_link_info *) inf;
5508 return elf_i386_finish_dynamic_symbol (info->output_bfd, info,
5512 /* Finish up undefined weak symbol handling in PIE. Fill its PLT entry
5513 here since undefined weak symbol may not be dynamic and may not be
5514 called for elf_i386_finish_dynamic_symbol. */
5517 elf_i386_pie_finish_undefweak_symbol (struct bfd_hash_entry *bh,
5520 struct elf_link_hash_entry *h = (struct elf_link_hash_entry *) bh;
5521 struct bfd_link_info *info = (struct bfd_link_info *) inf;
5523 if (h->root.type != bfd_link_hash_undefweak
5524 || h->dynindx != -1)
5527 return elf_i386_finish_dynamic_symbol (info->output_bfd,
5531 /* Used to decide how to sort relocs in an optimal manner for the
5532 dynamic linker, before writing them out. */
5534 static enum elf_reloc_type_class
5535 elf_i386_reloc_type_class (const struct bfd_link_info *info,
5536 const asection *rel_sec ATTRIBUTE_UNUSED,
5537 const Elf_Internal_Rela *rela)
5539 bfd *abfd = info->output_bfd;
5540 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
5541 struct elf_link_hash_table *htab = elf_hash_table (info);
5543 if (htab->dynsym != NULL
5544 && htab->dynsym->contents != NULL)
5546 /* Check relocation against STT_GNU_IFUNC symbol if there are
5548 unsigned long r_symndx = ELF32_R_SYM (rela->r_info);
5549 Elf_Internal_Sym sym;
5550 if (!bed->s->swap_symbol_in (abfd,
5551 (htab->dynsym->contents
5552 + r_symndx * sizeof (Elf32_External_Sym)),
5556 if (ELF32_ST_TYPE (sym.st_info) == STT_GNU_IFUNC)
5557 return reloc_class_ifunc;
5560 switch (ELF32_R_TYPE (rela->r_info))
5562 case R_386_RELATIVE:
5563 return reloc_class_relative;
5564 case R_386_JUMP_SLOT:
5565 return reloc_class_plt;
5567 return reloc_class_copy;
5569 return reloc_class_normal;
5573 /* Finish up the dynamic sections. */
5576 elf_i386_finish_dynamic_sections (bfd *output_bfd,
5577 struct bfd_link_info *info)
5579 struct elf_i386_link_hash_table *htab;
5582 const struct elf_i386_backend_data *abed;
5584 htab = elf_i386_hash_table (info);
5588 dynobj = htab->elf.dynobj;
5589 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
5590 abed = get_elf_i386_backend_data (output_bfd);
5592 if (htab->elf.dynamic_sections_created)
5594 Elf32_External_Dyn *dyncon, *dynconend;
5596 if (sdyn == NULL || htab->elf.sgot == NULL)
5599 dyncon = (Elf32_External_Dyn *) sdyn->contents;
5600 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
5601 for (; dyncon < dynconend; dyncon++)
5603 Elf_Internal_Dyn dyn;
5606 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
5611 if (abed->is_vxworks
5612 && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
5617 s = htab->elf.sgotplt;
5618 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
5622 s = htab->elf.srelplt;
5623 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
5627 s = htab->elf.srelplt;
5628 dyn.d_un.d_val = s->size;
5632 /* My reading of the SVR4 ABI indicates that the
5633 procedure linkage table relocs (DT_JMPREL) should be
5634 included in the overall relocs (DT_REL). This is
5635 what Solaris does. However, UnixWare can not handle
5636 that case. Therefore, we override the DT_RELSZ entry
5637 here to make it not include the JMPREL relocs. */
5638 s = htab->elf.srelplt;
5641 dyn.d_un.d_val -= s->size;
5645 /* We may not be using the standard ELF linker script.
5646 If .rel.plt is the first .rel section, we adjust
5647 DT_REL to not include it. */
5648 s = htab->elf.srelplt;
5651 if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
5653 dyn.d_un.d_ptr += s->size;
5657 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5660 /* Fill in the first entry in the procedure linkage table. */
5661 if (htab->elf.splt && htab->elf.splt->size > 0)
5663 if (bfd_link_pic (info))
5665 memcpy (htab->elf.splt->contents, abed->plt->pic_plt0_entry,
5666 abed->plt->plt0_entry_size);
5667 memset (htab->elf.splt->contents + abed->plt->plt0_entry_size,
5668 abed->plt0_pad_byte,
5669 abed->plt->plt_entry_size - abed->plt->plt0_entry_size);
5673 memcpy (htab->elf.splt->contents, abed->plt->plt0_entry,
5674 abed->plt->plt0_entry_size);
5675 memset (htab->elf.splt->contents + abed->plt->plt0_entry_size,
5676 abed->plt0_pad_byte,
5677 abed->plt->plt_entry_size - abed->plt->plt0_entry_size);
5678 bfd_put_32 (output_bfd,
5679 (htab->elf.sgotplt->output_section->vma
5680 + htab->elf.sgotplt->output_offset
5682 htab->elf.splt->contents
5683 + abed->plt->plt0_got1_offset);
5684 bfd_put_32 (output_bfd,
5685 (htab->elf.sgotplt->output_section->vma
5686 + htab->elf.sgotplt->output_offset
5688 htab->elf.splt->contents
5689 + abed->plt->plt0_got2_offset);
5691 if (abed->is_vxworks)
5693 Elf_Internal_Rela rel;
5695 /* Generate a relocation for _GLOBAL_OFFSET_TABLE_ + 4.
5696 On IA32 we use REL relocations so the addend goes in
5697 the PLT directly. */
5698 rel.r_offset = (htab->elf.splt->output_section->vma
5699 + htab->elf.splt->output_offset
5700 + abed->plt->plt0_got1_offset);
5701 rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
5702 bfd_elf32_swap_reloc_out (output_bfd, &rel,
5703 htab->srelplt2->contents);
5704 /* Generate a relocation for _GLOBAL_OFFSET_TABLE_ + 8. */
5705 rel.r_offset = (htab->elf.splt->output_section->vma
5706 + htab->elf.splt->output_offset
5707 + abed->plt->plt0_got2_offset);
5708 rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
5709 bfd_elf32_swap_reloc_out (output_bfd, &rel,
5710 htab->srelplt2->contents +
5711 sizeof (Elf32_External_Rel));
5715 /* UnixWare sets the entsize of .plt to 4, although that doesn't
5716 really seem like the right value. */
5717 elf_section_data (htab->elf.splt->output_section)
5718 ->this_hdr.sh_entsize = 4;
5720 /* Correct the .rel.plt.unloaded relocations. */
5721 if (abed->is_vxworks && !bfd_link_pic (info))
5723 int num_plts = (htab->elf.splt->size
5724 / abed->plt->plt_entry_size) - 1;
5727 p = htab->srelplt2->contents;
5728 if (bfd_link_pic (info))
5729 p += PLTRESOLVE_RELOCS_SHLIB * sizeof (Elf32_External_Rel);
5731 p += PLTRESOLVE_RELOCS * sizeof (Elf32_External_Rel);
5733 for (; num_plts; num_plts--)
5735 Elf_Internal_Rela rel;
5736 bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
5737 rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
5738 bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
5739 p += sizeof (Elf32_External_Rel);
5741 bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
5742 rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_386_32);
5743 bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
5744 p += sizeof (Elf32_External_Rel);
5750 if (htab->elf.sgotplt)
5752 if (bfd_is_abs_section (htab->elf.sgotplt->output_section))
5754 (*_bfd_error_handler)
5755 (_("discarded output section: `%A'"), htab->elf.sgotplt);
5759 /* Fill in the first three entries in the global offset table. */
5760 if (htab->elf.sgotplt->size > 0)
5762 bfd_put_32 (output_bfd,
5764 : sdyn->output_section->vma + sdyn->output_offset),
5765 htab->elf.sgotplt->contents);
5766 bfd_put_32 (output_bfd, 0, htab->elf.sgotplt->contents + 4);
5767 bfd_put_32 (output_bfd, 0, htab->elf.sgotplt->contents + 8);
5770 elf_section_data (htab->elf.sgotplt->output_section)->this_hdr.sh_entsize = 4;
5773 /* Adjust .eh_frame for .plt section. */
5774 if (htab->plt_eh_frame != NULL
5775 && htab->plt_eh_frame->contents != NULL)
5777 if (htab->elf.splt != NULL
5778 && htab->elf.splt->size != 0
5779 && (htab->elf.splt->flags & SEC_EXCLUDE) == 0
5780 && htab->elf.splt->output_section != NULL
5781 && htab->plt_eh_frame->output_section != NULL)
5783 bfd_vma plt_start = htab->elf.splt->output_section->vma;
5784 bfd_vma eh_frame_start = htab->plt_eh_frame->output_section->vma
5785 + htab->plt_eh_frame->output_offset
5786 + PLT_FDE_START_OFFSET;
5787 bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
5788 htab->plt_eh_frame->contents
5789 + PLT_FDE_START_OFFSET);
5791 if (htab->plt_eh_frame->sec_info_type
5792 == SEC_INFO_TYPE_EH_FRAME)
5794 if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
5796 htab->plt_eh_frame->contents))
5801 if (htab->elf.sgot && htab->elf.sgot->size > 0)
5802 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize = 4;
5804 /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols. */
5805 htab_traverse (htab->loc_hash_table,
5806 elf_i386_finish_local_dynamic_symbol,
5809 /* Fill PLT entries for undefined weak symbols in PIE. */
5810 if (bfd_link_pie (info))
5811 bfd_hash_traverse (&info->hash->table,
5812 elf_i386_pie_finish_undefweak_symbol,
5818 /* Return an array of PLT entry symbol values. */
5821 elf_i386_get_plt_sym_val (bfd *abfd, asymbol **dynsyms, asection *plt,
5824 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
5827 bfd_vma *plt_sym_val;
5829 bfd_byte *plt_contents;
5830 const struct elf_i386_backend_data *bed
5831 = get_elf_i386_backend_data (abfd);
5832 Elf_Internal_Shdr *hdr;
5834 /* Get the .plt section contents. */
5835 plt_contents = (bfd_byte *) bfd_malloc (plt->size);
5836 if (plt_contents == NULL)
5838 if (!bfd_get_section_contents (abfd, (asection *) plt,
5839 plt_contents, 0, plt->size))
5842 free (plt_contents);
5846 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
5847 if (! (*slurp_relocs) (abfd, relplt, dynsyms, TRUE))
5850 hdr = &elf_section_data (relplt)->this_hdr;
5851 count = relplt->size / hdr->sh_entsize;
5853 plt_sym_val = (bfd_vma *) bfd_malloc (sizeof (bfd_vma) * count);
5854 if (plt_sym_val == NULL)
5857 for (i = 0; i < count; i++)
5858 plt_sym_val[i] = -1;
5860 plt_offset = bed->plt->plt_entry_size;
5861 p = relplt->relocation;
5862 for (i = 0; i < count; i++, p++)
5866 /* Skip unknown relocation. PR 17512: file: bc9d6cf5. */
5867 if (p->howto == NULL)
5870 if (p->howto->type != R_386_JUMP_SLOT
5871 && p->howto->type != R_386_IRELATIVE)
5874 reloc_index = H_GET_32 (abfd, (plt_contents + plt_offset
5875 + bed->plt->plt_reloc_offset));
5876 reloc_index /= sizeof (Elf32_External_Rel);
5877 if (reloc_index < count)
5878 plt_sym_val[reloc_index] = plt->vma + plt_offset;
5880 plt_offset += bed->plt->plt_entry_size;
5882 /* PR binutils/18437: Skip extra relocations in the .rel.plt
5884 if (plt_offset >= plt->size)
5888 free (plt_contents);
5893 /* Similar to _bfd_elf_get_synthetic_symtab. */
5896 elf_i386_get_synthetic_symtab (bfd *abfd,
5903 asection *plt = bfd_get_section_by_name (abfd, ".plt");
5904 return _bfd_elf_ifunc_get_synthetic_symtab (abfd, symcount, syms,
5905 dynsymcount, dynsyms, ret,
5907 elf_i386_get_plt_sym_val);
5910 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
5913 elf_i386_hash_symbol (struct elf_link_hash_entry *h)
5915 if (h->plt.offset != (bfd_vma) -1
5917 && !h->pointer_equality_needed)
5920 return _bfd_elf_hash_symbol (h);
5923 /* Hook called by the linker routine which adds symbols from an object
5927 elf_i386_add_symbol_hook (bfd * abfd,
5928 struct bfd_link_info * info,
5929 Elf_Internal_Sym * sym,
5930 const char ** namep ATTRIBUTE_UNUSED,
5931 flagword * flagsp ATTRIBUTE_UNUSED,
5932 asection ** secp ATTRIBUTE_UNUSED,
5933 bfd_vma * valp ATTRIBUTE_UNUSED)
5935 if (ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE
5936 && (abfd->flags & DYNAMIC) == 0
5937 && bfd_get_flavour (info->output_bfd) == bfd_target_elf_flavour)
5938 elf_tdata (info->output_bfd)->has_gnu_symbols
5939 |= elf_gnu_symbol_unique;
5944 #define TARGET_LITTLE_SYM i386_elf32_vec
5945 #define TARGET_LITTLE_NAME "elf32-i386"
5946 #define ELF_ARCH bfd_arch_i386
5947 #define ELF_TARGET_ID I386_ELF_DATA
5948 #define ELF_MACHINE_CODE EM_386
5949 #define ELF_MAXPAGESIZE 0x1000
5951 #define elf_backend_can_gc_sections 1
5952 #define elf_backend_can_refcount 1
5953 #define elf_backend_want_got_plt 1
5954 #define elf_backend_plt_readonly 1
5955 #define elf_backend_want_plt_sym 0
5956 #define elf_backend_got_header_size 12
5957 #define elf_backend_plt_alignment 4
5958 #define elf_backend_extern_protected_data 1
5960 /* Support RELA for objdump of prelink objects. */
5961 #define elf_info_to_howto elf_i386_info_to_howto_rel
5962 #define elf_info_to_howto_rel elf_i386_info_to_howto_rel
5964 #define bfd_elf32_mkobject elf_i386_mkobject
5966 #define bfd_elf32_bfd_is_local_label_name elf_i386_is_local_label_name
5967 #define bfd_elf32_bfd_link_hash_table_create elf_i386_link_hash_table_create
5968 #define bfd_elf32_bfd_reloc_type_lookup elf_i386_reloc_type_lookup
5969 #define bfd_elf32_bfd_reloc_name_lookup elf_i386_reloc_name_lookup
5970 #define bfd_elf32_get_synthetic_symtab elf_i386_get_synthetic_symtab
5972 #define elf_backend_adjust_dynamic_symbol elf_i386_adjust_dynamic_symbol
5973 #define elf_backend_relocs_compatible _bfd_elf_relocs_compatible
5974 #define elf_backend_check_relocs elf_i386_check_relocs
5975 #define elf_backend_copy_indirect_symbol elf_i386_copy_indirect_symbol
5976 #define elf_backend_create_dynamic_sections elf_i386_create_dynamic_sections
5977 #define elf_backend_fake_sections elf_i386_fake_sections
5978 #define elf_backend_finish_dynamic_sections elf_i386_finish_dynamic_sections
5979 #define elf_backend_finish_dynamic_symbol elf_i386_finish_dynamic_symbol
5980 #define elf_backend_gc_mark_hook elf_i386_gc_mark_hook
5981 #define elf_backend_gc_sweep_hook elf_i386_gc_sweep_hook
5982 #define elf_backend_grok_prstatus elf_i386_grok_prstatus
5983 #define elf_backend_grok_psinfo elf_i386_grok_psinfo
5984 #define elf_backend_reloc_type_class elf_i386_reloc_type_class
5985 #define elf_backend_relocate_section elf_i386_relocate_section
5986 #define elf_backend_size_dynamic_sections elf_i386_size_dynamic_sections
5987 #define elf_backend_always_size_sections elf_i386_always_size_sections
5988 #define elf_backend_omit_section_dynsym \
5989 ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
5990 #define elf_backend_hash_symbol elf_i386_hash_symbol
5991 #define elf_backend_add_symbol_hook elf_i386_add_symbol_hook
5992 #define elf_backend_fixup_symbol elf_i386_fixup_symbol
5994 #include "elf32-target.h"
5996 /* FreeBSD support. */
5998 #undef TARGET_LITTLE_SYM
5999 #define TARGET_LITTLE_SYM i386_elf32_fbsd_vec
6000 #undef TARGET_LITTLE_NAME
6001 #define TARGET_LITTLE_NAME "elf32-i386-freebsd"
6003 #define ELF_OSABI ELFOSABI_FREEBSD
6005 /* The kernel recognizes executables as valid only if they carry a
6006 "FreeBSD" label in the ELF header. So we put this label on all
6007 executables and (for simplicity) also all other object files. */
6010 elf_i386_fbsd_post_process_headers (bfd *abfd, struct bfd_link_info *info)
6012 _bfd_elf_post_process_headers (abfd, info);
6014 #ifdef OLD_FREEBSD_ABI_LABEL
6016 /* The ABI label supported by FreeBSD <= 4.0 is quite nonstandard. */
6017 Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
6018 memcpy (&i_ehdrp->e_ident[EI_ABIVERSION], "FreeBSD", 8);
6023 #undef elf_backend_post_process_headers
6024 #define elf_backend_post_process_headers elf_i386_fbsd_post_process_headers
6026 #define elf32_bed elf32_i386_fbsd_bed
6028 #undef elf_backend_add_symbol_hook
6030 #include "elf32-target.h"
6034 #undef TARGET_LITTLE_SYM
6035 #define TARGET_LITTLE_SYM i386_elf32_sol2_vec
6036 #undef TARGET_LITTLE_NAME
6037 #define TARGET_LITTLE_NAME "elf32-i386-sol2"
6039 #undef elf_backend_post_process_headers
6041 /* Restore default: we cannot use ELFOSABI_SOLARIS, otherwise ELFOSABI_NONE
6042 objects won't be recognized. */
6046 #define elf32_bed elf32_i386_sol2_bed
6048 /* The 32-bit static TLS arena size is rounded to the nearest 8-byte
6050 #undef elf_backend_static_tls_alignment
6051 #define elf_backend_static_tls_alignment 8
6053 /* The Solaris 2 ABI requires a plt symbol on all platforms.
6055 Cf. Linker and Libraries Guide, Ch. 2, Link-Editor, Generating the Output
6057 #undef elf_backend_want_plt_sym
6058 #define elf_backend_want_plt_sym 1
6060 #include "elf32-target.h"
6062 /* Intel MCU support. */
6065 elf32_iamcu_elf_object_p (bfd *abfd)
6067 /* Set the right machine number for an IAMCU elf32 file. */
6068 bfd_default_set_arch_mach (abfd, bfd_arch_iamcu, bfd_mach_i386_iamcu);
6072 #undef TARGET_LITTLE_SYM
6073 #define TARGET_LITTLE_SYM iamcu_elf32_vec
6074 #undef TARGET_LITTLE_NAME
6075 #define TARGET_LITTLE_NAME "elf32-iamcu"
6077 #define ELF_ARCH bfd_arch_iamcu
6079 #undef ELF_MACHINE_CODE
6080 #define ELF_MACHINE_CODE EM_IAMCU
6085 #define elf32_bed elf32_iamcu_bed
6087 #undef elf_backend_object_p
6088 #define elf_backend_object_p elf32_iamcu_elf_object_p
6090 #undef elf_backend_static_tls_alignment
6092 #undef elf_backend_want_plt_sym
6093 #define elf_backend_want_plt_sym 0
6095 #include "elf32-target.h"
6097 /* Restore defaults. */
6099 #define ELF_ARCH bfd_arch_i386
6100 #undef ELF_MACHINE_CODE
6101 #define ELF_MACHINE_CODE EM_386
6103 /* Native Client support. */
6105 #undef TARGET_LITTLE_SYM
6106 #define TARGET_LITTLE_SYM i386_elf32_nacl_vec
6107 #undef TARGET_LITTLE_NAME
6108 #define TARGET_LITTLE_NAME "elf32-i386-nacl"
6110 #define elf32_bed elf32_i386_nacl_bed
6112 #undef ELF_MAXPAGESIZE
6113 #define ELF_MAXPAGESIZE 0x10000
6115 /* Restore defaults. */
6117 #undef elf_backend_want_plt_sym
6118 #define elf_backend_want_plt_sym 0
6119 #undef elf_backend_post_process_headers
6120 #undef elf_backend_static_tls_alignment
6122 /* NaCl uses substantially different PLT entries for the same effects. */
6124 #undef elf_backend_plt_alignment
6125 #define elf_backend_plt_alignment 5
6126 #define NACL_PLT_ENTRY_SIZE 64
6127 #define NACLMASK 0xe0 /* 32-byte alignment mask. */
6129 static const bfd_byte elf_i386_nacl_plt0_entry[] =
6131 0xff, 0x35, /* pushl contents of address */
6132 0, 0, 0, 0, /* replaced with address of .got + 4. */
6133 0x8b, 0x0d, /* movl contents of address, %ecx */
6134 0, 0, 0, 0, /* replaced with address of .got + 8. */
6135 0x83, 0xe1, NACLMASK, /* andl $NACLMASK, %ecx */
6136 0xff, 0xe1 /* jmp *%ecx */
6139 static const bfd_byte elf_i386_nacl_plt_entry[NACL_PLT_ENTRY_SIZE] =
6141 0x8b, 0x0d, /* movl contents of address, %ecx */
6142 0, 0, 0, 0, /* replaced with GOT slot address. */
6143 0x83, 0xe1, NACLMASK, /* andl $NACLMASK, %ecx */
6144 0xff, 0xe1, /* jmp *%ecx */
6146 /* Pad to the next 32-byte boundary with nop instructions. */
6148 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6149 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6151 /* Lazy GOT entries point here (32-byte aligned). */
6152 0x68, /* pushl immediate */
6153 0, 0, 0, 0, /* replaced with reloc offset. */
6154 0xe9, /* jmp relative */
6155 0, 0, 0, 0, /* replaced with offset to .plt. */
6157 /* Pad to the next 32-byte boundary with nop instructions. */
6158 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6159 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6163 static const bfd_byte
6164 elf_i386_nacl_pic_plt0_entry[sizeof (elf_i386_nacl_plt0_entry)] =
6166 0xff, 0x73, 0x04, /* pushl 4(%ebx) */
6167 0x8b, 0x4b, 0x08, /* mov 0x8(%ebx), %ecx */
6168 0x83, 0xe1, 0xe0, /* and $NACLMASK, %ecx */
6169 0xff, 0xe1, /* jmp *%ecx */
6171 /* This is expected to be the same size as elf_i386_nacl_plt0_entry,
6172 so pad to that size with nop instructions. */
6173 0x90, 0x90, 0x90, 0x90, 0x90, 0x90
6176 static const bfd_byte elf_i386_nacl_pic_plt_entry[NACL_PLT_ENTRY_SIZE] =
6178 0x8b, 0x8b, /* movl offset(%ebx), %ecx */
6179 0, 0, 0, 0, /* replaced with offset of this symbol in .got. */
6180 0x83, 0xe1, 0xe0, /* andl $NACLMASK, %ecx */
6181 0xff, 0xe1, /* jmp *%ecx */
6183 /* Pad to the next 32-byte boundary with nop instructions. */
6185 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6186 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6188 /* Lazy GOT entries point here (32-byte aligned). */
6189 0x68, /* pushl immediate */
6190 0, 0, 0, 0, /* replaced with offset into relocation table. */
6191 0xe9, /* jmp relative */
6192 0, 0, 0, 0, /* replaced with offset to start of .plt. */
6194 /* Pad to the next 32-byte boundary with nop instructions. */
6195 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6196 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6200 static const bfd_byte elf_i386_nacl_eh_frame_plt[] =
6202 #if (PLT_CIE_LENGTH != 20 \
6203 || PLT_FDE_LENGTH != 36 \
6204 || PLT_FDE_START_OFFSET != 4 + PLT_CIE_LENGTH + 8 \
6205 || PLT_FDE_LEN_OFFSET != 4 + PLT_CIE_LENGTH + 12)
6206 # error "Need elf_i386_backend_data parameters for eh_frame_plt offsets!"
6208 PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
6209 0, 0, 0, 0, /* CIE ID */
6210 1, /* CIE version */
6211 'z', 'R', 0, /* Augmentation string */
6212 1, /* Code alignment factor */
6213 0x7c, /* Data alignment factor: -4 */
6214 8, /* Return address column */
6215 1, /* Augmentation size */
6216 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
6217 DW_CFA_def_cfa, 4, 4, /* DW_CFA_def_cfa: r4 (esp) ofs 4 */
6218 DW_CFA_offset + 8, 1, /* DW_CFA_offset: r8 (eip) at cfa-4 */
6219 DW_CFA_nop, DW_CFA_nop,
6221 PLT_FDE_LENGTH, 0, 0, 0, /* FDE length */
6222 PLT_CIE_LENGTH + 8, 0, 0, 0, /* CIE pointer */
6223 0, 0, 0, 0, /* R_386_PC32 .plt goes here */
6224 0, 0, 0, 0, /* .plt size goes here */
6225 0, /* Augmentation size */
6226 DW_CFA_def_cfa_offset, 8, /* DW_CFA_def_cfa_offset: 8 */
6227 DW_CFA_advance_loc + 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */
6228 DW_CFA_def_cfa_offset, 12, /* DW_CFA_def_cfa_offset: 12 */
6229 DW_CFA_advance_loc + 58, /* DW_CFA_advance_loc: 58 to __PLT__+64 */
6230 DW_CFA_def_cfa_expression, /* DW_CFA_def_cfa_expression */
6231 13, /* Block length */
6232 DW_OP_breg4, 4, /* DW_OP_breg4 (esp): 4 */
6233 DW_OP_breg8, 0, /* DW_OP_breg8 (eip): 0 */
6234 DW_OP_const1u, 63, DW_OP_and, DW_OP_const1u, 37, DW_OP_ge,
6235 DW_OP_lit2, DW_OP_shl, DW_OP_plus,
6236 DW_CFA_nop, DW_CFA_nop
6239 static const struct elf_i386_plt_layout elf_i386_nacl_plt =
6241 elf_i386_nacl_plt0_entry, /* plt0_entry */
6242 sizeof (elf_i386_nacl_plt0_entry), /* plt0_entry_size */
6243 2, /* plt0_got1_offset */
6244 8, /* plt0_got2_offset */
6245 elf_i386_nacl_plt_entry, /* plt_entry */
6246 NACL_PLT_ENTRY_SIZE, /* plt_entry_size */
6247 2, /* plt_got_offset */
6248 33, /* plt_reloc_offset */
6249 38, /* plt_plt_offset */
6250 32, /* plt_lazy_offset */
6251 elf_i386_nacl_pic_plt0_entry, /* pic_plt0_entry */
6252 elf_i386_nacl_pic_plt_entry, /* pic_plt_entry */
6253 elf_i386_nacl_eh_frame_plt, /* eh_frame_plt */
6254 sizeof (elf_i386_nacl_eh_frame_plt),/* eh_frame_plt_size */
6257 static const struct elf_i386_backend_data elf_i386_nacl_arch_bed =
6259 &elf_i386_nacl_plt, /* plt */
6260 0x90, /* plt0_pad_byte: nop insn */
6265 elf32_i386_nacl_elf_object_p (bfd *abfd)
6267 /* Set the right machine number for a NaCl i386 ELF32 file. */
6268 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_i386_i386_nacl);
6272 #undef elf_backend_arch_data
6273 #define elf_backend_arch_data &elf_i386_nacl_arch_bed
6275 #undef elf_backend_object_p
6276 #define elf_backend_object_p elf32_i386_nacl_elf_object_p
6277 #undef elf_backend_modify_segment_map
6278 #define elf_backend_modify_segment_map nacl_modify_segment_map
6279 #undef elf_backend_modify_program_headers
6280 #define elf_backend_modify_program_headers nacl_modify_program_headers
6281 #undef elf_backend_final_write_processing
6282 #define elf_backend_final_write_processing nacl_final_write_processing
6284 #include "elf32-target.h"
6286 /* Restore defaults. */
6287 #undef elf_backend_object_p
6288 #undef elf_backend_modify_segment_map
6289 #undef elf_backend_modify_program_headers
6290 #undef elf_backend_final_write_processing
6292 /* VxWorks support. */
6294 #undef TARGET_LITTLE_SYM
6295 #define TARGET_LITTLE_SYM i386_elf32_vxworks_vec
6296 #undef TARGET_LITTLE_NAME
6297 #define TARGET_LITTLE_NAME "elf32-i386-vxworks"
6299 #undef elf_backend_plt_alignment
6300 #define elf_backend_plt_alignment 4
6302 static const struct elf_i386_backend_data elf_i386_vxworks_arch_bed =
6304 &elf_i386_plt, /* plt */
6305 0x90, /* plt0_pad_byte */
6309 #undef elf_backend_arch_data
6310 #define elf_backend_arch_data &elf_i386_vxworks_arch_bed
6312 #undef elf_backend_relocs_compatible
6313 #undef elf_backend_add_symbol_hook
6314 #define elf_backend_add_symbol_hook \
6315 elf_vxworks_add_symbol_hook
6316 #undef elf_backend_link_output_symbol_hook
6317 #define elf_backend_link_output_symbol_hook \
6318 elf_vxworks_link_output_symbol_hook
6319 #undef elf_backend_emit_relocs
6320 #define elf_backend_emit_relocs elf_vxworks_emit_relocs
6321 #undef elf_backend_final_write_processing
6322 #define elf_backend_final_write_processing \
6323 elf_vxworks_final_write_processing
6324 #undef elf_backend_static_tls_alignment
6326 /* On VxWorks, we emit relocations against _PROCEDURE_LINKAGE_TABLE_, so
6328 #undef elf_backend_want_plt_sym
6329 #define elf_backend_want_plt_sym 1
6332 #define elf32_bed elf32_i386_vxworks_bed
6334 #include "elf32-target.h"