1 /* Intel 80386/80486-specific support for 32-bit ELF
2 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
3 Free Software Foundation, Inc.
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
27 static reloc_howto_type *elf_i386_reloc_type_lookup
28 PARAMS ((bfd *, bfd_reloc_code_real_type));
29 static void elf_i386_info_to_howto
30 PARAMS ((bfd *, arelent *, Elf32_Internal_Rela *));
31 static void elf_i386_info_to_howto_rel
32 PARAMS ((bfd *, arelent *, Elf32_Internal_Rel *));
33 static boolean elf_i386_is_local_label_name PARAMS ((bfd *, const char *));
34 static struct bfd_hash_entry *elf_i386_link_hash_newfunc
35 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
36 static struct bfd_link_hash_table *elf_i386_link_hash_table_create
38 static boolean create_got_section PARAMS((bfd *, struct bfd_link_info *));
39 static boolean elf_i386_create_dynamic_sections
40 PARAMS((bfd *, struct bfd_link_info *));
41 static boolean elf_i386_check_relocs
42 PARAMS ((bfd *, struct bfd_link_info *, asection *,
43 const Elf_Internal_Rela *));
44 static asection *elf_i386_gc_mark_hook
45 PARAMS ((bfd *, struct bfd_link_info *, Elf_Internal_Rela *,
46 struct elf_link_hash_entry *, Elf_Internal_Sym *));
47 static boolean elf_i386_gc_sweep_hook
48 PARAMS ((bfd *, struct bfd_link_info *, asection *,
49 const Elf_Internal_Rela *));
50 static boolean elf_i386_adjust_dynamic_symbol
51 PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
52 static boolean allocate_dynrelocs
53 PARAMS ((struct elf_link_hash_entry *, PTR));
54 static boolean readonly_dynrelocs
55 PARAMS ((struct elf_link_hash_entry *, PTR));
56 static boolean elf_i386_size_dynamic_sections
57 PARAMS ((bfd *, struct bfd_link_info *));
58 static boolean elf_i386_relocate_section
59 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
60 Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
61 static boolean elf_i386_finish_dynamic_symbol
62 PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
64 static boolean elf_i386_finish_dynamic_sections
65 PARAMS ((bfd *, struct bfd_link_info *));
66 static boolean elf_i386_fake_sections
67 PARAMS ((bfd *, Elf32_Internal_Shdr *, asection *));
68 static enum elf_reloc_type_class elf_i386_reloc_type_class
69 PARAMS ((const Elf_Internal_Rela *));
70 static boolean elf_i386_grok_prstatus
71 PARAMS ((bfd *abfd, Elf_Internal_Note *note));
72 static boolean elf_i386_grok_psinfo
73 PARAMS ((bfd *abfd, Elf_Internal_Note *note));
75 #define USE_REL 1 /* 386 uses REL relocations instead of RELA */
79 static reloc_howto_type elf_howto_table[]=
81 HOWTO(R_386_NONE, 0, 0, 0, false, 0, complain_overflow_bitfield,
82 bfd_elf_generic_reloc, "R_386_NONE",
83 true, 0x00000000, 0x00000000, false),
84 HOWTO(R_386_32, 0, 2, 32, false, 0, complain_overflow_bitfield,
85 bfd_elf_generic_reloc, "R_386_32",
86 true, 0xffffffff, 0xffffffff, false),
87 HOWTO(R_386_PC32, 0, 2, 32, true, 0, complain_overflow_bitfield,
88 bfd_elf_generic_reloc, "R_386_PC32",
89 true, 0xffffffff, 0xffffffff, true),
90 HOWTO(R_386_GOT32, 0, 2, 32, false, 0, complain_overflow_bitfield,
91 bfd_elf_generic_reloc, "R_386_GOT32",
92 true, 0xffffffff, 0xffffffff, false),
93 HOWTO(R_386_PLT32, 0, 2, 32, true, 0, complain_overflow_bitfield,
94 bfd_elf_generic_reloc, "R_386_PLT32",
95 true, 0xffffffff, 0xffffffff, true),
96 HOWTO(R_386_COPY, 0, 2, 32, false, 0, complain_overflow_bitfield,
97 bfd_elf_generic_reloc, "R_386_COPY",
98 true, 0xffffffff, 0xffffffff, false),
99 HOWTO(R_386_GLOB_DAT, 0, 2, 32, false, 0, complain_overflow_bitfield,
100 bfd_elf_generic_reloc, "R_386_GLOB_DAT",
101 true, 0xffffffff, 0xffffffff, false),
102 HOWTO(R_386_JUMP_SLOT, 0, 2, 32, false, 0, complain_overflow_bitfield,
103 bfd_elf_generic_reloc, "R_386_JUMP_SLOT",
104 true, 0xffffffff, 0xffffffff, false),
105 HOWTO(R_386_RELATIVE, 0, 2, 32, false, 0, complain_overflow_bitfield,
106 bfd_elf_generic_reloc, "R_386_RELATIVE",
107 true, 0xffffffff, 0xffffffff, false),
108 HOWTO(R_386_GOTOFF, 0, 2, 32, false, 0, complain_overflow_bitfield,
109 bfd_elf_generic_reloc, "R_386_GOTOFF",
110 true, 0xffffffff, 0xffffffff, false),
111 HOWTO(R_386_GOTPC, 0, 2, 32, true, 0, complain_overflow_bitfield,
112 bfd_elf_generic_reloc, "R_386_GOTPC",
113 true, 0xffffffff, 0xffffffff, true),
115 /* We have a gap in the reloc numbers here.
116 R_386_standard counts the number up to this point, and
117 R_386_ext_offset is the value to subtract from a reloc type of
118 R_386_16 thru R_386_PC8 to form an index into this table. */
119 #define R_386_standard ((unsigned int) R_386_GOTPC + 1)
120 #define R_386_ext_offset ((unsigned int) R_386_16 - R_386_standard)
122 /* The remaining relocs are a GNU extension. */
123 HOWTO(R_386_16, 0, 1, 16, false, 0, complain_overflow_bitfield,
124 bfd_elf_generic_reloc, "R_386_16",
125 true, 0xffff, 0xffff, false),
126 HOWTO(R_386_PC16, 0, 1, 16, true, 0, complain_overflow_bitfield,
127 bfd_elf_generic_reloc, "R_386_PC16",
128 true, 0xffff, 0xffff, true),
129 HOWTO(R_386_8, 0, 0, 8, false, 0, complain_overflow_bitfield,
130 bfd_elf_generic_reloc, "R_386_8",
131 true, 0xff, 0xff, false),
132 HOWTO(R_386_PC8, 0, 0, 8, true, 0, complain_overflow_signed,
133 bfd_elf_generic_reloc, "R_386_PC8",
134 true, 0xff, 0xff, true),
137 #define R_386_ext ((unsigned int) R_386_PC8 + 1 - R_386_ext_offset)
138 #define R_386_vt_offset ((unsigned int) R_386_GNU_VTINHERIT - R_386_ext)
140 /* GNU extension to record C++ vtable hierarchy. */
141 HOWTO (R_386_GNU_VTINHERIT, /* type */
143 2, /* size (0 = byte, 1 = short, 2 = long) */
145 false, /* pc_relative */
147 complain_overflow_dont, /* complain_on_overflow */
148 NULL, /* special_function */
149 "R_386_GNU_VTINHERIT", /* name */
150 false, /* partial_inplace */
155 /* GNU extension to record C++ vtable member usage. */
156 HOWTO (R_386_GNU_VTENTRY, /* type */
158 2, /* size (0 = byte, 1 = short, 2 = long) */
160 false, /* pc_relative */
162 complain_overflow_dont, /* complain_on_overflow */
163 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
164 "R_386_GNU_VTENTRY", /* name */
165 false, /* partial_inplace */
170 #define R_386_vt ((unsigned int) R_386_GNU_VTENTRY + 1 - R_386_vt_offset)
174 #ifdef DEBUG_GEN_RELOC
175 #define TRACE(str) fprintf (stderr, "i386 bfd reloc lookup %d (%s)\n", code, str)
180 static reloc_howto_type *
181 elf_i386_reloc_type_lookup (abfd, code)
182 bfd *abfd ATTRIBUTE_UNUSED;
183 bfd_reloc_code_real_type code;
188 TRACE ("BFD_RELOC_NONE");
189 return &elf_howto_table[(unsigned int) R_386_NONE ];
192 TRACE ("BFD_RELOC_32");
193 return &elf_howto_table[(unsigned int) R_386_32 ];
196 TRACE ("BFD_RELOC_CTOR");
197 return &elf_howto_table[(unsigned int) R_386_32 ];
199 case BFD_RELOC_32_PCREL:
200 TRACE ("BFD_RELOC_PC32");
201 return &elf_howto_table[(unsigned int) R_386_PC32 ];
203 case BFD_RELOC_386_GOT32:
204 TRACE ("BFD_RELOC_386_GOT32");
205 return &elf_howto_table[(unsigned int) R_386_GOT32 ];
207 case BFD_RELOC_386_PLT32:
208 TRACE ("BFD_RELOC_386_PLT32");
209 return &elf_howto_table[(unsigned int) R_386_PLT32 ];
211 case BFD_RELOC_386_COPY:
212 TRACE ("BFD_RELOC_386_COPY");
213 return &elf_howto_table[(unsigned int) R_386_COPY ];
215 case BFD_RELOC_386_GLOB_DAT:
216 TRACE ("BFD_RELOC_386_GLOB_DAT");
217 return &elf_howto_table[(unsigned int) R_386_GLOB_DAT ];
219 case BFD_RELOC_386_JUMP_SLOT:
220 TRACE ("BFD_RELOC_386_JUMP_SLOT");
221 return &elf_howto_table[(unsigned int) R_386_JUMP_SLOT ];
223 case BFD_RELOC_386_RELATIVE:
224 TRACE ("BFD_RELOC_386_RELATIVE");
225 return &elf_howto_table[(unsigned int) R_386_RELATIVE ];
227 case BFD_RELOC_386_GOTOFF:
228 TRACE ("BFD_RELOC_386_GOTOFF");
229 return &elf_howto_table[(unsigned int) R_386_GOTOFF ];
231 case BFD_RELOC_386_GOTPC:
232 TRACE ("BFD_RELOC_386_GOTPC");
233 return &elf_howto_table[(unsigned int) R_386_GOTPC ];
235 /* The remaining relocs are a GNU extension. */
237 TRACE ("BFD_RELOC_16");
238 return &elf_howto_table[(unsigned int) R_386_16 - R_386_ext_offset];
240 case BFD_RELOC_16_PCREL:
241 TRACE ("BFD_RELOC_16_PCREL");
242 return &elf_howto_table[(unsigned int) R_386_PC16 - R_386_ext_offset];
245 TRACE ("BFD_RELOC_8");
246 return &elf_howto_table[(unsigned int) R_386_8 - R_386_ext_offset];
248 case BFD_RELOC_8_PCREL:
249 TRACE ("BFD_RELOC_8_PCREL");
250 return &elf_howto_table[(unsigned int) R_386_PC8 - R_386_ext_offset];
252 case BFD_RELOC_VTABLE_INHERIT:
253 TRACE ("BFD_RELOC_VTABLE_INHERIT");
254 return &elf_howto_table[(unsigned int) R_386_GNU_VTINHERIT
257 case BFD_RELOC_VTABLE_ENTRY:
258 TRACE ("BFD_RELOC_VTABLE_ENTRY");
259 return &elf_howto_table[(unsigned int) R_386_GNU_VTENTRY
271 elf_i386_info_to_howto (abfd, cache_ptr, dst)
272 bfd *abfd ATTRIBUTE_UNUSED;
273 arelent *cache_ptr ATTRIBUTE_UNUSED;
274 Elf32_Internal_Rela *dst ATTRIBUTE_UNUSED;
280 elf_i386_info_to_howto_rel (abfd, cache_ptr, dst)
281 bfd *abfd ATTRIBUTE_UNUSED;
283 Elf32_Internal_Rel *dst;
285 unsigned int r_type = ELF32_R_TYPE (dst->r_info);
288 if ((indx = r_type) >= R_386_standard
289 && ((indx = r_type - R_386_ext_offset) - R_386_standard
290 >= R_386_ext - R_386_standard)
291 && ((indx = r_type - R_386_vt_offset) - R_386_ext
292 >= R_386_vt - R_386_ext))
294 (*_bfd_error_handler) (_("%s: invalid relocation type %d"),
295 bfd_archive_filename (abfd), (int) r_type);
296 indx = (unsigned int) R_386_NONE;
298 cache_ptr->howto = &elf_howto_table[indx];
301 /* Return whether a symbol name implies a local label. The UnixWare
302 2.1 cc generates temporary symbols that start with .X, so we
303 recognize them here. FIXME: do other SVR4 compilers also use .X?.
304 If so, we should move the .X recognition into
305 _bfd_elf_is_local_label_name. */
308 elf_i386_is_local_label_name (abfd, name)
312 if (name[0] == '.' && name[1] == 'X')
315 return _bfd_elf_is_local_label_name (abfd, name);
318 /* Functions for the i386 ELF linker. */
320 /* The name of the dynamic interpreter. This is put in the .interp
323 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1"
325 /* The size in bytes of an entry in the procedure linkage table. */
327 #define PLT_ENTRY_SIZE 16
329 /* The first entry in an absolute procedure linkage table looks like
330 this. See the SVR4 ABI i386 supplement to see how this works. */
332 static const bfd_byte elf_i386_plt0_entry[PLT_ENTRY_SIZE] =
334 0xff, 0x35, /* pushl contents of address */
335 0, 0, 0, 0, /* replaced with address of .got + 4. */
336 0xff, 0x25, /* jmp indirect */
337 0, 0, 0, 0, /* replaced with address of .got + 8. */
338 0, 0, 0, 0 /* pad out to 16 bytes. */
341 /* Subsequent entries in an absolute procedure linkage table look like
344 static const bfd_byte elf_i386_plt_entry[PLT_ENTRY_SIZE] =
346 0xff, 0x25, /* jmp indirect */
347 0, 0, 0, 0, /* replaced with address of this symbol in .got. */
348 0x68, /* pushl immediate */
349 0, 0, 0, 0, /* replaced with offset into relocation table. */
350 0xe9, /* jmp relative */
351 0, 0, 0, 0 /* replaced with offset to start of .plt. */
354 /* The first entry in a PIC procedure linkage table look like this. */
356 static const bfd_byte elf_i386_pic_plt0_entry[PLT_ENTRY_SIZE] =
358 0xff, 0xb3, 4, 0, 0, 0, /* pushl 4(%ebx) */
359 0xff, 0xa3, 8, 0, 0, 0, /* jmp *8(%ebx) */
360 0, 0, 0, 0 /* pad out to 16 bytes. */
363 /* Subsequent entries in a PIC procedure linkage table look like this. */
365 static const bfd_byte elf_i386_pic_plt_entry[PLT_ENTRY_SIZE] =
367 0xff, 0xa3, /* jmp *offset(%ebx) */
368 0, 0, 0, 0, /* replaced with offset of this symbol in .got. */
369 0x68, /* pushl immediate */
370 0, 0, 0, 0, /* replaced with offset into relocation table. */
371 0xe9, /* jmp relative */
372 0, 0, 0, 0 /* replaced with offset to start of .plt. */
375 /* The i386 linker needs to keep track of the number of relocs that it
376 decides to copy as dynamic relocs in check_relocs for each symbol.
377 This is so that it can later discard them if they are found to be
378 unnecessary. We store the information in a field extending the
379 regular ELF linker hash table. */
381 struct elf_i386_dyn_relocs
383 struct elf_i386_dyn_relocs *next;
385 /* The input section of the reloc. */
388 /* Total number of relocs copied for the input section. */
391 /* Number of pc-relative relocs copied for the input section. */
392 bfd_size_type pc_count;
395 /* i386 ELF linker hash entry. */
397 struct elf_i386_link_hash_entry
399 struct elf_link_hash_entry root;
401 /* Track dynamic relocs copied for this symbol. */
402 struct elf_i386_dyn_relocs *dyn_relocs;
405 /* i386 ELF linker hash table. */
407 struct elf_i386_link_hash_table
409 struct elf_link_hash_table root;
411 /* Short-cuts to get to dynamic linker sections. */
421 /* Get the i386 ELF linker hash table from a link_info structure. */
423 #define elf_i386_hash_table(p) \
424 ((struct elf_i386_link_hash_table *) ((p)->hash))
426 /* Create an entry in an i386 ELF linker hash table. */
428 static struct bfd_hash_entry *
429 elf_i386_link_hash_newfunc (entry, table, string)
430 struct bfd_hash_entry *entry;
431 struct bfd_hash_table *table;
434 struct elf_i386_link_hash_entry *ret =
435 (struct elf_i386_link_hash_entry *) entry;
437 /* Allocate the structure if it has not already been allocated by a
439 if (ret == (struct elf_i386_link_hash_entry *) NULL)
440 ret = ((struct elf_i386_link_hash_entry *)
441 bfd_hash_allocate (table,
442 sizeof (struct elf_i386_link_hash_entry)));
443 if (ret == (struct elf_i386_link_hash_entry *) NULL)
444 return (struct bfd_hash_entry *) ret;
446 /* Call the allocation method of the superclass. */
447 ret = ((struct elf_i386_link_hash_entry *)
448 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
450 if (ret != (struct elf_i386_link_hash_entry *) NULL)
452 ret->dyn_relocs = NULL;
455 return (struct bfd_hash_entry *) ret;
458 /* Create an i386 ELF linker hash table. */
460 static struct bfd_link_hash_table *
461 elf_i386_link_hash_table_create (abfd)
464 struct elf_i386_link_hash_table *ret;
465 bfd_size_type amt = sizeof (struct elf_i386_link_hash_table);
467 ret = (struct elf_i386_link_hash_table *) bfd_alloc (abfd, amt);
468 if (ret == (struct elf_i386_link_hash_table *) NULL)
471 if (! _bfd_elf_link_hash_table_init (&ret->root, abfd,
472 elf_i386_link_hash_newfunc))
474 bfd_release (abfd, ret);
486 return &ret->root.root;
489 /* Create .got, .gotplt, and .rel.got sections in DYNOBJ, and set up
490 shortcuts to them in our hash table. */
493 create_got_section (dynobj, info)
495 struct bfd_link_info *info;
497 struct elf_i386_link_hash_table *htab;
499 if (! _bfd_elf_create_got_section (dynobj, info))
502 htab = elf_i386_hash_table (info);
503 htab->sgot = bfd_get_section_by_name (dynobj, ".got");
504 htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
505 if (!htab->sgot || !htab->sgotplt)
508 htab->srelgot = bfd_make_section (dynobj, ".rel.got");
509 if (htab->srelgot == NULL
510 || ! bfd_set_section_flags (dynobj, htab->srelgot,
511 (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
512 | SEC_IN_MEMORY | SEC_LINKER_CREATED
514 || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2))
519 /* Create .plt, .rel.plt, .got, .got.plt, .rel.got, .dynbss, and
520 .rel.bss sections in DYNOBJ, and set up shortcuts to them in our
524 elf_i386_create_dynamic_sections (dynobj, info)
526 struct bfd_link_info *info;
528 struct elf_i386_link_hash_table *htab;
530 htab = elf_i386_hash_table (info);
531 if (!htab->sgot && !create_got_section (dynobj, info))
534 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
537 htab->splt = bfd_get_section_by_name (dynobj, ".plt");
538 htab->srelplt = bfd_get_section_by_name (dynobj, ".rel.plt");
539 htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
541 htab->srelbss = bfd_get_section_by_name (dynobj, ".rel.bss");
543 if (!htab->splt || !htab->srelplt || !htab->sdynbss
544 || (!info->shared && !htab->srelbss))
550 /* Look through the relocs for a section during the first phase, and
551 allocate space in the global offset table or procedure linkage
555 elf_i386_check_relocs (abfd, info, sec, relocs)
557 struct bfd_link_info *info;
559 const Elf_Internal_Rela *relocs;
561 struct elf_i386_link_hash_table *htab;
563 Elf_Internal_Shdr *symtab_hdr;
564 struct elf_link_hash_entry **sym_hashes;
565 bfd_signed_vma *local_got_refcounts;
566 const Elf_Internal_Rela *rel;
567 const Elf_Internal_Rela *rel_end;
570 if (info->relocateable)
573 htab = elf_i386_hash_table (info);
574 dynobj = htab->root.dynobj;
575 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
576 sym_hashes = elf_sym_hashes (abfd);
577 local_got_refcounts = elf_local_got_refcounts (abfd);
581 rel_end = relocs + sec->reloc_count;
582 for (rel = relocs; rel < rel_end; rel++)
584 unsigned long r_symndx;
585 struct elf_link_hash_entry *h;
587 r_symndx = ELF32_R_SYM (rel->r_info);
589 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
591 (*_bfd_error_handler) (_("%s: bad symbol index: %d"),
592 bfd_archive_filename (abfd),
597 if (r_symndx < symtab_hdr->sh_info)
600 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
602 /* Some relocs require a global offset table. */
603 if (htab->sgot == NULL)
605 switch (ELF32_R_TYPE (rel->r_info))
611 htab->root.dynobj = dynobj = abfd;
612 if (!create_got_section (dynobj, info))
621 switch (ELF32_R_TYPE (rel->r_info))
624 /* This symbol requires a global offset table entry. */
627 if (h->got.refcount == -1)
630 h->got.refcount += 1;
634 /* This is a global offset table entry for a local symbol. */
635 if (local_got_refcounts == NULL)
639 size = symtab_hdr->sh_info;
640 size *= sizeof (bfd_signed_vma);
641 local_got_refcounts = ((bfd_signed_vma *)
642 bfd_alloc (abfd, size));
643 if (local_got_refcounts == NULL)
645 elf_local_got_refcounts (abfd) = local_got_refcounts;
646 memset (local_got_refcounts, -1, (size_t) size);
648 if (local_got_refcounts[r_symndx] == -1)
649 local_got_refcounts[r_symndx] = 1;
651 local_got_refcounts[r_symndx] += 1;
656 /* This symbol requires a procedure linkage table entry. We
657 actually build the entry in adjust_dynamic_symbol,
658 because this might be a case of linking PIC code which is
659 never referenced by a dynamic object, in which case we
660 don't need to generate a procedure linkage table entry
663 /* If this is a local symbol, we resolve it directly without
664 creating a procedure linkage table entry. */
668 if (h->plt.refcount == -1)
670 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
674 h->plt.refcount += 1;
679 if (h != NULL && !info->shared)
681 /* If this reloc is in a read-only section, we might
682 need a copy reloc. */
683 if ((sec->flags & SEC_READONLY) != 0)
684 h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
686 /* We may need a .plt entry if the function this reloc
687 refers to is in a shared lib. */
688 if (h->plt.refcount == -1)
691 h->plt.refcount += 1;
694 /* If we are creating a shared library, and this is a reloc
695 against a global symbol, or a non PC relative reloc
696 against a local symbol, then we need to copy the reloc
697 into the shared library. However, if we are linking with
698 -Bsymbolic, we do not need to copy a reloc against a
699 global symbol which is defined in an object we are
700 including in the link (i.e., DEF_REGULAR is set). At
701 this point we have not seen all the input files, so it is
702 possible that DEF_REGULAR is not set now but will be set
703 later (it is never cleared). In case of a weak definition,
704 DEF_REGULAR may be cleared later by a strong definition in
705 a shared library. We account for that possibility below by
706 storing information in the relocs_copied field of the hash
707 table entry. A similar situation occurs when creating
708 shared libraries and symbol visibility changes render the
711 If on the other hand, we are creating an executable, we
712 may need to keep relocations for symbols satisfied by a
713 dynamic library if we manage to avoid copy relocs for the
716 && (sec->flags & SEC_ALLOC) != 0
717 && (ELF32_R_TYPE (rel->r_info) != R_386_PC32
720 || h->root.type == bfd_link_hash_defweak
721 || (h->elf_link_hash_flags
722 & ELF_LINK_HASH_DEF_REGULAR) == 0))))
724 && (sec->flags & SEC_ALLOC) != 0
726 && (h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
727 && (h->root.type == bfd_link_hash_defweak
728 || (h->elf_link_hash_flags
729 & ELF_LINK_HASH_DEF_REGULAR) == 0)))
731 /* We must copy these reloc types into the output file.
732 Create a reloc section in dynobj and make room for
735 htab->root.dynobj = dynobj = abfd;
741 name = (bfd_elf_string_from_elf_section
743 elf_elfheader (abfd)->e_shstrndx,
744 elf_section_data (sec)->rel_hdr.sh_name));
748 if (strncmp (name, ".rel", 4) != 0
749 || strcmp (bfd_get_section_name (abfd, sec),
752 (*_bfd_error_handler)
753 (_("%s: bad relocation section name `%s\'"),
754 bfd_archive_filename (abfd), name);
757 sreloc = bfd_get_section_by_name (dynobj, name);
762 sreloc = bfd_make_section (dynobj, name);
763 flags = (SEC_HAS_CONTENTS | SEC_READONLY
764 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
765 if ((sec->flags & SEC_ALLOC) != 0)
766 flags |= SEC_ALLOC | SEC_LOAD;
768 || ! bfd_set_section_flags (dynobj, sreloc, flags)
769 || ! bfd_set_section_alignment (dynobj, sreloc, 2))
772 elf_section_data (sec)->sreloc = sreloc;
775 /* If this is a global symbol, we count the number of
776 relocations we need for this symbol. */
779 struct elf_i386_link_hash_entry *eh;
780 struct elf_i386_dyn_relocs *p;
782 eh = (struct elf_i386_link_hash_entry *) h;
785 if (p == NULL || p->sec != sec)
787 p = ((struct elf_i386_dyn_relocs *)
788 bfd_alloc (dynobj, (bfd_size_type) sizeof *p));
791 p->next = eh->dyn_relocs;
799 if (ELF32_R_TYPE (rel->r_info) == R_386_PC32)
804 /* Track dynamic relocs needed for local syms too. */
805 elf_section_data (sec)->local_dynrel += 1;
811 /* This relocation describes the C++ object vtable hierarchy.
812 Reconstruct it for later use during GC. */
813 case R_386_GNU_VTINHERIT:
814 if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
818 /* This relocation describes which C++ vtable entries are actually
819 used. Record for later use during GC. */
820 case R_386_GNU_VTENTRY:
821 if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_offset))
833 /* Return the section that should be marked against GC for a given
837 elf_i386_gc_mark_hook (abfd, info, rel, h, sym)
839 struct bfd_link_info *info ATTRIBUTE_UNUSED;
840 Elf_Internal_Rela *rel;
841 struct elf_link_hash_entry *h;
842 Elf_Internal_Sym *sym;
846 switch (ELF32_R_TYPE (rel->r_info))
848 case R_386_GNU_VTINHERIT:
849 case R_386_GNU_VTENTRY:
853 switch (h->root.type)
855 case bfd_link_hash_defined:
856 case bfd_link_hash_defweak:
857 return h->root.u.def.section;
859 case bfd_link_hash_common:
860 return h->root.u.c.p->section;
869 if (!(elf_bad_symtab (abfd)
870 && ELF_ST_BIND (sym->st_info) != STB_LOCAL)
871 && ! ((sym->st_shndx <= 0 || sym->st_shndx >= SHN_LORESERVE)
872 && sym->st_shndx != SHN_COMMON))
874 return bfd_section_from_elf_index (abfd, sym->st_shndx);
881 /* Update the got entry reference counts for the section being removed. */
884 elf_i386_gc_sweep_hook (abfd, info, sec, relocs)
886 struct bfd_link_info *info;
888 const Elf_Internal_Rela *relocs;
890 Elf_Internal_Shdr *symtab_hdr;
891 struct elf_link_hash_entry **sym_hashes;
892 bfd_signed_vma *local_got_refcounts;
893 const Elf_Internal_Rela *rel, *relend;
894 unsigned long r_symndx;
895 struct elf_link_hash_entry *h;
898 elf_section_data (sec)->local_dynrel = 0;
900 dynobj = elf_hash_table (info)->dynobj;
904 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
905 sym_hashes = elf_sym_hashes (abfd);
906 local_got_refcounts = elf_local_got_refcounts (abfd);
908 relend = relocs + sec->reloc_count;
909 for (rel = relocs; rel < relend; rel++)
910 switch (ELF32_R_TYPE (rel->r_info))
915 r_symndx = ELF32_R_SYM (rel->r_info);
916 if (r_symndx >= symtab_hdr->sh_info)
918 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
919 if (h->got.refcount > 0)
920 h->got.refcount -= 1;
922 else if (local_got_refcounts != NULL)
924 if (local_got_refcounts[r_symndx] > 0)
925 local_got_refcounts[r_symndx] -= 1;
931 r_symndx = ELF32_R_SYM (rel->r_info);
932 if (r_symndx >= symtab_hdr->sh_info)
934 struct elf_i386_link_hash_entry *eh;
935 struct elf_i386_dyn_relocs **pp;
936 struct elf_i386_dyn_relocs *p;
938 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
940 if (!info->shared && h->plt.refcount > 0)
941 h->plt.refcount -= 1;
943 eh = (struct elf_i386_link_hash_entry *) h;
945 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
948 if (ELF32_R_TYPE (rel->r_info) == R_386_PC32)
959 r_symndx = ELF32_R_SYM (rel->r_info);
960 if (r_symndx >= symtab_hdr->sh_info)
962 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
963 if (h->plt.refcount > 0)
964 h->plt.refcount -= 1;
975 /* Adjust a symbol defined by a dynamic object and referenced by a
976 regular object. The current definition is in some section of the
977 dynamic object, but we're not including those sections. We have to
978 change the definition to something the rest of the link can
982 elf_i386_adjust_dynamic_symbol (info, h)
983 struct bfd_link_info *info;
984 struct elf_link_hash_entry *h;
986 struct elf_i386_link_hash_table *htab;
989 unsigned int power_of_two;
991 htab = elf_i386_hash_table (info);
992 dynobj = htab->root.dynobj;
994 /* If this is a function, put it in the procedure linkage table. We
995 will fill in the contents of the procedure linkage table later,
996 when we know the address of the .got section. */
997 if (h->type == STT_FUNC
998 || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
1000 if (h->plt.refcount <= 0
1002 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0
1003 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0))
1005 /* This case can occur if we saw a PLT32 reloc in an input
1006 file, but the symbol was never referred to by a dynamic
1007 object, or if all references were garbage collected. In
1008 such a case, we don't actually need to build a procedure
1009 linkage table, and we can just do a PC32 reloc instead. */
1010 h->plt.refcount = (bfd_vma) -1;
1011 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
1017 /* It's possible that we incorrectly decided a .plt reloc was
1018 needed for an R_386_PC32 reloc to a non-function sym in
1019 check_relocs. We can't decide accurately between function and
1020 non-function syms in check-relocs; Objects loaded later in
1021 the link may change h->type. So fix it now. */
1022 h->plt.refcount = (bfd_vma) -1;
1024 /* If this is a weak symbol, and there is a real definition, the
1025 processor independent code will have arranged for us to see the
1026 real definition first, and we can just use the same value. */
1027 if (h->weakdef != NULL)
1029 BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
1030 || h->weakdef->root.type == bfd_link_hash_defweak);
1031 h->root.u.def.section = h->weakdef->root.u.def.section;
1032 h->root.u.def.value = h->weakdef->root.u.def.value;
1036 /* This is a reference to a symbol defined by a dynamic object which
1037 is not a function. */
1039 /* If we are creating a shared library, we must presume that the
1040 only references to the symbol are via the global offset table.
1041 For such cases we need not do anything here; the relocations will
1042 be handled correctly by relocate_section. */
1046 /* If there are no references to this symbol that do not use the
1047 GOT, we don't need to generate a copy reloc. */
1048 if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0)
1051 /* We must allocate the symbol in our .dynbss section, which will
1052 become part of the .bss section of the executable. There will be
1053 an entry for this symbol in the .dynsym section. The dynamic
1054 object will contain position independent code, so all references
1055 from the dynamic object to this symbol will go through the global
1056 offset table. The dynamic linker will use the .dynsym entry to
1057 determine the address it must put in the global offset table, so
1058 both the dynamic object and the regular object will refer to the
1059 same memory location for the variable. */
1065 /* We must generate a R_386_COPY reloc to tell the dynamic linker to
1066 copy the initial value out of the dynamic object and into the
1067 runtime process image. We need to remember the offset into the
1068 .rel.bss section we are going to use. */
1069 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
1073 srel = htab->srelbss;
1076 srel->_raw_size += sizeof (Elf32_External_Rel);
1077 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
1080 /* We need to figure out the alignment required for this symbol. I
1081 have no idea how ELF linkers handle this. */
1082 power_of_two = bfd_log2 (h->size);
1083 if (power_of_two > 3)
1086 /* Apply the required alignment. */
1087 s->_raw_size = BFD_ALIGN (s->_raw_size,
1088 (bfd_size_type) (1 << power_of_two));
1089 if (power_of_two > bfd_get_section_alignment (dynobj, s))
1091 if (! bfd_set_section_alignment (dynobj, s, power_of_two))
1095 /* Define the symbol as being at this point in the section. */
1096 h->root.u.def.section = s;
1097 h->root.u.def.value = s->_raw_size;
1099 /* Increment the section size to make room for the symbol. */
1100 s->_raw_size += h->size;
1105 /* This is the condition under which elf_i386_finish_dynamic_symbol
1106 will be called from elflink.h. If elflink.h doesn't call our
1107 finish_dynamic_symbol routine, we'll need to do something about
1108 initializing any .plt and .got entries in elf_i386_relocate_section. */
1109 #define WILL_CALL_FINISH_DYNAMIC_SYMBOL(DYN, INFO, H) \
1111 && ((INFO)->shared \
1112 || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) \
1113 && ((H)->dynindx != -1 \
1114 || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0))
1116 /* Allocate space in .plt, .got and associated reloc sections for
1120 allocate_dynrelocs (h, inf)
1121 struct elf_link_hash_entry *h;
1124 struct bfd_link_info *info;
1125 struct elf_i386_link_hash_table *htab;
1127 struct elf_i386_link_hash_entry *eh;
1128 struct elf_i386_dyn_relocs *p;
1130 if (h->root.type == bfd_link_hash_indirect
1131 || h->root.type == bfd_link_hash_warning)
1134 info = (struct bfd_link_info *) inf;
1135 htab = elf_i386_hash_table (info);
1137 if (htab->root.dynamic_sections_created
1138 && h->plt.refcount > 0)
1140 /* Make sure this symbol is output as a dynamic symbol.
1141 Undefined weak syms won't yet be marked as dynamic. */
1142 if (h->dynindx == -1
1143 && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1145 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
1153 /* If this is the first .plt entry, make room for the special
1155 if (s->_raw_size == 0)
1156 s->_raw_size += PLT_ENTRY_SIZE;
1158 h->plt.offset = s->_raw_size;
1160 /* If this symbol is not defined in a regular file, and we are
1161 not generating a shared library, then set the symbol to this
1162 location in the .plt. This is required to make function
1163 pointers compare as equal between the normal executable and
1164 the shared library. */
1166 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1168 h->root.u.def.section = s;
1169 h->root.u.def.value = h->plt.offset;
1172 /* Make room for this entry. */
1173 s->_raw_size += PLT_ENTRY_SIZE;
1175 /* We also need to make an entry in the .got.plt section, which
1176 will be placed in the .got section by the linker script. */
1182 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info, h))
1184 /* We also need to make an entry in the .rel.plt section. */
1188 s->_raw_size += sizeof (Elf32_External_Rel);
1193 h->plt.offset = (bfd_vma) -1;
1194 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
1197 if (h->got.refcount > 0)
1201 /* Make sure this symbol is output as a dynamic symbol.
1202 Undefined weak syms won't yet be marked as dynamic. */
1203 if (h->dynindx == -1
1204 && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1206 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
1211 h->got.offset = s->_raw_size;
1213 dyn = htab->root.dynamic_sections_created;
1214 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h))
1215 htab->srelgot->_raw_size += sizeof (Elf32_External_Rel);
1218 h->got.offset = (bfd_vma) -1;
1220 eh = (struct elf_i386_link_hash_entry *) h;
1221 if (eh->dyn_relocs == NULL)
1224 /* In the shared -Bsymbolic case, discard space allocated for
1225 dynamic pc-relative relocs against symbols which turn out to be
1226 defined in regular objects. For the normal shared case, discard
1227 space for relocs that have become local due to symbol visibility
1232 if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0
1233 && ((h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0
1236 struct elf_i386_dyn_relocs **pp;
1238 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
1240 p->count -= p->pc_count;
1251 /* For the non-shared case, discard space for relocs against
1252 symbols which turn out to need copy relocs or are not
1255 if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
1256 && (((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
1257 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1258 || (htab->root.dynamic_sections_created
1259 && (h->root.type == bfd_link_hash_undefweak
1260 || h->root.type == bfd_link_hash_undefined))))
1262 /* Make sure this symbol is output as a dynamic symbol.
1263 Undefined weak syms won't yet be marked as dynamic. */
1264 if (h->dynindx == -1
1265 && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1267 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
1271 /* If that succeeded, we know we'll be keeping all the
1273 if (h->dynindx != -1)
1277 eh->dyn_relocs = NULL;
1282 /* Finally, allocate space. */
1283 for (p = eh->dyn_relocs; p != NULL; p = p->next)
1285 asection *sreloc = elf_section_data (p->sec)->sreloc;
1286 sreloc->_raw_size += p->count * sizeof (Elf32_External_Rel);
1292 /* Find any dynamic relocs that apply to read-only sections. */
1295 readonly_dynrelocs (h, inf)
1296 struct elf_link_hash_entry *h;
1299 struct elf_i386_link_hash_entry *eh;
1300 struct elf_i386_dyn_relocs *p;
1302 eh = (struct elf_i386_link_hash_entry *) h;
1303 for (p = eh->dyn_relocs; p != NULL; p = p->next)
1305 asection *s = p->sec->output_section;
1307 if (s != NULL && (s->flags & SEC_READONLY) != 0)
1309 struct bfd_link_info *info = (struct bfd_link_info *) inf;
1311 info->flags |= DF_TEXTREL;
1313 /* Not an error, just cut short the traversal. */
1320 /* Set the sizes of the dynamic sections. */
1323 elf_i386_size_dynamic_sections (output_bfd, info)
1324 bfd *output_bfd ATTRIBUTE_UNUSED;
1325 struct bfd_link_info *info;
1327 struct elf_i386_link_hash_table *htab;
1333 htab = elf_i386_hash_table (info);
1334 dynobj = htab->root.dynobj;
1338 if (htab->root.dynamic_sections_created)
1340 /* Set the contents of the .interp section to the interpreter. */
1343 s = bfd_get_section_by_name (dynobj, ".interp");
1346 s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
1347 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1351 /* Set up .got offsets for local syms, and space for local dynamic
1353 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
1355 bfd_signed_vma *local_got;
1356 bfd_signed_vma *end_local_got;
1357 bfd_size_type locsymcount;
1358 Elf_Internal_Shdr *symtab_hdr;
1361 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
1364 for (s = ibfd->sections; s != NULL; s = s->next)
1366 bfd_size_type count = elf_section_data (s)->local_dynrel;
1370 srel = elf_section_data (s)->sreloc;
1371 srel->_raw_size += count * sizeof (Elf32_External_Rel);
1375 local_got = elf_local_got_refcounts (ibfd);
1379 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
1380 locsymcount = symtab_hdr->sh_info;
1381 end_local_got = local_got + locsymcount;
1383 srel = htab->srelgot;
1384 for (; local_got < end_local_got; ++local_got)
1388 *local_got = s->_raw_size;
1391 srel->_raw_size += sizeof (Elf32_External_Rel);
1394 *local_got = (bfd_vma) -1;
1398 /* Allocate global sym .plt and .got entries, and space for global
1399 sym dynamic relocs. */
1400 elf_link_hash_traverse (&htab->root, allocate_dynrelocs, (PTR) info);
1402 /* We now have determined the sizes of the various dynamic sections.
1403 Allocate memory for them. */
1405 for (s = dynobj->sections; s != NULL; s = s->next)
1407 if ((s->flags & SEC_LINKER_CREATED) == 0)
1412 || s == htab->sgotplt)
1414 /* Strip this section if we don't need it; see the
1417 else if (strncmp (bfd_get_section_name (dynobj, s), ".rel", 4) == 0)
1419 if (s->_raw_size == 0)
1421 /* If we don't need this section, strip it from the
1422 output file. This is mostly to handle .rel.bss and
1423 .rel.plt. We must create both sections in
1424 create_dynamic_sections, because they must be created
1425 before the linker maps input sections to output
1426 sections. The linker does that before
1427 adjust_dynamic_symbol is called, and it is that
1428 function which decides whether anything needs to go
1429 into these sections. */
1433 if (s != htab->srelplt)
1436 /* We use the reloc_count field as a counter if we need
1437 to copy relocs into the output file. */
1443 /* It's not one of our sections, so don't allocate space. */
1447 if (s->_raw_size == 0)
1449 _bfd_strip_section_from_output (info, s);
1453 /* Allocate memory for the section contents. We use bfd_zalloc
1454 here in case unused entries are not reclaimed before the
1455 section's contents are written out. This should not happen,
1456 but this way if it does, we get a R_386_NONE reloc instead
1458 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size);
1459 if (s->contents == NULL)
1463 if (htab->root.dynamic_sections_created)
1465 /* Add some entries to the .dynamic section. We fill in the
1466 values later, in elf_i386_finish_dynamic_sections, but we
1467 must add the entries now so that we get the correct size for
1468 the .dynamic section. The DT_DEBUG entry is filled in by the
1469 dynamic linker and used by the debugger. */
1470 #define add_dynamic_entry(TAG, VAL) \
1471 bfd_elf32_add_dynamic_entry (info, (bfd_vma) (TAG), (bfd_vma) (VAL))
1475 if (!add_dynamic_entry (DT_DEBUG, 0))
1479 if (htab->splt->_raw_size != 0)
1481 if (!add_dynamic_entry (DT_PLTGOT, 0)
1482 || !add_dynamic_entry (DT_PLTRELSZ, 0)
1483 || !add_dynamic_entry (DT_PLTREL, DT_REL)
1484 || !add_dynamic_entry (DT_JMPREL, 0))
1490 if (!add_dynamic_entry (DT_REL, 0)
1491 || !add_dynamic_entry (DT_RELSZ, 0)
1492 || !add_dynamic_entry (DT_RELENT, sizeof (Elf32_External_Rel)))
1495 /* If any dynamic relocs apply to a read-only section,
1496 then we need a DT_TEXTREL entry. */
1497 elf_link_hash_traverse (&htab->root, readonly_dynrelocs, (PTR) info);
1499 if ((info->flags & DF_TEXTREL) != 0)
1501 if (!add_dynamic_entry (DT_TEXTREL, 0))
1506 #undef add_dynamic_entry
1511 /* Relocate an i386 ELF section. */
1514 elf_i386_relocate_section (output_bfd, info, input_bfd, input_section,
1515 contents, relocs, local_syms, local_sections)
1517 struct bfd_link_info *info;
1519 asection *input_section;
1521 Elf_Internal_Rela *relocs;
1522 Elf_Internal_Sym *local_syms;
1523 asection **local_sections;
1525 struct elf_i386_link_hash_table *htab;
1527 Elf_Internal_Shdr *symtab_hdr;
1528 struct elf_link_hash_entry **sym_hashes;
1529 bfd_vma *local_got_offsets;
1530 Elf_Internal_Rela *rel;
1531 Elf_Internal_Rela *relend;
1533 htab = elf_i386_hash_table (info);
1534 dynobj = htab->root.dynobj;
1535 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1536 sym_hashes = elf_sym_hashes (input_bfd);
1537 local_got_offsets = elf_local_got_offsets (input_bfd);
1540 relend = relocs + input_section->reloc_count;
1541 for (; rel < relend; rel++)
1544 reloc_howto_type *howto;
1545 unsigned long r_symndx;
1546 struct elf_link_hash_entry *h;
1547 Elf_Internal_Sym *sym;
1551 boolean unresolved_reloc;
1552 bfd_reloc_status_type r;
1555 r_type = ELF32_R_TYPE (rel->r_info);
1556 if (r_type == (int) R_386_GNU_VTINHERIT
1557 || r_type == (int) R_386_GNU_VTENTRY)
1560 if ((indx = (unsigned) r_type) >= R_386_standard
1561 && ((indx = (unsigned) r_type - R_386_ext_offset) - R_386_standard
1562 >= R_386_ext - R_386_standard))
1564 bfd_set_error (bfd_error_bad_value);
1567 howto = elf_howto_table + indx;
1569 r_symndx = ELF32_R_SYM (rel->r_info);
1571 if (info->relocateable)
1573 /* This is a relocateable link. We don't have to change
1574 anything, unless the reloc is against a section symbol,
1575 in which case we have to adjust according to where the
1576 section symbol winds up in the output section. */
1577 if (r_symndx < symtab_hdr->sh_info)
1579 sym = local_syms + r_symndx;
1580 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
1584 sec = local_sections[r_symndx];
1585 val = bfd_get_32 (input_bfd, contents + rel->r_offset);
1586 val += sec->output_offset + sym->st_value;
1587 bfd_put_32 (input_bfd, val, contents + rel->r_offset);
1594 /* This is a final link. */
1598 unresolved_reloc = false;
1599 if (r_symndx < symtab_hdr->sh_info)
1601 sym = local_syms + r_symndx;
1602 sec = local_sections[r_symndx];
1603 relocation = (sec->output_section->vma
1604 + sec->output_offset
1609 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1610 while (h->root.type == bfd_link_hash_indirect
1611 || h->root.type == bfd_link_hash_warning)
1612 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1615 if (h->root.type == bfd_link_hash_defined
1616 || h->root.type == bfd_link_hash_defweak)
1618 sec = h->root.u.def.section;
1619 if (sec->output_section == NULL)
1620 /* Set a flag that will be cleared later if we find a
1621 relocation value for this symbol. output_section
1622 is typically NULL for symbols satisfied by a shared
1624 unresolved_reloc = true;
1626 relocation = (h->root.u.def.value
1627 + sec->output_section->vma
1628 + sec->output_offset);
1630 else if (h->root.type == bfd_link_hash_undefweak)
1632 else if (info->shared
1633 && (!info->symbolic || info->allow_shlib_undefined)
1634 && !info->no_undefined
1635 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
1639 if (! ((*info->callbacks->undefined_symbol)
1640 (info, h->root.root.string, input_bfd,
1641 input_section, rel->r_offset,
1642 (!info->shared || info->no_undefined
1643 || ELF_ST_VISIBILITY (h->other)))))
1651 /* Relocation is to the entry for this symbol in the global
1653 if (htab->sgot == NULL)
1660 off = h->got.offset;
1661 dyn = htab->root.dynamic_sections_created;
1662 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h)
1666 || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL))
1667 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
1669 /* This is actually a static link, or it is a
1670 -Bsymbolic link and the symbol is defined
1671 locally, or the symbol was forced to be local
1672 because of a version file. We must initialize
1673 this entry in the global offset table. Since the
1674 offset must always be a multiple of 4, we use the
1675 least significant bit to record whether we have
1676 initialized it already.
1678 When doing a dynamic link, we create a .rel.got
1679 relocation entry to initialize the value. This
1680 is done in the finish_dynamic_symbol routine. */
1685 bfd_put_32 (output_bfd, relocation,
1686 htab->sgot->contents + off);
1691 unresolved_reloc = false;
1695 if (local_got_offsets == NULL)
1698 off = local_got_offsets[r_symndx];
1700 /* The offset must always be a multiple of 4. We use
1701 the least significant bit to record whether we have
1702 already generated the necessary reloc. */
1707 bfd_put_32 (output_bfd, relocation,
1708 htab->sgot->contents + off);
1713 Elf_Internal_Rel outrel;
1715 srelgot = htab->srelgot;
1716 if (srelgot == NULL)
1719 outrel.r_offset = (htab->sgot->output_section->vma
1720 + htab->sgot->output_offset
1722 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
1723 bfd_elf32_swap_reloc_out (output_bfd, &outrel,
1724 (((Elf32_External_Rel *)
1726 + srelgot->reloc_count));
1727 ++srelgot->reloc_count;
1730 local_got_offsets[r_symndx] |= 1;
1734 if (off >= (bfd_vma) -2)
1737 relocation = htab->sgot->output_offset + off;
1741 /* Relocation is relative to the start of the global offset
1744 /* Note that sgot->output_offset is not involved in this
1745 calculation. We always want the start of .got. If we
1746 defined _GLOBAL_OFFSET_TABLE in a different way, as is
1747 permitted by the ABI, we might have to change this
1749 relocation -= htab->sgot->output_section->vma;
1753 /* Use global offset table as symbol value. */
1754 relocation = htab->sgot->output_section->vma;
1755 unresolved_reloc = false;
1759 /* Relocation is to the entry for this symbol in the
1760 procedure linkage table. */
1762 /* Resolve a PLT32 reloc against a local symbol directly,
1763 without using the procedure linkage table. */
1767 if (h->plt.offset == (bfd_vma) -1
1768 || htab->splt == NULL)
1770 /* We didn't make a PLT entry for this symbol. This
1771 happens when statically linking PIC code, or when
1772 using -Bsymbolic. */
1776 relocation = (htab->splt->output_section->vma
1777 + htab->splt->output_offset
1779 unresolved_reloc = false;
1785 && (input_section->flags & SEC_ALLOC) != 0
1786 && (r_type != R_386_PC32
1789 && (! info->symbolic
1790 || (h->elf_link_hash_flags
1791 & ELF_LINK_HASH_DEF_REGULAR) == 0))))
1793 && (input_section->flags & SEC_ALLOC) != 0
1796 && (h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
1797 && (((h->elf_link_hash_flags
1798 & ELF_LINK_HASH_DEF_DYNAMIC) != 0
1799 && (h->elf_link_hash_flags
1800 & ELF_LINK_HASH_DEF_REGULAR) == 0)
1801 || h->root.type == bfd_link_hash_undefweak
1802 || h->root.type == bfd_link_hash_undefined)))
1804 Elf_Internal_Rel outrel;
1805 boolean skip, relocate;
1807 Elf32_External_Rel *loc;
1809 /* When generating a shared object, these relocations
1810 are copied into the output file to be resolved at run
1815 if (elf_section_data (input_section)->stab_info == NULL)
1816 outrel.r_offset = rel->r_offset;
1819 off = (_bfd_stab_section_offset
1820 (output_bfd, htab->root.stab_info, input_section,
1821 &elf_section_data (input_section)->stab_info,
1823 if (off == (bfd_vma) -1)
1825 outrel.r_offset = off;
1828 outrel.r_offset += (input_section->output_section->vma
1829 + input_section->output_offset);
1833 memset (&outrel, 0, sizeof outrel);
1838 && (r_type == R_386_PC32
1841 || (h->elf_link_hash_flags
1842 & ELF_LINK_HASH_DEF_REGULAR) == 0))
1846 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
1850 /* This symbol is local, or marked to become local. */
1852 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
1855 sreloc = elf_section_data (input_section)->sreloc;
1859 loc = ((Elf32_External_Rel *) sreloc->contents
1860 + sreloc->reloc_count);
1861 sreloc->reloc_count += 1;
1862 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
1864 /* If this reloc is against an external symbol, we do
1865 not want to fiddle with the addend. Otherwise, we
1866 need to include the symbol value so that it becomes
1867 an addend for the dynamic reloc. */
1878 /* FIXME: Why do we allow debugging sections to escape this error?
1879 More importantly, why do we not emit dynamic relocs for
1880 R_386_32 above in debugging sections (which are ! SEC_ALLOC)?
1881 If we had emitted the dynamic reloc, we could remove the
1883 if (unresolved_reloc
1885 && (input_section->flags & SEC_DEBUGGING) != 0
1886 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0))
1887 (*_bfd_error_handler)
1888 (_("%s(%s+0x%lx): unresolvable relocation against symbol `%s'"),
1889 bfd_archive_filename (input_bfd),
1890 bfd_get_section_name (input_bfd, input_section),
1891 (long) rel->r_offset,
1892 h->root.root.string);
1894 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1895 contents, rel->r_offset,
1896 relocation, (bfd_vma) 0);
1903 case bfd_reloc_overflow:
1908 name = h->root.root.string;
1911 name = bfd_elf_string_from_elf_section (input_bfd,
1912 symtab_hdr->sh_link,
1917 name = bfd_section_name (input_bfd, sec);
1919 if (! ((*info->callbacks->reloc_overflow)
1920 (info, name, howto->name, (bfd_vma) 0,
1921 input_bfd, input_section, rel->r_offset)))
1927 case bfd_reloc_outofrange:
1936 /* Finish up dynamic symbol handling. We set the contents of various
1937 dynamic sections here. */
1940 elf_i386_finish_dynamic_symbol (output_bfd, info, h, sym)
1942 struct bfd_link_info *info;
1943 struct elf_link_hash_entry *h;
1944 Elf_Internal_Sym *sym;
1946 struct elf_i386_link_hash_table *htab;
1949 htab = elf_i386_hash_table (info);
1950 dynobj = htab->root.dynobj;
1952 if (h->plt.offset != (bfd_vma) -1)
1956 Elf_Internal_Rel rel;
1958 /* This symbol has an entry in the procedure linkage table. Set
1961 if (h->dynindx == -1
1962 || htab->splt == NULL
1963 || htab->sgotplt == NULL
1964 || htab->srelplt == NULL)
1967 /* Get the index in the procedure linkage table which
1968 corresponds to this symbol. This is the index of this symbol
1969 in all the symbols for which we are making plt entries. The
1970 first entry in the procedure linkage table is reserved. */
1971 plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
1973 /* Get the offset into the .got table of the entry that
1974 corresponds to this function. Each .got entry is 4 bytes.
1975 The first three are reserved. */
1976 got_offset = (plt_index + 3) * 4;
1978 /* Fill in the entry in the procedure linkage table. */
1981 memcpy (htab->splt->contents + h->plt.offset, elf_i386_plt_entry,
1983 bfd_put_32 (output_bfd,
1984 (htab->sgotplt->output_section->vma
1985 + htab->sgotplt->output_offset
1987 htab->splt->contents + h->plt.offset + 2);
1991 memcpy (htab->splt->contents + h->plt.offset, elf_i386_pic_plt_entry,
1993 bfd_put_32 (output_bfd, got_offset,
1994 htab->splt->contents + h->plt.offset + 2);
1997 bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rel),
1998 htab->splt->contents + h->plt.offset + 7);
1999 bfd_put_32 (output_bfd, - (h->plt.offset + PLT_ENTRY_SIZE),
2000 htab->splt->contents + h->plt.offset + 12);
2002 /* Fill in the entry in the global offset table. */
2003 bfd_put_32 (output_bfd,
2004 (htab->splt->output_section->vma
2005 + htab->splt->output_offset
2008 htab->sgotplt->contents + got_offset);
2010 /* Fill in the entry in the .rel.plt section. */
2011 rel.r_offset = (htab->sgotplt->output_section->vma
2012 + htab->sgotplt->output_offset
2014 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_JUMP_SLOT);
2015 bfd_elf32_swap_reloc_out (output_bfd, &rel,
2016 ((Elf32_External_Rel *) htab->srelplt->contents
2019 if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
2021 /* Mark the symbol as undefined, rather than as defined in
2022 the .plt section. Leave the value alone. */
2023 sym->st_shndx = SHN_UNDEF;
2027 if (h->got.offset != (bfd_vma) -1)
2029 Elf_Internal_Rel rel;
2031 /* This symbol has an entry in the global offset table. Set it
2034 if (htab->sgot == NULL || htab->srelgot == NULL)
2037 rel.r_offset = (htab->sgot->output_section->vma
2038 + htab->sgot->output_offset
2039 + (h->got.offset & ~(bfd_vma) 1));
2041 /* If this is a static link, or it is a -Bsymbolic link and the
2042 symbol is defined locally or was forced to be local because
2043 of a version file, we just want to emit a RELATIVE reloc.
2044 The entry in the global offset table will already have been
2045 initialized in the relocate_section function. */
2049 || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL))
2050 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
2052 BFD_ASSERT((h->got.offset & 1) != 0);
2053 rel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
2057 BFD_ASSERT((h->got.offset & 1) == 0);
2058 bfd_put_32 (output_bfd, (bfd_vma) 0,
2059 htab->sgot->contents + h->got.offset);
2060 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_GLOB_DAT);
2063 bfd_elf32_swap_reloc_out (output_bfd, &rel,
2064 ((Elf32_External_Rel *) htab->srelgot->contents
2065 + htab->srelgot->reloc_count));
2066 ++htab->srelgot->reloc_count;
2069 if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
2071 Elf_Internal_Rel rel;
2073 /* This symbol needs a copy reloc. Set it up. */
2075 if (h->dynindx == -1
2076 || (h->root.type != bfd_link_hash_defined
2077 && h->root.type != bfd_link_hash_defweak)
2078 || htab->srelbss == NULL)
2081 rel.r_offset = (h->root.u.def.value
2082 + h->root.u.def.section->output_section->vma
2083 + h->root.u.def.section->output_offset);
2084 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_COPY);
2085 bfd_elf32_swap_reloc_out (output_bfd, &rel,
2086 ((Elf32_External_Rel *) htab->srelbss->contents
2087 + htab->srelbss->reloc_count));
2088 ++htab->srelbss->reloc_count;
2091 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
2092 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
2093 || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
2094 sym->st_shndx = SHN_ABS;
2099 /* Finish up the dynamic sections. */
2102 elf_i386_finish_dynamic_sections (output_bfd, info)
2104 struct bfd_link_info *info;
2106 struct elf_i386_link_hash_table *htab;
2110 htab = elf_i386_hash_table (info);
2111 dynobj = htab->root.dynobj;
2112 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
2114 if (htab->root.dynamic_sections_created)
2116 Elf32_External_Dyn *dyncon, *dynconend;
2118 if (sdyn == NULL || htab->sgot == NULL)
2121 dyncon = (Elf32_External_Dyn *) sdyn->contents;
2122 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
2123 for (; dyncon < dynconend; dyncon++)
2125 Elf_Internal_Dyn dyn;
2127 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
2135 dyn.d_un.d_ptr = htab->sgot->output_section->vma;
2136 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2140 dyn.d_un.d_ptr = htab->srelplt->output_section->vma;
2141 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2145 if (htab->srelplt->output_section->_cooked_size != 0)
2146 dyn.d_un.d_val = htab->srelplt->output_section->_cooked_size;
2148 dyn.d_un.d_val = htab->srelplt->output_section->_raw_size;
2149 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2153 /* My reading of the SVR4 ABI indicates that the
2154 procedure linkage table relocs (DT_JMPREL) should be
2155 included in the overall relocs (DT_REL). This is
2156 what Solaris does. However, UnixWare can not handle
2157 that case. Therefore, we override the DT_RELSZ entry
2158 here to make it not include the JMPREL relocs. Since
2159 the linker script arranges for .rel.plt to follow all
2160 other relocation sections, we don't have to worry
2161 about changing the DT_REL entry. */
2162 if (htab->srelplt != NULL)
2164 if (htab->srelplt->output_section->_cooked_size != 0)
2165 dyn.d_un.d_val -= htab->srelplt->output_section->_cooked_size;
2167 dyn.d_un.d_val -= htab->srelplt->output_section->_raw_size;
2169 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2174 /* Fill in the first entry in the procedure linkage table. */
2175 if (htab->splt && htab->splt->_raw_size > 0)
2178 memcpy (htab->splt->contents,
2179 elf_i386_pic_plt0_entry, PLT_ENTRY_SIZE);
2182 memcpy (htab->splt->contents,
2183 elf_i386_plt0_entry, PLT_ENTRY_SIZE);
2184 bfd_put_32 (output_bfd,
2185 (htab->sgotplt->output_section->vma
2186 + htab->sgotplt->output_offset
2188 htab->splt->contents + 2);
2189 bfd_put_32 (output_bfd,
2190 (htab->sgotplt->output_section->vma
2191 + htab->sgotplt->output_offset
2193 htab->splt->contents + 8);
2196 /* UnixWare sets the entsize of .plt to 4, although that doesn't
2197 really seem like the right value. */
2198 elf_section_data (htab->splt->output_section)
2199 ->this_hdr.sh_entsize = 4;
2205 /* Fill in the first three entries in the global offset table. */
2206 if (htab->sgotplt->_raw_size > 0)
2208 bfd_put_32 (output_bfd,
2209 (sdyn == NULL ? (bfd_vma) 0
2210 : sdyn->output_section->vma + sdyn->output_offset),
2211 htab->sgotplt->contents);
2212 bfd_put_32 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + 4);
2213 bfd_put_32 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + 8);
2216 elf_section_data (htab->sgotplt->output_section)->this_hdr.sh_entsize = 4;
2221 /* Set the correct type for an x86 ELF section. We do this by the
2222 section name, which is a hack, but ought to work. */
2225 elf_i386_fake_sections (abfd, hdr, sec)
2226 bfd *abfd ATTRIBUTE_UNUSED;
2227 Elf32_Internal_Shdr *hdr;
2230 register const char *name;
2232 name = bfd_get_section_name (abfd, sec);
2234 if (strcmp (name, ".reloc") == 0)
2236 * This is an ugly, but unfortunately necessary hack that is
2237 * needed when producing EFI binaries on x86. It tells
2238 * elf.c:elf_fake_sections() not to consider ".reloc" as a section
2239 * containing ELF relocation info. We need this hack in order to
2240 * be able to generate ELF binaries that can be translated into
2241 * EFI applications (which are essentially COFF objects). Those
2242 * files contain a COFF ".reloc" section inside an ELFNN object,
2243 * which would normally cause BFD to segfault because it would
2244 * attempt to interpret this section as containing relocation
2245 * entries for section "oc". With this hack enabled, ".reloc"
2246 * will be treated as a normal data section, which will avoid the
2247 * segfault. However, you won't be able to create an ELFNN binary
2248 * with a section named "oc" that needs relocations, but that's
2249 * the kind of ugly side-effects you get when detecting section
2250 * types based on their names... In practice, this limitation is
2253 hdr->sh_type = SHT_PROGBITS;
2258 static enum elf_reloc_type_class
2259 elf_i386_reloc_type_class (rela)
2260 const Elf_Internal_Rela *rela;
2262 switch ((int) ELF32_R_TYPE (rela->r_info))
2264 case R_386_RELATIVE:
2265 return reloc_class_relative;
2266 case R_386_JUMP_SLOT:
2267 return reloc_class_plt;
2269 return reloc_class_copy;
2271 return reloc_class_normal;
2275 /* Support for core dump NOTE sections */
2277 elf_i386_grok_prstatus (abfd, note)
2279 Elf_Internal_Note *note;
2284 switch (note->descsz)
2289 case 144: /* Linux/i386 */
2291 elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
2294 elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
2303 /* Make a ".reg/999" section. */
2304 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
2305 raw_size, note->descpos + offset);
2309 elf_i386_grok_psinfo (abfd, note)
2311 Elf_Internal_Note *note;
2313 switch (note->descsz)
2318 case 128: /* Linux/MIPS elf_prpsinfo */
2319 elf_tdata (abfd)->core_program
2320 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
2321 elf_tdata (abfd)->core_command
2322 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
2325 /* Note that for some reason, a spurious space is tacked
2326 onto the end of the args in some (at least one anyway)
2327 implementations, so strip it off if it exists. */
2330 char *command = elf_tdata (abfd)->core_command;
2331 int n = strlen (command);
2333 if (0 < n && command[n - 1] == ' ')
2334 command[n - 1] = '\0';
2340 #define TARGET_LITTLE_SYM bfd_elf32_i386_vec
2341 #define TARGET_LITTLE_NAME "elf32-i386"
2342 #define ELF_ARCH bfd_arch_i386
2343 #define ELF_MACHINE_CODE EM_386
2344 #define ELF_MAXPAGESIZE 0x1000
2346 #define elf_backend_can_gc_sections 1
2347 #define elf_backend_want_got_plt 1
2348 #define elf_backend_plt_readonly 1
2349 #define elf_backend_want_plt_sym 0
2350 #define elf_backend_got_header_size 12
2351 #define elf_backend_plt_header_size PLT_ENTRY_SIZE
2353 #define elf_info_to_howto elf_i386_info_to_howto
2354 #define elf_info_to_howto_rel elf_i386_info_to_howto_rel
2356 #define bfd_elf32_bfd_is_local_label_name elf_i386_is_local_label_name
2357 #define bfd_elf32_bfd_link_hash_table_create elf_i386_link_hash_table_create
2358 #define bfd_elf32_bfd_reloc_type_lookup elf_i386_reloc_type_lookup
2360 #define elf_backend_adjust_dynamic_symbol elf_i386_adjust_dynamic_symbol
2361 #define elf_backend_check_relocs elf_i386_check_relocs
2362 #define elf_backend_create_dynamic_sections elf_i386_create_dynamic_sections
2363 #define elf_backend_finish_dynamic_sections elf_i386_finish_dynamic_sections
2364 #define elf_backend_finish_dynamic_symbol elf_i386_finish_dynamic_symbol
2365 #define elf_backend_gc_mark_hook elf_i386_gc_mark_hook
2366 #define elf_backend_gc_sweep_hook elf_i386_gc_sweep_hook
2367 #define elf_backend_relocate_section elf_i386_relocate_section
2368 #define elf_backend_size_dynamic_sections elf_i386_size_dynamic_sections
2369 #define elf_backend_fake_sections elf_i386_fake_sections
2370 #define elf_backend_grok_prstatus elf_i386_grok_prstatus
2371 #define elf_backend_grok_psinfo elf_i386_grok_psinfo
2372 #define elf_backend_reloc_type_class elf_i386_reloc_type_class
2374 #include "elf32-target.h"