1 /* Intel 80386/80486-specific support for 32-bit ELF
2 Copyright 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
4 This file is part of BFD, the Binary File Descriptor library.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
26 static reloc_howto_type *elf_i386_reloc_type_lookup
27 PARAMS ((bfd *, bfd_reloc_code_real_type));
28 static void elf_i386_info_to_howto
29 PARAMS ((bfd *, arelent *, Elf32_Internal_Rela *));
30 static void elf_i386_info_to_howto_rel
31 PARAMS ((bfd *, arelent *, Elf32_Internal_Rel *));
32 static boolean elf_i386_check_relocs
33 PARAMS ((bfd *, struct bfd_link_info *, asection *,
34 const Elf_Internal_Rela *));
35 static boolean elf_i386_adjust_dynamic_symbol
36 PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
37 static boolean elf_i386_size_dynamic_sections
38 PARAMS ((bfd *, struct bfd_link_info *));
39 static boolean elf_i386_relocate_section
40 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
41 Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
42 static boolean elf_i386_finish_dynamic_symbol
43 PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
45 static boolean elf_i386_finish_dynamic_sections
46 PARAMS ((bfd *, struct bfd_link_info *));
48 #define USE_REL 1 /* 386 uses REL relocations instead of RELA */
64 LAST_INVALID_RELOC = 19,
65 /* The remaining relocs are a GNU extension. */
74 static CONST char *CONST reloc_type_names[] =
90 static reloc_howto_type elf_howto_table[]=
92 HOWTO(R_386_NONE, 0,0, 0,false,0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_NONE", true,0x00000000,0x00000000,false),
93 HOWTO(R_386_32, 0,2,32,false,0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_32", true,0xffffffff,0xffffffff,false),
94 HOWTO(R_386_PC32, 0,2,32,true, 0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_PC32", true,0xffffffff,0xffffffff,true),
95 HOWTO(R_386_GOT32, 0,2,32,false,0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_GOT32", true,0xffffffff,0xffffffff,false),
96 HOWTO(R_386_PLT32, 0,2,32,true,0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_PLT32", true,0xffffffff,0xffffffff,true),
97 HOWTO(R_386_COPY, 0,2,32,false,0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_COPY", true,0xffffffff,0xffffffff,false),
98 HOWTO(R_386_GLOB_DAT, 0,2,32,false,0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_GLOB_DAT", true,0xffffffff,0xffffffff,false),
99 HOWTO(R_386_JUMP_SLOT, 0,2,32,false,0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_JUMP_SLOT",true,0xffffffff,0xffffffff,false),
100 HOWTO(R_386_RELATIVE, 0,2,32,false,0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_RELATIVE", true,0xffffffff,0xffffffff,false),
101 HOWTO(R_386_GOTOFF, 0,2,32,false,0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_GOTOFF", true,0xffffffff,0xffffffff,false),
102 HOWTO(R_386_GOTPC, 0,2,32,true,0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_GOTPC", true,0xffffffff,0xffffffff,true),
112 /* The remaining relocs are a GNU extension. */
113 HOWTO(R_386_16, 0,1,16,false,0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_16", true,0xffff,0xffff,false),
114 HOWTO(R_386_PC16, 0,1,16,true, 0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_PC16", true,0xffff,0xffff,true),
115 HOWTO(R_386_8, 0,0,8,false,0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_8", true,0xff,0xff,false),
116 HOWTO(R_386_PC8, 0,0,8,true, 0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_PC8", true,0xff,0xff,true),
119 #ifdef DEBUG_GEN_RELOC
120 #define TRACE(str) fprintf (stderr, "i386 bfd reloc lookup %d (%s)\n", code, str)
125 static reloc_howto_type *
126 elf_i386_reloc_type_lookup (abfd, code)
128 bfd_reloc_code_real_type code;
133 TRACE ("BFD_RELOC_NONE");
134 return &elf_howto_table[ (int)R_386_NONE ];
137 TRACE ("BFD_RELOC_32");
138 return &elf_howto_table[ (int)R_386_32 ];
140 case BFD_RELOC_32_PCREL:
141 TRACE ("BFD_RELOC_PC32");
142 return &elf_howto_table[ (int)R_386_PC32 ];
144 case BFD_RELOC_386_GOT32:
145 TRACE ("BFD_RELOC_386_GOT32");
146 return &elf_howto_table[ (int)R_386_GOT32 ];
148 case BFD_RELOC_386_PLT32:
149 TRACE ("BFD_RELOC_386_PLT32");
150 return &elf_howto_table[ (int)R_386_PLT32 ];
152 case BFD_RELOC_386_COPY:
153 TRACE ("BFD_RELOC_386_COPY");
154 return &elf_howto_table[ (int)R_386_COPY ];
156 case BFD_RELOC_386_GLOB_DAT:
157 TRACE ("BFD_RELOC_386_GLOB_DAT");
158 return &elf_howto_table[ (int)R_386_GLOB_DAT ];
160 case BFD_RELOC_386_JUMP_SLOT:
161 TRACE ("BFD_RELOC_386_JUMP_SLOT");
162 return &elf_howto_table[ (int)R_386_JUMP_SLOT ];
164 case BFD_RELOC_386_RELATIVE:
165 TRACE ("BFD_RELOC_386_RELATIVE");
166 return &elf_howto_table[ (int)R_386_RELATIVE ];
168 case BFD_RELOC_386_GOTOFF:
169 TRACE ("BFD_RELOC_386_GOTOFF");
170 return &elf_howto_table[ (int)R_386_GOTOFF ];
172 case BFD_RELOC_386_GOTPC:
173 TRACE ("BFD_RELOC_386_GOTPC");
174 return &elf_howto_table[ (int)R_386_GOTPC ];
176 /* The remaining relocs are a GNU extension. */
178 TRACE ("BFD_RELOC_16");
179 return &elf_howto_table[(int) R_386_16];
181 case BFD_RELOC_16_PCREL:
182 TRACE ("BFD_RELOC_16_PCREL");
183 return &elf_howto_table[(int) R_386_PC16];
186 TRACE ("BFD_RELOC_8");
187 return &elf_howto_table[(int) R_386_8];
189 case BFD_RELOC_8_PCREL:
190 TRACE ("BFD_RELOC_8_PCREL");
191 return &elf_howto_table[(int) R_386_PC8];
202 elf_i386_info_to_howto (abfd, cache_ptr, dst)
205 Elf32_Internal_Rela *dst;
211 elf_i386_info_to_howto_rel (abfd, cache_ptr, dst)
214 Elf32_Internal_Rel *dst;
216 enum reloc_type type;
218 type = (enum reloc_type) ELF32_R_TYPE (dst->r_info);
219 BFD_ASSERT (type < R_386_max);
220 BFD_ASSERT (type < FIRST_INVALID_RELOC || type > LAST_INVALID_RELOC);
222 cache_ptr->howto = &elf_howto_table[(int) type];
225 /* Functions for the i386 ELF linker. */
227 /* The name of the dynamic interpreter. This is put in the .interp
230 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1"
232 /* The size in bytes of an entry in the procedure linkage table. */
234 #define PLT_ENTRY_SIZE 16
236 /* The first entry in an absolute procedure linkage table looks like
237 this. See the SVR4 ABI i386 supplement to see how this works. */
239 static const bfd_byte elf_i386_plt0_entry[PLT_ENTRY_SIZE] =
241 0xff, 0x35, /* pushl contents of address */
242 0, 0, 0, 0, /* replaced with address of .got + 4. */
243 0xff, 0x25, /* jmp indirect */
244 0, 0, 0, 0, /* replaced with address of .got + 8. */
245 0, 0, 0, 0 /* pad out to 16 bytes. */
248 /* Subsequent entries in an absolute procedure linkage table look like
251 static const bfd_byte elf_i386_plt_entry[PLT_ENTRY_SIZE] =
253 0xff, 0x25, /* jmp indirect */
254 0, 0, 0, 0, /* replaced with address of this symbol in .got. */
255 0x68, /* pushl immediate */
256 0, 0, 0, 0, /* replaced with offset into relocation table. */
257 0xe9, /* jmp relative */
258 0, 0, 0, 0 /* replaced with offset to start of .plt. */
261 /* The first entry in a PIC procedure linkage table look like this. */
263 static const bfd_byte elf_i386_pic_plt0_entry[PLT_ENTRY_SIZE] =
265 0xff, 0xb3, 4, 0, 0, 0, /* pushl 4(%ebx) */
266 0xff, 0xa3, 8, 0, 0, 0, /* jmp *8(%ebx) */
267 0, 0, 0, 0 /* pad out to 16 bytes. */
270 /* Subsequent entries in a PIC procedure linkage table look like this. */
272 static const bfd_byte elf_i386_pic_plt_entry[PLT_ENTRY_SIZE] =
274 0xff, 0xa3, /* jmp *offset(%ebx) */
275 0, 0, 0, 0, /* replaced with offset of this symbol in .got. */
276 0x68, /* pushl immediate */
277 0, 0, 0, 0, /* replaced with offset into relocation table. */
278 0xe9, /* jmp relative */
279 0, 0, 0, 0 /* replaced with offset to start of .plt. */
282 /* Look through the relocs for a section during the first phase, and
283 allocate space in the global offset table or procedure linkage
287 elf_i386_check_relocs (abfd, info, sec, relocs)
289 struct bfd_link_info *info;
291 const Elf_Internal_Rela *relocs;
294 Elf_Internal_Shdr *symtab_hdr;
295 struct elf_link_hash_entry **sym_hashes;
296 bfd_vma *local_got_offsets;
297 const Elf_Internal_Rela *rel;
298 const Elf_Internal_Rela *rel_end;
303 if (info->relocateable)
306 dynobj = elf_hash_table (info)->dynobj;
307 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
308 sym_hashes = elf_sym_hashes (abfd);
309 local_got_offsets = elf_local_got_offsets (abfd);
315 rel_end = relocs + sec->reloc_count;
316 for (rel = relocs; rel < rel_end; rel++)
318 unsigned long r_symndx;
319 struct elf_link_hash_entry *h;
321 r_symndx = ELF32_R_SYM (rel->r_info);
323 if (r_symndx < symtab_hdr->sh_info)
326 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
328 /* Some relocs require a global offset table. */
331 switch (ELF32_R_TYPE (rel->r_info))
336 elf_hash_table (info)->dynobj = dynobj = abfd;
337 if (! _bfd_elf_create_got_section (dynobj, info))
346 switch (ELF32_R_TYPE (rel->r_info))
349 /* This symbol requires a global offset table entry. */
353 sgot = bfd_get_section_by_name (dynobj, ".got");
354 BFD_ASSERT (sgot != NULL);
358 && (h != NULL || info->shared))
360 srelgot = bfd_get_section_by_name (dynobj, ".rel.got");
363 srelgot = bfd_make_section (dynobj, ".rel.got");
365 || ! bfd_set_section_flags (dynobj, srelgot,
372 || ! bfd_set_section_alignment (dynobj, srelgot, 2))
379 if (h->got_offset != (bfd_vma) -1)
381 /* We have already allocated space in the .got. */
384 h->got_offset = sgot->_raw_size;
386 /* Make sure this symbol is output as a dynamic symbol. */
387 if (h->dynindx == -1)
389 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
393 srelgot->_raw_size += sizeof (Elf32_External_Rel);
397 /* This is a global offset table entry for a local
399 if (local_got_offsets == NULL)
402 register unsigned int i;
404 size = symtab_hdr->sh_info * sizeof (bfd_vma);
405 local_got_offsets = (bfd_vma *) bfd_alloc (abfd, size);
406 if (local_got_offsets == NULL)
408 elf_local_got_offsets (abfd) = local_got_offsets;
409 for (i = 0; i < symtab_hdr->sh_info; i++)
410 local_got_offsets[i] = (bfd_vma) -1;
412 if (local_got_offsets[r_symndx] != (bfd_vma) -1)
414 /* We have already allocated space in the .got. */
417 local_got_offsets[r_symndx] = sgot->_raw_size;
421 /* If we are generating a shared object, we need to
422 output a R_386_RELATIVE reloc so that the dynamic
423 linker can adjust this GOT entry. */
424 srelgot->_raw_size += sizeof (Elf32_External_Rel);
428 sgot->_raw_size += 4;
433 /* This symbol requires a procedure linkage table entry. We
434 actually build the entry in adjust_dynamic_symbol,
435 because this might be a case of linking PIC code which is
436 never referenced by a dynamic object, in which case we
437 don't need to generate a procedure linkage table entry
440 /* If this is a local symbol, we resolve it directly without
441 creating a procedure linkage table entry. */
445 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
452 && (ELF32_R_TYPE (rel->r_info) != R_386_PC32 || h != NULL))
454 /* When creating a shared object, we must copy these
455 reloc types into the output file. We create a reloc
456 section in dynobj and make room for this reloc. */
461 name = (bfd_elf_string_from_elf_section
463 elf_elfheader (abfd)->e_shstrndx,
464 elf_section_data (sec)->rel_hdr.sh_name));
468 BFD_ASSERT (strncmp (name, ".rel", 4) == 0
469 && strcmp (bfd_get_section_name (abfd, sec),
472 sreloc = bfd_get_section_by_name (dynobj, name);
477 sreloc = bfd_make_section (dynobj, name);
478 flags = (SEC_HAS_CONTENTS | SEC_READONLY
479 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
480 if ((sec->flags & SEC_ALLOC) != 0)
481 flags |= SEC_ALLOC | SEC_LOAD;
483 || ! bfd_set_section_flags (dynobj, sreloc, flags)
484 || ! bfd_set_section_alignment (dynobj, sreloc, 2))
489 sreloc->_raw_size += sizeof (Elf32_External_Rel);
502 /* Adjust a symbol defined by a dynamic object and referenced by a
503 regular object. The current definition is in some section of the
504 dynamic object, but we're not including those sections. We have to
505 change the definition to something the rest of the link can
509 elf_i386_adjust_dynamic_symbol (info, h)
510 struct bfd_link_info *info;
511 struct elf_link_hash_entry *h;
515 unsigned int power_of_two;
517 dynobj = elf_hash_table (info)->dynobj;
519 /* Make sure we know what is going on here. */
520 BFD_ASSERT (dynobj != NULL
521 && ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT)
522 || h->weakdef != NULL
523 || ((h->elf_link_hash_flags
524 & ELF_LINK_HASH_DEF_DYNAMIC) != 0
525 && (h->elf_link_hash_flags
526 & ELF_LINK_HASH_REF_REGULAR) != 0
527 && (h->elf_link_hash_flags
528 & ELF_LINK_HASH_DEF_REGULAR) == 0)));
530 /* If this is a function, put it in the procedure linkage table. We
531 will fill in the contents of the procedure linkage table later,
532 when we know the address of the .got section. */
533 if (h->type == STT_FUNC
534 || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
537 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0
538 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0)
540 /* This case can occur if we saw a PLT32 reloc in an input
541 file, but the symbol was never referred to by a dynamic
542 object. In such a case, we don't actually need to build
543 a procedure linkage table, and we can just do a PC32
545 BFD_ASSERT ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0);
549 /* Make sure this symbol is output as a dynamic symbol. */
550 if (h->dynindx == -1)
552 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
556 s = bfd_get_section_by_name (dynobj, ".plt");
557 BFD_ASSERT (s != NULL);
559 /* If this is the first .plt entry, make room for the special
561 if (s->_raw_size == 0)
562 s->_raw_size += PLT_ENTRY_SIZE;
564 /* If this symbol is not defined in a regular file, and we are
565 not generating a shared library, then set the symbol to this
566 location in the .plt. This is required to make function
567 pointers compare as equal between the normal executable and
568 the shared library. */
570 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
572 h->root.u.def.section = s;
573 h->root.u.def.value = s->_raw_size;
576 h->plt_offset = s->_raw_size;
578 /* Make room for this entry. */
579 s->_raw_size += PLT_ENTRY_SIZE;
581 /* We also need to make an entry in the .got.plt section, which
582 will be placed in the .got section by the linker script. */
584 s = bfd_get_section_by_name (dynobj, ".got.plt");
585 BFD_ASSERT (s != NULL);
588 /* We also need to make an entry in the .rel.plt section. */
590 s = bfd_get_section_by_name (dynobj, ".rel.plt");
591 BFD_ASSERT (s != NULL);
592 s->_raw_size += sizeof (Elf32_External_Rel);
597 /* If this is a weak symbol, and there is a real definition, the
598 processor independent code will have arranged for us to see the
599 real definition first, and we can just use the same value. */
600 if (h->weakdef != NULL)
602 BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
603 || h->weakdef->root.type == bfd_link_hash_defweak);
604 h->root.u.def.section = h->weakdef->root.u.def.section;
605 h->root.u.def.value = h->weakdef->root.u.def.value;
609 /* This is a reference to a symbol defined by a dynamic object which
610 is not a function. */
612 /* If we are creating a shared library, we must presume that the
613 only references to the symbol are via the global offset table.
614 For such cases we need not do anything here; the relocations will
615 be handled correctly by relocate_section. */
619 /* We must allocate the symbol in our .dynbss section, which will
620 become part of the .bss section of the executable. There will be
621 an entry for this symbol in the .dynsym section. The dynamic
622 object will contain position independent code, so all references
623 from the dynamic object to this symbol will go through the global
624 offset table. The dynamic linker will use the .dynsym entry to
625 determine the address it must put in the global offset table, so
626 both the dynamic object and the regular object will refer to the
627 same memory location for the variable. */
629 s = bfd_get_section_by_name (dynobj, ".dynbss");
630 BFD_ASSERT (s != NULL);
632 /* If the symbol is currently defined in the .bss section of the
633 dynamic object, then it is OK to simply initialize it to zero.
634 If the symbol is in some other section, we must generate a
635 R_386_COPY reloc to tell the dynamic linker to copy the initial
636 value out of the dynamic object and into the runtime process
637 image. We need to remember the offset into the .rel.bss section
638 we are going to use. */
639 if ((h->root.u.def.section->flags & SEC_LOAD) != 0)
643 srel = bfd_get_section_by_name (dynobj, ".rel.bss");
644 BFD_ASSERT (srel != NULL);
645 srel->_raw_size += sizeof (Elf32_External_Rel);
646 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
649 /* We need to figure out the alignment required for this symbol. I
650 have no idea how ELF linkers handle this. */
651 power_of_two = bfd_log2 (h->size);
652 if (power_of_two > 3)
655 /* Apply the required alignment. */
656 s->_raw_size = BFD_ALIGN (s->_raw_size,
657 (bfd_size_type) (1 << power_of_two));
658 if (power_of_two > bfd_get_section_alignment (dynobj, s))
660 if (! bfd_set_section_alignment (dynobj, s, power_of_two))
664 /* Define the symbol as being at this point in the section. */
665 h->root.u.def.section = s;
666 h->root.u.def.value = s->_raw_size;
668 /* Increment the section size to make room for the symbol. */
669 s->_raw_size += h->size;
674 /* Set the sizes of the dynamic sections. */
677 elf_i386_size_dynamic_sections (output_bfd, info)
679 struct bfd_link_info *info;
687 dynobj = elf_hash_table (info)->dynobj;
688 BFD_ASSERT (dynobj != NULL);
690 if (elf_hash_table (info)->dynamic_sections_created)
692 /* Set the contents of the .interp section to the interpreter. */
695 s = bfd_get_section_by_name (dynobj, ".interp");
696 BFD_ASSERT (s != NULL);
697 s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
698 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
703 /* We may have created entries in the .rel.got section.
704 However, if we are not creating the dynamic sections, we will
705 not actually use these entries. Reset the size of .rel.got,
706 which will cause it to get stripped from the output file
708 s = bfd_get_section_by_name (dynobj, ".rel.got");
713 /* The check_relocs and adjust_dynamic_symbol entry points have
714 determined the sizes of the various dynamic sections. Allocate
719 for (s = dynobj->sections; s != NULL; s = s->next)
724 if ((s->flags & SEC_LINKER_CREATED) == 0)
727 /* It's OK to base decisions on the section name, because none
728 of the dynobj section names depend upon the input files. */
729 name = bfd_get_section_name (dynobj, s);
733 if (strcmp (name, ".plt") == 0)
735 if (s->_raw_size == 0)
737 /* Strip this section if we don't need it; see the
743 /* Remember whether there is a PLT. */
747 else if (strncmp (name, ".rel", 4) == 0)
749 if (s->_raw_size == 0)
751 /* If we don't need this section, strip it from the
752 output file. This is mostly to handle .rel.bss and
753 .rel.plt. We must create both sections in
754 create_dynamic_sections, because they must be created
755 before the linker maps input sections to output
756 sections. The linker does that before
757 adjust_dynamic_symbol is called, and it is that
758 function which decides whether anything needs to go
759 into these sections. */
766 /* Remember whether there are any reloc sections other
768 if (strcmp (name, ".rel.plt") != 0)
772 /* If this relocation section applies to a read only
773 section, then we probably need a DT_TEXTREL
774 entry. The entries in the .rel.plt section
775 really apply to the .got section, which we
776 created ourselves and so know is not readonly. */
777 target = bfd_get_section_by_name (output_bfd, name + 4);
779 && (target->flags & SEC_READONLY) != 0)
783 /* We use the reloc_count field as a counter if we need
784 to copy relocs into the output file. */
788 else if (strncmp (name, ".got", 4) != 0)
790 /* It's not one of our sections, so don't allocate space. */
798 for (spp = &s->output_section->owner->sections;
799 *spp != s->output_section;
802 *spp = s->output_section->next;
803 --s->output_section->owner->section_count;
808 /* Allocate memory for the section contents. */
809 s->contents = (bfd_byte *) bfd_alloc (dynobj, s->_raw_size);
810 if (s->contents == NULL && s->_raw_size != 0)
814 if (elf_hash_table (info)->dynamic_sections_created)
816 /* Add some entries to the .dynamic section. We fill in the
817 values later, in elf_i386_finish_dynamic_sections, but we
818 must add the entries now so that we get the correct size for
819 the .dynamic section. The DT_DEBUG entry is filled in by the
820 dynamic linker and used by the debugger. */
823 if (! bfd_elf32_add_dynamic_entry (info, DT_DEBUG, 0))
829 if (! bfd_elf32_add_dynamic_entry (info, DT_PLTGOT, 0)
830 || ! bfd_elf32_add_dynamic_entry (info, DT_PLTRELSZ, 0)
831 || ! bfd_elf32_add_dynamic_entry (info, DT_PLTREL, DT_REL)
832 || ! bfd_elf32_add_dynamic_entry (info, DT_JMPREL, 0))
838 if (! bfd_elf32_add_dynamic_entry (info, DT_REL, 0)
839 || ! bfd_elf32_add_dynamic_entry (info, DT_RELSZ, 0)
840 || ! bfd_elf32_add_dynamic_entry (info, DT_RELENT,
841 sizeof (Elf32_External_Rel)))
847 if (! bfd_elf32_add_dynamic_entry (info, DT_TEXTREL, 0))
855 /* Relocate an i386 ELF section. */
858 elf_i386_relocate_section (output_bfd, info, input_bfd, input_section,
859 contents, relocs, local_syms, local_sections)
861 struct bfd_link_info *info;
863 asection *input_section;
865 Elf_Internal_Rela *relocs;
866 Elf_Internal_Sym *local_syms;
867 asection **local_sections;
870 Elf_Internal_Shdr *symtab_hdr;
871 struct elf_link_hash_entry **sym_hashes;
872 bfd_vma *local_got_offsets;
876 Elf_Internal_Rela *rel;
877 Elf_Internal_Rela *relend;
879 dynobj = elf_hash_table (info)->dynobj;
880 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
881 sym_hashes = elf_sym_hashes (input_bfd);
882 local_got_offsets = elf_local_got_offsets (input_bfd);
889 relend = relocs + input_section->reloc_count;
890 for (; rel < relend; rel++)
893 reloc_howto_type *howto;
894 unsigned long r_symndx;
895 struct elf_link_hash_entry *h;
896 Elf_Internal_Sym *sym;
899 bfd_reloc_status_type r;
901 r_type = ELF32_R_TYPE (rel->r_info);
903 || r_type >= (int) R_386_max
904 || (r_type >= (int) FIRST_INVALID_RELOC
905 && r_type <= (int) LAST_INVALID_RELOC))
907 bfd_set_error (bfd_error_bad_value);
910 howto = elf_howto_table + r_type;
912 r_symndx = ELF32_R_SYM (rel->r_info);
914 if (info->relocateable)
916 /* This is a relocateable link. We don't have to change
917 anything, unless the reloc is against a section symbol,
918 in which case we have to adjust according to where the
919 section symbol winds up in the output section. */
920 if (r_symndx < symtab_hdr->sh_info)
922 sym = local_syms + r_symndx;
923 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
927 sec = local_sections[r_symndx];
928 val = bfd_get_32 (input_bfd, contents + rel->r_offset);
929 val += sec->output_offset + sym->st_value;
930 bfd_put_32 (input_bfd, val, contents + rel->r_offset);
937 /* This is a final link. */
941 if (r_symndx < symtab_hdr->sh_info)
943 sym = local_syms + r_symndx;
944 sec = local_sections[r_symndx];
945 relocation = (sec->output_section->vma
951 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
952 while (h->root.type == bfd_link_hash_indirect
953 || h->root.type == bfd_link_hash_warning)
954 h = (struct elf_link_hash_entry *) h->root.u.i.link;
955 if (h->root.type == bfd_link_hash_defined
956 || h->root.type == bfd_link_hash_defweak)
958 sec = h->root.u.def.section;
959 if (r_type == R_386_GOTPC
960 || (r_type == R_386_PLT32
961 && h->plt_offset != (bfd_vma) -1)
962 || (r_type == R_386_GOT32
963 && elf_hash_table (info)->dynamic_sections_created
966 || (h->elf_link_hash_flags
967 & ELF_LINK_HASH_DEF_REGULAR) == 0))
970 || (h->elf_link_hash_flags
971 & ELF_LINK_HASH_DEF_REGULAR) == 0)
972 && (r_type == R_386_32
973 || r_type == R_386_PC32)))
975 /* In these cases, we don't need the relocation
976 value. We check specially because in some
977 obscure cases sec->output_section will be NULL. */
980 else if (sec->output_section == NULL)
982 (*_bfd_error_handler)
983 ("%s: warning: unresolvable relocation against symbol `%s' from %s section",
984 bfd_get_filename (input_bfd), h->root.root.string,
985 bfd_get_section_name (input_bfd, input_section));
989 relocation = (h->root.u.def.value
990 + sec->output_section->vma
991 + sec->output_offset);
993 else if (h->root.type == bfd_link_hash_undefweak)
995 else if (info->shared && !info->symbolic)
999 if (! ((*info->callbacks->undefined_symbol)
1000 (info, h->root.root.string, input_bfd,
1001 input_section, rel->r_offset)))
1010 /* Relocation is to the entry for this symbol in the global
1014 sgot = bfd_get_section_by_name (dynobj, ".got");
1015 BFD_ASSERT (sgot != NULL);
1022 off = h->got_offset;
1023 BFD_ASSERT (off != (bfd_vma) -1);
1025 if (! elf_hash_table (info)->dynamic_sections_created
1028 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
1030 /* This is actually a static link, or it is a
1031 -Bsymbolic link and the symbol is defined
1032 locally. We must initialize this entry in the
1033 global offset table. Since the offset must
1034 always be a multiple of 4, we use the least
1035 significant bit to record whether we have
1036 initialized it already.
1038 When doing a dynamic link, we create a .rel.got
1039 relocation entry to initialize the value. This
1040 is done in the finish_dynamic_symbol routine. */
1045 bfd_put_32 (output_bfd, relocation,
1046 sgot->contents + off);
1051 relocation = sgot->output_offset + off;
1057 BFD_ASSERT (local_got_offsets != NULL
1058 && local_got_offsets[r_symndx] != (bfd_vma) -1);
1060 off = local_got_offsets[r_symndx];
1062 /* The offset must always be a multiple of 4. We use
1063 the least significant bit to record whether we have
1064 already generated the necessary reloc. */
1069 bfd_put_32 (output_bfd, relocation, sgot->contents + off);
1074 Elf_Internal_Rel outrel;
1076 srelgot = bfd_get_section_by_name (dynobj, ".rel.got");
1077 BFD_ASSERT (srelgot != NULL);
1079 outrel.r_offset = (sgot->output_section->vma
1080 + sgot->output_offset
1082 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
1083 bfd_elf32_swap_reloc_out (output_bfd, &outrel,
1084 (((Elf32_External_Rel *)
1086 + srelgot->reloc_count));
1087 ++srelgot->reloc_count;
1090 local_got_offsets[r_symndx] |= 1;
1093 relocation = sgot->output_offset + off;
1099 /* Relocation is relative to the start of the global offset
1104 sgot = bfd_get_section_by_name (dynobj, ".got");
1105 BFD_ASSERT (sgot != NULL);
1108 /* Note that sgot->output_offset is not involved in this
1109 calculation. We always want the start of .got. If we
1110 defined _GLOBAL_OFFSET_TABLE in a different way, as is
1111 permitted by the ABI, we might have to change this
1113 relocation -= sgot->output_section->vma;
1118 /* Use global offset table as symbol value. */
1122 sgot = bfd_get_section_by_name (dynobj, ".got");
1123 BFD_ASSERT (sgot != NULL);
1126 relocation = sgot->output_section->vma;
1131 /* Relocation is to the entry for this symbol in the
1132 procedure linkage table. */
1134 /* Resolve a PLT32 reloc again a local symbol directly,
1135 without using the procedure linkage table. */
1139 if (h->plt_offset == (bfd_vma) -1)
1141 /* We didn't make a PLT entry for this symbol. This
1142 happens when statically linking PIC code, or when
1143 using -Bsymbolic. */
1149 splt = bfd_get_section_by_name (dynobj, ".plt");
1150 BFD_ASSERT (splt != NULL);
1153 relocation = (splt->output_section->vma
1154 + splt->output_offset
1162 && (r_type != R_386_PC32
1164 && (! info->symbolic
1165 || (h->elf_link_hash_flags
1166 & ELF_LINK_HASH_DEF_REGULAR) == 0))))
1168 Elf_Internal_Rel outrel;
1171 /* When generating a shared object, these relocations
1172 are copied into the output file to be resolved at run
1179 name = (bfd_elf_string_from_elf_section
1181 elf_elfheader (input_bfd)->e_shstrndx,
1182 elf_section_data (input_section)->rel_hdr.sh_name));
1186 BFD_ASSERT (strncmp (name, ".rel", 4) == 0
1187 && strcmp (bfd_get_section_name (input_bfd,
1191 sreloc = bfd_get_section_by_name (dynobj, name);
1192 BFD_ASSERT (sreloc != NULL);
1195 outrel.r_offset = (rel->r_offset
1196 + input_section->output_section->vma
1197 + input_section->output_offset);
1198 if (r_type == R_386_PC32)
1200 BFD_ASSERT (h != NULL && h->dynindx != -1);
1202 outrel.r_info = ELF32_R_INFO (h->dynindx, R_386_PC32);
1208 && (h->elf_link_hash_flags
1209 & ELF_LINK_HASH_DEF_REGULAR) != 0))
1212 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
1216 BFD_ASSERT (h->dynindx != -1);
1218 outrel.r_info = ELF32_R_INFO (h->dynindx, R_386_32);
1222 bfd_elf32_swap_reloc_out (output_bfd, &outrel,
1223 (((Elf32_External_Rel *)
1225 + sreloc->reloc_count));
1226 ++sreloc->reloc_count;
1228 /* If this reloc is against an external symbol, we do
1229 not want to fiddle with the addend. Otherwise, we
1230 need to include the symbol value so that it becomes
1231 an addend for the dynamic reloc. */
1242 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1243 contents, rel->r_offset,
1244 relocation, (bfd_vma) 0);
1246 if (r != bfd_reloc_ok)
1251 case bfd_reloc_outofrange:
1253 case bfd_reloc_overflow:
1258 name = h->root.root.string;
1261 name = bfd_elf_string_from_elf_section (input_bfd,
1262 symtab_hdr->sh_link,
1267 name = bfd_section_name (input_bfd, sec);
1269 if (! ((*info->callbacks->reloc_overflow)
1270 (info, name, howto->name, (bfd_vma) 0,
1271 input_bfd, input_section, rel->r_offset)))
1282 /* Finish up dynamic symbol handling. We set the contents of various
1283 dynamic sections here. */
1286 elf_i386_finish_dynamic_symbol (output_bfd, info, h, sym)
1288 struct bfd_link_info *info;
1289 struct elf_link_hash_entry *h;
1290 Elf_Internal_Sym *sym;
1294 dynobj = elf_hash_table (info)->dynobj;
1296 if (h->plt_offset != (bfd_vma) -1)
1303 Elf_Internal_Rel rel;
1305 /* This symbol has an entry in the procedure linkage table. Set
1308 BFD_ASSERT (h->dynindx != -1);
1310 splt = bfd_get_section_by_name (dynobj, ".plt");
1311 sgot = bfd_get_section_by_name (dynobj, ".got.plt");
1312 srel = bfd_get_section_by_name (dynobj, ".rel.plt");
1313 BFD_ASSERT (splt != NULL && sgot != NULL && srel != NULL);
1315 /* Get the index in the procedure linkage table which
1316 corresponds to this symbol. This is the index of this symbol
1317 in all the symbols for which we are making plt entries. The
1318 first entry in the procedure linkage table is reserved. */
1319 plt_index = h->plt_offset / PLT_ENTRY_SIZE - 1;
1321 /* Get the offset into the .got table of the entry that
1322 corresponds to this function. Each .got entry is 4 bytes.
1323 The first three are reserved. */
1324 got_offset = (plt_index + 3) * 4;
1326 /* Fill in the entry in the procedure linkage table. */
1329 memcpy (splt->contents + h->plt_offset, elf_i386_plt_entry,
1331 bfd_put_32 (output_bfd,
1332 (sgot->output_section->vma
1333 + sgot->output_offset
1335 splt->contents + h->plt_offset + 2);
1339 memcpy (splt->contents + h->plt_offset, elf_i386_pic_plt_entry,
1341 bfd_put_32 (output_bfd, got_offset,
1342 splt->contents + h->plt_offset + 2);
1345 bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rel),
1346 splt->contents + h->plt_offset + 7);
1347 bfd_put_32 (output_bfd, - (h->plt_offset + PLT_ENTRY_SIZE),
1348 splt->contents + h->plt_offset + 12);
1350 /* Fill in the entry in the global offset table. */
1351 bfd_put_32 (output_bfd,
1352 (splt->output_section->vma
1353 + splt->output_offset
1356 sgot->contents + got_offset);
1358 /* Fill in the entry in the .rel.plt section. */
1359 rel.r_offset = (sgot->output_section->vma
1360 + sgot->output_offset
1362 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_JUMP_SLOT);
1363 bfd_elf32_swap_reloc_out (output_bfd, &rel,
1364 ((Elf32_External_Rel *) srel->contents
1367 if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1369 /* Mark the symbol as undefined, rather than as defined in
1370 the .plt section. Leave the value alone. */
1371 sym->st_shndx = SHN_UNDEF;
1375 if (h->got_offset != (bfd_vma) -1)
1379 Elf_Internal_Rel rel;
1381 /* This symbol has an entry in the global offset table. Set it
1384 BFD_ASSERT (h->dynindx != -1);
1386 sgot = bfd_get_section_by_name (dynobj, ".got");
1387 srel = bfd_get_section_by_name (dynobj, ".rel.got");
1388 BFD_ASSERT (sgot != NULL && srel != NULL);
1390 rel.r_offset = (sgot->output_section->vma
1391 + sgot->output_offset
1392 + (h->got_offset &~ 1));
1394 /* If this is a -Bsymbolic link, and the symbol is defined
1395 locally, we just want to emit a RELATIVE reloc. The entry in
1396 the global offset table will already have been initialized in
1397 the relocate_section function. */
1400 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
1401 rel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
1404 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got_offset);
1405 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_GLOB_DAT);
1408 bfd_elf32_swap_reloc_out (output_bfd, &rel,
1409 ((Elf32_External_Rel *) srel->contents
1410 + srel->reloc_count));
1411 ++srel->reloc_count;
1414 if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
1417 Elf_Internal_Rel rel;
1419 /* This symbol needs a copy reloc. Set it up. */
1421 BFD_ASSERT (h->dynindx != -1
1422 && (h->root.type == bfd_link_hash_defined
1423 || h->root.type == bfd_link_hash_defweak));
1425 s = bfd_get_section_by_name (h->root.u.def.section->owner,
1427 BFD_ASSERT (s != NULL);
1429 rel.r_offset = (h->root.u.def.value
1430 + h->root.u.def.section->output_section->vma
1431 + h->root.u.def.section->output_offset);
1432 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_COPY);
1433 bfd_elf32_swap_reloc_out (output_bfd, &rel,
1434 ((Elf32_External_Rel *) s->contents
1439 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
1440 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
1441 || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
1442 sym->st_shndx = SHN_ABS;
1447 /* Finish up the dynamic sections. */
1450 elf_i386_finish_dynamic_sections (output_bfd, info)
1452 struct bfd_link_info *info;
1458 dynobj = elf_hash_table (info)->dynobj;
1460 sgot = bfd_get_section_by_name (dynobj, ".got.plt");
1461 BFD_ASSERT (sgot != NULL);
1462 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
1464 if (elf_hash_table (info)->dynamic_sections_created)
1467 Elf32_External_Dyn *dyncon, *dynconend;
1469 splt = bfd_get_section_by_name (dynobj, ".plt");
1470 BFD_ASSERT (splt != NULL && sdyn != NULL);
1472 dyncon = (Elf32_External_Dyn *) sdyn->contents;
1473 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
1474 for (; dyncon < dynconend; dyncon++)
1476 Elf_Internal_Dyn dyn;
1480 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
1493 s = bfd_get_section_by_name (output_bfd, name);
1494 BFD_ASSERT (s != NULL);
1495 dyn.d_un.d_ptr = s->vma;
1496 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
1500 s = bfd_get_section_by_name (output_bfd, ".rel.plt");
1501 BFD_ASSERT (s != NULL);
1502 if (s->_cooked_size != 0)
1503 dyn.d_un.d_val = s->_cooked_size;
1505 dyn.d_un.d_val = s->_raw_size;
1506 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
1510 /* My reading of the SVR4 ABI indicates that the
1511 procedure linkage table relocs (DT_JMPREL) should be
1512 included in the overall relocs (DT_REL). This is
1513 what Solaris does. However, UnixWare can not handle
1514 that case. Therefore, we override the DT_RELSZ entry
1515 here to make it not include the JMPREL relocs. Since
1516 the linker script arranges for .rel.plt to follow all
1517 other relocation sections, we don't have to worry
1518 about changing the DT_REL entry. */
1519 s = bfd_get_section_by_name (output_bfd, ".rel.plt");
1522 if (s->_cooked_size != 0)
1523 dyn.d_un.d_val -= s->_cooked_size;
1525 dyn.d_un.d_val -= s->_raw_size;
1527 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
1532 /* Fill in the first entry in the procedure linkage table. */
1533 if (splt->_raw_size > 0)
1536 memcpy (splt->contents, elf_i386_pic_plt0_entry, PLT_ENTRY_SIZE);
1539 memcpy (splt->contents, elf_i386_plt0_entry, PLT_ENTRY_SIZE);
1540 bfd_put_32 (output_bfd,
1541 sgot->output_section->vma + sgot->output_offset + 4,
1542 splt->contents + 2);
1543 bfd_put_32 (output_bfd,
1544 sgot->output_section->vma + sgot->output_offset + 8,
1545 splt->contents + 8);
1549 /* UnixWare sets the entsize of .plt to 4, although that doesn't
1550 really seem like the right value. */
1551 elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
1554 /* Fill in the first three entries in the global offset table. */
1555 if (sgot->_raw_size > 0)
1558 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
1560 bfd_put_32 (output_bfd,
1561 sdyn->output_section->vma + sdyn->output_offset,
1563 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
1564 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
1567 elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
1572 #define TARGET_LITTLE_SYM bfd_elf32_i386_vec
1573 #define TARGET_LITTLE_NAME "elf32-i386"
1574 #define ELF_ARCH bfd_arch_i386
1575 #define ELF_MACHINE_CODE EM_386
1576 #define elf_info_to_howto elf_i386_info_to_howto
1577 #define elf_info_to_howto_rel elf_i386_info_to_howto_rel
1578 #define bfd_elf32_bfd_reloc_type_lookup elf_i386_reloc_type_lookup
1579 #define ELF_MAXPAGESIZE 0x1000
1580 #define elf_backend_create_dynamic_sections \
1581 _bfd_elf_create_dynamic_sections
1582 #define elf_backend_check_relocs elf_i386_check_relocs
1583 #define elf_backend_adjust_dynamic_symbol \
1584 elf_i386_adjust_dynamic_symbol
1585 #define elf_backend_size_dynamic_sections \
1586 elf_i386_size_dynamic_sections
1587 #define elf_backend_relocate_section elf_i386_relocate_section
1588 #define elf_backend_finish_dynamic_symbol \
1589 elf_i386_finish_dynamic_symbol
1590 #define elf_backend_finish_dynamic_sections \
1591 elf_i386_finish_dynamic_sections
1592 #define elf_backend_want_got_plt 1
1593 #define elf_backend_plt_readonly 1
1594 #define elf_backend_want_plt_sym 0
1596 #include "elf32-target.h"