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;
882 /* TRUE if there are dynamic relocs against IFUNC symbols that apply
883 to read-only sections. */
884 bfd_boolean readonly_dynrelocs_against_ifunc;
887 /* Get the i386 ELF linker hash table from a link_info structure. */
889 #define elf_i386_hash_table(p) \
890 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
891 == I386_ELF_DATA ? ((struct elf_i386_link_hash_table *) ((p)->hash)) : NULL)
893 #define elf_i386_compute_jump_table_size(htab) \
894 ((htab)->elf.srelplt->reloc_count * 4)
896 /* Create an entry in an i386 ELF linker hash table. */
898 static struct bfd_hash_entry *
899 elf_i386_link_hash_newfunc (struct bfd_hash_entry *entry,
900 struct bfd_hash_table *table,
903 /* Allocate the structure if it has not already been allocated by a
907 entry = (struct bfd_hash_entry *)
908 bfd_hash_allocate (table, sizeof (struct elf_i386_link_hash_entry));
913 /* Call the allocation method of the superclass. */
914 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
917 struct elf_i386_link_hash_entry *eh;
919 eh = (struct elf_i386_link_hash_entry *) entry;
920 eh->dyn_relocs = NULL;
921 eh->tls_type = GOT_UNKNOWN;
923 eh->has_got_reloc = 0;
924 eh->has_non_got_reloc = 0;
925 eh->func_pointer_refcount = 0;
926 eh->plt_got.offset = (bfd_vma) -1;
927 eh->tlsdesc_got = (bfd_vma) -1;
933 /* Compute a hash of a local hash entry. We use elf_link_hash_entry
934 for local symbol so that we can handle local STT_GNU_IFUNC symbols
935 as global symbol. We reuse indx and dynstr_index for local symbol
936 hash since they aren't used by global symbols in this backend. */
939 elf_i386_local_htab_hash (const void *ptr)
941 struct elf_link_hash_entry *h
942 = (struct elf_link_hash_entry *) ptr;
943 return ELF_LOCAL_SYMBOL_HASH (h->indx, h->dynstr_index);
946 /* Compare local hash entries. */
949 elf_i386_local_htab_eq (const void *ptr1, const void *ptr2)
951 struct elf_link_hash_entry *h1
952 = (struct elf_link_hash_entry *) ptr1;
953 struct elf_link_hash_entry *h2
954 = (struct elf_link_hash_entry *) ptr2;
956 return h1->indx == h2->indx && h1->dynstr_index == h2->dynstr_index;
959 /* Find and/or create a hash entry for local symbol. */
961 static struct elf_link_hash_entry *
962 elf_i386_get_local_sym_hash (struct elf_i386_link_hash_table *htab,
963 bfd *abfd, const Elf_Internal_Rela *rel,
966 struct elf_i386_link_hash_entry e, *ret;
967 asection *sec = abfd->sections;
968 hashval_t h = ELF_LOCAL_SYMBOL_HASH (sec->id,
969 ELF32_R_SYM (rel->r_info));
972 e.elf.indx = sec->id;
973 e.elf.dynstr_index = ELF32_R_SYM (rel->r_info);
974 slot = htab_find_slot_with_hash (htab->loc_hash_table, &e, h,
975 create ? INSERT : NO_INSERT);
982 ret = (struct elf_i386_link_hash_entry *) *slot;
986 ret = (struct elf_i386_link_hash_entry *)
987 objalloc_alloc ((struct objalloc *) htab->loc_hash_memory,
988 sizeof (struct elf_i386_link_hash_entry));
991 memset (ret, 0, sizeof (*ret));
992 ret->elf.indx = sec->id;
993 ret->elf.dynstr_index = ELF32_R_SYM (rel->r_info);
994 ret->elf.dynindx = -1;
995 ret->func_pointer_refcount = 0;
996 ret->plt_got.offset = (bfd_vma) -1;
1002 /* Destroy an i386 ELF linker hash table. */
1005 elf_i386_link_hash_table_free (bfd *obfd)
1007 struct elf_i386_link_hash_table *htab
1008 = (struct elf_i386_link_hash_table *) obfd->link.hash;
1010 if (htab->loc_hash_table)
1011 htab_delete (htab->loc_hash_table);
1012 if (htab->loc_hash_memory)
1013 objalloc_free ((struct objalloc *) htab->loc_hash_memory);
1014 _bfd_elf_link_hash_table_free (obfd);
1017 /* Create an i386 ELF linker hash table. */
1019 static struct bfd_link_hash_table *
1020 elf_i386_link_hash_table_create (bfd *abfd)
1022 struct elf_i386_link_hash_table *ret;
1023 bfd_size_type amt = sizeof (struct elf_i386_link_hash_table);
1025 ret = (struct elf_i386_link_hash_table *) bfd_zmalloc (amt);
1029 if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd,
1030 elf_i386_link_hash_newfunc,
1031 sizeof (struct elf_i386_link_hash_entry),
1038 ret->loc_hash_table = htab_try_create (1024,
1039 elf_i386_local_htab_hash,
1040 elf_i386_local_htab_eq,
1042 ret->loc_hash_memory = objalloc_create ();
1043 if (!ret->loc_hash_table || !ret->loc_hash_memory)
1045 elf_i386_link_hash_table_free (abfd);
1048 ret->elf.root.hash_table_free = elf_i386_link_hash_table_free;
1050 return &ret->elf.root;
1053 /* Create .plt, .rel.plt, .got, .got.plt, .rel.got, .dynbss, and
1054 .rel.bss sections in DYNOBJ, and set up shortcuts to them in our
1058 elf_i386_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
1060 struct elf_i386_link_hash_table *htab;
1062 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
1065 htab = elf_i386_hash_table (info);
1069 htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss");
1073 if (bfd_link_executable (info))
1075 /* Always allow copy relocs for building executables. */
1076 asection *s = bfd_get_linker_section (dynobj, ".rel.bss");
1079 const struct elf_backend_data *bed = get_elf_backend_data (dynobj);
1080 s = bfd_make_section_anyway_with_flags (dynobj,
1082 (bed->dynamic_sec_flags
1085 || ! bfd_set_section_alignment (dynobj, s,
1086 bed->s->log_file_align))
1092 if (get_elf_i386_backend_data (dynobj)->is_vxworks
1093 && !elf_vxworks_create_dynamic_sections (dynobj, info,
1097 if (!info->no_ld_generated_unwind_info
1098 && htab->plt_eh_frame == NULL
1099 && htab->elf.splt != NULL)
1101 flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
1102 | SEC_HAS_CONTENTS | SEC_IN_MEMORY
1103 | SEC_LINKER_CREATED);
1105 = bfd_make_section_anyway_with_flags (dynobj, ".eh_frame", flags);
1106 if (htab->plt_eh_frame == NULL
1107 || !bfd_set_section_alignment (dynobj, htab->plt_eh_frame, 2))
1114 /* Copy the extra info we tack onto an elf_link_hash_entry. */
1117 elf_i386_copy_indirect_symbol (struct bfd_link_info *info,
1118 struct elf_link_hash_entry *dir,
1119 struct elf_link_hash_entry *ind)
1121 struct elf_i386_link_hash_entry *edir, *eind;
1123 edir = (struct elf_i386_link_hash_entry *) dir;
1124 eind = (struct elf_i386_link_hash_entry *) ind;
1126 if (eind->dyn_relocs != NULL)
1128 if (edir->dyn_relocs != NULL)
1130 struct elf_dyn_relocs **pp;
1131 struct elf_dyn_relocs *p;
1133 /* Add reloc counts against the indirect sym to the direct sym
1134 list. Merge any entries against the same section. */
1135 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
1137 struct elf_dyn_relocs *q;
1139 for (q = edir->dyn_relocs; q != NULL; q = q->next)
1140 if (q->sec == p->sec)
1142 q->pc_count += p->pc_count;
1143 q->count += p->count;
1150 *pp = edir->dyn_relocs;
1153 edir->dyn_relocs = eind->dyn_relocs;
1154 eind->dyn_relocs = NULL;
1157 if (ind->root.type == bfd_link_hash_indirect
1158 && dir->got.refcount <= 0)
1160 edir->tls_type = eind->tls_type;
1161 eind->tls_type = GOT_UNKNOWN;
1164 /* Copy gotoff_ref so that elf_i386_adjust_dynamic_symbol will
1165 generate a R_386_COPY reloc. */
1166 edir->gotoff_ref |= eind->gotoff_ref;
1168 edir->has_got_reloc |= eind->has_got_reloc;
1169 edir->has_non_got_reloc |= eind->has_non_got_reloc;
1171 if (ELIMINATE_COPY_RELOCS
1172 && ind->root.type != bfd_link_hash_indirect
1173 && dir->dynamic_adjusted)
1175 /* If called to transfer flags for a weakdef during processing
1176 of elf_adjust_dynamic_symbol, don't copy non_got_ref.
1177 We clear it ourselves for ELIMINATE_COPY_RELOCS. */
1178 dir->ref_dynamic |= ind->ref_dynamic;
1179 dir->ref_regular |= ind->ref_regular;
1180 dir->ref_regular_nonweak |= ind->ref_regular_nonweak;
1181 dir->needs_plt |= ind->needs_plt;
1182 dir->pointer_equality_needed |= ind->pointer_equality_needed;
1186 if (eind->func_pointer_refcount > 0)
1188 edir->func_pointer_refcount += eind->func_pointer_refcount;
1189 eind->func_pointer_refcount = 0;
1192 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
1196 /* Return TRUE if the TLS access code sequence support transition
1200 elf_i386_check_tls_transition (bfd *abfd, asection *sec,
1202 Elf_Internal_Shdr *symtab_hdr,
1203 struct elf_link_hash_entry **sym_hashes,
1204 unsigned int r_type,
1205 const Elf_Internal_Rela *rel,
1206 const Elf_Internal_Rela *relend)
1208 unsigned int val, type;
1209 unsigned long r_symndx;
1210 struct elf_link_hash_entry *h;
1213 /* Get the section contents. */
1214 if (contents == NULL)
1216 if (elf_section_data (sec)->this_hdr.contents != NULL)
1217 contents = elf_section_data (sec)->this_hdr.contents;
1220 /* FIXME: How to better handle error condition? */
1221 if (!bfd_malloc_and_get_section (abfd, sec, &contents))
1224 /* Cache the section contents for elf_link_input_bfd. */
1225 elf_section_data (sec)->this_hdr.contents = contents;
1229 offset = rel->r_offset;
1234 if (offset < 2 || (rel + 1) >= relend)
1237 type = bfd_get_8 (abfd, contents + offset - 2);
1238 if (r_type == R_386_TLS_GD)
1240 /* Check transition from GD access model. Only
1241 leal foo@tlsgd(,%reg,1), %eax; call ___tls_get_addr
1242 leal foo@tlsgd(%reg), %eax; call ___tls_get_addr; nop
1243 can transit to different access model. */
1244 if ((offset + 10) > sec->size ||
1245 (type != 0x8d && type != 0x04))
1248 val = bfd_get_8 (abfd, contents + offset - 1);
1251 /* leal foo@tlsgd(,%reg,1), %eax; call ___tls_get_addr */
1255 if (bfd_get_8 (abfd, contents + offset - 3) != 0x8d)
1258 if ((val & 0xc7) != 0x05 || val == (4 << 3))
1263 /* leal foo@tlsgd(%reg), %eax; call ___tls_get_addr; nop */
1264 if ((val & 0xf8) != 0x80 || (val & 7) == 4)
1267 if (bfd_get_8 (abfd, contents + offset + 9) != 0x90)
1273 /* Check transition from LD access model. Only
1274 leal foo@tlsgd(%reg), %eax; call ___tls_get_addr
1275 can transit to different access model. */
1276 if (type != 0x8d || (offset + 9) > sec->size)
1279 val = bfd_get_8 (abfd, contents + offset - 1);
1280 if ((val & 0xf8) != 0x80 || (val & 7) == 4)
1284 if (bfd_get_8 (abfd, contents + offset + 4) != 0xe8)
1287 r_symndx = ELF32_R_SYM (rel[1].r_info);
1288 if (r_symndx < symtab_hdr->sh_info)
1291 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1292 /* Use strncmp to check ___tls_get_addr since ___tls_get_addr
1293 may be versioned. */
1295 && h->root.root.string != NULL
1296 && (ELF32_R_TYPE (rel[1].r_info) == R_386_PC32
1297 || ELF32_R_TYPE (rel[1].r_info) == R_386_PLT32)
1298 && (strncmp (h->root.root.string, "___tls_get_addr",
1302 /* Check transition from IE access model:
1303 movl foo@indntpoff(%rip), %eax
1304 movl foo@indntpoff(%rip), %reg
1305 addl foo@indntpoff(%rip), %reg
1308 if (offset < 1 || (offset + 4) > sec->size)
1311 /* Check "movl foo@tpoff(%rip), %eax" first. */
1312 val = bfd_get_8 (abfd, contents + offset - 1);
1319 /* Check movl|addl foo@tpoff(%rip), %reg. */
1320 type = bfd_get_8 (abfd, contents + offset - 2);
1321 return ((type == 0x8b || type == 0x03)
1322 && (val & 0xc7) == 0x05);
1324 case R_386_TLS_GOTIE:
1325 case R_386_TLS_IE_32:
1326 /* Check transition from {IE_32,GOTIE} access model:
1327 subl foo@{tpoff,gontoff}(%reg1), %reg2
1328 movl foo@{tpoff,gontoff}(%reg1), %reg2
1329 addl foo@{tpoff,gontoff}(%reg1), %reg2
1332 if (offset < 2 || (offset + 4) > sec->size)
1335 val = bfd_get_8 (abfd, contents + offset - 1);
1336 if ((val & 0xc0) != 0x80 || (val & 7) == 4)
1339 type = bfd_get_8 (abfd, contents + offset - 2);
1340 return type == 0x8b || type == 0x2b || type == 0x03;
1342 case R_386_TLS_GOTDESC:
1343 /* Check transition from GDesc access model:
1344 leal x@tlsdesc(%ebx), %eax
1346 Make sure it's a leal adding ebx to a 32-bit offset
1347 into any register, although it's probably almost always
1350 if (offset < 2 || (offset + 4) > sec->size)
1353 if (bfd_get_8 (abfd, contents + offset - 2) != 0x8d)
1356 val = bfd_get_8 (abfd, contents + offset - 1);
1357 return (val & 0xc7) == 0x83;
1359 case R_386_TLS_DESC_CALL:
1360 /* Check transition from GDesc access model:
1361 call *x@tlsdesc(%rax)
1363 if (offset + 2 <= sec->size)
1365 /* Make sure that it's a call *x@tlsdesc(%rax). */
1366 static const unsigned char call[] = { 0xff, 0x10 };
1367 return memcmp (contents + offset, call, 2) == 0;
1377 /* Return TRUE if the TLS access transition is OK or no transition
1378 will be performed. Update R_TYPE if there is a transition. */
1381 elf_i386_tls_transition (struct bfd_link_info *info, bfd *abfd,
1382 asection *sec, bfd_byte *contents,
1383 Elf_Internal_Shdr *symtab_hdr,
1384 struct elf_link_hash_entry **sym_hashes,
1385 unsigned int *r_type, int tls_type,
1386 const Elf_Internal_Rela *rel,
1387 const Elf_Internal_Rela *relend,
1388 struct elf_link_hash_entry *h,
1389 unsigned long r_symndx)
1391 unsigned int from_type = *r_type;
1392 unsigned int to_type = from_type;
1393 bfd_boolean check = TRUE;
1395 /* Skip TLS transition for functions. */
1397 && (h->type == STT_FUNC
1398 || h->type == STT_GNU_IFUNC))
1404 case R_386_TLS_GOTDESC:
1405 case R_386_TLS_DESC_CALL:
1406 case R_386_TLS_IE_32:
1408 case R_386_TLS_GOTIE:
1409 if (bfd_link_executable (info))
1412 to_type = R_386_TLS_LE_32;
1413 else if (from_type != R_386_TLS_IE
1414 && from_type != R_386_TLS_GOTIE)
1415 to_type = R_386_TLS_IE_32;
1418 /* When we are called from elf_i386_relocate_section, CONTENTS
1419 isn't NULL and there may be additional transitions based on
1421 if (contents != NULL)
1423 unsigned int new_to_type = to_type;
1425 if (bfd_link_executable (info)
1428 && (tls_type & GOT_TLS_IE))
1429 new_to_type = R_386_TLS_LE_32;
1431 if (to_type == R_386_TLS_GD
1432 || to_type == R_386_TLS_GOTDESC
1433 || to_type == R_386_TLS_DESC_CALL)
1435 if (tls_type == GOT_TLS_IE_POS)
1436 new_to_type = R_386_TLS_GOTIE;
1437 else if (tls_type & GOT_TLS_IE)
1438 new_to_type = R_386_TLS_IE_32;
1441 /* We checked the transition before when we were called from
1442 elf_i386_check_relocs. We only want to check the new
1443 transition which hasn't been checked before. */
1444 check = new_to_type != to_type && from_type == to_type;
1445 to_type = new_to_type;
1451 if (bfd_link_executable (info))
1452 to_type = R_386_TLS_LE_32;
1459 /* Return TRUE if there is no transition. */
1460 if (from_type == to_type)
1463 /* Check if the transition can be performed. */
1465 && ! elf_i386_check_tls_transition (abfd, sec, contents,
1466 symtab_hdr, sym_hashes,
1467 from_type, rel, relend))
1469 reloc_howto_type *from, *to;
1472 from = elf_i386_rtype_to_howto (abfd, from_type);
1473 to = elf_i386_rtype_to_howto (abfd, to_type);
1476 name = h->root.root.string;
1479 struct elf_i386_link_hash_table *htab;
1481 htab = elf_i386_hash_table (info);
1486 Elf_Internal_Sym *isym;
1488 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1490 name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
1494 (*_bfd_error_handler)
1495 (_("%B: TLS transition from %s to %s against `%s' at 0x%lx "
1496 "in section `%A' failed"),
1497 abfd, sec, from->name, to->name, name,
1498 (unsigned long) rel->r_offset);
1499 bfd_set_error (bfd_error_bad_value);
1507 /* Rename some of the generic section flags to better document how they
1509 #define need_convert_load sec_flg0
1510 #define check_relocs_failed sec_flg1
1512 /* Look through the relocs for a section during the first phase, and
1513 calculate needed space in the global offset table, procedure linkage
1514 table, and dynamic reloc sections. */
1517 elf_i386_check_relocs (bfd *abfd,
1518 struct bfd_link_info *info,
1520 const Elf_Internal_Rela *relocs)
1522 struct elf_i386_link_hash_table *htab;
1523 Elf_Internal_Shdr *symtab_hdr;
1524 struct elf_link_hash_entry **sym_hashes;
1525 const Elf_Internal_Rela *rel;
1526 const Elf_Internal_Rela *rel_end;
1528 bfd_boolean use_plt_got;
1530 if (bfd_link_relocatable (info))
1533 BFD_ASSERT (is_i386_elf (abfd));
1535 htab = elf_i386_hash_table (info);
1538 sec->check_relocs_failed = 1;
1542 use_plt_got = (!get_elf_i386_backend_data (abfd)->is_vxworks
1543 && (get_elf_i386_backend_data (abfd)
1544 == &elf_i386_arch_bed));
1546 symtab_hdr = &elf_symtab_hdr (abfd);
1547 sym_hashes = elf_sym_hashes (abfd);
1551 rel_end = relocs + sec->reloc_count;
1552 for (rel = relocs; rel < rel_end; rel++)
1554 unsigned int r_type;
1555 unsigned long r_symndx;
1556 struct elf_link_hash_entry *h;
1557 struct elf_i386_link_hash_entry *eh;
1558 Elf_Internal_Sym *isym;
1560 bfd_boolean size_reloc;
1562 r_symndx = ELF32_R_SYM (rel->r_info);
1563 r_type = ELF32_R_TYPE (rel->r_info);
1565 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
1567 (*_bfd_error_handler) (_("%B: bad symbol index: %d"),
1573 if (r_symndx < symtab_hdr->sh_info)
1575 /* A local symbol. */
1576 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1581 /* Check relocation against local STT_GNU_IFUNC symbol. */
1582 if (ELF32_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
1584 h = elf_i386_get_local_sym_hash (htab, abfd, rel, TRUE);
1588 /* Fake a STT_GNU_IFUNC symbol. */
1589 h->type = STT_GNU_IFUNC;
1592 h->forced_local = 1;
1593 h->root.type = bfd_link_hash_defined;
1601 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1602 while (h->root.type == bfd_link_hash_indirect
1603 || h->root.type == bfd_link_hash_warning)
1604 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1607 eh = (struct elf_i386_link_hash_entry *) h;
1622 if (htab->elf.dynobj == NULL)
1623 htab->elf.dynobj = abfd;
1624 /* Create the ifunc sections for static executables. */
1625 if (h->type == STT_GNU_IFUNC
1626 && !_bfd_elf_create_ifunc_sections (htab->elf.dynobj,
1632 /* It is referenced by a non-shared object. */
1634 h->root.non_ir_ref = 1;
1636 if (h->type == STT_GNU_IFUNC)
1637 elf_tdata (info->output_bfd)->has_gnu_symbols
1638 |= elf_gnu_symbol_ifunc;
1641 if (! elf_i386_tls_transition (info, abfd, sec, NULL,
1642 symtab_hdr, sym_hashes,
1643 &r_type, GOT_UNKNOWN,
1644 rel, rel_end, h, r_symndx))
1650 htab->tls_ldm_got.refcount += 1;
1654 /* This symbol requires a procedure linkage table entry. We
1655 actually build the entry in adjust_dynamic_symbol,
1656 because this might be a case of linking PIC code which is
1657 never referenced by a dynamic object, in which case we
1658 don't need to generate a procedure linkage table entry
1661 /* If this is a local symbol, we resolve it directly without
1662 creating a procedure linkage table entry. */
1666 eh->has_got_reloc = 1;
1668 h->plt.refcount += 1;
1675 case R_386_TLS_IE_32:
1677 case R_386_TLS_GOTIE:
1678 if (!bfd_link_executable (info))
1679 info->flags |= DF_STATIC_TLS;
1685 case R_386_TLS_GOTDESC:
1686 case R_386_TLS_DESC_CALL:
1687 /* This symbol requires a global offset table entry. */
1689 int tls_type, old_tls_type;
1696 tls_type = GOT_NORMAL;
1698 case R_386_TLS_GD: tls_type = GOT_TLS_GD; break;
1699 case R_386_TLS_GOTDESC:
1700 case R_386_TLS_DESC_CALL:
1701 tls_type = GOT_TLS_GDESC; break;
1702 case R_386_TLS_IE_32:
1703 if (ELF32_R_TYPE (rel->r_info) == r_type)
1704 tls_type = GOT_TLS_IE_NEG;
1706 /* If this is a GD->IE transition, we may use either of
1707 R_386_TLS_TPOFF and R_386_TLS_TPOFF32. */
1708 tls_type = GOT_TLS_IE;
1711 case R_386_TLS_GOTIE:
1712 tls_type = GOT_TLS_IE_POS; break;
1717 h->got.refcount += 1;
1718 old_tls_type = elf_i386_hash_entry(h)->tls_type;
1722 bfd_signed_vma *local_got_refcounts;
1724 /* This is a global offset table entry for a local symbol. */
1725 local_got_refcounts = elf_local_got_refcounts (abfd);
1726 if (local_got_refcounts == NULL)
1730 size = symtab_hdr->sh_info;
1731 size *= (sizeof (bfd_signed_vma)
1732 + sizeof (bfd_vma) + sizeof(char));
1733 local_got_refcounts = (bfd_signed_vma *)
1734 bfd_zalloc (abfd, size);
1735 if (local_got_refcounts == NULL)
1737 elf_local_got_refcounts (abfd) = local_got_refcounts;
1738 elf_i386_local_tlsdesc_gotent (abfd)
1739 = (bfd_vma *) (local_got_refcounts + symtab_hdr->sh_info);
1740 elf_i386_local_got_tls_type (abfd)
1741 = (char *) (local_got_refcounts + 2 * symtab_hdr->sh_info);
1743 local_got_refcounts[r_symndx] += 1;
1744 old_tls_type = elf_i386_local_got_tls_type (abfd) [r_symndx];
1747 if ((old_tls_type & GOT_TLS_IE) && (tls_type & GOT_TLS_IE))
1748 tls_type |= old_tls_type;
1749 /* If a TLS symbol is accessed using IE at least once,
1750 there is no point to use dynamic model for it. */
1751 else if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
1752 && (! GOT_TLS_GD_ANY_P (old_tls_type)
1753 || (tls_type & GOT_TLS_IE) == 0))
1755 if ((old_tls_type & GOT_TLS_IE) && GOT_TLS_GD_ANY_P (tls_type))
1756 tls_type = old_tls_type;
1757 else if (GOT_TLS_GD_ANY_P (old_tls_type)
1758 && GOT_TLS_GD_ANY_P (tls_type))
1759 tls_type |= old_tls_type;
1763 name = h->root.root.string;
1765 name = bfd_elf_sym_name (abfd, symtab_hdr, isym,
1767 (*_bfd_error_handler)
1768 (_("%B: `%s' accessed both as normal and "
1769 "thread local symbol"),
1771 bfd_set_error (bfd_error_bad_value);
1776 if (old_tls_type != tls_type)
1779 elf_i386_hash_entry (h)->tls_type = tls_type;
1781 elf_i386_local_got_tls_type (abfd) [r_symndx] = tls_type;
1789 if (htab->elf.sgot == NULL)
1791 if (htab->elf.dynobj == NULL)
1792 htab->elf.dynobj = abfd;
1793 if (!_bfd_elf_create_got_section (htab->elf.dynobj, info))
1796 if (r_type != R_386_TLS_IE)
1799 eh->has_got_reloc = 1;
1804 case R_386_TLS_LE_32:
1807 eh->has_got_reloc = 1;
1808 if (bfd_link_executable (info))
1810 info->flags |= DF_STATIC_TLS;
1815 if (eh != NULL && (sec->flags & SEC_CODE) != 0)
1816 eh->has_non_got_reloc = 1;
1818 /* STT_GNU_IFUNC symbol must go through PLT even if it is
1819 locally defined and undefined symbol may turn out to be
1820 a STT_GNU_IFUNC symbol later. */
1822 && (bfd_link_executable (info)
1823 || ((h->type == STT_GNU_IFUNC
1824 || h->root.type == bfd_link_hash_undefweak
1825 || h->root.type == bfd_link_hash_undefined)
1826 && SYMBOLIC_BIND (info, h))))
1828 /* If this reloc is in a read-only section, we might
1829 need a copy reloc. We can't check reliably at this
1830 stage whether the section is read-only, as input
1831 sections have not yet been mapped to output sections.
1832 Tentatively set the flag for now, and correct in
1833 adjust_dynamic_symbol. */
1836 /* We may need a .plt entry if the function this reloc
1837 refers to is in a shared lib. */
1838 h->plt.refcount += 1;
1839 if (r_type == R_386_PC32)
1841 /* Since something like ".long foo - ." may be used
1842 as pointer, make sure that PLT is used if foo is
1843 a function defined in a shared library. */
1844 if ((sec->flags & SEC_CODE) == 0)
1845 h->pointer_equality_needed = 1;
1849 h->pointer_equality_needed = 1;
1850 /* R_386_32 can be resolved at run-time. */
1851 if (r_type == R_386_32
1852 && (sec->flags & SEC_READONLY) == 0)
1853 eh->func_pointer_refcount += 1;
1859 /* If we are creating a shared library, and this is a reloc
1860 against a global symbol, or a non PC relative reloc
1861 against a local symbol, then we need to copy the reloc
1862 into the shared library. However, if we are linking with
1863 -Bsymbolic, we do not need to copy a reloc against a
1864 global symbol which is defined in an object we are
1865 including in the link (i.e., DEF_REGULAR is set). At
1866 this point we have not seen all the input files, so it is
1867 possible that DEF_REGULAR is not set now but will be set
1868 later (it is never cleared). In case of a weak definition,
1869 DEF_REGULAR may be cleared later by a strong definition in
1870 a shared library. We account for that possibility below by
1871 storing information in the relocs_copied field of the hash
1872 table entry. A similar situation occurs when creating
1873 shared libraries and symbol visibility changes render the
1876 If on the other hand, we are creating an executable, we
1877 may need to keep relocations for symbols satisfied by a
1878 dynamic library if we manage to avoid copy relocs for the
1880 if ((bfd_link_pic (info)
1881 && (sec->flags & SEC_ALLOC) != 0
1882 && (r_type != R_386_PC32
1884 && (! (bfd_link_pie (info)
1885 || SYMBOLIC_BIND (info, h))
1886 || h->root.type == bfd_link_hash_defweak
1887 || !h->def_regular))))
1888 || (ELIMINATE_COPY_RELOCS
1889 && !bfd_link_pic (info)
1890 && (sec->flags & SEC_ALLOC) != 0
1892 && (h->root.type == bfd_link_hash_defweak
1893 || !h->def_regular)))
1895 struct elf_dyn_relocs *p;
1896 struct elf_dyn_relocs **head;
1898 /* We must copy these reloc types into the output file.
1899 Create a reloc section in dynobj and make room for
1903 if (htab->elf.dynobj == NULL)
1904 htab->elf.dynobj = abfd;
1906 sreloc = _bfd_elf_make_dynamic_reloc_section
1907 (sec, htab->elf.dynobj, 2, abfd, /*rela?*/ FALSE);
1913 /* If this is a global symbol, we count the number of
1914 relocations we need for this symbol. */
1917 head = &eh->dyn_relocs;
1921 /* Track dynamic relocs needed for local syms too.
1922 We really need local syms available to do this
1927 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1932 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
1936 vpp = &elf_section_data (s)->local_dynrel;
1937 head = (struct elf_dyn_relocs **)vpp;
1941 if (p == NULL || p->sec != sec)
1943 bfd_size_type amt = sizeof *p;
1944 p = (struct elf_dyn_relocs *) bfd_alloc (htab->elf.dynobj,
1956 /* Count size relocation as PC-relative relocation. */
1957 if (r_type == R_386_PC32 || size_reloc)
1962 /* This relocation describes the C++ object vtable hierarchy.
1963 Reconstruct it for later use during GC. */
1964 case R_386_GNU_VTINHERIT:
1965 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1969 /* This relocation describes which C++ vtable entries are actually
1970 used. Record for later use during GC. */
1971 case R_386_GNU_VTENTRY:
1972 BFD_ASSERT (h != NULL);
1974 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
1984 && h->plt.refcount > 0
1985 && (((info->flags & DF_BIND_NOW) && !h->pointer_equality_needed)
1986 || h->got.refcount > 0)
1987 && htab->plt_got == NULL)
1989 /* Create the GOT procedure linkage table. */
1990 unsigned int plt_got_align;
1991 const struct elf_backend_data *bed;
1993 bed = get_elf_backend_data (info->output_bfd);
1994 BFD_ASSERT (sizeof (elf_i386_got_plt_entry) == 8
1995 && (sizeof (elf_i386_got_plt_entry)
1996 == sizeof (elf_i386_pic_got_plt_entry)));
1999 if (htab->elf.dynobj == NULL)
2000 htab->elf.dynobj = abfd;
2002 = bfd_make_section_anyway_with_flags (htab->elf.dynobj,
2004 (bed->dynamic_sec_flags
2009 if (htab->plt_got == NULL
2010 || !bfd_set_section_alignment (htab->elf.dynobj,
2016 if ((r_type == R_386_GOT32 || r_type == R_386_GOT32X)
2017 && (h == NULL || h->type != STT_GNU_IFUNC))
2018 sec->need_convert_load = 1;
2024 sec->check_relocs_failed = 1;
2028 /* Return the section that should be marked against GC for a given
2032 elf_i386_gc_mark_hook (asection *sec,
2033 struct bfd_link_info *info,
2034 Elf_Internal_Rela *rel,
2035 struct elf_link_hash_entry *h,
2036 Elf_Internal_Sym *sym)
2039 switch (ELF32_R_TYPE (rel->r_info))
2041 case R_386_GNU_VTINHERIT:
2042 case R_386_GNU_VTENTRY:
2046 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
2049 /* Remove undefined weak symbol from the dynamic symbol table if it
2050 is resolved to 0. */
2053 elf_i386_fixup_symbol (struct bfd_link_info *info,
2054 struct elf_link_hash_entry *h)
2056 if (h->dynindx != -1
2057 && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info,
2058 elf_i386_hash_entry (h)))
2061 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
2067 /* Adjust a symbol defined by a dynamic object and referenced by a
2068 regular object. The current definition is in some section of the
2069 dynamic object, but we're not including those sections. We have to
2070 change the definition to something the rest of the link can
2074 elf_i386_adjust_dynamic_symbol (struct bfd_link_info *info,
2075 struct elf_link_hash_entry *h)
2077 struct elf_i386_link_hash_table *htab;
2079 struct elf_i386_link_hash_entry *eh;
2080 struct elf_dyn_relocs *p;
2082 /* STT_GNU_IFUNC symbol must go through PLT. */
2083 if (h->type == STT_GNU_IFUNC)
2085 /* All local STT_GNU_IFUNC references must be treate as local
2086 calls via local PLT. */
2088 && SYMBOL_CALLS_LOCAL (info, h))
2090 bfd_size_type pc_count = 0, count = 0;
2091 struct elf_dyn_relocs **pp;
2093 eh = (struct elf_i386_link_hash_entry *) h;
2094 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2096 pc_count += p->pc_count;
2097 p->count -= p->pc_count;
2106 if (pc_count || count)
2110 if (h->plt.refcount <= 0)
2111 h->plt.refcount = 1;
2113 h->plt.refcount += 1;
2117 if (h->plt.refcount <= 0)
2119 h->plt.offset = (bfd_vma) -1;
2125 /* If this is a function, put it in the procedure linkage table. We
2126 will fill in the contents of the procedure linkage table later,
2127 when we know the address of the .got section. */
2128 if (h->type == STT_FUNC
2131 if (h->plt.refcount <= 0
2132 || SYMBOL_CALLS_LOCAL (info, h)
2133 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2134 && h->root.type == bfd_link_hash_undefweak))
2136 /* This case can occur if we saw a PLT32 reloc in an input
2137 file, but the symbol was never referred to by a dynamic
2138 object, or if all references were garbage collected. In
2139 such a case, we don't actually need to build a procedure
2140 linkage table, and we can just do a PC32 reloc instead. */
2141 h->plt.offset = (bfd_vma) -1;
2148 /* It's possible that we incorrectly decided a .plt reloc was
2149 needed for an R_386_PC32 reloc to a non-function sym in
2150 check_relocs. We can't decide accurately between function and
2151 non-function syms in check-relocs; Objects loaded later in
2152 the link may change h->type. So fix it now. */
2153 h->plt.offset = (bfd_vma) -1;
2155 /* If this is a weak symbol, and there is a real definition, the
2156 processor independent code will have arranged for us to see the
2157 real definition first, and we can just use the same value. */
2158 if (h->u.weakdef != NULL)
2160 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
2161 || h->u.weakdef->root.type == bfd_link_hash_defweak);
2162 h->root.u.def.section = h->u.weakdef->root.u.def.section;
2163 h->root.u.def.value = h->u.weakdef->root.u.def.value;
2164 if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
2165 h->non_got_ref = h->u.weakdef->non_got_ref;
2169 /* This is a reference to a symbol defined by a dynamic object which
2170 is not a function. */
2172 /* If we are creating a shared library, we must presume that the
2173 only references to the symbol are via the global offset table.
2174 For such cases we need not do anything here; the relocations will
2175 be handled correctly by relocate_section. */
2176 if (!bfd_link_executable (info))
2179 /* If there are no references to this symbol that do not use the
2180 GOT nor R_386_GOTOFF relocation, we don't need to generate a copy
2182 eh = (struct elf_i386_link_hash_entry *) h;
2183 if (!h->non_got_ref && !eh->gotoff_ref)
2186 /* If -z nocopyreloc was given, we won't generate them either. */
2187 if (info->nocopyreloc)
2193 htab = elf_i386_hash_table (info);
2197 /* If there aren't any dynamic relocs in read-only sections nor
2198 R_386_GOTOFF relocation, then we can keep the dynamic relocs and
2199 avoid the copy reloc. This doesn't work on VxWorks, where we can
2200 not have dynamic relocations (other than copy and jump slot
2201 relocations) in an executable. */
2202 if (ELIMINATE_COPY_RELOCS
2204 && !get_elf_i386_backend_data (info->output_bfd)->is_vxworks)
2206 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2208 s = p->sec->output_section;
2209 if (s != NULL && (s->flags & SEC_READONLY) != 0)
2220 /* We must allocate the symbol in our .dynbss section, which will
2221 become part of the .bss section of the executable. There will be
2222 an entry for this symbol in the .dynsym section. The dynamic
2223 object will contain position independent code, so all references
2224 from the dynamic object to this symbol will go through the global
2225 offset table. The dynamic linker will use the .dynsym entry to
2226 determine the address it must put in the global offset table, so
2227 both the dynamic object and the regular object will refer to the
2228 same memory location for the variable. */
2230 /* We must generate a R_386_COPY reloc to tell the dynamic linker to
2231 copy the initial value out of the dynamic object and into the
2232 runtime process image. */
2233 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
2235 htab->srelbss->size += sizeof (Elf32_External_Rel);
2241 return _bfd_elf_adjust_dynamic_copy (info, h, s);
2244 /* Allocate space in .plt, .got and associated reloc sections for
2248 elf_i386_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
2250 struct bfd_link_info *info;
2251 struct elf_i386_link_hash_table *htab;
2252 struct elf_i386_link_hash_entry *eh;
2253 struct elf_dyn_relocs *p;
2254 unsigned plt_entry_size;
2255 bfd_boolean resolved_to_zero;
2257 if (h->root.type == bfd_link_hash_indirect)
2260 eh = (struct elf_i386_link_hash_entry *) h;
2262 info = (struct bfd_link_info *) inf;
2263 htab = elf_i386_hash_table (info);
2267 plt_entry_size = GET_PLT_ENTRY_SIZE (info->output_bfd);
2269 resolved_to_zero = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
2271 /* Clear the reference count of function pointer relocations if
2272 symbol isn't a normal function. */
2273 if (h->type != STT_FUNC)
2274 eh->func_pointer_refcount = 0;
2276 /* We can't use the GOT PLT if pointer equality is needed since
2277 finish_dynamic_symbol won't clear symbol value and the dynamic
2278 linker won't update the GOT slot. We will get into an infinite
2279 loop at run-time. */
2280 if (htab->plt_got != NULL
2281 && h->type != STT_GNU_IFUNC
2282 && !h->pointer_equality_needed
2283 && h->plt.refcount > 0
2284 && h->got.refcount > 0)
2286 /* Don't use the regular PLT if there are both GOT and GOTPLT
2288 h->plt.offset = (bfd_vma) -1;
2290 /* Use the GOT PLT. */
2291 eh->plt_got.refcount = 1;
2294 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it
2295 here if it is defined and referenced in a non-shared object. */
2296 if (h->type == STT_GNU_IFUNC
2298 return _bfd_elf_allocate_ifunc_dyn_relocs (info, h, &eh->dyn_relocs,
2299 &htab->readonly_dynrelocs_against_ifunc,
2302 /* Don't create the PLT entry if there are only function pointer
2303 relocations which can be resolved at run-time. */
2304 else if (htab->elf.dynamic_sections_created
2305 && (h->plt.refcount > eh->func_pointer_refcount
2306 || eh->plt_got.refcount > 0))
2308 bfd_boolean use_plt_got;
2310 /* Clear the reference count of function pointer relocations
2312 eh->func_pointer_refcount = 0;
2314 if ((info->flags & DF_BIND_NOW) && !h->pointer_equality_needed)
2316 /* Don't use the regular PLT for DF_BIND_NOW. */
2317 h->plt.offset = (bfd_vma) -1;
2319 /* Use the GOT PLT. */
2320 h->got.refcount = 1;
2321 eh->plt_got.refcount = 1;
2324 use_plt_got = eh->plt_got.refcount > 0;
2326 /* Make sure this symbol is output as a dynamic symbol.
2327 Undefined weak syms won't yet be marked as dynamic. */
2328 if (h->dynindx == -1
2330 && !resolved_to_zero)
2332 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2336 if (bfd_link_pic (info)
2337 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
2339 asection *s = htab->elf.splt;
2340 asection *got_s = htab->plt_got;
2342 /* If this is the first .plt entry, make room for the special
2343 first entry. The .plt section is used by prelink to undo
2344 prelinking for dynamic relocations. */
2346 s->size = plt_entry_size;
2349 eh->plt_got.offset = got_s->size;
2351 h->plt.offset = s->size;
2353 /* If this symbol is not defined in a regular file, and we are
2354 not generating a shared library, then set the symbol to this
2355 location in the .plt. This is required to make function
2356 pointers compare as equal between the normal executable and
2357 the shared library. */
2358 if (! bfd_link_pic (info)
2363 /* We need to make a call to the entry of the GOT PLT
2364 instead of regular PLT entry. */
2365 h->root.u.def.section = got_s;
2366 h->root.u.def.value = eh->plt_got.offset;
2370 h->root.u.def.section = s;
2371 h->root.u.def.value = h->plt.offset;
2375 /* Make room for this entry. */
2377 got_s->size += sizeof (elf_i386_got_plt_entry);
2380 s->size += plt_entry_size;
2382 /* We also need to make an entry in the .got.plt section,
2383 which will be placed in the .got section by the linker
2385 htab->elf.sgotplt->size += 4;
2387 /* There should be no PLT relocation against resolved
2388 undefined weak symbol in executable. */
2389 if (!resolved_to_zero)
2391 /* We also need to make an entry in the .rel.plt
2393 htab->elf.srelplt->size += sizeof (Elf32_External_Rel);
2394 htab->elf.srelplt->reloc_count++;
2398 if (get_elf_i386_backend_data (info->output_bfd)->is_vxworks
2399 && !bfd_link_pic (info))
2401 /* VxWorks has a second set of relocations for each PLT entry
2402 in executables. They go in a separate relocation section,
2403 which is processed by the kernel loader. */
2405 /* There are two relocations for the initial PLT entry: an
2406 R_386_32 relocation for _GLOBAL_OFFSET_TABLE_ + 4 and an
2407 R_386_32 relocation for _GLOBAL_OFFSET_TABLE_ + 8. */
2409 if (h->plt.offset == plt_entry_size)
2410 htab->srelplt2->size += (sizeof (Elf32_External_Rel) * 2);
2412 /* There are two extra relocations for each subsequent PLT entry:
2413 an R_386_32 relocation for the GOT entry, and an R_386_32
2414 relocation for the PLT entry. */
2416 htab->srelplt2->size += (sizeof (Elf32_External_Rel) * 2);
2421 eh->plt_got.offset = (bfd_vma) -1;
2422 h->plt.offset = (bfd_vma) -1;
2428 eh->plt_got.offset = (bfd_vma) -1;
2429 h->plt.offset = (bfd_vma) -1;
2433 eh->tlsdesc_got = (bfd_vma) -1;
2435 /* If R_386_TLS_{IE_32,IE,GOTIE} symbol is now local to the binary,
2436 make it a R_386_TLS_LE_32 requiring no TLS entry. */
2437 if (h->got.refcount > 0
2438 && bfd_link_executable (info)
2440 && (elf_i386_hash_entry(h)->tls_type & GOT_TLS_IE))
2441 h->got.offset = (bfd_vma) -1;
2442 else if (h->got.refcount > 0)
2446 int tls_type = elf_i386_hash_entry(h)->tls_type;
2448 /* Make sure this symbol is output as a dynamic symbol.
2449 Undefined weak syms won't yet be marked as dynamic. */
2450 if (h->dynindx == -1
2452 && !resolved_to_zero)
2454 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2459 if (GOT_TLS_GDESC_P (tls_type))
2461 eh->tlsdesc_got = htab->elf.sgotplt->size
2462 - elf_i386_compute_jump_table_size (htab);
2463 htab->elf.sgotplt->size += 8;
2464 h->got.offset = (bfd_vma) -2;
2466 if (! GOT_TLS_GDESC_P (tls_type)
2467 || GOT_TLS_GD_P (tls_type))
2469 h->got.offset = s->size;
2471 /* R_386_TLS_GD needs 2 consecutive GOT slots. */
2472 if (GOT_TLS_GD_P (tls_type) || tls_type == GOT_TLS_IE_BOTH)
2475 dyn = htab->elf.dynamic_sections_created;
2476 /* R_386_TLS_IE_32 needs one dynamic relocation,
2477 R_386_TLS_IE resp. R_386_TLS_GOTIE needs one dynamic relocation,
2478 (but if both R_386_TLS_IE_32 and R_386_TLS_IE is present, we
2479 need two), R_386_TLS_GD needs one if local symbol and two if
2480 global. No dynamic relocation against resolved undefined weak
2481 symbol in executable. */
2482 if (tls_type == GOT_TLS_IE_BOTH)
2483 htab->elf.srelgot->size += 2 * sizeof (Elf32_External_Rel);
2484 else if ((GOT_TLS_GD_P (tls_type) && h->dynindx == -1)
2485 || (tls_type & GOT_TLS_IE))
2486 htab->elf.srelgot->size += sizeof (Elf32_External_Rel);
2487 else if (GOT_TLS_GD_P (tls_type))
2488 htab->elf.srelgot->size += 2 * sizeof (Elf32_External_Rel);
2489 else if (! GOT_TLS_GDESC_P (tls_type)
2490 && ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2491 && !resolved_to_zero)
2492 || h->root.type != bfd_link_hash_undefweak)
2493 && (bfd_link_pic (info)
2494 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
2495 htab->elf.srelgot->size += sizeof (Elf32_External_Rel);
2496 if (GOT_TLS_GDESC_P (tls_type))
2497 htab->elf.srelplt->size += sizeof (Elf32_External_Rel);
2500 h->got.offset = (bfd_vma) -1;
2502 if (eh->dyn_relocs == NULL)
2505 /* In the shared -Bsymbolic case, discard space allocated for
2506 dynamic pc-relative relocs against symbols which turn out to be
2507 defined in regular objects. For the normal shared case, discard
2508 space for pc-relative relocs that have become local due to symbol
2509 visibility changes. */
2511 if (bfd_link_pic (info))
2513 /* The only reloc that uses pc_count is R_386_PC32, which will
2514 appear on a call or on something like ".long foo - .". We
2515 want calls to protected symbols to resolve directly to the
2516 function rather than going via the plt. If people want
2517 function pointer comparisons to work as expected then they
2518 should avoid writing assembly like ".long foo - .". */
2519 if (SYMBOL_CALLS_LOCAL (info, h))
2521 struct elf_dyn_relocs **pp;
2523 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2525 p->count -= p->pc_count;
2534 if (get_elf_i386_backend_data (info->output_bfd)->is_vxworks)
2536 struct elf_dyn_relocs **pp;
2537 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2539 if (strcmp (p->sec->output_section->name, ".tls_vars") == 0)
2546 /* Also discard relocs on undefined weak syms with non-default
2547 visibility or in PIE. */
2548 if (eh->dyn_relocs != NULL
2549 && h->root.type == bfd_link_hash_undefweak)
2551 /* Undefined weak symbol is never bound locally in shared
2553 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2554 || resolved_to_zero)
2558 /* Keep dynamic non-GOT/non-PLT relocation so that we
2559 can branch to 0 without PLT. */
2560 struct elf_dyn_relocs **pp;
2562 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2563 if (p->pc_count == 0)
2567 /* Remove non-R_386_PC32 relocation. */
2568 p->count = p->pc_count;
2572 if (eh->dyn_relocs != NULL)
2574 /* Make sure undefined weak symbols are output
2575 as dynamic symbols in PIEs for dynamic non-GOT
2576 non-PLT reloations. */
2577 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2582 eh->dyn_relocs = NULL;
2584 else if (h->dynindx == -1
2585 && !h->forced_local)
2587 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2592 else if (ELIMINATE_COPY_RELOCS)
2594 /* For the non-shared case, discard space for relocs against
2595 symbols which turn out to need copy relocs or are not
2596 dynamic. Keep dynamic relocations for run-time function
2597 pointer initialization. */
2599 if ((!h->non_got_ref
2600 || eh->func_pointer_refcount > 0
2601 || (h->root.type == bfd_link_hash_undefweak
2602 && !resolved_to_zero))
2605 || (htab->elf.dynamic_sections_created
2606 && (h->root.type == bfd_link_hash_undefweak
2607 || h->root.type == bfd_link_hash_undefined))))
2609 /* Make sure this symbol is output as a dynamic symbol.
2610 Undefined weak syms won't yet be marked as dynamic. */
2611 if (h->dynindx == -1
2613 && !resolved_to_zero)
2615 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2619 /* If that succeeded, we know we'll be keeping all the
2621 if (h->dynindx != -1)
2625 eh->dyn_relocs = NULL;
2626 eh->func_pointer_refcount = 0;
2631 /* Finally, allocate space. */
2632 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2636 sreloc = elf_section_data (p->sec)->sreloc;
2638 BFD_ASSERT (sreloc != NULL);
2639 sreloc->size += p->count * sizeof (Elf32_External_Rel);
2645 /* Allocate space in .plt, .got and associated reloc sections for
2646 local dynamic relocs. */
2649 elf_i386_allocate_local_dynrelocs (void **slot, void *inf)
2651 struct elf_link_hash_entry *h
2652 = (struct elf_link_hash_entry *) *slot;
2654 if (h->type != STT_GNU_IFUNC
2658 || h->root.type != bfd_link_hash_defined)
2661 return elf_i386_allocate_dynrelocs (h, inf);
2664 /* Find any dynamic relocs that apply to read-only sections. */
2667 elf_i386_readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
2669 struct elf_i386_link_hash_entry *eh;
2670 struct elf_dyn_relocs *p;
2672 /* Skip local IFUNC symbols. */
2673 if (h->forced_local && h->type == STT_GNU_IFUNC)
2676 eh = (struct elf_i386_link_hash_entry *) h;
2677 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2679 asection *s = p->sec->output_section;
2681 if (s != NULL && (s->flags & SEC_READONLY) != 0)
2683 struct bfd_link_info *info = (struct bfd_link_info *) inf;
2685 info->flags |= DF_TEXTREL;
2687 if ((info->warn_shared_textrel && bfd_link_pic (info))
2688 || info->error_textrel)
2689 info->callbacks->einfo (_("%P: %B: warning: relocation against `%s' in readonly section `%A'\n"),
2690 p->sec->owner, h->root.root.string,
2693 /* Not an error, just cut short the traversal. */
2700 /* With the local symbol, foo, we convert
2701 mov foo@GOT[(%reg1)], %reg2
2703 lea foo[@GOTOFF(%reg1)], %reg2
2705 call/jmp *foo@GOT[(%reg)]
2707 nop call foo/jmp foo nop
2708 When PIC is false, convert
2709 test %reg1, foo@GOT[(%reg2)]
2713 binop foo@GOT[(%reg1)], %reg2
2716 where binop is one of adc, add, and, cmp, or, sbb, sub, xor
2720 elf_i386_convert_load (bfd *abfd, asection *sec,
2721 struct bfd_link_info *link_info)
2723 Elf_Internal_Shdr *symtab_hdr;
2724 Elf_Internal_Rela *internal_relocs;
2725 Elf_Internal_Rela *irel, *irelend;
2727 struct elf_i386_link_hash_table *htab;
2728 bfd_boolean changed_contents;
2729 bfd_boolean changed_relocs;
2731 bfd_signed_vma *local_got_refcounts;
2733 /* Don't even try to convert non-ELF outputs. */
2734 if (!is_elf_hash_table (link_info->hash))
2737 /* Nothing to do if there is no need or no output. */
2738 if ((sec->flags & (SEC_CODE | SEC_RELOC)) != (SEC_CODE | SEC_RELOC)
2739 || sec->need_convert_load == 0
2740 || bfd_is_abs_section (sec->output_section))
2743 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2745 /* Load the relocations for this section. */
2746 internal_relocs = (_bfd_elf_link_read_relocs
2747 (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
2748 link_info->keep_memory));
2749 if (internal_relocs == NULL)
2752 htab = elf_i386_hash_table (link_info);
2753 changed_contents = FALSE;
2754 changed_relocs = FALSE;
2755 local_got_refcounts = elf_local_got_refcounts (abfd);
2757 is_pic = bfd_link_pic (link_info);
2759 /* Get the section contents. */
2760 if (elf_section_data (sec)->this_hdr.contents != NULL)
2761 contents = elf_section_data (sec)->this_hdr.contents;
2764 if (!bfd_malloc_and_get_section (abfd, sec, &contents))
2768 irelend = internal_relocs + sec->reloc_count;
2769 for (irel = internal_relocs; irel < irelend; irel++)
2771 unsigned int r_type = ELF32_R_TYPE (irel->r_info);
2772 unsigned int r_symndx = ELF32_R_SYM (irel->r_info);
2774 struct elf_link_hash_entry *h;
2775 unsigned int opcode;
2778 bfd_boolean baseless;
2779 Elf_Internal_Sym *isym;
2780 unsigned int addend;
2783 bfd_boolean to_reloc_32;
2785 if (r_type != R_386_GOT32 && r_type != R_386_GOT32X)
2788 roff = irel->r_offset;
2792 /* Addend for R_386_GOT32 and R_386_GOT32X relocations must be 0. */
2793 addend = bfd_get_32 (abfd, contents + roff);
2797 modrm = bfd_get_8 (abfd, contents + roff - 1);
2798 baseless = (modrm & 0xc7) == 0x5;
2800 if (r_type == R_386_GOT32X && baseless && is_pic)
2802 /* For PIC, disallow R_386_GOT32X without a base register
2803 since we don't know what the GOT base is. Allow
2804 R_386_GOT32 for existing object files. */
2807 if (r_symndx < symtab_hdr->sh_info)
2809 isym = bfd_sym_from_r_symndx (&htab->sym_cache, abfd,
2811 name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
2815 indx = r_symndx - symtab_hdr->sh_info;
2816 h = elf_sym_hashes (abfd)[indx];
2817 BFD_ASSERT (h != NULL);
2818 name = h->root.root.string;
2821 (*_bfd_error_handler)
2822 (_("%B: direct GOT relocation R_386_GOT32X against `%s' without base register can not be used when making a shared object"),
2827 opcode = bfd_get_8 (abfd, contents + roff - 2);
2829 /* Convert mov to lea since it has been done for a while. */
2832 /* Only convert R_386_GOT32X relocation for call, jmp or
2833 one of adc, add, and, cmp, or, sbb, sub, test, xor
2835 if (r_type != R_386_GOT32X)
2839 /* Convert to R_386_32 if PIC is false or there is no base
2841 to_reloc_32 = !is_pic || baseless;
2843 /* Try to convert R_386_GOT32 and R_386_GOT32X. Get the symbol
2844 referred to by the reloc. */
2845 if (r_symndx < symtab_hdr->sh_info)
2847 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
2850 /* STT_GNU_IFUNC must keep GOT32 relocations. */
2851 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
2855 if (opcode == 0x0ff)
2856 /* Convert "call/jmp *foo@GOT[(%reg)]". */
2857 goto convert_branch;
2859 /* Convert "mov foo@GOT[(%reg1)], %reg2",
2860 "test %reg1, foo@GOT(%reg2)" and
2861 "binop foo@GOT[(%reg1)], %reg2". */
2865 indx = r_symndx - symtab_hdr->sh_info;
2866 h = elf_sym_hashes (abfd)[indx];
2867 BFD_ASSERT (h != NULL);
2869 while (h->root.type == bfd_link_hash_indirect
2870 || h->root.type == bfd_link_hash_warning)
2871 h = (struct elf_link_hash_entry *) h->root.u.i.link;
2873 /* STT_GNU_IFUNC must keep GOT32 relocations. */
2874 if (h->type == STT_GNU_IFUNC)
2877 /* Undefined weak symbol is only bound locally in executable
2878 and its reference is resolved as 0. */
2879 if (UNDEFINED_WEAK_RESOLVED_TO_ZERO (link_info,
2880 elf_i386_hash_entry (h)))
2884 /* No direct branch to 0 for PIC. */
2888 goto convert_branch;
2892 /* We can convert load of address 0 to R_386_32. */
2900 /* We have "call/jmp *foo@GOT[(%reg)]". */
2901 if ((h->root.type == bfd_link_hash_defined
2902 || h->root.type == bfd_link_hash_defweak)
2903 && SYMBOL_REFERENCES_LOCAL (link_info, h))
2905 /* The function is locally defined. */
2907 /* Convert R_386_GOT32X to R_386_PC32. */
2908 if (modrm == 0x15 || (modrm & 0xf8) == 0x90)
2910 /* Convert to "nop call foo". ADDR_PREFIX_OPCODE
2913 nop = link_info->call_nop_byte;
2914 if (link_info->call_nop_as_suffix)
2916 nop_offset = roff + 3;
2917 irel->r_offset -= 1;
2920 nop_offset = roff - 2;
2924 /* Convert to "jmp foo nop". */
2927 nop_offset = roff + 3;
2928 irel->r_offset -= 1;
2931 bfd_put_8 (abfd, nop, contents + nop_offset);
2932 bfd_put_8 (abfd, modrm, contents + irel->r_offset - 1);
2933 /* When converting to PC-relative relocation, we
2934 need to adjust addend by -4. */
2935 bfd_put_32 (abfd, -4, contents + irel->r_offset);
2936 irel->r_info = ELF32_R_INFO (r_symndx, R_386_PC32);
2940 if (h->got.refcount > 0)
2941 h->got.refcount -= 1;
2945 if (local_got_refcounts != NULL
2946 && local_got_refcounts[r_symndx] > 0)
2947 local_got_refcounts[r_symndx] -= 1;
2950 changed_contents = TRUE;
2951 changed_relocs = TRUE;
2956 /* We have "mov foo@GOT[(%re1g)], %reg2",
2957 "test %reg1, foo@GOT(%reg2)" and
2958 "binop foo@GOT[(%reg1)], %reg2".
2960 Avoid optimizing _DYNAMIC since ld.so may use its
2961 link-time address. */
2962 if (h == htab->elf.hdynamic)
2965 /* def_regular is set by an assignment in a linker script in
2966 bfd_elf_record_link_assignment. */
2968 || h->root.type == bfd_link_hash_defined
2969 || h->root.type == bfd_link_hash_defweak)
2970 && SYMBOL_REFERENCES_LOCAL (link_info, h))
2977 /* Convert "mov foo@GOT[(%reg1)], %reg2" to
2978 "mov $foo, %reg2" with R_386_32. */
2980 modrm = 0xc0 | (modrm & 0x38) >> 3;
2981 bfd_put_8 (abfd, modrm, contents + roff - 1);
2986 /* Convert "mov foo@GOT(%reg1), %reg2" to
2987 "lea foo@GOTOFF(%reg1), %reg2". */
2988 r_type = R_386_GOTOFF;
2994 /* Only R_386_32 is supported. */
3000 /* Convert "test %reg1, foo@GOT(%reg2)" to
3001 "test $foo, %reg1". */
3002 modrm = 0xc0 | (modrm & 0x38) >> 3;
3007 /* Convert "binop foo@GOT(%reg1), %reg2" to
3008 "binop $foo, %reg2". */
3010 | (modrm & 0x38) >> 3
3014 bfd_put_8 (abfd, modrm, contents + roff - 1);
3018 bfd_put_8 (abfd, opcode, contents + roff - 2);
3019 irel->r_info = ELF32_R_INFO (r_symndx, r_type);
3023 if (h->got.refcount > 0)
3024 h->got.refcount -= 1;
3028 if (local_got_refcounts != NULL
3029 && local_got_refcounts[r_symndx] > 0)
3030 local_got_refcounts[r_symndx] -= 1;
3033 changed_contents = TRUE;
3034 changed_relocs = TRUE;
3039 if (contents != NULL
3040 && elf_section_data (sec)->this_hdr.contents != contents)
3042 if (!changed_contents && !link_info->keep_memory)
3046 /* Cache the section contents for elf_link_input_bfd. */
3047 elf_section_data (sec)->this_hdr.contents = contents;
3051 if (elf_section_data (sec)->relocs != internal_relocs)
3053 if (!changed_relocs)
3054 free (internal_relocs);
3056 elf_section_data (sec)->relocs = internal_relocs;
3062 if (contents != NULL
3063 && elf_section_data (sec)->this_hdr.contents != contents)
3065 if (internal_relocs != NULL
3066 && elf_section_data (sec)->relocs != internal_relocs)
3067 free (internal_relocs);
3071 /* Set the sizes of the dynamic sections. */
3074 elf_i386_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
3076 struct elf_i386_link_hash_table *htab;
3082 htab = elf_i386_hash_table (info);
3085 dynobj = htab->elf.dynobj;
3089 if (htab->elf.dynamic_sections_created)
3091 /* Set the contents of the .interp section to the interpreter. */
3092 if (bfd_link_executable (info) && !info->nointerp)
3094 s = bfd_get_linker_section (dynobj, ".interp");
3097 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
3098 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
3103 /* Set up .got offsets for local syms, and space for local dynamic
3105 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
3107 bfd_signed_vma *local_got;
3108 bfd_signed_vma *end_local_got;
3109 char *local_tls_type;
3110 bfd_vma *local_tlsdesc_gotent;
3111 bfd_size_type locsymcount;
3112 Elf_Internal_Shdr *symtab_hdr;
3115 if (! is_i386_elf (ibfd))
3118 for (s = ibfd->sections; s != NULL; s = s->next)
3120 struct elf_dyn_relocs *p;
3122 if (!elf_i386_convert_load (ibfd, s, info))
3125 for (p = ((struct elf_dyn_relocs *)
3126 elf_section_data (s)->local_dynrel);
3130 if (!bfd_is_abs_section (p->sec)
3131 && bfd_is_abs_section (p->sec->output_section))
3133 /* Input section has been discarded, either because
3134 it is a copy of a linkonce section or due to
3135 linker script /DISCARD/, so we'll be discarding
3138 else if (get_elf_i386_backend_data (output_bfd)->is_vxworks
3139 && strcmp (p->sec->output_section->name,
3142 /* Relocations in vxworks .tls_vars sections are
3143 handled specially by the loader. */
3145 else if (p->count != 0)
3147 srel = elf_section_data (p->sec)->sreloc;
3148 srel->size += p->count * sizeof (Elf32_External_Rel);
3149 if ((p->sec->output_section->flags & SEC_READONLY) != 0
3150 && (info->flags & DF_TEXTREL) == 0)
3152 info->flags |= DF_TEXTREL;
3153 if ((info->warn_shared_textrel && bfd_link_pic (info))
3154 || info->error_textrel)
3155 info->callbacks->einfo (_("%P: %B: warning: relocation in readonly section `%A'\n"),
3156 p->sec->owner, p->sec);
3162 local_got = elf_local_got_refcounts (ibfd);
3166 symtab_hdr = &elf_symtab_hdr (ibfd);
3167 locsymcount = symtab_hdr->sh_info;
3168 end_local_got = local_got + locsymcount;
3169 local_tls_type = elf_i386_local_got_tls_type (ibfd);
3170 local_tlsdesc_gotent = elf_i386_local_tlsdesc_gotent (ibfd);
3172 srel = htab->elf.srelgot;
3173 for (; local_got < end_local_got;
3174 ++local_got, ++local_tls_type, ++local_tlsdesc_gotent)
3176 *local_tlsdesc_gotent = (bfd_vma) -1;
3179 if (GOT_TLS_GDESC_P (*local_tls_type))
3181 *local_tlsdesc_gotent = htab->elf.sgotplt->size
3182 - elf_i386_compute_jump_table_size (htab);
3183 htab->elf.sgotplt->size += 8;
3184 *local_got = (bfd_vma) -2;
3186 if (! GOT_TLS_GDESC_P (*local_tls_type)
3187 || GOT_TLS_GD_P (*local_tls_type))
3189 *local_got = s->size;
3191 if (GOT_TLS_GD_P (*local_tls_type)
3192 || *local_tls_type == GOT_TLS_IE_BOTH)
3195 if (bfd_link_pic (info)
3196 || GOT_TLS_GD_ANY_P (*local_tls_type)
3197 || (*local_tls_type & GOT_TLS_IE))
3199 if (*local_tls_type == GOT_TLS_IE_BOTH)
3200 srel->size += 2 * sizeof (Elf32_External_Rel);
3201 else if (GOT_TLS_GD_P (*local_tls_type)
3202 || ! GOT_TLS_GDESC_P (*local_tls_type))
3203 srel->size += sizeof (Elf32_External_Rel);
3204 if (GOT_TLS_GDESC_P (*local_tls_type))
3205 htab->elf.srelplt->size += sizeof (Elf32_External_Rel);
3209 *local_got = (bfd_vma) -1;
3213 if (htab->tls_ldm_got.refcount > 0)
3215 /* Allocate 2 got entries and 1 dynamic reloc for R_386_TLS_LDM
3217 htab->tls_ldm_got.offset = htab->elf.sgot->size;
3218 htab->elf.sgot->size += 8;
3219 htab->elf.srelgot->size += sizeof (Elf32_External_Rel);
3222 htab->tls_ldm_got.offset = -1;
3224 /* Allocate global sym .plt and .got entries, and space for global
3225 sym dynamic relocs. */
3226 elf_link_hash_traverse (&htab->elf, elf_i386_allocate_dynrelocs, info);
3228 /* Allocate .plt and .got entries, and space for local symbols. */
3229 htab_traverse (htab->loc_hash_table,
3230 elf_i386_allocate_local_dynrelocs,
3233 /* For every jump slot reserved in the sgotplt, reloc_count is
3234 incremented. However, when we reserve space for TLS descriptors,
3235 it's not incremented, so in order to compute the space reserved
3236 for them, it suffices to multiply the reloc count by the jump
3239 PR ld/13302: We start next_irelative_index at the end of .rela.plt
3240 so that R_386_IRELATIVE entries come last. */
3241 if (htab->elf.srelplt)
3243 htab->next_tls_desc_index = htab->elf.srelplt->reloc_count;
3244 htab->sgotplt_jump_table_size = htab->next_tls_desc_index * 4;
3245 htab->next_irelative_index = htab->elf.srelplt->reloc_count - 1;
3247 else if (htab->elf.irelplt)
3248 htab->next_irelative_index = htab->elf.irelplt->reloc_count - 1;
3251 if (htab->elf.sgotplt)
3253 /* Don't allocate .got.plt section if there are no GOT nor PLT
3254 entries and there is no reference to _GLOBAL_OFFSET_TABLE_. */
3255 if ((htab->elf.hgot == NULL
3256 || !htab->elf.hgot->ref_regular_nonweak)
3257 && (htab->elf.sgotplt->size
3258 == get_elf_backend_data (output_bfd)->got_header_size)
3259 && (htab->elf.splt == NULL
3260 || htab->elf.splt->size == 0)
3261 && (htab->elf.sgot == NULL
3262 || htab->elf.sgot->size == 0)
3263 && (htab->elf.iplt == NULL
3264 || htab->elf.iplt->size == 0)
3265 && (htab->elf.igotplt == NULL
3266 || htab->elf.igotplt->size == 0))
3267 htab->elf.sgotplt->size = 0;
3271 if (htab->plt_eh_frame != NULL
3272 && htab->elf.splt != NULL
3273 && htab->elf.splt->size != 0
3274 && !bfd_is_abs_section (htab->elf.splt->output_section)
3275 && _bfd_elf_eh_frame_present (info))
3276 htab->plt_eh_frame->size = sizeof (elf_i386_eh_frame_plt);
3278 /* We now have determined the sizes of the various dynamic sections.
3279 Allocate memory for them. */
3281 for (s = dynobj->sections; s != NULL; s = s->next)
3283 bfd_boolean strip_section = TRUE;
3285 if ((s->flags & SEC_LINKER_CREATED) == 0)
3288 if (s == htab->elf.splt
3289 || s == htab->elf.sgot)
3291 /* Strip this section if we don't need it; see the
3293 /* We'd like to strip these sections if they aren't needed, but if
3294 we've exported dynamic symbols from them we must leave them.
3295 It's too late to tell BFD to get rid of the symbols. */
3297 if (htab->elf.hplt != NULL)
3298 strip_section = FALSE;
3300 else if (s == htab->elf.sgotplt
3301 || s == htab->elf.iplt
3302 || s == htab->elf.igotplt
3303 || s == htab->plt_got
3304 || s == htab->plt_eh_frame
3305 || s == htab->sdynbss)
3307 /* Strip these too. */
3309 else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rel"))
3312 && s != htab->elf.srelplt
3313 && s != htab->srelplt2)
3316 /* We use the reloc_count field as a counter if we need
3317 to copy relocs into the output file. */
3322 /* It's not one of our sections, so don't allocate space. */
3328 /* If we don't need this section, strip it from the
3329 output file. This is mostly to handle .rel.bss and
3330 .rel.plt. We must create both sections in
3331 create_dynamic_sections, because they must be created
3332 before the linker maps input sections to output
3333 sections. The linker does that before
3334 adjust_dynamic_symbol is called, and it is that
3335 function which decides whether anything needs to go
3336 into these sections. */
3338 s->flags |= SEC_EXCLUDE;
3342 if ((s->flags & SEC_HAS_CONTENTS) == 0)
3345 /* Allocate memory for the section contents. We use bfd_zalloc
3346 here in case unused entries are not reclaimed before the
3347 section's contents are written out. This should not happen,
3348 but this way if it does, we get a R_386_NONE reloc instead
3350 s->contents = (unsigned char *) bfd_zalloc (dynobj, s->size);
3351 if (s->contents == NULL)
3355 if (htab->plt_eh_frame != NULL
3356 && htab->plt_eh_frame->contents != NULL)
3358 memcpy (htab->plt_eh_frame->contents, elf_i386_eh_frame_plt,
3359 sizeof (elf_i386_eh_frame_plt));
3360 bfd_put_32 (dynobj, htab->elf.splt->size,
3361 htab->plt_eh_frame->contents + PLT_FDE_LEN_OFFSET);
3364 if (htab->elf.dynamic_sections_created)
3366 /* Add some entries to the .dynamic section. We fill in the
3367 values later, in elf_i386_finish_dynamic_sections, but we
3368 must add the entries now so that we get the correct size for
3369 the .dynamic section. The DT_DEBUG entry is filled in by the
3370 dynamic linker and used by the debugger. */
3371 #define add_dynamic_entry(TAG, VAL) \
3372 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
3374 if (bfd_link_executable (info))
3376 if (!add_dynamic_entry (DT_DEBUG, 0))
3380 if (htab->elf.splt->size != 0)
3382 /* DT_PLTGOT is used by prelink even if there is no PLT
3384 if (!add_dynamic_entry (DT_PLTGOT, 0))
3387 if (htab->elf.srelplt->size != 0)
3389 if (!add_dynamic_entry (DT_PLTRELSZ, 0)
3390 || !add_dynamic_entry (DT_PLTREL, DT_REL)
3391 || !add_dynamic_entry (DT_JMPREL, 0))
3398 if (!add_dynamic_entry (DT_REL, 0)
3399 || !add_dynamic_entry (DT_RELSZ, 0)
3400 || !add_dynamic_entry (DT_RELENT, sizeof (Elf32_External_Rel)))
3403 /* If any dynamic relocs apply to a read-only section,
3404 then we need a DT_TEXTREL entry. */
3405 if ((info->flags & DF_TEXTREL) == 0)
3406 elf_link_hash_traverse (&htab->elf,
3407 elf_i386_readonly_dynrelocs, info);
3409 if ((info->flags & DF_TEXTREL) != 0)
3411 if (htab->readonly_dynrelocs_against_ifunc)
3413 info->callbacks->einfo
3414 (_("%P%X: read-only segment has dynamic IFUNC relocations; recompile with -fPIC\n"));
3415 bfd_set_error (bfd_error_bad_value);
3419 if (!add_dynamic_entry (DT_TEXTREL, 0))
3423 if (get_elf_i386_backend_data (output_bfd)->is_vxworks
3424 && !elf_vxworks_add_dynamic_entries (output_bfd, info))
3427 #undef add_dynamic_entry
3433 elf_i386_always_size_sections (bfd *output_bfd,
3434 struct bfd_link_info *info)
3436 asection *tls_sec = elf_hash_table (info)->tls_sec;
3440 struct elf_link_hash_entry *tlsbase;
3442 tlsbase = elf_link_hash_lookup (elf_hash_table (info),
3443 "_TLS_MODULE_BASE_",
3444 FALSE, FALSE, FALSE);
3446 if (tlsbase && tlsbase->type == STT_TLS)
3448 struct elf_i386_link_hash_table *htab;
3449 struct bfd_link_hash_entry *bh = NULL;
3450 const struct elf_backend_data *bed
3451 = get_elf_backend_data (output_bfd);
3453 htab = elf_i386_hash_table (info);
3457 if (!(_bfd_generic_link_add_one_symbol
3458 (info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL,
3459 tls_sec, 0, NULL, FALSE,
3460 bed->collect, &bh)))
3463 htab->tls_module_base = bh;
3465 tlsbase = (struct elf_link_hash_entry *)bh;
3466 tlsbase->def_regular = 1;
3467 tlsbase->other = STV_HIDDEN;
3468 tlsbase->root.linker_def = 1;
3469 (*bed->elf_backend_hide_symbol) (info, tlsbase, TRUE);
3476 /* Set the correct type for an x86 ELF section. We do this by the
3477 section name, which is a hack, but ought to work. */
3480 elf_i386_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
3481 Elf_Internal_Shdr *hdr,
3486 name = bfd_get_section_name (abfd, sec);
3488 /* This is an ugly, but unfortunately necessary hack that is
3489 needed when producing EFI binaries on x86. It tells
3490 elf.c:elf_fake_sections() not to consider ".reloc" as a section
3491 containing ELF relocation info. We need this hack in order to
3492 be able to generate ELF binaries that can be translated into
3493 EFI applications (which are essentially COFF objects). Those
3494 files contain a COFF ".reloc" section inside an ELFNN object,
3495 which would normally cause BFD to segfault because it would
3496 attempt to interpret this section as containing relocation
3497 entries for section "oc". With this hack enabled, ".reloc"
3498 will be treated as a normal data section, which will avoid the
3499 segfault. However, you won't be able to create an ELFNN binary
3500 with a section named "oc" that needs relocations, but that's
3501 the kind of ugly side-effects you get when detecting section
3502 types based on their names... In practice, this limitation is
3503 unlikely to bite. */
3504 if (strcmp (name, ".reloc") == 0)
3505 hdr->sh_type = SHT_PROGBITS;
3510 /* _TLS_MODULE_BASE_ needs to be treated especially when linking
3511 executables. Rather than setting it to the beginning of the TLS
3512 section, we have to set it to the end. This function may be called
3513 multiple times, it is idempotent. */
3516 elf_i386_set_tls_module_base (struct bfd_link_info *info)
3518 struct elf_i386_link_hash_table *htab;
3519 struct bfd_link_hash_entry *base;
3521 if (!bfd_link_executable (info))
3524 htab = elf_i386_hash_table (info);
3528 base = htab->tls_module_base;
3532 base->u.def.value = htab->elf.tls_size;
3535 /* Return the base VMA address which should be subtracted from real addresses
3536 when resolving @dtpoff relocation.
3537 This is PT_TLS segment p_vaddr. */
3540 elf_i386_dtpoff_base (struct bfd_link_info *info)
3542 /* If tls_sec is NULL, we should have signalled an error already. */
3543 if (elf_hash_table (info)->tls_sec == NULL)
3545 return elf_hash_table (info)->tls_sec->vma;
3548 /* Return the relocation value for @tpoff relocation
3549 if STT_TLS virtual address is ADDRESS. */
3552 elf_i386_tpoff (struct bfd_link_info *info, bfd_vma address)
3554 struct elf_link_hash_table *htab = elf_hash_table (info);
3555 const struct elf_backend_data *bed = get_elf_backend_data (info->output_bfd);
3556 bfd_vma static_tls_size;
3558 /* If tls_sec is NULL, we should have signalled an error already. */
3559 if (htab->tls_sec == NULL)
3562 /* Consider special static TLS alignment requirements. */
3563 static_tls_size = BFD_ALIGN (htab->tls_size, bed->static_tls_alignment);
3564 return static_tls_size + htab->tls_sec->vma - address;
3567 /* Relocate an i386 ELF section. */
3570 elf_i386_relocate_section (bfd *output_bfd,
3571 struct bfd_link_info *info,
3573 asection *input_section,
3575 Elf_Internal_Rela *relocs,
3576 Elf_Internal_Sym *local_syms,
3577 asection **local_sections)
3579 struct elf_i386_link_hash_table *htab;
3580 Elf_Internal_Shdr *symtab_hdr;
3581 struct elf_link_hash_entry **sym_hashes;
3582 bfd_vma *local_got_offsets;
3583 bfd_vma *local_tlsdesc_gotents;
3584 Elf_Internal_Rela *rel;
3585 Elf_Internal_Rela *wrel;
3586 Elf_Internal_Rela *relend;
3587 bfd_boolean is_vxworks_tls;
3588 unsigned plt_entry_size;
3590 BFD_ASSERT (is_i386_elf (input_bfd));
3592 /* Skip if check_relocs failed. */
3593 if (input_section->check_relocs_failed)
3596 htab = elf_i386_hash_table (info);
3599 symtab_hdr = &elf_symtab_hdr (input_bfd);
3600 sym_hashes = elf_sym_hashes (input_bfd);
3601 local_got_offsets = elf_local_got_offsets (input_bfd);
3602 local_tlsdesc_gotents = elf_i386_local_tlsdesc_gotent (input_bfd);
3603 /* We have to handle relocations in vxworks .tls_vars sections
3604 specially, because the dynamic loader is 'weird'. */
3605 is_vxworks_tls = (get_elf_i386_backend_data (output_bfd)->is_vxworks
3606 && bfd_link_pic (info)
3607 && !strcmp (input_section->output_section->name,
3610 elf_i386_set_tls_module_base (info);
3612 plt_entry_size = GET_PLT_ENTRY_SIZE (output_bfd);
3614 rel = wrel = relocs;
3615 relend = relocs + input_section->reloc_count;
3616 for (; rel < relend; wrel++, rel++)
3618 unsigned int r_type;
3619 reloc_howto_type *howto;
3620 unsigned long r_symndx;
3621 struct elf_link_hash_entry *h;
3622 struct elf_i386_link_hash_entry *eh;
3623 Elf_Internal_Sym *sym;
3625 bfd_vma off, offplt, plt_offset;
3627 bfd_boolean unresolved_reloc;
3628 bfd_reloc_status_type r;
3632 asection *resolved_plt;
3633 bfd_boolean resolved_to_zero;
3635 r_type = ELF32_R_TYPE (rel->r_info);
3636 if (r_type == R_386_GNU_VTINHERIT
3637 || r_type == R_386_GNU_VTENTRY)
3644 if ((indx = r_type) >= R_386_standard
3645 && ((indx = r_type - R_386_ext_offset) - R_386_standard
3646 >= R_386_ext - R_386_standard)
3647 && ((indx = r_type - R_386_tls_offset) - R_386_ext
3648 >= R_386_ext2 - R_386_ext))
3650 (*_bfd_error_handler)
3651 (_("%B: unrecognized relocation (0x%x) in section `%A'"),
3652 input_bfd, input_section, r_type);
3653 bfd_set_error (bfd_error_bad_value);
3656 howto = elf_howto_table + indx;
3658 r_symndx = ELF32_R_SYM (rel->r_info);
3662 unresolved_reloc = FALSE;
3663 if (r_symndx < symtab_hdr->sh_info)
3665 sym = local_syms + r_symndx;
3666 sec = local_sections[r_symndx];
3667 relocation = (sec->output_section->vma
3668 + sec->output_offset
3670 st_size = sym->st_size;
3672 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION
3673 && ((sec->flags & SEC_MERGE) != 0
3674 || (bfd_link_relocatable (info)
3675 && sec->output_offset != 0)))
3678 bfd_byte *where = contents + rel->r_offset;
3680 switch (howto->size)
3683 addend = bfd_get_8 (input_bfd, where);
3684 if (howto->pc_relative)
3686 addend = (addend ^ 0x80) - 0x80;
3691 addend = bfd_get_16 (input_bfd, where);
3692 if (howto->pc_relative)
3694 addend = (addend ^ 0x8000) - 0x8000;
3699 addend = bfd_get_32 (input_bfd, where);
3700 if (howto->pc_relative)
3702 addend = (addend ^ 0x80000000) - 0x80000000;
3710 if (bfd_link_relocatable (info))
3711 addend += sec->output_offset;
3714 asection *msec = sec;
3715 addend = _bfd_elf_rel_local_sym (output_bfd, sym, &msec,
3717 addend -= relocation;
3718 addend += msec->output_section->vma + msec->output_offset;
3721 switch (howto->size)
3724 /* FIXME: overflow checks. */
3725 if (howto->pc_relative)
3727 bfd_put_8 (input_bfd, addend, where);
3730 if (howto->pc_relative)
3732 bfd_put_16 (input_bfd, addend, where);
3735 if (howto->pc_relative)
3737 bfd_put_32 (input_bfd, addend, where);
3741 else if (!bfd_link_relocatable (info)
3742 && ELF32_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
3744 /* Relocate against local STT_GNU_IFUNC symbol. */
3745 h = elf_i386_get_local_sym_hash (htab, input_bfd, rel,
3750 /* Set STT_GNU_IFUNC symbol value. */
3751 h->root.u.def.value = sym->st_value;
3752 h->root.u.def.section = sec;
3757 bfd_boolean warned ATTRIBUTE_UNUSED;
3758 bfd_boolean ignored ATTRIBUTE_UNUSED;
3760 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
3761 r_symndx, symtab_hdr, sym_hashes,
3763 unresolved_reloc, warned, ignored);
3767 if (sec != NULL && discarded_section (sec))
3769 _bfd_clear_contents (howto, input_bfd, input_section,
3770 contents + rel->r_offset);
3771 wrel->r_offset = rel->r_offset;
3775 /* For ld -r, remove relocations in debug sections against
3776 sections defined in discarded sections. Not done for
3777 eh_frame editing code expects to be present. */
3778 if (bfd_link_relocatable (info)
3779 && (input_section->flags & SEC_DEBUGGING))
3785 if (bfd_link_relocatable (info))
3792 /* Since STT_GNU_IFUNC symbol must go through PLT, we handle
3793 it here if it is defined in a non-shared object. */
3795 && h->type == STT_GNU_IFUNC
3798 asection *plt, *gotplt, *base_got;
3802 if ((input_section->flags & SEC_ALLOC) == 0)
3804 /* Dynamic relocs are not propagated for SEC_DEBUGGING
3805 sections because such sections are not SEC_ALLOC and
3806 thus ld.so will not process them. */
3807 if ((input_section->flags & SEC_DEBUGGING) != 0)
3811 else if (h->plt.offset == (bfd_vma) -1)
3814 /* STT_GNU_IFUNC symbol must go through PLT. */
3815 if (htab->elf.splt != NULL)
3817 plt = htab->elf.splt;
3818 gotplt = htab->elf.sgotplt;
3822 plt = htab->elf.iplt;
3823 gotplt = htab->elf.igotplt;
3826 relocation = (plt->output_section->vma
3827 + plt->output_offset + h->plt.offset);
3832 if (h->root.root.string)
3833 name = h->root.root.string;
3835 name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
3837 (*_bfd_error_handler)
3838 (_("%B: relocation %s against STT_GNU_IFUNC "
3839 "symbol `%s' isn't handled by %s"), input_bfd,
3840 elf_howto_table[r_type].name,
3841 name, __FUNCTION__);
3842 bfd_set_error (bfd_error_bad_value);
3846 /* Generate dynamic relcoation only when there is a
3847 non-GOT reference in a shared object. */
3848 if (bfd_link_pic (info) && h->non_got_ref)
3850 Elf_Internal_Rela outrel;
3854 /* Need a dynamic relocation to get the real function
3856 offset = _bfd_elf_section_offset (output_bfd,
3860 if (offset == (bfd_vma) -1
3861 || offset == (bfd_vma) -2)
3864 outrel.r_offset = (input_section->output_section->vma
3865 + input_section->output_offset
3868 if (h->dynindx == -1
3870 || bfd_link_executable (info))
3872 /* This symbol is resolved locally. */
3873 outrel.r_info = ELF32_R_INFO (0, R_386_IRELATIVE);
3874 bfd_put_32 (output_bfd,
3875 (h->root.u.def.value
3876 + h->root.u.def.section->output_section->vma
3877 + h->root.u.def.section->output_offset),
3881 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
3883 sreloc = htab->elf.irelifunc;
3884 elf_append_rel (output_bfd, sreloc, &outrel);
3886 /* If this reloc is against an external symbol, we
3887 do not want to fiddle with the addend. Otherwise,
3888 we need to include the symbol value so that it
3889 becomes an addend for the dynamic reloc. For an
3890 internal symbol, we have updated addend. */
3900 base_got = htab->elf.sgot;
3901 off = h->got.offset;
3903 if (base_got == NULL)
3906 if (off == (bfd_vma) -1)
3908 /* We can't use h->got.offset here to save state, or
3909 even just remember the offset, as finish_dynamic_symbol
3910 would use that as offset into .got. */
3912 if (htab->elf.splt != NULL)
3914 plt_index = h->plt.offset / plt_entry_size - 1;
3915 off = (plt_index + 3) * 4;
3916 base_got = htab->elf.sgotplt;
3920 plt_index = h->plt.offset / plt_entry_size;
3921 off = plt_index * 4;
3922 base_got = htab->elf.igotplt;
3925 if (h->dynindx == -1
3929 /* This references the local defitionion. We must
3930 initialize this entry in the global offset table.
3931 Since the offset must always be a multiple of 8,
3932 we use the least significant bit to record
3933 whether we have initialized it already.
3935 When doing a dynamic link, we create a .rela.got
3936 relocation entry to initialize the value. This
3937 is done in the finish_dynamic_symbol routine. */
3942 bfd_put_32 (output_bfd, relocation,
3943 base_got->contents + off);
3950 /* Adjust for static executables. */
3951 if (htab->elf.splt == NULL)
3952 relocation += gotplt->output_offset;
3956 relocation = (base_got->output_section->vma
3957 + base_got->output_offset + off
3958 - gotplt->output_section->vma
3959 - gotplt->output_offset);
3960 /* Adjust for static executables. */
3961 if (htab->elf.splt == NULL)
3962 relocation += gotplt->output_offset;
3968 relocation -= (gotplt->output_section->vma
3969 + gotplt->output_offset);
3974 eh = (struct elf_i386_link_hash_entry *) h;
3975 resolved_to_zero = (eh != NULL
3976 && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh));
3981 /* Avoid optimizing _DYNAMIC since ld.so may use its
3982 link-time address. */
3983 if (h == htab->elf.hdynamic)
3986 if (bfd_link_pic (info))
3988 /* It is OK to convert mov to lea and convert indirect
3989 branch to direct branch. It is OK to convert adc,
3990 add, and, cmp, or, sbb, sub, test, xor only when PIC
3992 unsigned int opcode, addend;
3993 addend = bfd_get_32 (input_bfd, contents + rel->r_offset);
3996 opcode = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
3997 if (opcode != 0x8b && opcode != 0xff)
4001 /* Resolve "mov GOT[(%reg)], %reg",
4002 "call/jmp *GOT[(%reg)]", "test %reg, foo@GOT[(%reg)]"
4003 and "binop foo@GOT[(%reg)], %reg". */
4005 || (h->plt.offset == (bfd_vma) -1
4006 && h->got.offset == (bfd_vma) -1)
4007 || htab->elf.sgotplt == NULL)
4010 offplt = (htab->elf.sgotplt->output_section->vma
4011 + htab->elf.sgotplt->output_offset);
4013 /* It is relative to .got.plt section. */
4014 if (h->got.offset != (bfd_vma) -1)
4015 /* Use GOT entry. Mask off the least significant bit in
4016 GOT offset which may be set by R_386_GOT32 processing
4018 relocation = (htab->elf.sgot->output_section->vma
4019 + htab->elf.sgot->output_offset
4020 + (h->got.offset & ~1) - offplt);
4022 /* Use GOTPLT entry. */
4023 relocation = (h->plt.offset / plt_entry_size - 1 + 3) * 4;
4025 if (!bfd_link_pic (info))
4027 /* If not PIC, add the .got.plt section address for
4028 baseless addressing. */
4030 modrm = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
4031 if ((modrm & 0xc7) == 0x5)
4032 relocation += offplt;
4035 unresolved_reloc = FALSE;
4040 /* Relocation is to the entry for this symbol in the global
4042 if (htab->elf.sgot == NULL)
4049 off = h->got.offset;
4050 dyn = htab->elf.dynamic_sections_created;
4051 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
4052 bfd_link_pic (info),
4054 || (bfd_link_pic (info)
4055 && SYMBOL_REFERENCES_LOCAL (info, h))
4056 || (ELF_ST_VISIBILITY (h->other)
4057 && h->root.type == bfd_link_hash_undefweak))
4059 /* This is actually a static link, or it is a
4060 -Bsymbolic link and the symbol is defined
4061 locally, or the symbol was forced to be local
4062 because of a version file. We must initialize
4063 this entry in the global offset table. Since the
4064 offset must always be a multiple of 4, we use the
4065 least significant bit to record whether we have
4066 initialized it already.
4068 When doing a dynamic link, we create a .rel.got
4069 relocation entry to initialize the value. This
4070 is done in the finish_dynamic_symbol routine. */
4075 bfd_put_32 (output_bfd, relocation,
4076 htab->elf.sgot->contents + off);
4081 unresolved_reloc = FALSE;
4085 if (local_got_offsets == NULL)
4088 off = local_got_offsets[r_symndx];
4090 /* The offset must always be a multiple of 4. We use
4091 the least significant bit to record whether we have
4092 already generated the necessary reloc. */
4097 bfd_put_32 (output_bfd, relocation,
4098 htab->elf.sgot->contents + off);
4100 if (bfd_link_pic (info))
4103 Elf_Internal_Rela outrel;
4105 s = htab->elf.srelgot;
4109 outrel.r_offset = (htab->elf.sgot->output_section->vma
4110 + htab->elf.sgot->output_offset
4112 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
4113 elf_append_rel (output_bfd, s, &outrel);
4116 local_got_offsets[r_symndx] |= 1;
4120 if (off >= (bfd_vma) -2)
4123 relocation = htab->elf.sgot->output_section->vma
4124 + htab->elf.sgot->output_offset + off
4125 - htab->elf.sgotplt->output_section->vma
4126 - htab->elf.sgotplt->output_offset;
4130 /* Relocation is relative to the start of the global offset
4133 /* Check to make sure it isn't a protected function or data
4134 symbol for shared library since it may not be local when
4135 used as function address or with copy relocation. We also
4136 need to make sure that a symbol is referenced locally. */
4137 if (!bfd_link_executable (info) && h)
4139 if (!h->def_regular)
4143 switch (ELF_ST_VISIBILITY (h->other))
4146 v = _("hidden symbol");
4149 v = _("internal symbol");
4152 v = _("protected symbol");
4159 (*_bfd_error_handler)
4160 (_("%B: relocation R_386_GOTOFF against undefined %s `%s' can not be used when making a shared object"),
4161 input_bfd, v, h->root.root.string);
4162 bfd_set_error (bfd_error_bad_value);
4165 else if (!SYMBOL_REFERENCES_LOCAL (info, h)
4166 && (h->type == STT_FUNC
4167 || h->type == STT_OBJECT)
4168 && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
4170 (*_bfd_error_handler)
4171 (_("%B: relocation R_386_GOTOFF against protected %s `%s' can not be used when making a shared object"),
4173 h->type == STT_FUNC ? "function" : "data",
4174 h->root.root.string);
4175 bfd_set_error (bfd_error_bad_value);
4180 /* Note that sgot is not involved in this
4181 calculation. We always want the start of .got.plt. If we
4182 defined _GLOBAL_OFFSET_TABLE_ in a different way, as is
4183 permitted by the ABI, we might have to change this
4185 relocation -= htab->elf.sgotplt->output_section->vma
4186 + htab->elf.sgotplt->output_offset;
4190 /* Use global offset table as symbol value. */
4191 relocation = htab->elf.sgotplt->output_section->vma
4192 + htab->elf.sgotplt->output_offset;
4193 unresolved_reloc = FALSE;
4197 /* Relocation is to the entry for this symbol in the
4198 procedure linkage table. */
4200 /* Resolve a PLT32 reloc against a local symbol directly,
4201 without using the procedure linkage table. */
4205 if ((h->plt.offset == (bfd_vma) -1
4206 && eh->plt_got.offset == (bfd_vma) -1)
4207 || htab->elf.splt == NULL)
4209 /* We didn't make a PLT entry for this symbol. This
4210 happens when statically linking PIC code, or when
4211 using -Bsymbolic. */
4215 if (h->plt.offset != (bfd_vma) -1)
4217 resolved_plt = htab->elf.splt;
4218 plt_offset = h->plt.offset;
4222 resolved_plt = htab->plt_got;
4223 plt_offset = eh->plt_got.offset;
4226 relocation = (resolved_plt->output_section->vma
4227 + resolved_plt->output_offset
4229 unresolved_reloc = FALSE;
4233 /* Set to symbol size. */
4234 relocation = st_size;
4239 if ((input_section->flags & SEC_ALLOC) == 0
4243 /* Copy dynamic function pointer relocations. Don't generate
4244 dynamic relocations against resolved undefined weak symbols
4245 in PIE, except for R_386_PC32. */
4246 if ((bfd_link_pic (info)
4248 || ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4249 && (!resolved_to_zero
4250 || r_type == R_386_PC32))
4251 || h->root.type != bfd_link_hash_undefweak))
4252 && ((r_type != R_386_PC32 && r_type != R_386_SIZE32)
4253 || !SYMBOL_CALLS_LOCAL (info, h)))
4254 || (ELIMINATE_COPY_RELOCS
4255 && !bfd_link_pic (info)
4259 || eh->func_pointer_refcount > 0
4260 || (h->root.type == bfd_link_hash_undefweak
4261 && !resolved_to_zero))
4262 && ((h->def_dynamic && !h->def_regular)
4263 /* Undefined weak symbol is bound locally when
4265 || h->root.type == bfd_link_hash_undefweak)))
4267 Elf_Internal_Rela outrel;
4268 bfd_boolean skip, relocate;
4271 /* When generating a shared object, these relocations
4272 are copied into the output file to be resolved at run
4279 _bfd_elf_section_offset (output_bfd, info, input_section,
4281 if (outrel.r_offset == (bfd_vma) -1)
4283 else if (outrel.r_offset == (bfd_vma) -2)
4284 skip = TRUE, relocate = TRUE;
4285 outrel.r_offset += (input_section->output_section->vma
4286 + input_section->output_offset);
4289 memset (&outrel, 0, sizeof outrel);
4292 && (r_type == R_386_PC32
4293 || !(bfd_link_executable (info)
4294 || SYMBOLIC_BIND (info, h))
4295 || !h->def_regular))
4296 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
4299 /* This symbol is local, or marked to become local. */
4301 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
4304 sreloc = elf_section_data (input_section)->sreloc;
4306 if (sreloc == NULL || sreloc->contents == NULL)
4308 r = bfd_reloc_notsupported;
4309 goto check_relocation_error;
4312 elf_append_rel (output_bfd, sreloc, &outrel);
4314 /* If this reloc is against an external symbol, we do
4315 not want to fiddle with the addend. Otherwise, we
4316 need to include the symbol value so that it becomes
4317 an addend for the dynamic reloc. */
4324 if (!bfd_link_executable (info))
4326 Elf_Internal_Rela outrel;
4329 outrel.r_offset = rel->r_offset
4330 + input_section->output_section->vma
4331 + input_section->output_offset;
4332 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
4333 sreloc = elf_section_data (input_section)->sreloc;
4336 elf_append_rel (output_bfd, sreloc, &outrel);
4341 case R_386_TLS_GOTDESC:
4342 case R_386_TLS_DESC_CALL:
4343 case R_386_TLS_IE_32:
4344 case R_386_TLS_GOTIE:
4345 tls_type = GOT_UNKNOWN;
4346 if (h == NULL && local_got_offsets)
4347 tls_type = elf_i386_local_got_tls_type (input_bfd) [r_symndx];
4349 tls_type = elf_i386_hash_entry(h)->tls_type;
4350 if (tls_type == GOT_TLS_IE)
4351 tls_type = GOT_TLS_IE_NEG;
4353 if (! elf_i386_tls_transition (info, input_bfd,
4354 input_section, contents,
4355 symtab_hdr, sym_hashes,
4356 &r_type, tls_type, rel,
4357 relend, h, r_symndx))
4360 if (r_type == R_386_TLS_LE_32)
4362 BFD_ASSERT (! unresolved_reloc);
4363 if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GD)
4368 /* GD->LE transition. */
4369 type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
4372 /* leal foo(,%reg,1), %eax; call ___tls_get_addr
4374 movl %gs:0, %eax; subl $foo@tpoff, %eax
4375 (6 byte form of subl). */
4376 memcpy (contents + rel->r_offset - 3,
4377 "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12);
4378 roff = rel->r_offset + 5;
4382 /* leal foo(%reg), %eax; call ___tls_get_addr; nop
4384 movl %gs:0, %eax; subl $foo@tpoff, %eax
4385 (6 byte form of subl). */
4386 memcpy (contents + rel->r_offset - 2,
4387 "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12);
4388 roff = rel->r_offset + 6;
4390 bfd_put_32 (output_bfd, elf_i386_tpoff (info, relocation),
4392 /* Skip R_386_PC32/R_386_PLT32. */
4397 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GOTDESC)
4399 /* GDesc -> LE transition.
4400 It's originally something like:
4401 leal x@tlsdesc(%ebx), %eax
4405 Registers other than %eax may be set up here. */
4410 roff = rel->r_offset;
4411 val = bfd_get_8 (input_bfd, contents + roff - 1);
4413 /* Now modify the instruction as appropriate. */
4414 /* aoliva FIXME: remove the above and xor the byte
4416 bfd_put_8 (output_bfd, val ^ 0x86,
4417 contents + roff - 1);
4418 bfd_put_32 (output_bfd, -elf_i386_tpoff (info, relocation),
4422 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_DESC_CALL)
4424 /* GDesc -> LE transition.
4432 roff = rel->r_offset;
4433 bfd_put_8 (output_bfd, 0x66, contents + roff);
4434 bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
4437 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_IE)
4441 /* IE->LE transition:
4442 Originally it can be one of:
4450 val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
4453 /* movl foo, %eax. */
4454 bfd_put_8 (output_bfd, 0xb8,
4455 contents + rel->r_offset - 1);
4461 type = bfd_get_8 (input_bfd,
4462 contents + rel->r_offset - 2);
4467 bfd_put_8 (output_bfd, 0xc7,
4468 contents + rel->r_offset - 2);
4469 bfd_put_8 (output_bfd,
4470 0xc0 | ((val >> 3) & 7),
4471 contents + rel->r_offset - 1);
4475 bfd_put_8 (output_bfd, 0x81,
4476 contents + rel->r_offset - 2);
4477 bfd_put_8 (output_bfd,
4478 0xc0 | ((val >> 3) & 7),
4479 contents + rel->r_offset - 1);
4486 bfd_put_32 (output_bfd, -elf_i386_tpoff (info, relocation),
4487 contents + rel->r_offset);
4492 unsigned int val, type;
4494 /* {IE_32,GOTIE}->LE transition:
4495 Originally it can be one of:
4496 subl foo(%reg1), %reg2
4497 movl foo(%reg1), %reg2
4498 addl foo(%reg1), %reg2
4501 movl $foo, %reg2 (6 byte form)
4502 addl $foo, %reg2. */
4503 type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
4504 val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
4508 bfd_put_8 (output_bfd, 0xc7,
4509 contents + rel->r_offset - 2);
4510 bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
4511 contents + rel->r_offset - 1);
4513 else if (type == 0x2b)
4516 bfd_put_8 (output_bfd, 0x81,
4517 contents + rel->r_offset - 2);
4518 bfd_put_8 (output_bfd, 0xe8 | ((val >> 3) & 7),
4519 contents + rel->r_offset - 1);
4521 else if (type == 0x03)
4524 bfd_put_8 (output_bfd, 0x81,
4525 contents + rel->r_offset - 2);
4526 bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
4527 contents + rel->r_offset - 1);
4531 if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GOTIE)
4532 bfd_put_32 (output_bfd, -elf_i386_tpoff (info, relocation),
4533 contents + rel->r_offset);
4535 bfd_put_32 (output_bfd, elf_i386_tpoff (info, relocation),
4536 contents + rel->r_offset);
4541 if (htab->elf.sgot == NULL)
4546 off = h->got.offset;
4547 offplt = elf_i386_hash_entry (h)->tlsdesc_got;
4551 if (local_got_offsets == NULL)
4554 off = local_got_offsets[r_symndx];
4555 offplt = local_tlsdesc_gotents[r_symndx];
4562 Elf_Internal_Rela outrel;
4566 if (htab->elf.srelgot == NULL)
4569 indx = h && h->dynindx != -1 ? h->dynindx : 0;
4571 if (GOT_TLS_GDESC_P (tls_type))
4574 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_DESC);
4575 BFD_ASSERT (htab->sgotplt_jump_table_size + offplt + 8
4576 <= htab->elf.sgotplt->size);
4577 outrel.r_offset = (htab->elf.sgotplt->output_section->vma
4578 + htab->elf.sgotplt->output_offset
4580 + htab->sgotplt_jump_table_size);
4581 sreloc = htab->elf.srelplt;
4582 loc = sreloc->contents;
4583 loc += (htab->next_tls_desc_index++
4584 * sizeof (Elf32_External_Rel));
4585 BFD_ASSERT (loc + sizeof (Elf32_External_Rel)
4586 <= sreloc->contents + sreloc->size);
4587 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
4590 BFD_ASSERT (! unresolved_reloc);
4591 bfd_put_32 (output_bfd,
4592 relocation - elf_i386_dtpoff_base (info),
4593 htab->elf.sgotplt->contents + offplt
4594 + htab->sgotplt_jump_table_size + 4);
4598 bfd_put_32 (output_bfd, 0,
4599 htab->elf.sgotplt->contents + offplt
4600 + htab->sgotplt_jump_table_size + 4);
4604 sreloc = htab->elf.srelgot;
4606 outrel.r_offset = (htab->elf.sgot->output_section->vma
4607 + htab->elf.sgot->output_offset + off);
4609 if (GOT_TLS_GD_P (tls_type))
4610 dr_type = R_386_TLS_DTPMOD32;
4611 else if (GOT_TLS_GDESC_P (tls_type))
4613 else if (tls_type == GOT_TLS_IE_POS)
4614 dr_type = R_386_TLS_TPOFF;
4616 dr_type = R_386_TLS_TPOFF32;
4618 if (dr_type == R_386_TLS_TPOFF && indx == 0)
4619 bfd_put_32 (output_bfd,
4620 relocation - elf_i386_dtpoff_base (info),
4621 htab->elf.sgot->contents + off);
4622 else if (dr_type == R_386_TLS_TPOFF32 && indx == 0)
4623 bfd_put_32 (output_bfd,
4624 elf_i386_dtpoff_base (info) - relocation,
4625 htab->elf.sgot->contents + off);
4626 else if (dr_type != R_386_TLS_DESC)
4627 bfd_put_32 (output_bfd, 0,
4628 htab->elf.sgot->contents + off);
4629 outrel.r_info = ELF32_R_INFO (indx, dr_type);
4631 elf_append_rel (output_bfd, sreloc, &outrel);
4633 if (GOT_TLS_GD_P (tls_type))
4637 BFD_ASSERT (! unresolved_reloc);
4638 bfd_put_32 (output_bfd,
4639 relocation - elf_i386_dtpoff_base (info),
4640 htab->elf.sgot->contents + off + 4);
4644 bfd_put_32 (output_bfd, 0,
4645 htab->elf.sgot->contents + off + 4);
4646 outrel.r_info = ELF32_R_INFO (indx,
4647 R_386_TLS_DTPOFF32);
4648 outrel.r_offset += 4;
4649 elf_append_rel (output_bfd, sreloc, &outrel);
4652 else if (tls_type == GOT_TLS_IE_BOTH)
4654 bfd_put_32 (output_bfd,
4656 ? relocation - elf_i386_dtpoff_base (info)
4658 htab->elf.sgot->contents + off + 4);
4659 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF);
4660 outrel.r_offset += 4;
4661 elf_append_rel (output_bfd, sreloc, &outrel);
4668 local_got_offsets[r_symndx] |= 1;
4671 if (off >= (bfd_vma) -2
4672 && ! GOT_TLS_GDESC_P (tls_type))
4674 if (r_type == R_386_TLS_GOTDESC
4675 || r_type == R_386_TLS_DESC_CALL)
4677 relocation = htab->sgotplt_jump_table_size + offplt;
4678 unresolved_reloc = FALSE;
4680 else if (r_type == ELF32_R_TYPE (rel->r_info))
4682 bfd_vma g_o_t = htab->elf.sgotplt->output_section->vma
4683 + htab->elf.sgotplt->output_offset;
4684 relocation = htab->elf.sgot->output_section->vma
4685 + htab->elf.sgot->output_offset + off - g_o_t;
4686 if ((r_type == R_386_TLS_IE || r_type == R_386_TLS_GOTIE)
4687 && tls_type == GOT_TLS_IE_BOTH)
4689 if (r_type == R_386_TLS_IE)
4690 relocation += g_o_t;
4691 unresolved_reloc = FALSE;
4693 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GD)
4695 unsigned int val, type;
4698 /* GD->IE transition. */
4699 type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
4700 val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
4703 /* leal foo(,%reg,1), %eax; call ___tls_get_addr
4705 movl %gs:0, %eax; subl $foo@gottpoff(%reg), %eax. */
4707 roff = rel->r_offset - 3;
4711 /* leal foo(%reg), %eax; call ___tls_get_addr; nop
4713 movl %gs:0, %eax; subl $foo@gottpoff(%reg), %eax. */
4714 roff = rel->r_offset - 2;
4716 memcpy (contents + roff,
4717 "\x65\xa1\0\0\0\0\x2b\x80\0\0\0", 12);
4718 contents[roff + 7] = 0x80 | (val & 7);
4719 /* If foo is used only with foo@gotntpoff(%reg) and
4720 foo@indntpoff, but not with foo@gottpoff(%reg), change
4721 subl $foo@gottpoff(%reg), %eax
4723 addl $foo@gotntpoff(%reg), %eax. */
4724 if (tls_type == GOT_TLS_IE_POS)
4725 contents[roff + 6] = 0x03;
4726 bfd_put_32 (output_bfd,
4727 htab->elf.sgot->output_section->vma
4728 + htab->elf.sgot->output_offset + off
4729 - htab->elf.sgotplt->output_section->vma
4730 - htab->elf.sgotplt->output_offset,
4731 contents + roff + 8);
4732 /* Skip R_386_PLT32. */
4737 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GOTDESC)
4739 /* GDesc -> IE transition.
4740 It's originally something like:
4741 leal x@tlsdesc(%ebx), %eax
4744 movl x@gotntpoff(%ebx), %eax # before xchg %ax,%ax
4746 movl x@gottpoff(%ebx), %eax # before negl %eax
4748 Registers other than %eax may be set up here. */
4752 /* First, make sure it's a leal adding ebx to a 32-bit
4753 offset into any register, although it's probably
4754 almost always going to be eax. */
4755 roff = rel->r_offset;
4757 /* Now modify the instruction as appropriate. */
4758 /* To turn a leal into a movl in the form we use it, it
4759 suffices to change the first byte from 0x8d to 0x8b.
4760 aoliva FIXME: should we decide to keep the leal, all
4761 we have to do is remove the statement below, and
4762 adjust the relaxation of R_386_TLS_DESC_CALL. */
4763 bfd_put_8 (output_bfd, 0x8b, contents + roff - 2);
4765 if (tls_type == GOT_TLS_IE_BOTH)
4768 bfd_put_32 (output_bfd,
4769 htab->elf.sgot->output_section->vma
4770 + htab->elf.sgot->output_offset + off
4771 - htab->elf.sgotplt->output_section->vma
4772 - htab->elf.sgotplt->output_offset,
4776 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_DESC_CALL)
4778 /* GDesc -> IE transition.
4786 depending on how we transformed the TLS_GOTDESC above.
4791 roff = rel->r_offset;
4793 /* Now modify the instruction as appropriate. */
4794 if (tls_type != GOT_TLS_IE_NEG)
4797 bfd_put_8 (output_bfd, 0x66, contents + roff);
4798 bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
4803 bfd_put_8 (output_bfd, 0xf7, contents + roff);
4804 bfd_put_8 (output_bfd, 0xd8, contents + roff + 1);
4814 if (! elf_i386_tls_transition (info, input_bfd,
4815 input_section, contents,
4816 symtab_hdr, sym_hashes,
4817 &r_type, GOT_UNKNOWN, rel,
4818 relend, h, r_symndx))
4821 if (r_type != R_386_TLS_LDM)
4823 /* LD->LE transition:
4824 leal foo(%reg), %eax; call ___tls_get_addr.
4826 movl %gs:0, %eax; nop; leal 0(%esi,1), %esi. */
4827 BFD_ASSERT (r_type == R_386_TLS_LE_32);
4828 memcpy (contents + rel->r_offset - 2,
4829 "\x65\xa1\0\0\0\0\x90\x8d\x74\x26", 11);
4830 /* Skip R_386_PC32/R_386_PLT32. */
4836 if (htab->elf.sgot == NULL)
4839 off = htab->tls_ldm_got.offset;
4844 Elf_Internal_Rela outrel;
4846 if (htab->elf.srelgot == NULL)
4849 outrel.r_offset = (htab->elf.sgot->output_section->vma
4850 + htab->elf.sgot->output_offset + off);
4852 bfd_put_32 (output_bfd, 0,
4853 htab->elf.sgot->contents + off);
4854 bfd_put_32 (output_bfd, 0,
4855 htab->elf.sgot->contents + off + 4);
4856 outrel.r_info = ELF32_R_INFO (0, R_386_TLS_DTPMOD32);
4857 elf_append_rel (output_bfd, htab->elf.srelgot, &outrel);
4858 htab->tls_ldm_got.offset |= 1;
4860 relocation = htab->elf.sgot->output_section->vma
4861 + htab->elf.sgot->output_offset + off
4862 - htab->elf.sgotplt->output_section->vma
4863 - htab->elf.sgotplt->output_offset;
4864 unresolved_reloc = FALSE;
4867 case R_386_TLS_LDO_32:
4868 if (!bfd_link_executable (info)
4869 || (input_section->flags & SEC_CODE) == 0)
4870 relocation -= elf_i386_dtpoff_base (info);
4872 /* When converting LDO to LE, we must negate. */
4873 relocation = -elf_i386_tpoff (info, relocation);
4876 case R_386_TLS_LE_32:
4878 if (!bfd_link_executable (info))
4880 Elf_Internal_Rela outrel;
4883 outrel.r_offset = rel->r_offset
4884 + input_section->output_section->vma
4885 + input_section->output_offset;
4886 if (h != NULL && h->dynindx != -1)
4890 if (r_type == R_386_TLS_LE_32)
4891 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF32);
4893 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF);
4894 sreloc = elf_section_data (input_section)->sreloc;
4897 elf_append_rel (output_bfd, sreloc, &outrel);
4900 else if (r_type == R_386_TLS_LE_32)
4901 relocation = elf_i386_dtpoff_base (info) - relocation;
4903 relocation -= elf_i386_dtpoff_base (info);
4905 else if (r_type == R_386_TLS_LE_32)
4906 relocation = elf_i386_tpoff (info, relocation);
4908 relocation = -elf_i386_tpoff (info, relocation);
4915 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
4916 because such sections are not SEC_ALLOC and thus ld.so will
4917 not process them. */
4918 if (unresolved_reloc
4919 && !((input_section->flags & SEC_DEBUGGING) != 0
4921 && _bfd_elf_section_offset (output_bfd, info, input_section,
4922 rel->r_offset) != (bfd_vma) -1)
4924 (*_bfd_error_handler)
4925 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
4928 (long) rel->r_offset,
4930 h->root.root.string);
4935 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4936 contents, rel->r_offset,
4939 check_relocation_error:
4940 if (r != bfd_reloc_ok)
4945 name = h->root.root.string;
4948 name = bfd_elf_string_from_elf_section (input_bfd,
4949 symtab_hdr->sh_link,
4954 name = bfd_section_name (input_bfd, sec);
4957 if (r == bfd_reloc_overflow)
4959 if (! ((*info->callbacks->reloc_overflow)
4960 (info, (h ? &h->root : NULL), name, howto->name,
4961 (bfd_vma) 0, input_bfd, input_section,
4967 (*_bfd_error_handler)
4968 (_("%B(%A+0x%lx): reloc against `%s': error %d"),
4969 input_bfd, input_section,
4970 (long) rel->r_offset, name, (int) r);
4981 Elf_Internal_Shdr *rel_hdr;
4982 size_t deleted = rel - wrel;
4984 rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section);
4985 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
4986 if (rel_hdr->sh_size == 0)
4988 /* It is too late to remove an empty reloc section. Leave
4990 ??? What is wrong with an empty section??? */
4991 rel_hdr->sh_size = rel_hdr->sh_entsize;
4994 rel_hdr = _bfd_elf_single_rel_hdr (input_section);
4995 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
4996 input_section->reloc_count -= deleted;
5002 /* Finish up dynamic symbol handling. We set the contents of various
5003 dynamic sections here. */
5006 elf_i386_finish_dynamic_symbol (bfd *output_bfd,
5007 struct bfd_link_info *info,
5008 struct elf_link_hash_entry *h,
5009 Elf_Internal_Sym *sym)
5011 struct elf_i386_link_hash_table *htab;
5012 unsigned plt_entry_size;
5013 const struct elf_i386_backend_data *abed;
5014 struct elf_i386_link_hash_entry *eh;
5015 bfd_boolean local_undefweak;
5017 htab = elf_i386_hash_table (info);
5021 abed = get_elf_i386_backend_data (output_bfd);
5022 plt_entry_size = GET_PLT_ENTRY_SIZE (output_bfd);
5024 eh = (struct elf_i386_link_hash_entry *) h;
5026 /* We keep PLT/GOT entries without dynamic PLT/GOT relocations for
5027 resolved undefined weak symbols in executable so that their
5028 references have value 0 at run-time. */
5029 local_undefweak = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
5031 if (h->plt.offset != (bfd_vma) -1)
5035 Elf_Internal_Rela rel;
5037 asection *plt, *gotplt, *relplt;
5039 /* When building a static executable, use .iplt, .igot.plt and
5040 .rel.iplt sections for STT_GNU_IFUNC symbols. */
5041 if (htab->elf.splt != NULL)
5043 plt = htab->elf.splt;
5044 gotplt = htab->elf.sgotplt;
5045 relplt = htab->elf.srelplt;
5049 plt = htab->elf.iplt;
5050 gotplt = htab->elf.igotplt;
5051 relplt = htab->elf.irelplt;
5054 /* This symbol has an entry in the procedure linkage table. Set
5057 if ((h->dynindx == -1
5059 && !((h->forced_local || bfd_link_executable (info))
5061 && h->type == STT_GNU_IFUNC))
5067 /* Get the index in the procedure linkage table which
5068 corresponds to this symbol. This is the index of this symbol
5069 in all the symbols for which we are making plt entries. The
5070 first entry in the procedure linkage table is reserved.
5072 Get the offset into the .got table of the entry that
5073 corresponds to this function. Each .got entry is 4 bytes.
5074 The first three are reserved.
5076 For static executables, we don't reserve anything. */
5078 if (plt == htab->elf.splt)
5080 got_offset = h->plt.offset / plt_entry_size - 1;
5081 got_offset = (got_offset + 3) * 4;
5085 got_offset = h->plt.offset / plt_entry_size;
5086 got_offset = got_offset * 4;
5089 /* Fill in the entry in the procedure linkage table. */
5090 if (! bfd_link_pic (info))
5092 memcpy (plt->contents + h->plt.offset, abed->plt->plt_entry,
5093 abed->plt->plt_entry_size);
5094 bfd_put_32 (output_bfd,
5095 (gotplt->output_section->vma
5096 + gotplt->output_offset
5098 plt->contents + h->plt.offset
5099 + abed->plt->plt_got_offset);
5101 if (abed->is_vxworks)
5103 int s, k, reloc_index;
5105 /* Create the R_386_32 relocation referencing the GOT
5106 for this PLT entry. */
5108 /* S: Current slot number (zero-based). */
5109 s = ((h->plt.offset - abed->plt->plt_entry_size)
5110 / abed->plt->plt_entry_size);
5111 /* K: Number of relocations for PLTResolve. */
5112 if (bfd_link_pic (info))
5113 k = PLTRESOLVE_RELOCS_SHLIB;
5115 k = PLTRESOLVE_RELOCS;
5116 /* Skip the PLTresolve relocations, and the relocations for
5117 the other PLT slots. */
5118 reloc_index = k + s * PLT_NON_JUMP_SLOT_RELOCS;
5119 loc = (htab->srelplt2->contents + reloc_index
5120 * sizeof (Elf32_External_Rel));
5122 rel.r_offset = (htab->elf.splt->output_section->vma
5123 + htab->elf.splt->output_offset
5124 + h->plt.offset + 2),
5125 rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
5126 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
5128 /* Create the R_386_32 relocation referencing the beginning of
5129 the PLT for this GOT entry. */
5130 rel.r_offset = (htab->elf.sgotplt->output_section->vma
5131 + htab->elf.sgotplt->output_offset
5133 rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_386_32);
5134 bfd_elf32_swap_reloc_out (output_bfd, &rel,
5135 loc + sizeof (Elf32_External_Rel));
5140 memcpy (plt->contents + h->plt.offset, abed->plt->pic_plt_entry,
5141 abed->plt->plt_entry_size);
5142 bfd_put_32 (output_bfd, got_offset,
5143 plt->contents + h->plt.offset
5144 + abed->plt->plt_got_offset);
5147 /* Fill in the entry in the global offset table. Leave the entry
5148 as zero for undefined weak symbol in PIE. No PLT relocation
5149 against undefined weak symbol in PIE. */
5150 if (!local_undefweak)
5152 bfd_put_32 (output_bfd,
5153 (plt->output_section->vma
5154 + plt->output_offset
5156 + abed->plt->plt_lazy_offset),
5157 gotplt->contents + got_offset);
5159 /* Fill in the entry in the .rel.plt section. */
5160 rel.r_offset = (gotplt->output_section->vma
5161 + gotplt->output_offset
5163 if (h->dynindx == -1
5164 || ((bfd_link_executable (info)
5165 || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
5167 && h->type == STT_GNU_IFUNC))
5169 /* If an STT_GNU_IFUNC symbol is locally defined, generate
5170 R_386_IRELATIVE instead of R_386_JUMP_SLOT. Store addend
5171 in the .got.plt section. */
5172 bfd_put_32 (output_bfd,
5173 (h->root.u.def.value
5174 + h->root.u.def.section->output_section->vma
5175 + h->root.u.def.section->output_offset),
5176 gotplt->contents + got_offset);
5177 rel.r_info = ELF32_R_INFO (0, R_386_IRELATIVE);
5178 /* R_386_IRELATIVE comes last. */
5179 plt_index = htab->next_irelative_index--;
5183 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_JUMP_SLOT);
5184 plt_index = htab->next_jump_slot_index++;
5187 loc = relplt->contents + plt_index * sizeof (Elf32_External_Rel);
5188 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
5190 /* Don't fill PLT entry for static executables. */
5191 if (plt == htab->elf.splt)
5193 bfd_put_32 (output_bfd,
5194 plt_index * sizeof (Elf32_External_Rel),
5195 plt->contents + h->plt.offset
5196 + abed->plt->plt_reloc_offset);
5197 bfd_put_32 (output_bfd, - (h->plt.offset
5198 + abed->plt->plt_plt_offset + 4),
5199 plt->contents + h->plt.offset
5200 + abed->plt->plt_plt_offset);
5204 else if (eh->plt_got.offset != (bfd_vma) -1)
5206 bfd_vma got_offset, plt_offset;
5207 asection *plt, *got, *gotplt;
5208 const bfd_byte *got_plt_entry;
5210 /* Offset of displacement of the indirect jump. */
5211 bfd_vma plt_got_offset = 2;
5213 /* Set the entry in the GOT procedure linkage table. */
5214 plt = htab->plt_got;
5215 got = htab->elf.sgot;
5216 gotplt = htab->elf.sgotplt;
5217 got_offset = h->got.offset;
5219 if (got_offset == (bfd_vma) -1
5225 /* Fill in the entry in the GOT procedure linkage table. */
5226 if (! bfd_link_pic (info))
5228 got_plt_entry = elf_i386_got_plt_entry;
5229 got_offset += got->output_section->vma + got->output_offset;
5233 got_plt_entry = elf_i386_pic_got_plt_entry;
5234 got_offset += (got->output_section->vma
5235 + got->output_offset
5236 - gotplt->output_section->vma
5237 - gotplt->output_offset);
5240 plt_offset = eh->plt_got.offset;
5241 memcpy (plt->contents + plt_offset, got_plt_entry,
5242 sizeof (elf_i386_got_plt_entry));
5243 bfd_put_32 (output_bfd, got_offset,
5244 plt->contents + plt_offset + plt_got_offset);
5247 if (!local_undefweak
5249 && (h->plt.offset != (bfd_vma) -1
5250 || eh->plt_got.offset != (bfd_vma) -1))
5252 /* Mark the symbol as undefined, rather than as defined in
5253 the .plt section. Leave the value if there were any
5254 relocations where pointer equality matters (this is a clue
5255 for the dynamic linker, to make function pointer
5256 comparisons work between an application and shared
5257 library), otherwise set it to zero. If a function is only
5258 called from a binary, there is no need to slow down
5259 shared libraries because of that. */
5260 sym->st_shndx = SHN_UNDEF;
5261 if (!h->pointer_equality_needed)
5265 /* Don't generate dynamic GOT relocation against undefined weak
5266 symbol in executable. */
5267 if (h->got.offset != (bfd_vma) -1
5268 && ! GOT_TLS_GD_ANY_P (elf_i386_hash_entry(h)->tls_type)
5269 && (elf_i386_hash_entry(h)->tls_type & GOT_TLS_IE) == 0
5270 && !local_undefweak)
5272 Elf_Internal_Rela rel;
5274 /* This symbol has an entry in the global offset table. Set it
5277 if (htab->elf.sgot == NULL || htab->elf.srelgot == NULL)
5280 rel.r_offset = (htab->elf.sgot->output_section->vma
5281 + htab->elf.sgot->output_offset
5282 + (h->got.offset & ~(bfd_vma) 1));
5284 /* If this is a static link, or it is a -Bsymbolic link and the
5285 symbol is defined locally or was forced to be local because
5286 of a version file, we just want to emit a RELATIVE reloc.
5287 The entry in the global offset table will already have been
5288 initialized in the relocate_section function. */
5290 && h->type == STT_GNU_IFUNC)
5292 if (bfd_link_pic (info))
5294 /* Generate R_386_GLOB_DAT. */
5301 if (!h->pointer_equality_needed)
5304 /* For non-shared object, we can't use .got.plt, which
5305 contains the real function addres if we need pointer
5306 equality. We load the GOT entry with the PLT entry. */
5307 plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt;
5308 bfd_put_32 (output_bfd,
5309 (plt->output_section->vma
5310 + plt->output_offset + h->plt.offset),
5311 htab->elf.sgot->contents + h->got.offset);
5315 else if (bfd_link_pic (info)
5316 && SYMBOL_REFERENCES_LOCAL (info, h))
5318 BFD_ASSERT((h->got.offset & 1) != 0);
5319 rel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
5323 BFD_ASSERT((h->got.offset & 1) == 0);
5325 bfd_put_32 (output_bfd, (bfd_vma) 0,
5326 htab->elf.sgot->contents + h->got.offset);
5327 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_GLOB_DAT);
5330 elf_append_rel (output_bfd, htab->elf.srelgot, &rel);
5335 Elf_Internal_Rela rel;
5337 /* This symbol needs a copy reloc. Set it up. */
5339 if (h->dynindx == -1
5340 || (h->root.type != bfd_link_hash_defined
5341 && h->root.type != bfd_link_hash_defweak)
5342 || htab->srelbss == NULL)
5345 rel.r_offset = (h->root.u.def.value
5346 + h->root.u.def.section->output_section->vma
5347 + h->root.u.def.section->output_offset);
5348 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_COPY);
5349 elf_append_rel (output_bfd, htab->srelbss, &rel);
5355 /* Finish up local dynamic symbol handling. We set the contents of
5356 various dynamic sections here. */
5359 elf_i386_finish_local_dynamic_symbol (void **slot, void *inf)
5361 struct elf_link_hash_entry *h
5362 = (struct elf_link_hash_entry *) *slot;
5363 struct bfd_link_info *info
5364 = (struct bfd_link_info *) inf;
5366 return elf_i386_finish_dynamic_symbol (info->output_bfd, info,
5370 /* Finish up undefined weak symbol handling in PIE. Fill its PLT entry
5371 here since undefined weak symbol may not be dynamic and may not be
5372 called for elf_i386_finish_dynamic_symbol. */
5375 elf_i386_pie_finish_undefweak_symbol (struct bfd_hash_entry *bh,
5378 struct elf_link_hash_entry *h = (struct elf_link_hash_entry *) bh;
5379 struct bfd_link_info *info = (struct bfd_link_info *) inf;
5381 if (h->root.type != bfd_link_hash_undefweak
5382 || h->dynindx != -1)
5385 return elf_i386_finish_dynamic_symbol (info->output_bfd,
5389 /* Used to decide how to sort relocs in an optimal manner for the
5390 dynamic linker, before writing them out. */
5392 static enum elf_reloc_type_class
5393 elf_i386_reloc_type_class (const struct bfd_link_info *info,
5394 const asection *rel_sec ATTRIBUTE_UNUSED,
5395 const Elf_Internal_Rela *rela)
5397 bfd *abfd = info->output_bfd;
5398 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
5399 struct elf_link_hash_table *htab = elf_hash_table (info);
5401 if (htab->dynsym != NULL
5402 && htab->dynsym->contents != NULL)
5404 /* Check relocation against STT_GNU_IFUNC symbol if there are
5406 unsigned long r_symndx = ELF32_R_SYM (rela->r_info);
5407 Elf_Internal_Sym sym;
5408 if (!bed->s->swap_symbol_in (abfd,
5409 (htab->dynsym->contents
5410 + r_symndx * sizeof (Elf32_External_Sym)),
5414 if (ELF32_ST_TYPE (sym.st_info) == STT_GNU_IFUNC)
5415 return reloc_class_ifunc;
5418 switch (ELF32_R_TYPE (rela->r_info))
5420 case R_386_RELATIVE:
5421 return reloc_class_relative;
5422 case R_386_JUMP_SLOT:
5423 return reloc_class_plt;
5425 return reloc_class_copy;
5427 return reloc_class_normal;
5431 /* Finish up the dynamic sections. */
5434 elf_i386_finish_dynamic_sections (bfd *output_bfd,
5435 struct bfd_link_info *info)
5437 struct elf_i386_link_hash_table *htab;
5440 const struct elf_i386_backend_data *abed;
5442 htab = elf_i386_hash_table (info);
5446 dynobj = htab->elf.dynobj;
5447 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
5448 abed = get_elf_i386_backend_data (output_bfd);
5450 if (htab->elf.dynamic_sections_created)
5452 Elf32_External_Dyn *dyncon, *dynconend;
5454 if (sdyn == NULL || htab->elf.sgot == NULL)
5457 dyncon = (Elf32_External_Dyn *) sdyn->contents;
5458 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
5459 for (; dyncon < dynconend; dyncon++)
5461 Elf_Internal_Dyn dyn;
5464 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
5469 if (abed->is_vxworks
5470 && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
5475 s = htab->elf.sgotplt;
5476 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
5480 s = htab->elf.srelplt;
5481 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
5485 s = htab->elf.srelplt;
5486 dyn.d_un.d_val = s->size;
5490 /* My reading of the SVR4 ABI indicates that the
5491 procedure linkage table relocs (DT_JMPREL) should be
5492 included in the overall relocs (DT_REL). This is
5493 what Solaris does. However, UnixWare can not handle
5494 that case. Therefore, we override the DT_RELSZ entry
5495 here to make it not include the JMPREL relocs. */
5496 s = htab->elf.srelplt;
5499 dyn.d_un.d_val -= s->size;
5503 /* We may not be using the standard ELF linker script.
5504 If .rel.plt is the first .rel section, we adjust
5505 DT_REL to not include it. */
5506 s = htab->elf.srelplt;
5509 if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
5511 dyn.d_un.d_ptr += s->size;
5515 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5518 /* Fill in the first entry in the procedure linkage table. */
5519 if (htab->elf.splt && htab->elf.splt->size > 0)
5521 if (bfd_link_pic (info))
5523 memcpy (htab->elf.splt->contents, abed->plt->pic_plt0_entry,
5524 abed->plt->plt0_entry_size);
5525 memset (htab->elf.splt->contents + abed->plt->plt0_entry_size,
5526 abed->plt0_pad_byte,
5527 abed->plt->plt_entry_size - abed->plt->plt0_entry_size);
5531 memcpy (htab->elf.splt->contents, abed->plt->plt0_entry,
5532 abed->plt->plt0_entry_size);
5533 memset (htab->elf.splt->contents + abed->plt->plt0_entry_size,
5534 abed->plt0_pad_byte,
5535 abed->plt->plt_entry_size - abed->plt->plt0_entry_size);
5536 bfd_put_32 (output_bfd,
5537 (htab->elf.sgotplt->output_section->vma
5538 + htab->elf.sgotplt->output_offset
5540 htab->elf.splt->contents
5541 + abed->plt->plt0_got1_offset);
5542 bfd_put_32 (output_bfd,
5543 (htab->elf.sgotplt->output_section->vma
5544 + htab->elf.sgotplt->output_offset
5546 htab->elf.splt->contents
5547 + abed->plt->plt0_got2_offset);
5549 if (abed->is_vxworks)
5551 Elf_Internal_Rela rel;
5553 /* Generate a relocation for _GLOBAL_OFFSET_TABLE_ + 4.
5554 On IA32 we use REL relocations so the addend goes in
5555 the PLT directly. */
5556 rel.r_offset = (htab->elf.splt->output_section->vma
5557 + htab->elf.splt->output_offset
5558 + abed->plt->plt0_got1_offset);
5559 rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
5560 bfd_elf32_swap_reloc_out (output_bfd, &rel,
5561 htab->srelplt2->contents);
5562 /* Generate a relocation for _GLOBAL_OFFSET_TABLE_ + 8. */
5563 rel.r_offset = (htab->elf.splt->output_section->vma
5564 + htab->elf.splt->output_offset
5565 + abed->plt->plt0_got2_offset);
5566 rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
5567 bfd_elf32_swap_reloc_out (output_bfd, &rel,
5568 htab->srelplt2->contents +
5569 sizeof (Elf32_External_Rel));
5573 /* UnixWare sets the entsize of .plt to 4, although that doesn't
5574 really seem like the right value. */
5575 elf_section_data (htab->elf.splt->output_section)
5576 ->this_hdr.sh_entsize = 4;
5578 /* Correct the .rel.plt.unloaded relocations. */
5579 if (abed->is_vxworks && !bfd_link_pic (info))
5581 int num_plts = (htab->elf.splt->size
5582 / abed->plt->plt_entry_size) - 1;
5585 p = htab->srelplt2->contents;
5586 if (bfd_link_pic (info))
5587 p += PLTRESOLVE_RELOCS_SHLIB * sizeof (Elf32_External_Rel);
5589 p += PLTRESOLVE_RELOCS * sizeof (Elf32_External_Rel);
5591 for (; num_plts; num_plts--)
5593 Elf_Internal_Rela rel;
5594 bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
5595 rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
5596 bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
5597 p += sizeof (Elf32_External_Rel);
5599 bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
5600 rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_386_32);
5601 bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
5602 p += sizeof (Elf32_External_Rel);
5608 if (htab->elf.sgotplt)
5610 if (bfd_is_abs_section (htab->elf.sgotplt->output_section))
5612 (*_bfd_error_handler)
5613 (_("discarded output section: `%A'"), htab->elf.sgotplt);
5617 /* Fill in the first three entries in the global offset table. */
5618 if (htab->elf.sgotplt->size > 0)
5620 bfd_put_32 (output_bfd,
5622 : sdyn->output_section->vma + sdyn->output_offset),
5623 htab->elf.sgotplt->contents);
5624 bfd_put_32 (output_bfd, 0, htab->elf.sgotplt->contents + 4);
5625 bfd_put_32 (output_bfd, 0, htab->elf.sgotplt->contents + 8);
5628 elf_section_data (htab->elf.sgotplt->output_section)->this_hdr.sh_entsize = 4;
5631 /* Adjust .eh_frame for .plt section. */
5632 if (htab->plt_eh_frame != NULL
5633 && htab->plt_eh_frame->contents != NULL)
5635 if (htab->elf.splt != NULL
5636 && htab->elf.splt->size != 0
5637 && (htab->elf.splt->flags & SEC_EXCLUDE) == 0
5638 && htab->elf.splt->output_section != NULL
5639 && htab->plt_eh_frame->output_section != NULL)
5641 bfd_vma plt_start = htab->elf.splt->output_section->vma;
5642 bfd_vma eh_frame_start = htab->plt_eh_frame->output_section->vma
5643 + htab->plt_eh_frame->output_offset
5644 + PLT_FDE_START_OFFSET;
5645 bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
5646 htab->plt_eh_frame->contents
5647 + PLT_FDE_START_OFFSET);
5649 if (htab->plt_eh_frame->sec_info_type
5650 == SEC_INFO_TYPE_EH_FRAME)
5652 if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
5654 htab->plt_eh_frame->contents))
5659 if (htab->elf.sgot && htab->elf.sgot->size > 0)
5660 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize = 4;
5662 /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols. */
5663 htab_traverse (htab->loc_hash_table,
5664 elf_i386_finish_local_dynamic_symbol,
5667 /* Fill PLT entries for undefined weak symbols in PIE. */
5668 if (bfd_link_pie (info))
5669 bfd_hash_traverse (&info->hash->table,
5670 elf_i386_pie_finish_undefweak_symbol,
5676 /* Return an array of PLT entry symbol values. */
5679 elf_i386_get_plt_sym_val (bfd *abfd, asymbol **dynsyms, asection *plt,
5682 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
5685 bfd_vma *plt_sym_val;
5687 bfd_byte *plt_contents;
5688 const struct elf_i386_backend_data *bed
5689 = get_elf_i386_backend_data (abfd);
5690 Elf_Internal_Shdr *hdr;
5692 /* Get the .plt section contents. */
5693 plt_contents = (bfd_byte *) bfd_malloc (plt->size);
5694 if (plt_contents == NULL)
5696 if (!bfd_get_section_contents (abfd, (asection *) plt,
5697 plt_contents, 0, plt->size))
5700 free (plt_contents);
5704 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
5705 if (! (*slurp_relocs) (abfd, relplt, dynsyms, TRUE))
5708 hdr = &elf_section_data (relplt)->this_hdr;
5709 count = relplt->size / hdr->sh_entsize;
5711 plt_sym_val = (bfd_vma *) bfd_malloc (sizeof (bfd_vma) * count);
5712 if (plt_sym_val == NULL)
5715 for (i = 0; i < count; i++)
5716 plt_sym_val[i] = -1;
5718 plt_offset = bed->plt->plt_entry_size;
5719 p = relplt->relocation;
5720 for (i = 0; i < count; i++, p++)
5724 /* Skip unknown relocation. PR 17512: file: bc9d6cf5. */
5725 if (p->howto == NULL)
5728 if (p->howto->type != R_386_JUMP_SLOT
5729 && p->howto->type != R_386_IRELATIVE)
5732 reloc_index = H_GET_32 (abfd, (plt_contents + plt_offset
5733 + bed->plt->plt_reloc_offset));
5734 reloc_index /= sizeof (Elf32_External_Rel);
5735 if (reloc_index < count)
5736 plt_sym_val[reloc_index] = plt->vma + plt_offset;
5738 plt_offset += bed->plt->plt_entry_size;
5740 /* PR binutils/18437: Skip extra relocations in the .rel.plt
5742 if (plt_offset >= plt->size)
5746 free (plt_contents);
5751 /* Similar to _bfd_elf_get_synthetic_symtab. */
5754 elf_i386_get_synthetic_symtab (bfd *abfd,
5761 asection *plt = bfd_get_section_by_name (abfd, ".plt");
5762 return _bfd_elf_ifunc_get_synthetic_symtab (abfd, symcount, syms,
5763 dynsymcount, dynsyms, ret,
5765 elf_i386_get_plt_sym_val);
5768 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
5771 elf_i386_hash_symbol (struct elf_link_hash_entry *h)
5773 if (h->plt.offset != (bfd_vma) -1
5775 && !h->pointer_equality_needed)
5778 return _bfd_elf_hash_symbol (h);
5781 /* Hook called by the linker routine which adds symbols from an object
5785 elf_i386_add_symbol_hook (bfd * abfd,
5786 struct bfd_link_info * info,
5787 Elf_Internal_Sym * sym,
5788 const char ** namep ATTRIBUTE_UNUSED,
5789 flagword * flagsp ATTRIBUTE_UNUSED,
5790 asection ** secp ATTRIBUTE_UNUSED,
5791 bfd_vma * valp ATTRIBUTE_UNUSED)
5793 if (ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE
5794 && (abfd->flags & DYNAMIC) == 0
5795 && bfd_get_flavour (info->output_bfd) == bfd_target_elf_flavour)
5796 elf_tdata (info->output_bfd)->has_gnu_symbols
5797 |= elf_gnu_symbol_unique;
5802 #define TARGET_LITTLE_SYM i386_elf32_vec
5803 #define TARGET_LITTLE_NAME "elf32-i386"
5804 #define ELF_ARCH bfd_arch_i386
5805 #define ELF_TARGET_ID I386_ELF_DATA
5806 #define ELF_MACHINE_CODE EM_386
5807 #define ELF_MAXPAGESIZE 0x1000
5809 #define elf_backend_can_gc_sections 1
5810 #define elf_backend_can_refcount 1
5811 #define elf_backend_want_got_plt 1
5812 #define elf_backend_plt_readonly 1
5813 #define elf_backend_want_plt_sym 0
5814 #define elf_backend_got_header_size 12
5815 #define elf_backend_plt_alignment 4
5816 #define elf_backend_extern_protected_data 1
5818 /* Support RELA for objdump of prelink objects. */
5819 #define elf_info_to_howto elf_i386_info_to_howto_rel
5820 #define elf_info_to_howto_rel elf_i386_info_to_howto_rel
5822 #define bfd_elf32_mkobject elf_i386_mkobject
5824 #define bfd_elf32_bfd_is_local_label_name elf_i386_is_local_label_name
5825 #define bfd_elf32_bfd_link_hash_table_create elf_i386_link_hash_table_create
5826 #define bfd_elf32_bfd_reloc_type_lookup elf_i386_reloc_type_lookup
5827 #define bfd_elf32_bfd_reloc_name_lookup elf_i386_reloc_name_lookup
5828 #define bfd_elf32_get_synthetic_symtab elf_i386_get_synthetic_symtab
5830 #define elf_backend_adjust_dynamic_symbol elf_i386_adjust_dynamic_symbol
5831 #define elf_backend_relocs_compatible _bfd_elf_relocs_compatible
5832 #define elf_backend_check_relocs elf_i386_check_relocs
5833 #define elf_backend_copy_indirect_symbol elf_i386_copy_indirect_symbol
5834 #define elf_backend_create_dynamic_sections elf_i386_create_dynamic_sections
5835 #define elf_backend_fake_sections elf_i386_fake_sections
5836 #define elf_backend_finish_dynamic_sections elf_i386_finish_dynamic_sections
5837 #define elf_backend_finish_dynamic_symbol elf_i386_finish_dynamic_symbol
5838 #define elf_backend_gc_mark_hook elf_i386_gc_mark_hook
5839 #define elf_backend_grok_prstatus elf_i386_grok_prstatus
5840 #define elf_backend_grok_psinfo elf_i386_grok_psinfo
5841 #define elf_backend_reloc_type_class elf_i386_reloc_type_class
5842 #define elf_backend_relocate_section elf_i386_relocate_section
5843 #define elf_backend_size_dynamic_sections elf_i386_size_dynamic_sections
5844 #define elf_backend_always_size_sections elf_i386_always_size_sections
5845 #define elf_backend_omit_section_dynsym \
5846 ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
5847 #define elf_backend_hash_symbol elf_i386_hash_symbol
5848 #define elf_backend_add_symbol_hook elf_i386_add_symbol_hook
5849 #define elf_backend_fixup_symbol elf_i386_fixup_symbol
5851 #include "elf32-target.h"
5853 /* FreeBSD support. */
5855 #undef TARGET_LITTLE_SYM
5856 #define TARGET_LITTLE_SYM i386_elf32_fbsd_vec
5857 #undef TARGET_LITTLE_NAME
5858 #define TARGET_LITTLE_NAME "elf32-i386-freebsd"
5860 #define ELF_OSABI ELFOSABI_FREEBSD
5862 /* The kernel recognizes executables as valid only if they carry a
5863 "FreeBSD" label in the ELF header. So we put this label on all
5864 executables and (for simplicity) also all other object files. */
5867 elf_i386_fbsd_post_process_headers (bfd *abfd, struct bfd_link_info *info)
5869 _bfd_elf_post_process_headers (abfd, info);
5871 #ifdef OLD_FREEBSD_ABI_LABEL
5873 /* The ABI label supported by FreeBSD <= 4.0 is quite nonstandard. */
5874 Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
5875 memcpy (&i_ehdrp->e_ident[EI_ABIVERSION], "FreeBSD", 8);
5880 #undef elf_backend_post_process_headers
5881 #define elf_backend_post_process_headers elf_i386_fbsd_post_process_headers
5883 #define elf32_bed elf32_i386_fbsd_bed
5885 #undef elf_backend_add_symbol_hook
5887 #include "elf32-target.h"
5891 #undef TARGET_LITTLE_SYM
5892 #define TARGET_LITTLE_SYM i386_elf32_sol2_vec
5893 #undef TARGET_LITTLE_NAME
5894 #define TARGET_LITTLE_NAME "elf32-i386-sol2"
5896 #undef elf_backend_post_process_headers
5898 /* Restore default: we cannot use ELFOSABI_SOLARIS, otherwise ELFOSABI_NONE
5899 objects won't be recognized. */
5903 #define elf32_bed elf32_i386_sol2_bed
5905 /* The 32-bit static TLS arena size is rounded to the nearest 8-byte
5907 #undef elf_backend_static_tls_alignment
5908 #define elf_backend_static_tls_alignment 8
5910 /* The Solaris 2 ABI requires a plt symbol on all platforms.
5912 Cf. Linker and Libraries Guide, Ch. 2, Link-Editor, Generating the Output
5914 #undef elf_backend_want_plt_sym
5915 #define elf_backend_want_plt_sym 1
5917 #undef elf_backend_strtab_flags
5918 #define elf_backend_strtab_flags SHF_STRINGS
5920 /* Called to set the sh_flags, sh_link and sh_info fields of OSECTION which
5921 has a type >= SHT_LOOS. Returns TRUE if these fields were initialised
5922 FALSE otherwise. ISECTION is the best guess matching section from the
5923 input bfd IBFD, but it might be NULL. */
5926 elf32_i386_copy_solaris_special_section_fields (const bfd *ibfd ATTRIBUTE_UNUSED,
5927 bfd *obfd ATTRIBUTE_UNUSED,
5928 const Elf_Internal_Shdr *isection ATTRIBUTE_UNUSED,
5929 Elf_Internal_Shdr *osection ATTRIBUTE_UNUSED)
5931 /* PR 19938: FIXME: Need to add code for setting the sh_info
5932 and sh_link fields of Solaris specific section types. */
5935 /* Based upon Oracle Solaris 11.3 Linkers and Libraries Guide, Ch. 13,
5936 Object File Format, Table 13-9 ELF sh_link and sh_info Interpretation:
5938 http://docs.oracle.com/cd/E53394_01/html/E54813/chapter6-94076.html#scrolltoc
5940 The following values should be set:
5943 -----------------------------------------------------------------------------
5944 SHT_SUNW_ancillary The section header index of 0
5945 [0x6fffffee] the associated string table.
5947 SHT_SUNW_capinfo The section header index of For a dynamic object, the
5948 [0x6ffffff0] the associated symbol table. section header index of
5950 SHT_SUNW_capchain table,
5953 SHT_SUNW_symsort The section header index of 0
5954 [0x6ffffff1] the associated symbol table.
5956 SHT_SUNW_tlssort The section header index of 0
5957 [0x6ffffff2] the associated symbol table.
5959 SHT_SUNW_LDYNSYM The section header index of One greater than the
5960 [0x6ffffff3] the associated string table. symbol table index of the
5961 This index is the same string last local symbol,
5962 table used by the SHT_DYNSYM STB_LOCAL. Since
5963 section. SHT_SUNW_LDYNSYM only
5964 contains local symbols,
5965 sh_info is equivalent to
5966 the number of symbols in
5969 SHT_SUNW_cap If symbol capabilities exist, If any capabilities refer
5970 [0x6ffffff5] the section header index of to named strings, the
5971 the associated section header index of
5972 SHT_SUNW_capinfo table, the associated string
5973 otherwise 0. table, otherwise 0.
5975 SHT_SUNW_move The section header index of 0
5976 [0x6ffffffa] the associated symbol table.
5981 SHT_SUNW_syminfo The section header index of The section header index
5982 [0x6ffffffc] the associated symbol table. of the associated
5985 SHT_SUNW_verdef The section header index of The number of version
5986 [0x6ffffffd] the associated string table. definitions within the
5989 SHT_SUNW_verneed The section header index of The number of version
5990 [0x6ffffffe] the associated string table. dependencies within the
5993 SHT_SUNW_versym The section header index of 0
5994 [0x6fffffff] the associated symbol table. */
5997 #undef elf_backend_copy_special_section_fields
5998 #define elf_backend_copy_special_section_fields elf32_i386_copy_solaris_special_section_fields
6000 #include "elf32-target.h"
6002 /* Intel MCU support. */
6005 elf32_iamcu_elf_object_p (bfd *abfd)
6007 /* Set the right machine number for an IAMCU elf32 file. */
6008 bfd_default_set_arch_mach (abfd, bfd_arch_iamcu, bfd_mach_i386_iamcu);
6012 #undef TARGET_LITTLE_SYM
6013 #define TARGET_LITTLE_SYM iamcu_elf32_vec
6014 #undef TARGET_LITTLE_NAME
6015 #define TARGET_LITTLE_NAME "elf32-iamcu"
6017 #define ELF_ARCH bfd_arch_iamcu
6019 #undef ELF_MACHINE_CODE
6020 #define ELF_MACHINE_CODE EM_IAMCU
6025 #define elf32_bed elf32_iamcu_bed
6027 #undef elf_backend_object_p
6028 #define elf_backend_object_p elf32_iamcu_elf_object_p
6030 #undef elf_backend_static_tls_alignment
6032 #undef elf_backend_want_plt_sym
6033 #define elf_backend_want_plt_sym 0
6035 #undef elf_backend_strtab_flags
6036 #undef elf_backend_copy_special_section_fields
6038 #include "elf32-target.h"
6040 /* Restore defaults. */
6042 #define ELF_ARCH bfd_arch_i386
6043 #undef ELF_MACHINE_CODE
6044 #define ELF_MACHINE_CODE EM_386
6046 /* Native Client support. */
6048 #undef TARGET_LITTLE_SYM
6049 #define TARGET_LITTLE_SYM i386_elf32_nacl_vec
6050 #undef TARGET_LITTLE_NAME
6051 #define TARGET_LITTLE_NAME "elf32-i386-nacl"
6053 #define elf32_bed elf32_i386_nacl_bed
6055 #undef ELF_MAXPAGESIZE
6056 #define ELF_MAXPAGESIZE 0x10000
6058 /* Restore defaults. */
6060 #undef elf_backend_want_plt_sym
6061 #define elf_backend_want_plt_sym 0
6062 #undef elf_backend_post_process_headers
6063 #undef elf_backend_static_tls_alignment
6065 /* NaCl uses substantially different PLT entries for the same effects. */
6067 #undef elf_backend_plt_alignment
6068 #define elf_backend_plt_alignment 5
6069 #define NACL_PLT_ENTRY_SIZE 64
6070 #define NACLMASK 0xe0 /* 32-byte alignment mask. */
6072 static const bfd_byte elf_i386_nacl_plt0_entry[] =
6074 0xff, 0x35, /* pushl contents of address */
6075 0, 0, 0, 0, /* replaced with address of .got + 4. */
6076 0x8b, 0x0d, /* movl contents of address, %ecx */
6077 0, 0, 0, 0, /* replaced with address of .got + 8. */
6078 0x83, 0xe1, NACLMASK, /* andl $NACLMASK, %ecx */
6079 0xff, 0xe1 /* jmp *%ecx */
6082 static const bfd_byte elf_i386_nacl_plt_entry[NACL_PLT_ENTRY_SIZE] =
6084 0x8b, 0x0d, /* movl contents of address, %ecx */
6085 0, 0, 0, 0, /* replaced with GOT slot address. */
6086 0x83, 0xe1, NACLMASK, /* andl $NACLMASK, %ecx */
6087 0xff, 0xe1, /* jmp *%ecx */
6089 /* Pad to the next 32-byte boundary with nop instructions. */
6091 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6092 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6094 /* Lazy GOT entries point here (32-byte aligned). */
6095 0x68, /* pushl immediate */
6096 0, 0, 0, 0, /* replaced with reloc offset. */
6097 0xe9, /* jmp relative */
6098 0, 0, 0, 0, /* replaced with offset to .plt. */
6100 /* Pad to the next 32-byte boundary with nop instructions. */
6101 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6102 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6106 static const bfd_byte
6107 elf_i386_nacl_pic_plt0_entry[sizeof (elf_i386_nacl_plt0_entry)] =
6109 0xff, 0x73, 0x04, /* pushl 4(%ebx) */
6110 0x8b, 0x4b, 0x08, /* mov 0x8(%ebx), %ecx */
6111 0x83, 0xe1, 0xe0, /* and $NACLMASK, %ecx */
6112 0xff, 0xe1, /* jmp *%ecx */
6114 /* This is expected to be the same size as elf_i386_nacl_plt0_entry,
6115 so pad to that size with nop instructions. */
6116 0x90, 0x90, 0x90, 0x90, 0x90, 0x90
6119 static const bfd_byte elf_i386_nacl_pic_plt_entry[NACL_PLT_ENTRY_SIZE] =
6121 0x8b, 0x8b, /* movl offset(%ebx), %ecx */
6122 0, 0, 0, 0, /* replaced with offset of this symbol in .got. */
6123 0x83, 0xe1, 0xe0, /* andl $NACLMASK, %ecx */
6124 0xff, 0xe1, /* jmp *%ecx */
6126 /* Pad to the next 32-byte boundary with nop instructions. */
6128 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6129 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6131 /* Lazy GOT entries point here (32-byte aligned). */
6132 0x68, /* pushl immediate */
6133 0, 0, 0, 0, /* replaced with offset into relocation table. */
6134 0xe9, /* jmp relative */
6135 0, 0, 0, 0, /* replaced with offset to start of .plt. */
6137 /* Pad to the next 32-byte boundary with nop instructions. */
6138 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6139 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6143 static const bfd_byte elf_i386_nacl_eh_frame_plt[] =
6145 #if (PLT_CIE_LENGTH != 20 \
6146 || PLT_FDE_LENGTH != 36 \
6147 || PLT_FDE_START_OFFSET != 4 + PLT_CIE_LENGTH + 8 \
6148 || PLT_FDE_LEN_OFFSET != 4 + PLT_CIE_LENGTH + 12)
6149 # error "Need elf_i386_backend_data parameters for eh_frame_plt offsets!"
6151 PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
6152 0, 0, 0, 0, /* CIE ID */
6153 1, /* CIE version */
6154 'z', 'R', 0, /* Augmentation string */
6155 1, /* Code alignment factor */
6156 0x7c, /* Data alignment factor: -4 */
6157 8, /* Return address column */
6158 1, /* Augmentation size */
6159 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
6160 DW_CFA_def_cfa, 4, 4, /* DW_CFA_def_cfa: r4 (esp) ofs 4 */
6161 DW_CFA_offset + 8, 1, /* DW_CFA_offset: r8 (eip) at cfa-4 */
6162 DW_CFA_nop, DW_CFA_nop,
6164 PLT_FDE_LENGTH, 0, 0, 0, /* FDE length */
6165 PLT_CIE_LENGTH + 8, 0, 0, 0, /* CIE pointer */
6166 0, 0, 0, 0, /* R_386_PC32 .plt goes here */
6167 0, 0, 0, 0, /* .plt size goes here */
6168 0, /* Augmentation size */
6169 DW_CFA_def_cfa_offset, 8, /* DW_CFA_def_cfa_offset: 8 */
6170 DW_CFA_advance_loc + 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */
6171 DW_CFA_def_cfa_offset, 12, /* DW_CFA_def_cfa_offset: 12 */
6172 DW_CFA_advance_loc + 58, /* DW_CFA_advance_loc: 58 to __PLT__+64 */
6173 DW_CFA_def_cfa_expression, /* DW_CFA_def_cfa_expression */
6174 13, /* Block length */
6175 DW_OP_breg4, 4, /* DW_OP_breg4 (esp): 4 */
6176 DW_OP_breg8, 0, /* DW_OP_breg8 (eip): 0 */
6177 DW_OP_const1u, 63, DW_OP_and, DW_OP_const1u, 37, DW_OP_ge,
6178 DW_OP_lit2, DW_OP_shl, DW_OP_plus,
6179 DW_CFA_nop, DW_CFA_nop
6182 static const struct elf_i386_plt_layout elf_i386_nacl_plt =
6184 elf_i386_nacl_plt0_entry, /* plt0_entry */
6185 sizeof (elf_i386_nacl_plt0_entry), /* plt0_entry_size */
6186 2, /* plt0_got1_offset */
6187 8, /* plt0_got2_offset */
6188 elf_i386_nacl_plt_entry, /* plt_entry */
6189 NACL_PLT_ENTRY_SIZE, /* plt_entry_size */
6190 2, /* plt_got_offset */
6191 33, /* plt_reloc_offset */
6192 38, /* plt_plt_offset */
6193 32, /* plt_lazy_offset */
6194 elf_i386_nacl_pic_plt0_entry, /* pic_plt0_entry */
6195 elf_i386_nacl_pic_plt_entry, /* pic_plt_entry */
6196 elf_i386_nacl_eh_frame_plt, /* eh_frame_plt */
6197 sizeof (elf_i386_nacl_eh_frame_plt),/* eh_frame_plt_size */
6200 static const struct elf_i386_backend_data elf_i386_nacl_arch_bed =
6202 &elf_i386_nacl_plt, /* plt */
6203 0x90, /* plt0_pad_byte: nop insn */
6208 elf32_i386_nacl_elf_object_p (bfd *abfd)
6210 /* Set the right machine number for a NaCl i386 ELF32 file. */
6211 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_i386_i386_nacl);
6215 #undef elf_backend_arch_data
6216 #define elf_backend_arch_data &elf_i386_nacl_arch_bed
6218 #undef elf_backend_object_p
6219 #define elf_backend_object_p elf32_i386_nacl_elf_object_p
6220 #undef elf_backend_modify_segment_map
6221 #define elf_backend_modify_segment_map nacl_modify_segment_map
6222 #undef elf_backend_modify_program_headers
6223 #define elf_backend_modify_program_headers nacl_modify_program_headers
6224 #undef elf_backend_final_write_processing
6225 #define elf_backend_final_write_processing nacl_final_write_processing
6227 #include "elf32-target.h"
6229 /* Restore defaults. */
6230 #undef elf_backend_object_p
6231 #undef elf_backend_modify_segment_map
6232 #undef elf_backend_modify_program_headers
6233 #undef elf_backend_final_write_processing
6235 /* VxWorks support. */
6237 #undef TARGET_LITTLE_SYM
6238 #define TARGET_LITTLE_SYM i386_elf32_vxworks_vec
6239 #undef TARGET_LITTLE_NAME
6240 #define TARGET_LITTLE_NAME "elf32-i386-vxworks"
6242 #undef elf_backend_plt_alignment
6243 #define elf_backend_plt_alignment 4
6245 static const struct elf_i386_backend_data elf_i386_vxworks_arch_bed =
6247 &elf_i386_plt, /* plt */
6248 0x90, /* plt0_pad_byte */
6252 #undef elf_backend_arch_data
6253 #define elf_backend_arch_data &elf_i386_vxworks_arch_bed
6255 #undef elf_backend_relocs_compatible
6256 #undef elf_backend_add_symbol_hook
6257 #define elf_backend_add_symbol_hook \
6258 elf_vxworks_add_symbol_hook
6259 #undef elf_backend_link_output_symbol_hook
6260 #define elf_backend_link_output_symbol_hook \
6261 elf_vxworks_link_output_symbol_hook
6262 #undef elf_backend_emit_relocs
6263 #define elf_backend_emit_relocs elf_vxworks_emit_relocs
6264 #undef elf_backend_final_write_processing
6265 #define elf_backend_final_write_processing \
6266 elf_vxworks_final_write_processing
6267 #undef elf_backend_static_tls_alignment
6269 /* On VxWorks, we emit relocations against _PROCEDURE_LINKAGE_TABLE_, so
6271 #undef elf_backend_want_plt_sym
6272 #define elf_backend_want_plt_sym 1
6275 #define elf32_bed elf32_i386_vxworks_bed
6277 #include "elf32-target.h"