1 /* Intel 80386/80486-specific support for 32-bit ELF
2 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
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. */
21 /* $FreeBSD: src/contrib/binutils/bfd/elf32-i386.c,v 1.4.2.7 2002/09/01 23:43:37 obrien Exp $ */
29 static reloc_howto_type *elf_i386_reloc_type_lookup
30 PARAMS ((bfd *, bfd_reloc_code_real_type));
31 static void elf_i386_info_to_howto
32 PARAMS ((bfd *, arelent *, Elf32_Internal_Rela *));
33 static void elf_i386_info_to_howto_rel
34 PARAMS ((bfd *, arelent *, Elf32_Internal_Rel *));
35 static boolean elf_i386_is_local_label_name
36 PARAMS ((bfd *, const char *));
37 static boolean elf_i386_grok_prstatus
38 PARAMS ((bfd *abfd, Elf_Internal_Note *note));
39 static boolean elf_i386_grok_psinfo
40 PARAMS ((bfd *abfd, Elf_Internal_Note *note));
41 static struct bfd_hash_entry *link_hash_newfunc
42 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
43 static struct bfd_link_hash_table *elf_i386_link_hash_table_create
45 static boolean create_got_section
46 PARAMS((bfd *, struct bfd_link_info *));
47 static boolean elf_i386_create_dynamic_sections
48 PARAMS((bfd *, struct bfd_link_info *));
49 static void elf_i386_copy_indirect_symbol
50 PARAMS ((struct elf_link_hash_entry *, struct elf_link_hash_entry *));
51 static boolean elf_i386_check_relocs
52 PARAMS ((bfd *, struct bfd_link_info *, asection *,
53 const Elf_Internal_Rela *));
54 static asection *elf_i386_gc_mark_hook
55 PARAMS ((bfd *, struct bfd_link_info *, Elf_Internal_Rela *,
56 struct elf_link_hash_entry *, Elf_Internal_Sym *));
57 static boolean elf_i386_gc_sweep_hook
58 PARAMS ((bfd *, struct bfd_link_info *, asection *,
59 const Elf_Internal_Rela *));
60 static boolean elf_i386_adjust_dynamic_symbol
61 PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
62 static boolean allocate_dynrelocs
63 PARAMS ((struct elf_link_hash_entry *, PTR));
64 static boolean readonly_dynrelocs
65 PARAMS ((struct elf_link_hash_entry *, PTR));
66 static boolean elf_i386_fake_sections
67 PARAMS ((bfd *, Elf32_Internal_Shdr *, asection *));
68 static boolean elf_i386_size_dynamic_sections
69 PARAMS ((bfd *, struct bfd_link_info *));
70 static boolean elf_i386_relocate_section
71 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
72 Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
73 static boolean elf_i386_finish_dynamic_symbol
74 PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
76 static enum elf_reloc_type_class elf_i386_reloc_type_class
77 PARAMS ((const Elf_Internal_Rela *));
78 static boolean elf_i386_finish_dynamic_sections
79 PARAMS ((bfd *, struct bfd_link_info *));
81 #define USE_REL 1 /* 386 uses REL relocations instead of RELA */
85 static reloc_howto_type elf_howto_table[]=
87 HOWTO(R_386_NONE, 0, 0, 0, false, 0, complain_overflow_bitfield,
88 bfd_elf_generic_reloc, "R_386_NONE",
89 true, 0x00000000, 0x00000000, false),
90 HOWTO(R_386_32, 0, 2, 32, false, 0, complain_overflow_bitfield,
91 bfd_elf_generic_reloc, "R_386_32",
92 true, 0xffffffff, 0xffffffff, false),
93 HOWTO(R_386_PC32, 0, 2, 32, true, 0, complain_overflow_bitfield,
94 bfd_elf_generic_reloc, "R_386_PC32",
95 true, 0xffffffff, 0xffffffff, true),
96 HOWTO(R_386_GOT32, 0, 2, 32, false, 0, complain_overflow_bitfield,
97 bfd_elf_generic_reloc, "R_386_GOT32",
98 true, 0xffffffff, 0xffffffff, false),
99 HOWTO(R_386_PLT32, 0, 2, 32, true, 0, complain_overflow_bitfield,
100 bfd_elf_generic_reloc, "R_386_PLT32",
101 true, 0xffffffff, 0xffffffff, true),
102 HOWTO(R_386_COPY, 0, 2, 32, false, 0, complain_overflow_bitfield,
103 bfd_elf_generic_reloc, "R_386_COPY",
104 true, 0xffffffff, 0xffffffff, false),
105 HOWTO(R_386_GLOB_DAT, 0, 2, 32, false, 0, complain_overflow_bitfield,
106 bfd_elf_generic_reloc, "R_386_GLOB_DAT",
107 true, 0xffffffff, 0xffffffff, false),
108 HOWTO(R_386_JUMP_SLOT, 0, 2, 32, false, 0, complain_overflow_bitfield,
109 bfd_elf_generic_reloc, "R_386_JUMP_SLOT",
110 true, 0xffffffff, 0xffffffff, false),
111 HOWTO(R_386_RELATIVE, 0, 2, 32, false, 0, complain_overflow_bitfield,
112 bfd_elf_generic_reloc, "R_386_RELATIVE",
113 true, 0xffffffff, 0xffffffff, false),
114 HOWTO(R_386_GOTOFF, 0, 2, 32, false, 0, complain_overflow_bitfield,
115 bfd_elf_generic_reloc, "R_386_GOTOFF",
116 true, 0xffffffff, 0xffffffff, false),
117 HOWTO(R_386_GOTPC, 0, 2, 32, true, 0, complain_overflow_bitfield,
118 bfd_elf_generic_reloc, "R_386_GOTPC",
119 true, 0xffffffff, 0xffffffff, true),
121 /* We have a gap in the reloc numbers here.
122 R_386_standard counts the number up to this point, and
123 R_386_ext_offset is the value to subtract from a reloc type of
124 R_386_16 thru R_386_PC8 to form an index into this table. */
125 #define R_386_standard ((unsigned int) R_386_GOTPC + 1)
126 #define R_386_ext_offset ((unsigned int) R_386_16 - R_386_standard)
128 /* The remaining relocs are a GNU extension. */
129 HOWTO(R_386_16, 0, 1, 16, false, 0, complain_overflow_bitfield,
130 bfd_elf_generic_reloc, "R_386_16",
131 true, 0xffff, 0xffff, false),
132 HOWTO(R_386_PC16, 0, 1, 16, true, 0, complain_overflow_bitfield,
133 bfd_elf_generic_reloc, "R_386_PC16",
134 true, 0xffff, 0xffff, true),
135 HOWTO(R_386_8, 0, 0, 8, false, 0, complain_overflow_bitfield,
136 bfd_elf_generic_reloc, "R_386_8",
137 true, 0xff, 0xff, false),
138 HOWTO(R_386_PC8, 0, 0, 8, true, 0, complain_overflow_signed,
139 bfd_elf_generic_reloc, "R_386_PC8",
140 true, 0xff, 0xff, true),
143 #define R_386_ext ((unsigned int) R_386_PC8 + 1 - R_386_ext_offset)
144 #define R_386_vt_offset ((unsigned int) R_386_GNU_VTINHERIT - R_386_ext)
146 /* GNU extension to record C++ vtable hierarchy. */
147 HOWTO (R_386_GNU_VTINHERIT, /* type */
149 2, /* size (0 = byte, 1 = short, 2 = long) */
151 false, /* pc_relative */
153 complain_overflow_dont, /* complain_on_overflow */
154 NULL, /* special_function */
155 "R_386_GNU_VTINHERIT", /* name */
156 false, /* partial_inplace */
161 /* GNU extension to record C++ vtable member usage. */
162 HOWTO (R_386_GNU_VTENTRY, /* type */
164 2, /* size (0 = byte, 1 = short, 2 = long) */
166 false, /* pc_relative */
168 complain_overflow_dont, /* complain_on_overflow */
169 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
170 "R_386_GNU_VTENTRY", /* name */
171 false, /* partial_inplace */
176 #define R_386_vt ((unsigned int) R_386_GNU_VTENTRY + 1 - R_386_vt_offset)
180 #ifdef DEBUG_GEN_RELOC
181 #define TRACE(str) fprintf (stderr, "i386 bfd reloc lookup %d (%s)\n", code, str)
186 static reloc_howto_type *
187 elf_i386_reloc_type_lookup (abfd, code)
188 bfd *abfd ATTRIBUTE_UNUSED;
189 bfd_reloc_code_real_type code;
194 TRACE ("BFD_RELOC_NONE");
195 return &elf_howto_table[(unsigned int) R_386_NONE ];
198 TRACE ("BFD_RELOC_32");
199 return &elf_howto_table[(unsigned int) R_386_32 ];
202 TRACE ("BFD_RELOC_CTOR");
203 return &elf_howto_table[(unsigned int) R_386_32 ];
205 case BFD_RELOC_32_PCREL:
206 TRACE ("BFD_RELOC_PC32");
207 return &elf_howto_table[(unsigned int) R_386_PC32 ];
209 case BFD_RELOC_386_GOT32:
210 TRACE ("BFD_RELOC_386_GOT32");
211 return &elf_howto_table[(unsigned int) R_386_GOT32 ];
213 case BFD_RELOC_386_PLT32:
214 TRACE ("BFD_RELOC_386_PLT32");
215 return &elf_howto_table[(unsigned int) R_386_PLT32 ];
217 case BFD_RELOC_386_COPY:
218 TRACE ("BFD_RELOC_386_COPY");
219 return &elf_howto_table[(unsigned int) R_386_COPY ];
221 case BFD_RELOC_386_GLOB_DAT:
222 TRACE ("BFD_RELOC_386_GLOB_DAT");
223 return &elf_howto_table[(unsigned int) R_386_GLOB_DAT ];
225 case BFD_RELOC_386_JUMP_SLOT:
226 TRACE ("BFD_RELOC_386_JUMP_SLOT");
227 return &elf_howto_table[(unsigned int) R_386_JUMP_SLOT ];
229 case BFD_RELOC_386_RELATIVE:
230 TRACE ("BFD_RELOC_386_RELATIVE");
231 return &elf_howto_table[(unsigned int) R_386_RELATIVE ];
233 case BFD_RELOC_386_GOTOFF:
234 TRACE ("BFD_RELOC_386_GOTOFF");
235 return &elf_howto_table[(unsigned int) R_386_GOTOFF ];
237 case BFD_RELOC_386_GOTPC:
238 TRACE ("BFD_RELOC_386_GOTPC");
239 return &elf_howto_table[(unsigned int) R_386_GOTPC ];
241 /* The remaining relocs are a GNU extension. */
243 TRACE ("BFD_RELOC_16");
244 return &elf_howto_table[(unsigned int) R_386_16 - R_386_ext_offset];
246 case BFD_RELOC_16_PCREL:
247 TRACE ("BFD_RELOC_16_PCREL");
248 return &elf_howto_table[(unsigned int) R_386_PC16 - R_386_ext_offset];
251 TRACE ("BFD_RELOC_8");
252 return &elf_howto_table[(unsigned int) R_386_8 - R_386_ext_offset];
254 case BFD_RELOC_8_PCREL:
255 TRACE ("BFD_RELOC_8_PCREL");
256 return &elf_howto_table[(unsigned int) R_386_PC8 - R_386_ext_offset];
258 case BFD_RELOC_VTABLE_INHERIT:
259 TRACE ("BFD_RELOC_VTABLE_INHERIT");
260 return &elf_howto_table[(unsigned int) R_386_GNU_VTINHERIT
263 case BFD_RELOC_VTABLE_ENTRY:
264 TRACE ("BFD_RELOC_VTABLE_ENTRY");
265 return &elf_howto_table[(unsigned int) R_386_GNU_VTENTRY
277 elf_i386_info_to_howto (abfd, cache_ptr, dst)
278 bfd *abfd ATTRIBUTE_UNUSED;
279 arelent *cache_ptr ATTRIBUTE_UNUSED;
280 Elf32_Internal_Rela *dst ATTRIBUTE_UNUSED;
286 elf_i386_info_to_howto_rel (abfd, cache_ptr, dst)
287 bfd *abfd ATTRIBUTE_UNUSED;
289 Elf32_Internal_Rel *dst;
291 unsigned int r_type = ELF32_R_TYPE (dst->r_info);
294 if ((indx = r_type) >= R_386_standard
295 && ((indx = r_type - R_386_ext_offset) - R_386_standard
296 >= R_386_ext - R_386_standard)
297 && ((indx = r_type - R_386_vt_offset) - R_386_ext
298 >= R_386_vt - R_386_ext))
300 (*_bfd_error_handler) (_("%s: invalid relocation type %d"),
301 bfd_archive_filename (abfd), (int) r_type);
302 indx = (unsigned int) R_386_NONE;
304 cache_ptr->howto = &elf_howto_table[indx];
307 /* Return whether a symbol name implies a local label. The UnixWare
308 2.1 cc generates temporary symbols that start with .X, so we
309 recognize them here. FIXME: do other SVR4 compilers also use .X?.
310 If so, we should move the .X recognition into
311 _bfd_elf_is_local_label_name. */
314 elf_i386_is_local_label_name (abfd, name)
318 if (name[0] == '.' && name[1] == 'X')
321 return _bfd_elf_is_local_label_name (abfd, name);
324 /* Support for core dump NOTE sections. */
326 elf_i386_grok_prstatus (abfd, note)
328 Elf_Internal_Note *note;
333 switch (note->descsz)
338 case 144: /* Linux/i386 */
340 elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
343 elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
352 /* Make a ".reg/999" section. */
353 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
354 raw_size, note->descpos + offset);
358 elf_i386_grok_psinfo (abfd, note)
360 Elf_Internal_Note *note;
362 switch (note->descsz)
367 case 124: /* Linux/i386 elf_prpsinfo */
368 elf_tdata (abfd)->core_program
369 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
370 elf_tdata (abfd)->core_command
371 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
374 /* Note that for some reason, a spurious space is tacked
375 onto the end of the args in some (at least one anyway)
376 implementations, so strip it off if it exists. */
379 char *command = elf_tdata (abfd)->core_command;
380 int n = strlen (command);
382 if (0 < n && command[n - 1] == ' ')
383 command[n - 1] = '\0';
389 /* Functions for the i386 ELF linker.
391 In order to gain some understanding of code in this file without
392 knowing all the intricate details of the linker, note the
395 Functions named elf_i386_* are called by external routines, other
396 functions are only called locally. elf_i386_* functions appear
397 in this file more or less in the order in which they are called
398 from external routines. eg. elf_i386_check_relocs is called
399 early in the link process, elf_i386_finish_dynamic_sections is
400 one of the last functions. */
403 /* The name of the dynamic interpreter. This is put in the .interp
407 #ifndef ELF_DYNAMIC_INTERPRETER
408 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1"
412 /* The size in bytes of an entry in the procedure linkage table. */
414 #define PLT_ENTRY_SIZE 16
416 /* The first entry in an absolute procedure linkage table looks like
417 this. See the SVR4 ABI i386 supplement to see how this works. */
419 static const bfd_byte elf_i386_plt0_entry[PLT_ENTRY_SIZE] =
421 0xff, 0x35, /* pushl contents of address */
422 0, 0, 0, 0, /* replaced with address of .got + 4. */
423 0xff, 0x25, /* jmp indirect */
424 0, 0, 0, 0, /* replaced with address of .got + 8. */
425 0, 0, 0, 0 /* pad out to 16 bytes. */
428 /* Subsequent entries in an absolute procedure linkage table look like
431 static const bfd_byte elf_i386_plt_entry[PLT_ENTRY_SIZE] =
433 0xff, 0x25, /* jmp indirect */
434 0, 0, 0, 0, /* replaced with address of this symbol in .got. */
435 0x68, /* pushl immediate */
436 0, 0, 0, 0, /* replaced with offset into relocation table. */
437 0xe9, /* jmp relative */
438 0, 0, 0, 0 /* replaced with offset to start of .plt. */
441 /* The first entry in a PIC procedure linkage table look like this. */
443 static const bfd_byte elf_i386_pic_plt0_entry[PLT_ENTRY_SIZE] =
445 0xff, 0xb3, 4, 0, 0, 0, /* pushl 4(%ebx) */
446 0xff, 0xa3, 8, 0, 0, 0, /* jmp *8(%ebx) */
447 0, 0, 0, 0 /* pad out to 16 bytes. */
450 /* Subsequent entries in a PIC procedure linkage table look like this. */
452 static const bfd_byte elf_i386_pic_plt_entry[PLT_ENTRY_SIZE] =
454 0xff, 0xa3, /* jmp *offset(%ebx) */
455 0, 0, 0, 0, /* replaced with offset of this symbol in .got. */
456 0x68, /* pushl immediate */
457 0, 0, 0, 0, /* replaced with offset into relocation table. */
458 0xe9, /* jmp relative */
459 0, 0, 0, 0 /* replaced with offset to start of .plt. */
462 /* The i386 linker needs to keep track of the number of relocs that it
463 decides to copy as dynamic relocs in check_relocs for each symbol.
464 This is so that it can later discard them if they are found to be
465 unnecessary. We store the information in a field extending the
466 regular ELF linker hash table. */
468 struct elf_i386_dyn_relocs
470 struct elf_i386_dyn_relocs *next;
472 /* The input section of the reloc. */
475 /* Total number of relocs copied for the input section. */
478 /* Number of pc-relative relocs copied for the input section. */
479 bfd_size_type pc_count;
482 /* i386 ELF linker hash entry. */
484 struct elf_i386_link_hash_entry
486 struct elf_link_hash_entry elf;
488 /* Track dynamic relocs copied for this symbol. */
489 struct elf_i386_dyn_relocs *dyn_relocs;
492 /* i386 ELF linker hash table. */
494 struct elf_i386_link_hash_table
496 struct elf_link_hash_table elf;
498 /* Short-cuts to get to dynamic linker sections. */
507 /* Small local sym to section mapping cache. */
508 struct sym_sec_cache sym_sec;
511 /* Get the i386 ELF linker hash table from a link_info structure. */
513 #define elf_i386_hash_table(p) \
514 ((struct elf_i386_link_hash_table *) ((p)->hash))
516 /* Create an entry in an i386 ELF linker hash table. */
518 static struct bfd_hash_entry *
519 link_hash_newfunc (entry, table, string)
520 struct bfd_hash_entry *entry;
521 struct bfd_hash_table *table;
524 /* Allocate the structure if it has not already been allocated by a
528 entry = bfd_hash_allocate (table,
529 sizeof (struct elf_i386_link_hash_entry));
534 /* Call the allocation method of the superclass. */
535 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
538 struct elf_i386_link_hash_entry *eh;
540 eh = (struct elf_i386_link_hash_entry *) entry;
541 eh->dyn_relocs = NULL;
547 /* Create an i386 ELF linker hash table. */
549 static struct bfd_link_hash_table *
550 elf_i386_link_hash_table_create (abfd)
553 struct elf_i386_link_hash_table *ret;
554 bfd_size_type amt = sizeof (struct elf_i386_link_hash_table);
556 ret = (struct elf_i386_link_hash_table *) bfd_alloc (abfd, amt);
560 if (! _bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc))
562 bfd_release (abfd, ret);
573 ret->sym_sec.abfd = NULL;
575 return &ret->elf.root;
578 /* Create .got, .gotplt, and .rel.got sections in DYNOBJ, and set up
579 shortcuts to them in our hash table. */
582 create_got_section (dynobj, info)
584 struct bfd_link_info *info;
586 struct elf_i386_link_hash_table *htab;
588 if (! _bfd_elf_create_got_section (dynobj, info))
591 htab = elf_i386_hash_table (info);
592 htab->sgot = bfd_get_section_by_name (dynobj, ".got");
593 htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
594 if (!htab->sgot || !htab->sgotplt)
597 htab->srelgot = bfd_make_section (dynobj, ".rel.got");
598 if (htab->srelgot == NULL
599 || ! bfd_set_section_flags (dynobj, htab->srelgot,
600 (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
601 | SEC_IN_MEMORY | SEC_LINKER_CREATED
603 || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2))
608 /* Create .plt, .rel.plt, .got, .got.plt, .rel.got, .dynbss, and
609 .rel.bss sections in DYNOBJ, and set up shortcuts to them in our
613 elf_i386_create_dynamic_sections (dynobj, info)
615 struct bfd_link_info *info;
617 struct elf_i386_link_hash_table *htab;
619 htab = elf_i386_hash_table (info);
620 if (!htab->sgot && !create_got_section (dynobj, info))
623 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
626 htab->splt = bfd_get_section_by_name (dynobj, ".plt");
627 htab->srelplt = bfd_get_section_by_name (dynobj, ".rel.plt");
628 htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
630 htab->srelbss = bfd_get_section_by_name (dynobj, ".rel.bss");
632 if (!htab->splt || !htab->srelplt || !htab->sdynbss
633 || (!info->shared && !htab->srelbss))
639 /* Copy the extra info we tack onto an elf_link_hash_entry. */
642 elf_i386_copy_indirect_symbol (dir, ind)
643 struct elf_link_hash_entry *dir, *ind;
645 struct elf_i386_link_hash_entry *edir, *eind;
647 edir = (struct elf_i386_link_hash_entry *) dir;
648 eind = (struct elf_i386_link_hash_entry *) ind;
650 if (eind->dyn_relocs != NULL)
652 if (edir->dyn_relocs != NULL)
654 struct elf_i386_dyn_relocs **pp;
655 struct elf_i386_dyn_relocs *p;
657 if (ind->root.type == bfd_link_hash_indirect)
660 /* Add reloc counts against the weak sym to the strong sym
661 list. Merge any entries against the same section. */
662 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
664 struct elf_i386_dyn_relocs *q;
666 for (q = edir->dyn_relocs; q != NULL; q = q->next)
667 if (q->sec == p->sec)
669 q->pc_count += p->pc_count;
670 q->count += p->count;
677 *pp = edir->dyn_relocs;
680 edir->dyn_relocs = eind->dyn_relocs;
681 eind->dyn_relocs = NULL;
684 _bfd_elf_link_hash_copy_indirect (dir, ind);
687 /* Look through the relocs for a section during the first phase, and
688 calculate needed space in the global offset table, procedure linkage
689 table, and dynamic reloc sections. */
692 elf_i386_check_relocs (abfd, info, sec, relocs)
694 struct bfd_link_info *info;
696 const Elf_Internal_Rela *relocs;
698 struct elf_i386_link_hash_table *htab;
699 Elf_Internal_Shdr *symtab_hdr;
700 struct elf_link_hash_entry **sym_hashes;
701 const Elf_Internal_Rela *rel;
702 const Elf_Internal_Rela *rel_end;
705 if (info->relocateable)
708 htab = elf_i386_hash_table (info);
709 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
710 sym_hashes = elf_sym_hashes (abfd);
714 rel_end = relocs + sec->reloc_count;
715 for (rel = relocs; rel < rel_end; rel++)
717 unsigned long r_symndx;
718 struct elf_link_hash_entry *h;
720 r_symndx = ELF32_R_SYM (rel->r_info);
722 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
724 (*_bfd_error_handler) (_("%s: bad symbol index: %d"),
725 bfd_archive_filename (abfd),
730 if (r_symndx < symtab_hdr->sh_info)
733 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
735 switch (ELF32_R_TYPE (rel->r_info))
738 /* This symbol requires a global offset table entry. */
741 h->got.refcount += 1;
745 bfd_signed_vma *local_got_refcounts;
747 /* This is a global offset table entry for a local symbol. */
748 local_got_refcounts = elf_local_got_refcounts (abfd);
749 if (local_got_refcounts == NULL)
753 size = symtab_hdr->sh_info;
754 size *= sizeof (bfd_signed_vma);
755 local_got_refcounts = ((bfd_signed_vma *)
756 bfd_zalloc (abfd, size));
757 if (local_got_refcounts == NULL)
759 elf_local_got_refcounts (abfd) = local_got_refcounts;
761 local_got_refcounts[r_symndx] += 1;
767 if (htab->sgot == NULL)
769 if (htab->elf.dynobj == NULL)
770 htab->elf.dynobj = abfd;
771 if (!create_got_section (htab->elf.dynobj, info))
777 /* This symbol requires a procedure linkage table entry. We
778 actually build the entry in adjust_dynamic_symbol,
779 because this might be a case of linking PIC code which is
780 never referenced by a dynamic object, in which case we
781 don't need to generate a procedure linkage table entry
784 /* If this is a local symbol, we resolve it directly without
785 creating a procedure linkage table entry. */
789 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
790 h->plt.refcount += 1;
795 if (h != NULL && !info->shared)
797 /* If this reloc is in a read-only section, we might
798 need a copy reloc. We can't check reliably at this
799 stage whether the section is read-only, as input
800 sections have not yet been mapped to output sections.
801 Tentatively set the flag for now, and correct in
802 adjust_dynamic_symbol. */
803 h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
805 /* We may need a .plt entry if the function this reloc
806 refers to is in a shared lib. */
807 h->plt.refcount += 1;
810 /* If we are creating a shared library, and this is a reloc
811 against a global symbol, or a non PC relative reloc
812 against a local symbol, then we need to copy the reloc
813 into the shared library. However, if we are linking with
814 -Bsymbolic, we do not need to copy a reloc against a
815 global symbol which is defined in an object we are
816 including in the link (i.e., DEF_REGULAR is set). At
817 this point we have not seen all the input files, so it is
818 possible that DEF_REGULAR is not set now but will be set
819 later (it is never cleared). In case of a weak definition,
820 DEF_REGULAR may be cleared later by a strong definition in
821 a shared library. We account for that possibility below by
822 storing information in the relocs_copied field of the hash
823 table entry. A similar situation occurs when creating
824 shared libraries and symbol visibility changes render the
827 If on the other hand, we are creating an executable, we
828 may need to keep relocations for symbols satisfied by a
829 dynamic library if we manage to avoid copy relocs for the
832 && (sec->flags & SEC_ALLOC) != 0
833 && (ELF32_R_TYPE (rel->r_info) != R_386_PC32
836 || h->root.type == bfd_link_hash_defweak
837 || (h->elf_link_hash_flags
838 & ELF_LINK_HASH_DEF_REGULAR) == 0))))
840 && (sec->flags & SEC_ALLOC) != 0
842 && (h->root.type == bfd_link_hash_defweak
843 || (h->elf_link_hash_flags
844 & ELF_LINK_HASH_DEF_REGULAR) == 0)))
846 struct elf_i386_dyn_relocs *p;
847 struct elf_i386_dyn_relocs **head;
849 /* We must copy these reloc types into the output file.
850 Create a reloc section in dynobj and make room for
856 unsigned int strndx = elf_elfheader (abfd)->e_shstrndx;
857 unsigned int shnam = elf_section_data (sec)->rel_hdr.sh_name;
859 name = bfd_elf_string_from_elf_section (abfd, strndx, shnam);
863 if (strncmp (name, ".rel", 4) != 0
864 || strcmp (bfd_get_section_name (abfd, sec),
867 (*_bfd_error_handler)
868 (_("%s: bad relocation section name `%s\'"),
869 bfd_archive_filename (abfd), name);
872 if (htab->elf.dynobj == NULL)
873 htab->elf.dynobj = abfd;
875 dynobj = htab->elf.dynobj;
876 sreloc = bfd_get_section_by_name (dynobj, name);
881 sreloc = bfd_make_section (dynobj, name);
882 flags = (SEC_HAS_CONTENTS | SEC_READONLY
883 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
884 if ((sec->flags & SEC_ALLOC) != 0)
885 flags |= SEC_ALLOC | SEC_LOAD;
887 || ! bfd_set_section_flags (dynobj, sreloc, flags)
888 || ! bfd_set_section_alignment (dynobj, sreloc, 2))
891 elf_section_data (sec)->sreloc = sreloc;
894 /* If this is a global symbol, we count the number of
895 relocations we need for this symbol. */
898 head = &((struct elf_i386_link_hash_entry *) h)->dyn_relocs;
902 /* Track dynamic relocs needed for local syms too.
903 We really need local syms available to do this
907 s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
912 head = ((struct elf_i386_dyn_relocs **)
913 &elf_section_data (s)->local_dynrel);
917 if (p == NULL || p->sec != sec)
919 bfd_size_type amt = sizeof *p;
920 p = ((struct elf_i386_dyn_relocs *)
921 bfd_alloc (htab->elf.dynobj, amt));
932 if (ELF32_R_TYPE (rel->r_info) == R_386_PC32)
937 /* This relocation describes the C++ object vtable hierarchy.
938 Reconstruct it for later use during GC. */
939 case R_386_GNU_VTINHERIT:
940 if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
944 /* This relocation describes which C++ vtable entries are actually
945 used. Record for later use during GC. */
946 case R_386_GNU_VTENTRY:
947 if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_offset))
959 /* Return the section that should be marked against GC for a given
963 elf_i386_gc_mark_hook (abfd, info, rel, h, sym)
965 struct bfd_link_info *info ATTRIBUTE_UNUSED;
966 Elf_Internal_Rela *rel;
967 struct elf_link_hash_entry *h;
968 Elf_Internal_Sym *sym;
972 switch (ELF32_R_TYPE (rel->r_info))
974 case R_386_GNU_VTINHERIT:
975 case R_386_GNU_VTENTRY:
979 switch (h->root.type)
981 case bfd_link_hash_defined:
982 case bfd_link_hash_defweak:
983 return h->root.u.def.section;
985 case bfd_link_hash_common:
986 return h->root.u.c.p->section;
995 return bfd_section_from_elf_index (abfd, sym->st_shndx);
1001 /* Update the got entry reference counts for the section being removed. */
1004 elf_i386_gc_sweep_hook (abfd, info, sec, relocs)
1006 struct bfd_link_info *info;
1008 const Elf_Internal_Rela *relocs;
1010 Elf_Internal_Shdr *symtab_hdr;
1011 struct elf_link_hash_entry **sym_hashes;
1012 bfd_signed_vma *local_got_refcounts;
1013 const Elf_Internal_Rela *rel, *relend;
1014 unsigned long r_symndx;
1015 struct elf_link_hash_entry *h;
1017 elf_section_data (sec)->local_dynrel = NULL;
1019 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1020 sym_hashes = elf_sym_hashes (abfd);
1021 local_got_refcounts = elf_local_got_refcounts (abfd);
1023 relend = relocs + sec->reloc_count;
1024 for (rel = relocs; rel < relend; rel++)
1025 switch (ELF32_R_TYPE (rel->r_info))
1030 r_symndx = ELF32_R_SYM (rel->r_info);
1031 if (r_symndx >= symtab_hdr->sh_info)
1033 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1034 if (h->got.refcount > 0)
1035 h->got.refcount -= 1;
1037 else if (local_got_refcounts != NULL)
1039 if (local_got_refcounts[r_symndx] > 0)
1040 local_got_refcounts[r_symndx] -= 1;
1046 r_symndx = ELF32_R_SYM (rel->r_info);
1047 if (r_symndx >= symtab_hdr->sh_info)
1049 struct elf_i386_link_hash_entry *eh;
1050 struct elf_i386_dyn_relocs **pp;
1051 struct elf_i386_dyn_relocs *p;
1053 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1055 if (!info->shared && h->plt.refcount > 0)
1056 h->plt.refcount -= 1;
1058 eh = (struct elf_i386_link_hash_entry *) h;
1060 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
1063 if (ELF32_R_TYPE (rel->r_info) == R_386_PC32)
1074 r_symndx = ELF32_R_SYM (rel->r_info);
1075 if (r_symndx >= symtab_hdr->sh_info)
1077 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1078 if (h->plt.refcount > 0)
1079 h->plt.refcount -= 1;
1090 /* Adjust a symbol defined by a dynamic object and referenced by a
1091 regular object. The current definition is in some section of the
1092 dynamic object, but we're not including those sections. We have to
1093 change the definition to something the rest of the link can
1097 elf_i386_adjust_dynamic_symbol (info, h)
1098 struct bfd_link_info *info;
1099 struct elf_link_hash_entry *h;
1101 struct elf_i386_link_hash_table *htab;
1102 struct elf_i386_link_hash_entry * eh;
1103 struct elf_i386_dyn_relocs *p;
1105 unsigned int power_of_two;
1107 /* If this is a function, put it in the procedure linkage table. We
1108 will fill in the contents of the procedure linkage table later,
1109 when we know the address of the .got section. */
1110 if (h->type == STT_FUNC
1111 || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
1113 if (h->plt.refcount <= 0
1115 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0
1116 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0
1117 && h->root.type != bfd_link_hash_undefweak
1118 && h->root.type != bfd_link_hash_undefined))
1120 /* This case can occur if we saw a PLT32 reloc in an input
1121 file, but the symbol was never referred to by a dynamic
1122 object, or if all references were garbage collected. In
1123 such a case, we don't actually need to build a procedure
1124 linkage table, and we can just do a PC32 reloc instead. */
1125 h->plt.offset = (bfd_vma) -1;
1126 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
1132 /* It's possible that we incorrectly decided a .plt reloc was
1133 needed for an R_386_PC32 reloc to a non-function sym in
1134 check_relocs. We can't decide accurately between function and
1135 non-function syms in check-relocs; Objects loaded later in
1136 the link may change h->type. So fix it now. */
1137 h->plt.offset = (bfd_vma) -1;
1139 /* If this is a weak symbol, and there is a real definition, the
1140 processor independent code will have arranged for us to see the
1141 real definition first, and we can just use the same value. */
1142 if (h->weakdef != NULL)
1144 BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
1145 || h->weakdef->root.type == bfd_link_hash_defweak);
1146 h->root.u.def.section = h->weakdef->root.u.def.section;
1147 h->root.u.def.value = h->weakdef->root.u.def.value;
1151 /* This is a reference to a symbol defined by a dynamic object which
1152 is not a function. */
1154 /* If we are creating a shared library, we must presume that the
1155 only references to the symbol are via the global offset table.
1156 For such cases we need not do anything here; the relocations will
1157 be handled correctly by relocate_section. */
1161 /* If there are no references to this symbol that do not use the
1162 GOT, we don't need to generate a copy reloc. */
1163 if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0)
1166 /* If -z nocopyreloc was given, we won't generate them either. */
1167 if (info->nocopyreloc)
1169 h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF;
1173 eh = (struct elf_i386_link_hash_entry *) h;
1174 for (p = eh->dyn_relocs; p != NULL; p = p->next)
1176 s = p->sec->output_section;
1177 if (s != NULL && (s->flags & SEC_READONLY) != 0)
1181 /* If we didn't find any dynamic relocs in read-only sections, then
1182 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
1185 h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF;
1189 /* We must allocate the symbol in our .dynbss section, which will
1190 become part of the .bss section of the executable. There will be
1191 an entry for this symbol in the .dynsym section. The dynamic
1192 object will contain position independent code, so all references
1193 from the dynamic object to this symbol will go through the global
1194 offset table. The dynamic linker will use the .dynsym entry to
1195 determine the address it must put in the global offset table, so
1196 both the dynamic object and the regular object will refer to the
1197 same memory location for the variable. */
1199 htab = elf_i386_hash_table (info);
1201 /* We must generate a R_386_COPY reloc to tell the dynamic linker to
1202 copy the initial value out of the dynamic object and into the
1203 runtime process image. */
1204 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
1206 htab->srelbss->_raw_size += sizeof (Elf32_External_Rel);
1207 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
1210 /* We need to figure out the alignment required for this symbol. I
1211 have no idea how ELF linkers handle this. */
1212 power_of_two = bfd_log2 (h->size);
1213 if (power_of_two > 3)
1216 /* Apply the required alignment. */
1218 s->_raw_size = BFD_ALIGN (s->_raw_size, (bfd_size_type) (1 << power_of_two));
1219 if (power_of_two > bfd_get_section_alignment (htab->elf.dynobj, s))
1221 if (! bfd_set_section_alignment (htab->elf.dynobj, s, power_of_two))
1225 /* Define the symbol as being at this point in the section. */
1226 h->root.u.def.section = s;
1227 h->root.u.def.value = s->_raw_size;
1229 /* Increment the section size to make room for the symbol. */
1230 s->_raw_size += h->size;
1235 /* This is the condition under which elf_i386_finish_dynamic_symbol
1236 will be called from elflink.h. If elflink.h doesn't call our
1237 finish_dynamic_symbol routine, we'll need to do something about
1238 initializing any .plt and .got entries in elf_i386_relocate_section. */
1239 #define WILL_CALL_FINISH_DYNAMIC_SYMBOL(DYN, INFO, H) \
1241 && ((INFO)->shared \
1242 || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) \
1243 && ((H)->dynindx != -1 \
1244 || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0))
1246 /* Allocate space in .plt, .got and associated reloc sections for
1250 allocate_dynrelocs (h, inf)
1251 struct elf_link_hash_entry *h;
1254 struct bfd_link_info *info;
1255 struct elf_i386_link_hash_table *htab;
1256 struct elf_i386_link_hash_entry *eh;
1257 struct elf_i386_dyn_relocs *p;
1259 if (h->root.type == bfd_link_hash_indirect)
1262 if (h->root.type == bfd_link_hash_warning)
1263 /* When warning symbols are created, they **replace** the "real"
1264 entry in the hash table, thus we never get to see the real
1265 symbol in a hash traversal. So look at it now. */
1266 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1268 info = (struct bfd_link_info *) inf;
1269 htab = elf_i386_hash_table (info);
1271 if (htab->elf.dynamic_sections_created
1272 && h->plt.refcount > 0)
1274 /* Make sure this symbol is output as a dynamic symbol.
1275 Undefined weak syms won't yet be marked as dynamic. */
1276 if (h->dynindx == -1
1277 && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1279 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
1283 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info, h))
1285 asection *s = htab->splt;
1287 /* If this is the first .plt entry, make room for the special
1289 if (s->_raw_size == 0)
1290 s->_raw_size += PLT_ENTRY_SIZE;
1292 h->plt.offset = s->_raw_size;
1294 /* If this symbol is not defined in a regular file, and we are
1295 not generating a shared library, then set the symbol to this
1296 location in the .plt. This is required to make function
1297 pointers compare as equal between the normal executable and
1298 the shared library. */
1300 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1302 h->root.u.def.section = s;
1303 h->root.u.def.value = h->plt.offset;
1306 /* Make room for this entry. */
1307 s->_raw_size += PLT_ENTRY_SIZE;
1309 /* We also need to make an entry in the .got.plt section, which
1310 will be placed in the .got section by the linker script. */
1311 htab->sgotplt->_raw_size += 4;
1313 /* We also need to make an entry in the .rel.plt section. */
1314 htab->srelplt->_raw_size += sizeof (Elf32_External_Rel);
1318 h->plt.offset = (bfd_vma) -1;
1319 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
1324 h->plt.offset = (bfd_vma) -1;
1325 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
1328 if (h->got.refcount > 0)
1333 /* Make sure this symbol is output as a dynamic symbol.
1334 Undefined weak syms won't yet be marked as dynamic. */
1335 if (h->dynindx == -1
1336 && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1338 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
1343 h->got.offset = s->_raw_size;
1345 dyn = htab->elf.dynamic_sections_created;
1346 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h))
1347 htab->srelgot->_raw_size += sizeof (Elf32_External_Rel);
1350 h->got.offset = (bfd_vma) -1;
1352 eh = (struct elf_i386_link_hash_entry *) h;
1353 if (eh->dyn_relocs == NULL)
1356 /* In the shared -Bsymbolic case, discard space allocated for
1357 dynamic pc-relative relocs against symbols which turn out to be
1358 defined in regular objects. For the normal shared case, discard
1359 space for pc-relative relocs that have become local due to symbol
1360 visibility changes. */
1364 if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0
1365 && ((h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0
1368 struct elf_i386_dyn_relocs **pp;
1370 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
1372 p->count -= p->pc_count;
1383 /* For the non-shared case, discard space for relocs against
1384 symbols which turn out to need copy relocs or are not
1387 if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
1388 && (((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
1389 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1390 || (htab->elf.dynamic_sections_created
1391 && (h->root.type == bfd_link_hash_undefweak
1392 || h->root.type == bfd_link_hash_undefined))))
1394 /* Make sure this symbol is output as a dynamic symbol.
1395 Undefined weak syms won't yet be marked as dynamic. */
1396 if (h->dynindx == -1
1397 && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1399 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
1403 /* If that succeeded, we know we'll be keeping all the
1405 if (h->dynindx != -1)
1409 eh->dyn_relocs = NULL;
1414 /* Finally, allocate space. */
1415 for (p = eh->dyn_relocs; p != NULL; p = p->next)
1417 asection *sreloc = elf_section_data (p->sec)->sreloc;
1418 sreloc->_raw_size += p->count * sizeof (Elf32_External_Rel);
1424 /* Find any dynamic relocs that apply to read-only sections. */
1427 readonly_dynrelocs (h, inf)
1428 struct elf_link_hash_entry *h;
1431 struct elf_i386_link_hash_entry *eh;
1432 struct elf_i386_dyn_relocs *p;
1434 if (h->root.type == bfd_link_hash_warning)
1435 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1437 eh = (struct elf_i386_link_hash_entry *) h;
1438 for (p = eh->dyn_relocs; p != NULL; p = p->next)
1440 asection *s = p->sec->output_section;
1442 if (s != NULL && (s->flags & SEC_READONLY) != 0)
1444 struct bfd_link_info *info = (struct bfd_link_info *) inf;
1446 info->flags |= DF_TEXTREL;
1448 /* Not an error, just cut short the traversal. */
1455 /* Set the sizes of the dynamic sections. */
1458 elf_i386_size_dynamic_sections (output_bfd, info)
1459 bfd *output_bfd ATTRIBUTE_UNUSED;
1460 struct bfd_link_info *info;
1462 struct elf_i386_link_hash_table *htab;
1468 htab = elf_i386_hash_table (info);
1469 dynobj = htab->elf.dynobj;
1473 if (htab->elf.dynamic_sections_created)
1475 /* Set the contents of the .interp section to the interpreter. */
1478 s = bfd_get_section_by_name (dynobj, ".interp");
1481 s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
1482 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1486 /* Set up .got offsets for local syms, and space for local dynamic
1488 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
1490 bfd_signed_vma *local_got;
1491 bfd_signed_vma *end_local_got;
1492 bfd_size_type locsymcount;
1493 Elf_Internal_Shdr *symtab_hdr;
1496 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
1499 for (s = ibfd->sections; s != NULL; s = s->next)
1501 struct elf_i386_dyn_relocs *p;
1503 for (p = *((struct elf_i386_dyn_relocs **)
1504 &elf_section_data (s)->local_dynrel);
1508 if (!bfd_is_abs_section (p->sec)
1509 && bfd_is_abs_section (p->sec->output_section))
1511 /* Input section has been discarded, either because
1512 it is a copy of a linkonce section or due to
1513 linker script /DISCARD/, so we'll be discarding
1516 else if (p->count != 0)
1518 srel = elf_section_data (p->sec)->sreloc;
1519 srel->_raw_size += p->count * sizeof (Elf32_External_Rel);
1520 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
1521 info->flags |= DF_TEXTREL;
1526 local_got = elf_local_got_refcounts (ibfd);
1530 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
1531 locsymcount = symtab_hdr->sh_info;
1532 end_local_got = local_got + locsymcount;
1534 srel = htab->srelgot;
1535 for (; local_got < end_local_got; ++local_got)
1539 *local_got = s->_raw_size;
1542 srel->_raw_size += sizeof (Elf32_External_Rel);
1545 *local_got = (bfd_vma) -1;
1549 /* Allocate global sym .plt and .got entries, and space for global
1550 sym dynamic relocs. */
1551 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, (PTR) info);
1553 /* We now have determined the sizes of the various dynamic sections.
1554 Allocate memory for them. */
1556 for (s = dynobj->sections; s != NULL; s = s->next)
1558 if ((s->flags & SEC_LINKER_CREATED) == 0)
1563 || s == htab->sgotplt)
1565 /* Strip this section if we don't need it; see the
1568 else if (strncmp (bfd_get_section_name (dynobj, s), ".rel", 4) == 0)
1570 if (s->_raw_size != 0 && s != htab->srelplt)
1573 /* We use the reloc_count field as a counter if we need
1574 to copy relocs into the output file. */
1579 /* It's not one of our sections, so don't allocate space. */
1583 if (s->_raw_size == 0)
1585 /* If we don't need this section, strip it from the
1586 output file. This is mostly to handle .rel.bss and
1587 .rel.plt. We must create both sections in
1588 create_dynamic_sections, because they must be created
1589 before the linker maps input sections to output
1590 sections. The linker does that before
1591 adjust_dynamic_symbol is called, and it is that
1592 function which decides whether anything needs to go
1593 into these sections. */
1595 _bfd_strip_section_from_output (info, s);
1599 /* Allocate memory for the section contents. We use bfd_zalloc
1600 here in case unused entries are not reclaimed before the
1601 section's contents are written out. This should not happen,
1602 but this way if it does, we get a R_386_NONE reloc instead
1604 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size);
1605 if (s->contents == NULL)
1609 if (htab->elf.dynamic_sections_created)
1611 /* Add some entries to the .dynamic section. We fill in the
1612 values later, in elf_i386_finish_dynamic_sections, but we
1613 must add the entries now so that we get the correct size for
1614 the .dynamic section. The DT_DEBUG entry is filled in by the
1615 dynamic linker and used by the debugger. */
1616 #define add_dynamic_entry(TAG, VAL) \
1617 bfd_elf32_add_dynamic_entry (info, (bfd_vma) (TAG), (bfd_vma) (VAL))
1621 if (!add_dynamic_entry (DT_DEBUG, 0))
1625 if (htab->splt->_raw_size != 0)
1627 if (!add_dynamic_entry (DT_PLTGOT, 0)
1628 || !add_dynamic_entry (DT_PLTRELSZ, 0)
1629 || !add_dynamic_entry (DT_PLTREL, DT_REL)
1630 || !add_dynamic_entry (DT_JMPREL, 0))
1636 if (!add_dynamic_entry (DT_REL, 0)
1637 || !add_dynamic_entry (DT_RELSZ, 0)
1638 || !add_dynamic_entry (DT_RELENT, sizeof (Elf32_External_Rel)))
1641 /* If any dynamic relocs apply to a read-only section,
1642 then we need a DT_TEXTREL entry. */
1643 if ((info->flags & DF_TEXTREL) == 0)
1644 elf_link_hash_traverse (&htab->elf, readonly_dynrelocs,
1647 if ((info->flags & DF_TEXTREL) != 0)
1649 if (!add_dynamic_entry (DT_TEXTREL, 0))
1654 #undef add_dynamic_entry
1659 /* Set the correct type for an x86 ELF section. We do this by the
1660 section name, which is a hack, but ought to work. */
1663 elf_i386_fake_sections (abfd, hdr, sec)
1664 bfd *abfd ATTRIBUTE_UNUSED;
1665 Elf32_Internal_Shdr *hdr;
1668 register const char *name;
1670 name = bfd_get_section_name (abfd, sec);
1672 /* This is an ugly, but unfortunately necessary hack that is
1673 needed when producing EFI binaries on x86. It tells
1674 elf.c:elf_fake_sections() not to consider ".reloc" as a section
1675 containing ELF relocation info. We need this hack in order to
1676 be able to generate ELF binaries that can be translated into
1677 EFI applications (which are essentially COFF objects). Those
1678 files contain a COFF ".reloc" section inside an ELFNN object,
1679 which would normally cause BFD to segfault because it would
1680 attempt to interpret this section as containing relocation
1681 entries for section "oc". With this hack enabled, ".reloc"
1682 will be treated as a normal data section, which will avoid the
1683 segfault. However, you won't be able to create an ELFNN binary
1684 with a section named "oc" that needs relocations, but that's
1685 the kind of ugly side-effects you get when detecting section
1686 types based on their names... In practice, this limitation is
1687 unlikely to bite. */
1688 if (strcmp (name, ".reloc") == 0)
1689 hdr->sh_type = SHT_PROGBITS;
1694 /* Relocate an i386 ELF section. */
1697 elf_i386_relocate_section (output_bfd, info, input_bfd, input_section,
1698 contents, relocs, local_syms, local_sections)
1700 struct bfd_link_info *info;
1702 asection *input_section;
1704 Elf_Internal_Rela *relocs;
1705 Elf_Internal_Sym *local_syms;
1706 asection **local_sections;
1708 struct elf_i386_link_hash_table *htab;
1709 Elf_Internal_Shdr *symtab_hdr;
1710 struct elf_link_hash_entry **sym_hashes;
1711 bfd_vma *local_got_offsets;
1712 Elf_Internal_Rela *rel;
1713 Elf_Internal_Rela *relend;
1715 htab = elf_i386_hash_table (info);
1716 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1717 sym_hashes = elf_sym_hashes (input_bfd);
1718 local_got_offsets = elf_local_got_offsets (input_bfd);
1721 relend = relocs + input_section->reloc_count;
1722 for (; rel < relend; rel++)
1725 reloc_howto_type *howto;
1726 unsigned long r_symndx;
1727 struct elf_link_hash_entry *h;
1728 Elf_Internal_Sym *sym;
1732 boolean unresolved_reloc;
1733 bfd_reloc_status_type r;
1736 r_type = ELF32_R_TYPE (rel->r_info);
1737 if (r_type == (int) R_386_GNU_VTINHERIT
1738 || r_type == (int) R_386_GNU_VTENTRY)
1741 if ((indx = (unsigned) r_type) >= R_386_standard
1742 && ((indx = (unsigned) r_type - R_386_ext_offset) - R_386_standard
1743 >= R_386_ext - R_386_standard))
1745 bfd_set_error (bfd_error_bad_value);
1748 howto = elf_howto_table + indx;
1750 r_symndx = ELF32_R_SYM (rel->r_info);
1752 if (info->relocateable)
1754 /* This is a relocatable link. We don't have to change
1755 anything, unless the reloc is against a section symbol,
1756 in which case we have to adjust according to where the
1757 section symbol winds up in the output section. */
1758 if (r_symndx < symtab_hdr->sh_info)
1760 sym = local_syms + r_symndx;
1761 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
1765 sec = local_sections[r_symndx];
1766 val = bfd_get_32 (input_bfd, contents + rel->r_offset);
1767 val += sec->output_offset + sym->st_value;
1768 bfd_put_32 (input_bfd, val, contents + rel->r_offset);
1774 /* This is a final link. */
1778 unresolved_reloc = false;
1779 if (r_symndx < symtab_hdr->sh_info)
1781 sym = local_syms + r_symndx;
1782 sec = local_sections[r_symndx];
1783 relocation = (sec->output_section->vma
1784 + sec->output_offset
1786 if ((sec->flags & SEC_MERGE)
1787 && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
1792 if (howto->src_mask != 0xffffffff)
1794 (*_bfd_error_handler)
1795 (_("%s(%s+0x%lx): %s relocation against SEC_MERGE section"),
1796 bfd_archive_filename (input_bfd),
1797 bfd_get_section_name (input_bfd, input_section),
1798 (long) rel->r_offset, howto->name);
1802 addend = bfd_get_32 (input_bfd, contents + rel->r_offset);
1805 _bfd_elf_rel_local_sym (output_bfd, sym, &msec, addend)
1807 addend += msec->output_section->vma + msec->output_offset;
1808 bfd_put_32 (input_bfd, addend, contents + rel->r_offset);
1813 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1814 while (h->root.type == bfd_link_hash_indirect
1815 || h->root.type == bfd_link_hash_warning)
1816 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1819 if (h->root.type == bfd_link_hash_defined
1820 || h->root.type == bfd_link_hash_defweak)
1822 sec = h->root.u.def.section;
1823 if (sec->output_section == NULL)
1824 /* Set a flag that will be cleared later if we find a
1825 relocation value for this symbol. output_section
1826 is typically NULL for symbols satisfied by a shared
1828 unresolved_reloc = true;
1830 relocation = (h->root.u.def.value
1831 + sec->output_section->vma
1832 + sec->output_offset);
1834 else if (h->root.type == bfd_link_hash_undefweak)
1836 else if (info->shared
1837 && (!info->symbolic || info->allow_shlib_undefined)
1838 && !info->no_undefined
1839 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
1843 if (! ((*info->callbacks->undefined_symbol)
1844 (info, h->root.root.string, input_bfd,
1845 input_section, rel->r_offset,
1846 (!info->shared || info->no_undefined
1847 || ELF_ST_VISIBILITY (h->other)))))
1855 /* Relocation is to the entry for this symbol in the global
1857 if (htab->sgot == NULL)
1864 off = h->got.offset;
1865 dyn = htab->elf.dynamic_sections_created;
1866 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h)
1870 || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL))
1871 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
1873 /* This is actually a static link, or it is a
1874 -Bsymbolic link and the symbol is defined
1875 locally, or the symbol was forced to be local
1876 because of a version file. We must initialize
1877 this entry in the global offset table. Since the
1878 offset must always be a multiple of 4, we use the
1879 least significant bit to record whether we have
1880 initialized it already.
1882 When doing a dynamic link, we create a .rel.got
1883 relocation entry to initialize the value. This
1884 is done in the finish_dynamic_symbol routine. */
1889 bfd_put_32 (output_bfd, relocation,
1890 htab->sgot->contents + off);
1895 unresolved_reloc = false;
1899 if (local_got_offsets == NULL)
1902 off = local_got_offsets[r_symndx];
1904 /* The offset must always be a multiple of 4. We use
1905 the least significant bit to record whether we have
1906 already generated the necessary reloc. */
1911 bfd_put_32 (output_bfd, relocation,
1912 htab->sgot->contents + off);
1917 Elf_Internal_Rel outrel;
1918 Elf32_External_Rel *loc;
1920 srelgot = htab->srelgot;
1921 if (srelgot == NULL)
1924 outrel.r_offset = (htab->sgot->output_section->vma
1925 + htab->sgot->output_offset
1927 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
1928 loc = (Elf32_External_Rel *) srelgot->contents;
1929 loc += srelgot->reloc_count++;
1930 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
1933 local_got_offsets[r_symndx] |= 1;
1937 if (off >= (bfd_vma) -2)
1940 relocation = htab->sgot->output_offset + off;
1944 /* Relocation is relative to the start of the global offset
1947 /* Note that sgot->output_offset is not involved in this
1948 calculation. We always want the start of .got. If we
1949 defined _GLOBAL_OFFSET_TABLE in a different way, as is
1950 permitted by the ABI, we might have to change this
1952 relocation -= htab->sgot->output_section->vma;
1956 /* Use global offset table as symbol value. */
1957 relocation = htab->sgot->output_section->vma;
1958 unresolved_reloc = false;
1962 /* Relocation is to the entry for this symbol in the
1963 procedure linkage table. */
1965 /* Resolve a PLT32 reloc against a local symbol directly,
1966 without using the procedure linkage table. */
1970 if (h->plt.offset == (bfd_vma) -1
1971 || htab->splt == NULL)
1973 /* We didn't make a PLT entry for this symbol. This
1974 happens when statically linking PIC code, or when
1975 using -Bsymbolic. */
1979 relocation = (htab->splt->output_section->vma
1980 + htab->splt->output_offset
1982 unresolved_reloc = false;
1987 /* r_symndx will be zero only for relocs against symbols
1988 from removed linkonce sections, or sections discarded by
1991 || (input_section->flags & SEC_ALLOC) == 0)
1995 && (r_type != R_386_PC32
1998 && (! info->symbolic
1999 || (h->elf_link_hash_flags
2000 & ELF_LINK_HASH_DEF_REGULAR) == 0))))
2004 && (h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
2005 && (((h->elf_link_hash_flags
2006 & ELF_LINK_HASH_DEF_DYNAMIC) != 0
2007 && (h->elf_link_hash_flags
2008 & ELF_LINK_HASH_DEF_REGULAR) == 0)
2009 || h->root.type == bfd_link_hash_undefweak
2010 || h->root.type == bfd_link_hash_undefined)))
2012 Elf_Internal_Rel outrel;
2013 boolean skip, relocate;
2015 Elf32_External_Rel *loc;
2017 /* When generating a shared object, these relocations
2018 are copied into the output file to be resolved at run
2025 _bfd_elf_section_offset (output_bfd, info, input_section,
2027 if (outrel.r_offset == (bfd_vma) -1)
2029 else if (outrel.r_offset == (bfd_vma) -2)
2030 skip = true, relocate = true;
2031 outrel.r_offset += (input_section->output_section->vma
2032 + input_section->output_offset);
2035 memset (&outrel, 0, sizeof outrel);
2038 && (r_type == R_386_PC32
2041 || (h->elf_link_hash_flags
2042 & ELF_LINK_HASH_DEF_REGULAR) == 0))
2043 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
2046 /* This symbol is local, or marked to become local. */
2048 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
2051 sreloc = elf_section_data (input_section)->sreloc;
2055 loc = (Elf32_External_Rel *) sreloc->contents;
2056 loc += sreloc->reloc_count++;
2057 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
2059 /* If this reloc is against an external symbol, we do
2060 not want to fiddle with the addend. Otherwise, we
2061 need to include the symbol value so that it becomes
2062 an addend for the dynamic reloc. */
2072 /* FIXME: Why do we allow debugging sections to escape this error?
2073 More importantly, why do we not emit dynamic relocs for
2074 R_386_32 above in debugging sections (which are ! SEC_ALLOC)?
2075 If we had emitted the dynamic reloc, we could remove the
2077 if (unresolved_reloc
2079 && (input_section->flags & SEC_DEBUGGING) != 0
2080 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0))
2081 (*_bfd_error_handler)
2082 (_("%s(%s+0x%lx): unresolvable relocation against symbol `%s'"),
2083 bfd_archive_filename (input_bfd),
2084 bfd_get_section_name (input_bfd, input_section),
2085 (long) rel->r_offset,
2086 h->root.root.string);
2088 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
2089 contents, rel->r_offset,
2090 relocation, (bfd_vma) 0);
2092 if (r != bfd_reloc_ok)
2097 name = h->root.root.string;
2100 name = bfd_elf_string_from_elf_section (input_bfd,
2101 symtab_hdr->sh_link,
2106 name = bfd_section_name (input_bfd, sec);
2109 if (r == bfd_reloc_overflow)
2112 if (! ((*info->callbacks->reloc_overflow)
2113 (info, name, howto->name, (bfd_vma) 0,
2114 input_bfd, input_section, rel->r_offset)))
2119 (*_bfd_error_handler)
2120 (_("%s(%s+0x%lx): reloc against `%s': error %d"),
2121 bfd_archive_filename (input_bfd),
2122 bfd_get_section_name (input_bfd, input_section),
2123 (long) rel->r_offset, name, (int) r);
2132 /* Finish up dynamic symbol handling. We set the contents of various
2133 dynamic sections here. */
2136 elf_i386_finish_dynamic_symbol (output_bfd, info, h, sym)
2138 struct bfd_link_info *info;
2139 struct elf_link_hash_entry *h;
2140 Elf_Internal_Sym *sym;
2142 struct elf_i386_link_hash_table *htab;
2144 htab = elf_i386_hash_table (info);
2146 if (h->plt.offset != (bfd_vma) -1)
2150 Elf_Internal_Rel rel;
2151 Elf32_External_Rel *loc;
2153 /* This symbol has an entry in the procedure linkage table. Set
2156 if (h->dynindx == -1
2157 || htab->splt == NULL
2158 || htab->sgotplt == NULL
2159 || htab->srelplt == NULL)
2162 /* Get the index in the procedure linkage table which
2163 corresponds to this symbol. This is the index of this symbol
2164 in all the symbols for which we are making plt entries. The
2165 first entry in the procedure linkage table is reserved. */
2166 plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
2168 /* Get the offset into the .got table of the entry that
2169 corresponds to this function. Each .got entry is 4 bytes.
2170 The first three are reserved. */
2171 got_offset = (plt_index + 3) * 4;
2173 /* Fill in the entry in the procedure linkage table. */
2176 memcpy (htab->splt->contents + h->plt.offset, elf_i386_plt_entry,
2178 bfd_put_32 (output_bfd,
2179 (htab->sgotplt->output_section->vma
2180 + htab->sgotplt->output_offset
2182 htab->splt->contents + h->plt.offset + 2);
2186 memcpy (htab->splt->contents + h->plt.offset, elf_i386_pic_plt_entry,
2188 bfd_put_32 (output_bfd, got_offset,
2189 htab->splt->contents + h->plt.offset + 2);
2192 bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rel),
2193 htab->splt->contents + h->plt.offset + 7);
2194 bfd_put_32 (output_bfd, - (h->plt.offset + PLT_ENTRY_SIZE),
2195 htab->splt->contents + h->plt.offset + 12);
2197 /* Fill in the entry in the global offset table. */
2198 bfd_put_32 (output_bfd,
2199 (htab->splt->output_section->vma
2200 + htab->splt->output_offset
2203 htab->sgotplt->contents + got_offset);
2205 /* Fill in the entry in the .rel.plt section. */
2206 rel.r_offset = (htab->sgotplt->output_section->vma
2207 + htab->sgotplt->output_offset
2209 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_JUMP_SLOT);
2210 loc = (Elf32_External_Rel *) htab->srelplt->contents + plt_index;
2211 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
2213 if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
2215 /* Mark the symbol as undefined, rather than as defined in
2216 the .plt section. Leave the value alone. This is a clue
2217 for the dynamic linker, to make function pointer
2218 comparisons work between an application and shared
2220 sym->st_shndx = SHN_UNDEF;
2224 if (h->got.offset != (bfd_vma) -1)
2226 Elf_Internal_Rel rel;
2227 Elf32_External_Rel *loc;
2229 /* This symbol has an entry in the global offset table. Set it
2232 if (htab->sgot == NULL || htab->srelgot == NULL)
2235 rel.r_offset = (htab->sgot->output_section->vma
2236 + htab->sgot->output_offset
2237 + (h->got.offset & ~(bfd_vma) 1));
2239 /* If this is a static link, or it is a -Bsymbolic link and the
2240 symbol is defined locally or was forced to be local because
2241 of a version file, we just want to emit a RELATIVE reloc.
2242 The entry in the global offset table will already have been
2243 initialized in the relocate_section function. */
2247 || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL))
2248 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
2250 BFD_ASSERT((h->got.offset & 1) != 0);
2251 rel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
2255 BFD_ASSERT((h->got.offset & 1) == 0);
2256 bfd_put_32 (output_bfd, (bfd_vma) 0,
2257 htab->sgot->contents + h->got.offset);
2258 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_GLOB_DAT);
2261 loc = (Elf32_External_Rel *) htab->srelgot->contents;
2262 loc += htab->srelgot->reloc_count++;
2263 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
2266 if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
2268 Elf_Internal_Rel rel;
2269 Elf32_External_Rel *loc;
2271 /* This symbol needs a copy reloc. Set it up. */
2273 if (h->dynindx == -1
2274 || (h->root.type != bfd_link_hash_defined
2275 && h->root.type != bfd_link_hash_defweak)
2276 || htab->srelbss == NULL)
2279 rel.r_offset = (h->root.u.def.value
2280 + h->root.u.def.section->output_section->vma
2281 + h->root.u.def.section->output_offset);
2282 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_COPY);
2283 loc = (Elf32_External_Rel *) htab->srelbss->contents;
2284 loc += htab->srelbss->reloc_count++;
2285 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
2288 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
2289 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
2290 || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
2291 sym->st_shndx = SHN_ABS;
2296 /* Used to decide how to sort relocs in an optimal manner for the
2297 dynamic linker, before writing them out. */
2299 static enum elf_reloc_type_class
2300 elf_i386_reloc_type_class (rela)
2301 const Elf_Internal_Rela *rela;
2303 switch ((int) ELF32_R_TYPE (rela->r_info))
2305 case R_386_RELATIVE:
2306 return reloc_class_relative;
2307 case R_386_JUMP_SLOT:
2308 return reloc_class_plt;
2310 return reloc_class_copy;
2312 return reloc_class_normal;
2316 /* Finish up the dynamic sections. */
2319 elf_i386_finish_dynamic_sections (output_bfd, info)
2321 struct bfd_link_info *info;
2323 struct elf_i386_link_hash_table *htab;
2327 htab = elf_i386_hash_table (info);
2328 dynobj = htab->elf.dynobj;
2329 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
2331 if (htab->elf.dynamic_sections_created)
2333 Elf32_External_Dyn *dyncon, *dynconend;
2335 if (sdyn == NULL || htab->sgot == NULL)
2338 dyncon = (Elf32_External_Dyn *) sdyn->contents;
2339 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
2340 for (; dyncon < dynconend; dyncon++)
2342 Elf_Internal_Dyn dyn;
2345 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
2353 dyn.d_un.d_ptr = htab->sgot->output_section->vma;
2357 dyn.d_un.d_ptr = htab->srelplt->output_section->vma;
2361 s = htab->srelplt->output_section;
2362 if (s->_cooked_size != 0)
2363 dyn.d_un.d_val = s->_cooked_size;
2365 dyn.d_un.d_val = s->_raw_size;
2369 /* My reading of the SVR4 ABI indicates that the
2370 procedure linkage table relocs (DT_JMPREL) should be
2371 included in the overall relocs (DT_REL). This is
2372 what Solaris does. However, UnixWare can not handle
2373 that case. Therefore, we override the DT_RELSZ entry
2374 here to make it not include the JMPREL relocs. Since
2375 the linker script arranges for .rel.plt to follow all
2376 other relocation sections, we don't have to worry
2377 about changing the DT_REL entry. */
2378 if (htab->srelplt != NULL)
2380 s = htab->srelplt->output_section;
2381 if (s->_cooked_size != 0)
2382 dyn.d_un.d_val -= s->_cooked_size;
2384 dyn.d_un.d_val -= s->_raw_size;
2389 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2392 /* Fill in the first entry in the procedure linkage table. */
2393 if (htab->splt && htab->splt->_raw_size > 0)
2396 memcpy (htab->splt->contents,
2397 elf_i386_pic_plt0_entry, PLT_ENTRY_SIZE);
2400 memcpy (htab->splt->contents,
2401 elf_i386_plt0_entry, PLT_ENTRY_SIZE);
2402 bfd_put_32 (output_bfd,
2403 (htab->sgotplt->output_section->vma
2404 + htab->sgotplt->output_offset
2406 htab->splt->contents + 2);
2407 bfd_put_32 (output_bfd,
2408 (htab->sgotplt->output_section->vma
2409 + htab->sgotplt->output_offset
2411 htab->splt->contents + 8);
2414 /* UnixWare sets the entsize of .plt to 4, although that doesn't
2415 really seem like the right value. */
2416 elf_section_data (htab->splt->output_section)
2417 ->this_hdr.sh_entsize = 4;
2423 /* Fill in the first three entries in the global offset table. */
2424 if (htab->sgotplt->_raw_size > 0)
2426 bfd_put_32 (output_bfd,
2427 (sdyn == NULL ? (bfd_vma) 0
2428 : sdyn->output_section->vma + sdyn->output_offset),
2429 htab->sgotplt->contents);
2430 bfd_put_32 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + 4);
2431 bfd_put_32 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + 8);
2434 elf_section_data (htab->sgotplt->output_section)->this_hdr.sh_entsize = 4;
2439 #define TARGET_LITTLE_SYM bfd_elf32_i386_vec
2440 #define TARGET_LITTLE_NAME "elf32-i386"
2441 #define ELF_ARCH bfd_arch_i386
2442 #define ELF_MACHINE_CODE EM_386
2443 #define ELF_MAXPAGESIZE 0x1000
2445 #define elf_backend_can_gc_sections 1
2446 #define elf_backend_can_refcount 1
2447 #define elf_backend_want_got_plt 1
2448 #define elf_backend_plt_readonly 1
2449 #define elf_backend_want_plt_sym 0
2450 #define elf_backend_got_header_size 12
2451 #define elf_backend_plt_header_size PLT_ENTRY_SIZE
2453 #define elf_info_to_howto elf_i386_info_to_howto
2454 #define elf_info_to_howto_rel elf_i386_info_to_howto_rel
2456 #define bfd_elf32_bfd_is_local_label_name elf_i386_is_local_label_name
2457 #define bfd_elf32_bfd_link_hash_table_create elf_i386_link_hash_table_create
2458 #define bfd_elf32_bfd_reloc_type_lookup elf_i386_reloc_type_lookup
2460 #define elf_backend_adjust_dynamic_symbol elf_i386_adjust_dynamic_symbol
2461 #define elf_backend_check_relocs elf_i386_check_relocs
2462 #define elf_backend_copy_indirect_symbol elf_i386_copy_indirect_symbol
2463 #define elf_backend_create_dynamic_sections elf_i386_create_dynamic_sections
2464 #define elf_backend_fake_sections elf_i386_fake_sections
2465 #define elf_backend_finish_dynamic_sections elf_i386_finish_dynamic_sections
2466 #define elf_backend_finish_dynamic_symbol elf_i386_finish_dynamic_symbol
2467 #define elf_backend_gc_mark_hook elf_i386_gc_mark_hook
2468 #define elf_backend_gc_sweep_hook elf_i386_gc_sweep_hook
2469 #define elf_backend_grok_prstatus elf_i386_grok_prstatus
2470 #define elf_backend_grok_psinfo elf_i386_grok_psinfo
2471 #define elf_backend_reloc_type_class elf_i386_reloc_type_class
2472 #define elf_backend_relocate_section elf_i386_relocate_section
2473 #define elf_backend_size_dynamic_sections elf_i386_size_dynamic_sections
2475 #include "elf32-target.h"