1 /* Intel 80386/80486-specific support for 32-bit ELF
2 Copyright 1993, 94-98, 1999 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_is_local_label_name
PARAMS ((bfd
*, const char *));
33 static struct bfd_hash_entry
*elf_i386_link_hash_newfunc
34 PARAMS ((struct bfd_hash_entry
*, struct bfd_hash_table
*, const char *));
35 static struct bfd_link_hash_table
*elf_i386_link_hash_table_create
37 static boolean elf_i386_check_relocs
38 PARAMS ((bfd
*, struct bfd_link_info
*, asection
*,
39 const Elf_Internal_Rela
*));
40 static boolean elf_i386_adjust_dynamic_symbol
41 PARAMS ((struct bfd_link_info
*, struct elf_link_hash_entry
*));
42 static boolean elf_i386_size_dynamic_sections
43 PARAMS ((bfd
*, struct bfd_link_info
*));
44 static boolean elf_i386_relocate_section
45 PARAMS ((bfd
*, struct bfd_link_info
*, bfd
*, asection
*, bfd_byte
*,
46 Elf_Internal_Rela
*, Elf_Internal_Sym
*, asection
**));
47 static boolean elf_i386_finish_dynamic_symbol
48 PARAMS ((bfd
*, struct bfd_link_info
*, struct elf_link_hash_entry
*,
50 static boolean elf_i386_finish_dynamic_sections
51 PARAMS ((bfd
*, struct bfd_link_info
*));
53 #define USE_REL 1 /* 386 uses REL relocations instead of RELA */
57 static reloc_howto_type elf_howto_table
[]=
59 HOWTO(R_386_NONE
, 0,0, 0,false,0,complain_overflow_bitfield
, bfd_elf_generic_reloc
,"R_386_NONE", true,0x00000000,0x00000000,false),
60 HOWTO(R_386_32
, 0,2,32,false,0,complain_overflow_bitfield
, bfd_elf_generic_reloc
,"R_386_32", true,0xffffffff,0xffffffff,false),
61 HOWTO(R_386_PC32
, 0,2,32,true, 0,complain_overflow_bitfield
, bfd_elf_generic_reloc
,"R_386_PC32", true,0xffffffff,0xffffffff,true),
62 HOWTO(R_386_GOT32
, 0,2,32,false,0,complain_overflow_bitfield
, bfd_elf_generic_reloc
,"R_386_GOT32", true,0xffffffff,0xffffffff,false),
63 HOWTO(R_386_PLT32
, 0,2,32,true,0,complain_overflow_bitfield
, bfd_elf_generic_reloc
,"R_386_PLT32", true,0xffffffff,0xffffffff,true),
64 HOWTO(R_386_COPY
, 0,2,32,false,0,complain_overflow_bitfield
, bfd_elf_generic_reloc
,"R_386_COPY", true,0xffffffff,0xffffffff,false),
65 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),
66 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),
67 HOWTO(R_386_RELATIVE
, 0,2,32,false,0,complain_overflow_bitfield
, bfd_elf_generic_reloc
,"R_386_RELATIVE", true,0xffffffff,0xffffffff,false),
68 HOWTO(R_386_GOTOFF
, 0,2,32,false,0,complain_overflow_bitfield
, bfd_elf_generic_reloc
,"R_386_GOTOFF", true,0xffffffff,0xffffffff,false),
69 HOWTO(R_386_GOTPC
, 0,2,32,true,0,complain_overflow_bitfield
, bfd_elf_generic_reloc
,"R_386_GOTPC", true,0xffffffff,0xffffffff,true),
79 /* The remaining relocs are a GNU extension. */
80 HOWTO(R_386_16
, 0,1,16,false,0,complain_overflow_bitfield
, bfd_elf_generic_reloc
,"R_386_16", true,0xffff,0xffff,false),
81 HOWTO(R_386_PC16
, 0,1,16,true, 0,complain_overflow_bitfield
, bfd_elf_generic_reloc
,"R_386_PC16", true,0xffff,0xffff,true),
82 HOWTO(R_386_8
, 0,0,8,false,0,complain_overflow_bitfield
, bfd_elf_generic_reloc
,"R_386_8", true,0xff,0xff,false),
83 HOWTO(R_386_PC8
, 0,0,8,true, 0,complain_overflow_signed
, bfd_elf_generic_reloc
,"R_386_PC8", true,0xff,0xff,true),
86 /* GNU extension to record C++ vtable hierarchy. */
87 static reloc_howto_type elf32_i386_vtinherit_howto
=
88 HOWTO (R_386_GNU_VTINHERIT
, /* type */
90 2, /* size (0 = byte, 1 = short, 2 = long) */
92 false, /* pc_relative */
94 complain_overflow_dont
, /* complain_on_overflow */
95 NULL
, /* special_function */
96 "R_386_GNU_VTINHERIT", /* name */
97 false, /* partial_inplace */
102 /* GNU extension to record C++ vtable member usage. */
103 static reloc_howto_type elf32_i386_vtentry_howto
=
104 HOWTO (R_386_GNU_VTENTRY
, /* type */
106 2, /* size (0 = byte, 1 = short, 2 = long) */
108 false, /* pc_relative */
110 complain_overflow_dont
, /* complain_on_overflow */
111 _bfd_elf_rel_vtable_reloc_fn
, /* special_function */
112 "R_386_GNU_VTENTRY", /* name */
113 false, /* partial_inplace */
118 #ifdef DEBUG_GEN_RELOC
119 #define TRACE(str) fprintf (stderr, "i386 bfd reloc lookup %d (%s)\n", code, str)
124 static reloc_howto_type
*
125 elf_i386_reloc_type_lookup (abfd
, code
)
126 bfd
*abfd ATTRIBUTE_UNUSED
;
127 bfd_reloc_code_real_type code
;
132 TRACE ("BFD_RELOC_NONE");
133 return &elf_howto_table
[ (int)R_386_NONE
];
136 TRACE ("BFD_RELOC_32");
137 return &elf_howto_table
[ (int)R_386_32
];
140 TRACE ("BFD_RELOC_CTOR");
141 return &elf_howto_table
[ (int)R_386_32
];
143 case BFD_RELOC_32_PCREL
:
144 TRACE ("BFD_RELOC_PC32");
145 return &elf_howto_table
[ (int)R_386_PC32
];
147 case BFD_RELOC_386_GOT32
:
148 TRACE ("BFD_RELOC_386_GOT32");
149 return &elf_howto_table
[ (int)R_386_GOT32
];
151 case BFD_RELOC_386_PLT32
:
152 TRACE ("BFD_RELOC_386_PLT32");
153 return &elf_howto_table
[ (int)R_386_PLT32
];
155 case BFD_RELOC_386_COPY
:
156 TRACE ("BFD_RELOC_386_COPY");
157 return &elf_howto_table
[ (int)R_386_COPY
];
159 case BFD_RELOC_386_GLOB_DAT
:
160 TRACE ("BFD_RELOC_386_GLOB_DAT");
161 return &elf_howto_table
[ (int)R_386_GLOB_DAT
];
163 case BFD_RELOC_386_JUMP_SLOT
:
164 TRACE ("BFD_RELOC_386_JUMP_SLOT");
165 return &elf_howto_table
[ (int)R_386_JUMP_SLOT
];
167 case BFD_RELOC_386_RELATIVE
:
168 TRACE ("BFD_RELOC_386_RELATIVE");
169 return &elf_howto_table
[ (int)R_386_RELATIVE
];
171 case BFD_RELOC_386_GOTOFF
:
172 TRACE ("BFD_RELOC_386_GOTOFF");
173 return &elf_howto_table
[ (int)R_386_GOTOFF
];
175 case BFD_RELOC_386_GOTPC
:
176 TRACE ("BFD_RELOC_386_GOTPC");
177 return &elf_howto_table
[ (int)R_386_GOTPC
];
179 /* The remaining relocs are a GNU extension. */
181 TRACE ("BFD_RELOC_16");
182 return &elf_howto_table
[(int) R_386_16
];
184 case BFD_RELOC_16_PCREL
:
185 TRACE ("BFD_RELOC_16_PCREL");
186 return &elf_howto_table
[(int) R_386_PC16
];
189 TRACE ("BFD_RELOC_8");
190 return &elf_howto_table
[(int) R_386_8
];
192 case BFD_RELOC_8_PCREL
:
193 TRACE ("BFD_RELOC_8_PCREL");
194 return &elf_howto_table
[(int) R_386_PC8
];
196 case BFD_RELOC_VTABLE_INHERIT
:
197 TRACE ("BFD_RELOC_VTABLE_INHERIT");
198 return &elf32_i386_vtinherit_howto
;
200 case BFD_RELOC_VTABLE_ENTRY
:
201 TRACE ("BFD_RELOC_VTABLE_ENTRY");
202 return &elf32_i386_vtentry_howto
;
213 elf_i386_info_to_howto (abfd
, cache_ptr
, dst
)
214 bfd
*abfd ATTRIBUTE_UNUSED
;
215 arelent
*cache_ptr ATTRIBUTE_UNUSED
;
216 Elf32_Internal_Rela
*dst ATTRIBUTE_UNUSED
;
222 elf_i386_info_to_howto_rel (abfd
, cache_ptr
, dst
)
223 bfd
*abfd ATTRIBUTE_UNUSED
;
225 Elf32_Internal_Rel
*dst
;
227 enum elf_i386_reloc_type type
;
229 type
= (enum elf_i386_reloc_type
) ELF32_R_TYPE (dst
->r_info
);
230 if (type
== R_386_GNU_VTINHERIT
)
231 cache_ptr
->howto
= &elf32_i386_vtinherit_howto
;
232 else if (type
== R_386_GNU_VTENTRY
)
233 cache_ptr
->howto
= &elf32_i386_vtentry_howto
;
236 BFD_ASSERT (type
< R_386_max
);
237 BFD_ASSERT (type
< FIRST_INVALID_RELOC
|| type
> LAST_INVALID_RELOC
);
238 cache_ptr
->howto
= &elf_howto_table
[(int) type
];
242 /* Return whether a symbol name implies a local label. The UnixWare
243 2.1 cc generates temporary symbols that start with .X, so we
244 recognize them here. FIXME: do other SVR4 compilers also use .X?.
245 If so, we should move the .X recognition into
246 _bfd_elf_is_local_label_name. */
249 elf_i386_is_local_label_name (abfd
, name
)
253 if (name
[0] == '.' && name
[1] == 'X')
256 return _bfd_elf_is_local_label_name (abfd
, name
);
259 /* Functions for the i386 ELF linker. */
261 /* The name of the dynamic interpreter. This is put in the .interp
264 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1"
266 /* The size in bytes of an entry in the procedure linkage table. */
268 #define PLT_ENTRY_SIZE 16
270 /* The first entry in an absolute procedure linkage table looks like
271 this. See the SVR4 ABI i386 supplement to see how this works. */
273 static const bfd_byte elf_i386_plt0_entry
[PLT_ENTRY_SIZE
] =
275 0xff, 0x35, /* pushl contents of address */
276 0, 0, 0, 0, /* replaced with address of .got + 4. */
277 0xff, 0x25, /* jmp indirect */
278 0, 0, 0, 0, /* replaced with address of .got + 8. */
279 0, 0, 0, 0 /* pad out to 16 bytes. */
282 /* Subsequent entries in an absolute procedure linkage table look like
285 static const bfd_byte elf_i386_plt_entry
[PLT_ENTRY_SIZE
] =
287 0xff, 0x25, /* jmp indirect */
288 0, 0, 0, 0, /* replaced with address of this symbol in .got. */
289 0x68, /* pushl immediate */
290 0, 0, 0, 0, /* replaced with offset into relocation table. */
291 0xe9, /* jmp relative */
292 0, 0, 0, 0 /* replaced with offset to start of .plt. */
295 /* The first entry in a PIC procedure linkage table look like this. */
297 static const bfd_byte elf_i386_pic_plt0_entry
[PLT_ENTRY_SIZE
] =
299 0xff, 0xb3, 4, 0, 0, 0, /* pushl 4(%ebx) */
300 0xff, 0xa3, 8, 0, 0, 0, /* jmp *8(%ebx) */
301 0, 0, 0, 0 /* pad out to 16 bytes. */
304 /* Subsequent entries in a PIC procedure linkage table look like this. */
306 static const bfd_byte elf_i386_pic_plt_entry
[PLT_ENTRY_SIZE
] =
308 0xff, 0xa3, /* jmp *offset(%ebx) */
309 0, 0, 0, 0, /* replaced with offset of this symbol in .got. */
310 0x68, /* pushl immediate */
311 0, 0, 0, 0, /* replaced with offset into relocation table. */
312 0xe9, /* jmp relative */
313 0, 0, 0, 0 /* replaced with offset to start of .plt. */
316 /* The i386 linker needs to keep track of the number of relocs that it
317 decides to copy in check_relocs for each symbol. This is so that
318 it can discard PC relative relocs if it doesn't need them when
319 linking with -Bsymbolic. We store the information in a field
320 extending the regular ELF linker hash table. */
322 /* This structure keeps track of the number of PC relative relocs we
323 have copied for a given symbol. */
325 struct elf_i386_pcrel_relocs_copied
328 struct elf_i386_pcrel_relocs_copied
*next
;
329 /* A section in dynobj. */
331 /* Number of relocs copied in this section. */
335 /* i386 ELF linker hash entry. */
337 struct elf_i386_link_hash_entry
339 struct elf_link_hash_entry root
;
341 /* Number of PC relative relocs copied for this symbol. */
342 struct elf_i386_pcrel_relocs_copied
*pcrel_relocs_copied
;
345 /* i386 ELF linker hash table. */
347 struct elf_i386_link_hash_table
349 struct elf_link_hash_table root
;
352 /* Declare this now that the above structures are defined. */
354 static boolean elf_i386_discard_copies
355 PARAMS ((struct elf_i386_link_hash_entry
*, PTR
));
357 /* Traverse an i386 ELF linker hash table. */
359 #define elf_i386_link_hash_traverse(table, func, info) \
360 (elf_link_hash_traverse \
362 (boolean (*) PARAMS ((struct elf_link_hash_entry *, PTR))) (func), \
365 /* Get the i386 ELF linker hash table from a link_info structure. */
367 #define elf_i386_hash_table(p) \
368 ((struct elf_i386_link_hash_table *) ((p)->hash))
370 /* Create an entry in an i386 ELF linker hash table. */
372 static struct bfd_hash_entry
*
373 elf_i386_link_hash_newfunc (entry
, table
, string
)
374 struct bfd_hash_entry
*entry
;
375 struct bfd_hash_table
*table
;
378 struct elf_i386_link_hash_entry
*ret
=
379 (struct elf_i386_link_hash_entry
*) entry
;
381 /* Allocate the structure if it has not already been allocated by a
383 if (ret
== (struct elf_i386_link_hash_entry
*) NULL
)
384 ret
= ((struct elf_i386_link_hash_entry
*)
385 bfd_hash_allocate (table
,
386 sizeof (struct elf_i386_link_hash_entry
)));
387 if (ret
== (struct elf_i386_link_hash_entry
*) NULL
)
388 return (struct bfd_hash_entry
*) ret
;
390 /* Call the allocation method of the superclass. */
391 ret
= ((struct elf_i386_link_hash_entry
*)
392 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry
*) ret
,
394 if (ret
!= (struct elf_i386_link_hash_entry
*) NULL
)
396 ret
->pcrel_relocs_copied
= NULL
;
399 return (struct bfd_hash_entry
*) ret
;
402 /* Create an i386 ELF linker hash table. */
404 static struct bfd_link_hash_table
*
405 elf_i386_link_hash_table_create (abfd
)
408 struct elf_i386_link_hash_table
*ret
;
410 ret
= ((struct elf_i386_link_hash_table
*)
411 bfd_alloc (abfd
, sizeof (struct elf_i386_link_hash_table
)));
412 if (ret
== (struct elf_i386_link_hash_table
*) NULL
)
415 if (! _bfd_elf_link_hash_table_init (&ret
->root
, abfd
,
416 elf_i386_link_hash_newfunc
))
418 bfd_release (abfd
, ret
);
422 return &ret
->root
.root
;
425 /* Look through the relocs for a section during the first phase, and
426 allocate space in the global offset table or procedure linkage
430 elf_i386_check_relocs (abfd
, info
, sec
, relocs
)
432 struct bfd_link_info
*info
;
434 const Elf_Internal_Rela
*relocs
;
437 Elf_Internal_Shdr
*symtab_hdr
;
438 struct elf_link_hash_entry
**sym_hashes
;
439 bfd_vma
*local_got_offsets
;
440 const Elf_Internal_Rela
*rel
;
441 const Elf_Internal_Rela
*rel_end
;
446 if (info
->relocateable
)
449 dynobj
= elf_hash_table (info
)->dynobj
;
450 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
451 sym_hashes
= elf_sym_hashes (abfd
);
452 local_got_offsets
= elf_local_got_offsets (abfd
);
458 rel_end
= relocs
+ sec
->reloc_count
;
459 for (rel
= relocs
; rel
< rel_end
; rel
++)
461 unsigned long r_symndx
;
462 struct elf_link_hash_entry
*h
;
464 r_symndx
= ELF32_R_SYM (rel
->r_info
);
466 if (r_symndx
< symtab_hdr
->sh_info
)
469 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
471 /* Some relocs require a global offset table. */
474 switch (ELF32_R_TYPE (rel
->r_info
))
479 elf_hash_table (info
)->dynobj
= dynobj
= abfd
;
480 if (! _bfd_elf_create_got_section (dynobj
, info
))
489 switch (ELF32_R_TYPE (rel
->r_info
))
492 /* This symbol requires a global offset table entry. */
496 sgot
= bfd_get_section_by_name (dynobj
, ".got");
497 BFD_ASSERT (sgot
!= NULL
);
501 && (h
!= NULL
|| info
->shared
))
503 srelgot
= bfd_get_section_by_name (dynobj
, ".rel.got");
506 srelgot
= bfd_make_section (dynobj
, ".rel.got");
508 || ! bfd_set_section_flags (dynobj
, srelgot
,
515 || ! bfd_set_section_alignment (dynobj
, srelgot
, 2))
522 if (h
->got
.offset
!= (bfd_vma
) -1)
524 /* We have already allocated space in the .got. */
527 h
->got
.offset
= sgot
->_raw_size
;
529 /* Make sure this symbol is output as a dynamic symbol. */
530 if (h
->dynindx
== -1)
532 if (! bfd_elf32_link_record_dynamic_symbol (info
, h
))
536 srelgot
->_raw_size
+= sizeof (Elf32_External_Rel
);
540 /* This is a global offset table entry for a local
542 if (local_got_offsets
== NULL
)
545 register unsigned int i
;
547 size
= symtab_hdr
->sh_info
* sizeof (bfd_vma
);
548 local_got_offsets
= (bfd_vma
*) bfd_alloc (abfd
, size
);
549 if (local_got_offsets
== NULL
)
551 elf_local_got_offsets (abfd
) = local_got_offsets
;
552 for (i
= 0; i
< symtab_hdr
->sh_info
; i
++)
553 local_got_offsets
[i
] = (bfd_vma
) -1;
555 if (local_got_offsets
[r_symndx
] != (bfd_vma
) -1)
557 /* We have already allocated space in the .got. */
560 local_got_offsets
[r_symndx
] = sgot
->_raw_size
;
564 /* If we are generating a shared object, we need to
565 output a R_386_RELATIVE reloc so that the dynamic
566 linker can adjust this GOT entry. */
567 srelgot
->_raw_size
+= sizeof (Elf32_External_Rel
);
571 sgot
->_raw_size
+= 4;
576 /* This symbol requires a procedure linkage table entry. We
577 actually build the entry in adjust_dynamic_symbol,
578 because this might be a case of linking PIC code which is
579 never referenced by a dynamic object, in which case we
580 don't need to generate a procedure linkage table entry
583 /* If this is a local symbol, we resolve it directly without
584 creating a procedure linkage table entry. */
588 h
->elf_link_hash_flags
|= ELF_LINK_HASH_NEEDS_PLT
;
594 /* If we are creating a shared library, and this is a reloc
595 against a global symbol, or a non PC relative reloc
596 against a local symbol, then we need to copy the reloc
597 into the shared library. However, if we are linking with
598 -Bsymbolic, we do not need to copy a reloc against a
599 global symbol which is defined in an object we are
600 including in the link (i.e., DEF_REGULAR is set). At
601 this point we have not seen all the input files, so it is
602 possible that DEF_REGULAR is not set now but will be set
603 later (it is never cleared). We account for that
604 possibility below by storing information in the
605 pcrel_relocs_copied field of the hash table entry. */
607 && (sec
->flags
& SEC_ALLOC
) != 0
608 && (ELF32_R_TYPE (rel
->r_info
) != R_386_PC32
611 || (h
->elf_link_hash_flags
612 & ELF_LINK_HASH_DEF_REGULAR
) == 0))))
614 /* When creating a shared object, we must copy these
615 reloc types into the output file. We create a reloc
616 section in dynobj and make room for this reloc. */
621 name
= (bfd_elf_string_from_elf_section
623 elf_elfheader (abfd
)->e_shstrndx
,
624 elf_section_data (sec
)->rel_hdr
.sh_name
));
628 BFD_ASSERT (strncmp (name
, ".rel", 4) == 0
629 && strcmp (bfd_get_section_name (abfd
, sec
),
632 sreloc
= bfd_get_section_by_name (dynobj
, name
);
637 sreloc
= bfd_make_section (dynobj
, name
);
638 flags
= (SEC_HAS_CONTENTS
| SEC_READONLY
639 | SEC_IN_MEMORY
| SEC_LINKER_CREATED
);
640 if ((sec
->flags
& SEC_ALLOC
) != 0)
641 flags
|= SEC_ALLOC
| SEC_LOAD
;
643 || ! bfd_set_section_flags (dynobj
, sreloc
, flags
)
644 || ! bfd_set_section_alignment (dynobj
, sreloc
, 2))
649 sreloc
->_raw_size
+= sizeof (Elf32_External_Rel
);
651 /* If we are linking with -Bsymbolic, and this is a
652 global symbol, we count the number of PC relative
653 relocations we have entered for this symbol, so that
654 we can discard them again if the symbol is later
655 defined by a regular object. Note that this function
656 is only called if we are using an elf_i386 linker
657 hash table, which means that h is really a pointer to
658 an elf_i386_link_hash_entry. */
659 if (h
!= NULL
&& info
->symbolic
660 && ELF32_R_TYPE (rel
->r_info
) == R_386_PC32
)
662 struct elf_i386_link_hash_entry
*eh
;
663 struct elf_i386_pcrel_relocs_copied
*p
;
665 eh
= (struct elf_i386_link_hash_entry
*) h
;
667 for (p
= eh
->pcrel_relocs_copied
; p
!= NULL
; p
= p
->next
)
668 if (p
->section
== sreloc
)
673 p
= ((struct elf_i386_pcrel_relocs_copied
*)
674 bfd_alloc (dynobj
, sizeof *p
));
677 p
->next
= eh
->pcrel_relocs_copied
;
678 eh
->pcrel_relocs_copied
= p
;
689 /* This relocation describes the C++ object vtable hierarchy.
690 Reconstruct it for later use during GC. */
691 case R_386_GNU_VTINHERIT
:
692 if (!_bfd_elf32_gc_record_vtinherit (abfd
, sec
, h
, rel
->r_offset
))
696 /* This relocation describes which C++ vtable entries are actually
697 used. Record for later use during GC. */
698 case R_386_GNU_VTENTRY
:
699 if (!_bfd_elf32_gc_record_vtentry (abfd
, sec
, h
, rel
->r_offset
))
711 /* Return the section that should be marked against GC for a given
715 elf_i386_gc_mark_hook (abfd
, info
, rel
, h
, sym
)
717 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
718 Elf_Internal_Rela
*rel
;
719 struct elf_link_hash_entry
*h
;
720 Elf_Internal_Sym
*sym
;
724 switch (ELF32_R_TYPE (rel
->r_info
))
726 case R_386_GNU_VTINHERIT
:
727 case R_386_GNU_VTENTRY
:
731 switch (h
->root
.type
)
733 case bfd_link_hash_defined
:
734 case bfd_link_hash_defweak
:
735 return h
->root
.u
.def
.section
;
737 case bfd_link_hash_common
:
738 return h
->root
.u
.c
.p
->section
;
747 if (!(elf_bad_symtab (abfd
)
748 && ELF_ST_BIND (sym
->st_info
) != STB_LOCAL
)
749 && ! ((sym
->st_shndx
<= 0 || sym
->st_shndx
>= SHN_LORESERVE
)
750 && sym
->st_shndx
!= SHN_COMMON
))
752 return bfd_section_from_elf_index (abfd
, sym
->st_shndx
);
759 /* Update the got entry reference counts for the section being removed. */
762 elf_i386_gc_sweep_hook (abfd
, info
, sec
, relocs
)
763 bfd
*abfd ATTRIBUTE_UNUSED
;
764 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
765 asection
*sec ATTRIBUTE_UNUSED
;
766 const Elf_Internal_Rela
*relocs ATTRIBUTE_UNUSED
;
768 /* ??? It would seem that the existing i386 code does no sort
769 of reference counting or whatnot on its GOT and PLT entries,
770 so it is not possible to garbage collect them at this time. */
775 /* Adjust a symbol defined by a dynamic object and referenced by a
776 regular object. The current definition is in some section of the
777 dynamic object, but we're not including those sections. We have to
778 change the definition to something the rest of the link can
782 elf_i386_adjust_dynamic_symbol (info
, h
)
783 struct bfd_link_info
*info
;
784 struct elf_link_hash_entry
*h
;
788 unsigned int power_of_two
;
790 dynobj
= elf_hash_table (info
)->dynobj
;
792 /* Make sure we know what is going on here. */
793 BFD_ASSERT (dynobj
!= NULL
794 && ((h
->elf_link_hash_flags
& ELF_LINK_HASH_NEEDS_PLT
)
795 || h
->weakdef
!= NULL
796 || ((h
->elf_link_hash_flags
797 & ELF_LINK_HASH_DEF_DYNAMIC
) != 0
798 && (h
->elf_link_hash_flags
799 & ELF_LINK_HASH_REF_REGULAR
) != 0
800 && (h
->elf_link_hash_flags
801 & ELF_LINK_HASH_DEF_REGULAR
) == 0)));
803 /* If this is a function, put it in the procedure linkage table. We
804 will fill in the contents of the procedure linkage table later,
805 when we know the address of the .got section. */
806 if (h
->type
== STT_FUNC
807 || (h
->elf_link_hash_flags
& ELF_LINK_HASH_NEEDS_PLT
) != 0)
810 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_DYNAMIC
) == 0
811 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_REF_DYNAMIC
) == 0)
813 /* This case can occur if we saw a PLT32 reloc in an input
814 file, but the symbol was never referred to by a dynamic
815 object. In such a case, we don't actually need to build
816 a procedure linkage table, and we can just do a PC32
818 BFD_ASSERT ((h
->elf_link_hash_flags
& ELF_LINK_HASH_NEEDS_PLT
) != 0);
822 /* Make sure this symbol is output as a dynamic symbol. */
823 if (h
->dynindx
== -1)
825 if (! bfd_elf32_link_record_dynamic_symbol (info
, h
))
829 s
= bfd_get_section_by_name (dynobj
, ".plt");
830 BFD_ASSERT (s
!= NULL
);
832 /* If this is the first .plt entry, make room for the special
834 if (s
->_raw_size
== 0)
835 s
->_raw_size
+= PLT_ENTRY_SIZE
;
837 /* If this symbol is not defined in a regular file, and we are
838 not generating a shared library, then set the symbol to this
839 location in the .plt. This is required to make function
840 pointers compare as equal between the normal executable and
841 the shared library. */
843 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
) == 0)
845 h
->root
.u
.def
.section
= s
;
846 h
->root
.u
.def
.value
= s
->_raw_size
;
849 h
->plt
.offset
= s
->_raw_size
;
851 /* Make room for this entry. */
852 s
->_raw_size
+= PLT_ENTRY_SIZE
;
854 /* We also need to make an entry in the .got.plt section, which
855 will be placed in the .got section by the linker script. */
857 s
= bfd_get_section_by_name (dynobj
, ".got.plt");
858 BFD_ASSERT (s
!= NULL
);
861 /* We also need to make an entry in the .rel.plt section. */
863 s
= bfd_get_section_by_name (dynobj
, ".rel.plt");
864 BFD_ASSERT (s
!= NULL
);
865 s
->_raw_size
+= sizeof (Elf32_External_Rel
);
870 /* If this is a weak symbol, and there is a real definition, the
871 processor independent code will have arranged for us to see the
872 real definition first, and we can just use the same value. */
873 if (h
->weakdef
!= NULL
)
875 BFD_ASSERT (h
->weakdef
->root
.type
== bfd_link_hash_defined
876 || h
->weakdef
->root
.type
== bfd_link_hash_defweak
);
877 h
->root
.u
.def
.section
= h
->weakdef
->root
.u
.def
.section
;
878 h
->root
.u
.def
.value
= h
->weakdef
->root
.u
.def
.value
;
882 /* This is a reference to a symbol defined by a dynamic object which
883 is not a function. */
885 /* If we are creating a shared library, we must presume that the
886 only references to the symbol are via the global offset table.
887 For such cases we need not do anything here; the relocations will
888 be handled correctly by relocate_section. */
892 /* We must allocate the symbol in our .dynbss section, which will
893 become part of the .bss section of the executable. There will be
894 an entry for this symbol in the .dynsym section. The dynamic
895 object will contain position independent code, so all references
896 from the dynamic object to this symbol will go through the global
897 offset table. The dynamic linker will use the .dynsym entry to
898 determine the address it must put in the global offset table, so
899 both the dynamic object and the regular object will refer to the
900 same memory location for the variable. */
902 s
= bfd_get_section_by_name (dynobj
, ".dynbss");
903 BFD_ASSERT (s
!= NULL
);
905 /* We must generate a R_386_COPY reloc to tell the dynamic linker to
906 copy the initial value out of the dynamic object and into the
907 runtime process image. We need to remember the offset into the
908 .rel.bss section we are going to use. */
909 if ((h
->root
.u
.def
.section
->flags
& SEC_ALLOC
) != 0)
913 srel
= bfd_get_section_by_name (dynobj
, ".rel.bss");
914 BFD_ASSERT (srel
!= NULL
);
915 srel
->_raw_size
+= sizeof (Elf32_External_Rel
);
916 h
->elf_link_hash_flags
|= ELF_LINK_HASH_NEEDS_COPY
;
919 /* We need to figure out the alignment required for this symbol. I
920 have no idea how ELF linkers handle this. */
921 power_of_two
= bfd_log2 (h
->size
);
922 if (power_of_two
> 3)
925 /* Apply the required alignment. */
926 s
->_raw_size
= BFD_ALIGN (s
->_raw_size
,
927 (bfd_size_type
) (1 << power_of_two
));
928 if (power_of_two
> bfd_get_section_alignment (dynobj
, s
))
930 if (! bfd_set_section_alignment (dynobj
, s
, power_of_two
))
934 /* Define the symbol as being at this point in the section. */
935 h
->root
.u
.def
.section
= s
;
936 h
->root
.u
.def
.value
= s
->_raw_size
;
938 /* Increment the section size to make room for the symbol. */
939 s
->_raw_size
+= h
->size
;
944 /* Set the sizes of the dynamic sections. */
947 elf_i386_size_dynamic_sections (output_bfd
, info
)
949 struct bfd_link_info
*info
;
957 dynobj
= elf_hash_table (info
)->dynobj
;
958 BFD_ASSERT (dynobj
!= NULL
);
960 if (elf_hash_table (info
)->dynamic_sections_created
)
962 /* Set the contents of the .interp section to the interpreter. */
965 s
= bfd_get_section_by_name (dynobj
, ".interp");
966 BFD_ASSERT (s
!= NULL
);
967 s
->_raw_size
= sizeof ELF_DYNAMIC_INTERPRETER
;
968 s
->contents
= (unsigned char *) ELF_DYNAMIC_INTERPRETER
;
973 /* We may have created entries in the .rel.got section.
974 However, if we are not creating the dynamic sections, we will
975 not actually use these entries. Reset the size of .rel.got,
976 which will cause it to get stripped from the output file
978 s
= bfd_get_section_by_name (dynobj
, ".rel.got");
983 /* If this is a -Bsymbolic shared link, then we need to discard all
984 PC relative relocs against symbols defined in a regular object.
985 We allocated space for them in the check_relocs routine, but we
986 will not fill them in in the relocate_section routine. */
987 if (info
->shared
&& info
->symbolic
)
988 elf_i386_link_hash_traverse (elf_i386_hash_table (info
),
989 elf_i386_discard_copies
,
992 /* The check_relocs and adjust_dynamic_symbol entry points have
993 determined the sizes of the various dynamic sections. Allocate
998 for (s
= dynobj
->sections
; s
!= NULL
; s
= s
->next
)
1003 if ((s
->flags
& SEC_LINKER_CREATED
) == 0)
1006 /* It's OK to base decisions on the section name, because none
1007 of the dynobj section names depend upon the input files. */
1008 name
= bfd_get_section_name (dynobj
, s
);
1012 if (strcmp (name
, ".plt") == 0)
1014 if (s
->_raw_size
== 0)
1016 /* Strip this section if we don't need it; see the
1022 /* Remember whether there is a PLT. */
1026 else if (strncmp (name
, ".rel", 4) == 0)
1028 if (s
->_raw_size
== 0)
1030 /* If we don't need this section, strip it from the
1031 output file. This is mostly to handle .rel.bss and
1032 .rel.plt. We must create both sections in
1033 create_dynamic_sections, because they must be created
1034 before the linker maps input sections to output
1035 sections. The linker does that before
1036 adjust_dynamic_symbol is called, and it is that
1037 function which decides whether anything needs to go
1038 into these sections. */
1045 /* Remember whether there are any reloc sections other
1047 if (strcmp (name
, ".rel.plt") != 0)
1049 const char *outname
;
1053 /* If this relocation section applies to a read only
1054 section, then we probably need a DT_TEXTREL
1055 entry. The entries in the .rel.plt section
1056 really apply to the .got section, which we
1057 created ourselves and so know is not readonly. */
1058 outname
= bfd_get_section_name (output_bfd
,
1060 target
= bfd_get_section_by_name (output_bfd
, outname
+ 4);
1062 && (target
->flags
& SEC_READONLY
) != 0
1063 && (target
->flags
& SEC_ALLOC
) != 0)
1067 /* We use the reloc_count field as a counter if we need
1068 to copy relocs into the output file. */
1072 else if (strncmp (name
, ".got", 4) != 0)
1074 /* It's not one of our sections, so don't allocate space. */
1080 _bfd_strip_section_from_output (s
);
1084 /* Allocate memory for the section contents. */
1085 s
->contents
= (bfd_byte
*) bfd_alloc (dynobj
, s
->_raw_size
);
1086 if (s
->contents
== NULL
&& s
->_raw_size
!= 0)
1090 if (elf_hash_table (info
)->dynamic_sections_created
)
1092 /* Add some entries to the .dynamic section. We fill in the
1093 values later, in elf_i386_finish_dynamic_sections, but we
1094 must add the entries now so that we get the correct size for
1095 the .dynamic section. The DT_DEBUG entry is filled in by the
1096 dynamic linker and used by the debugger. */
1099 if (! bfd_elf32_add_dynamic_entry (info
, DT_DEBUG
, 0))
1105 if (! bfd_elf32_add_dynamic_entry (info
, DT_PLTGOT
, 0)
1106 || ! bfd_elf32_add_dynamic_entry (info
, DT_PLTRELSZ
, 0)
1107 || ! bfd_elf32_add_dynamic_entry (info
, DT_PLTREL
, DT_REL
)
1108 || ! bfd_elf32_add_dynamic_entry (info
, DT_JMPREL
, 0))
1114 if (! bfd_elf32_add_dynamic_entry (info
, DT_REL
, 0)
1115 || ! bfd_elf32_add_dynamic_entry (info
, DT_RELSZ
, 0)
1116 || ! bfd_elf32_add_dynamic_entry (info
, DT_RELENT
,
1117 sizeof (Elf32_External_Rel
)))
1123 if (! bfd_elf32_add_dynamic_entry (info
, DT_TEXTREL
, 0))
1131 /* This function is called via elf_i386_link_hash_traverse if we are
1132 creating a shared object with -Bsymbolic. It discards the space
1133 allocated to copy PC relative relocs against symbols which are
1134 defined in regular objects. We allocated space for them in the
1135 check_relocs routine, but we won't fill them in in the
1136 relocate_section routine. */
1140 elf_i386_discard_copies (h
, ignore
)
1141 struct elf_i386_link_hash_entry
*h
;
1142 PTR ignore ATTRIBUTE_UNUSED
;
1144 struct elf_i386_pcrel_relocs_copied
*s
;
1146 /* We only discard relocs for symbols defined in a regular object. */
1147 if ((h
->root
.elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
) == 0)
1150 for (s
= h
->pcrel_relocs_copied
; s
!= NULL
; s
= s
->next
)
1151 s
->section
->_raw_size
-= s
->count
* sizeof (Elf32_External_Rel
);
1156 /* Relocate an i386 ELF section. */
1159 elf_i386_relocate_section (output_bfd
, info
, input_bfd
, input_section
,
1160 contents
, relocs
, local_syms
, local_sections
)
1162 struct bfd_link_info
*info
;
1164 asection
*input_section
;
1166 Elf_Internal_Rela
*relocs
;
1167 Elf_Internal_Sym
*local_syms
;
1168 asection
**local_sections
;
1171 Elf_Internal_Shdr
*symtab_hdr
;
1172 struct elf_link_hash_entry
**sym_hashes
;
1173 bfd_vma
*local_got_offsets
;
1177 Elf_Internal_Rela
*rel
;
1178 Elf_Internal_Rela
*relend
;
1180 dynobj
= elf_hash_table (info
)->dynobj
;
1181 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
1182 sym_hashes
= elf_sym_hashes (input_bfd
);
1183 local_got_offsets
= elf_local_got_offsets (input_bfd
);
1190 relend
= relocs
+ input_section
->reloc_count
;
1191 for (; rel
< relend
; rel
++)
1194 reloc_howto_type
*howto
;
1195 unsigned long r_symndx
;
1196 struct elf_link_hash_entry
*h
;
1197 Elf_Internal_Sym
*sym
;
1200 bfd_reloc_status_type r
;
1202 r_type
= ELF32_R_TYPE (rel
->r_info
);
1203 if (r_type
== R_386_GNU_VTINHERIT
1204 || r_type
== R_386_GNU_VTENTRY
)
1207 || r_type
>= (int) R_386_max
1208 || (r_type
>= (int) FIRST_INVALID_RELOC
1209 && r_type
<= (int) LAST_INVALID_RELOC
))
1211 bfd_set_error (bfd_error_bad_value
);
1214 howto
= elf_howto_table
+ r_type
;
1216 r_symndx
= ELF32_R_SYM (rel
->r_info
);
1218 if (info
->relocateable
)
1220 /* This is a relocateable link. We don't have to change
1221 anything, unless the reloc is against a section symbol,
1222 in which case we have to adjust according to where the
1223 section symbol winds up in the output section. */
1224 if (r_symndx
< symtab_hdr
->sh_info
)
1226 sym
= local_syms
+ r_symndx
;
1227 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
1231 sec
= local_sections
[r_symndx
];
1232 val
= bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
);
1233 val
+= sec
->output_offset
+ sym
->st_value
;
1234 bfd_put_32 (input_bfd
, val
, contents
+ rel
->r_offset
);
1241 /* This is a final link. */
1245 if (r_symndx
< symtab_hdr
->sh_info
)
1247 sym
= local_syms
+ r_symndx
;
1248 sec
= local_sections
[r_symndx
];
1249 relocation
= (sec
->output_section
->vma
1250 + sec
->output_offset
1255 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
1256 while (h
->root
.type
== bfd_link_hash_indirect
1257 || h
->root
.type
== bfd_link_hash_warning
)
1258 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
1259 if (h
->root
.type
== bfd_link_hash_defined
1260 || h
->root
.type
== bfd_link_hash_defweak
)
1262 sec
= h
->root
.u
.def
.section
;
1263 if (r_type
== R_386_GOTPC
1264 || (r_type
== R_386_PLT32
1265 && h
->plt
.offset
!= (bfd_vma
) -1)
1266 || (r_type
== R_386_GOT32
1267 && elf_hash_table (info
)->dynamic_sections_created
1269 || (! info
->symbolic
&& h
->dynindx
!= -1)
1270 || (h
->elf_link_hash_flags
1271 & ELF_LINK_HASH_DEF_REGULAR
) == 0))
1273 && ((! info
->symbolic
&& h
->dynindx
!= -1)
1274 || (h
->elf_link_hash_flags
1275 & ELF_LINK_HASH_DEF_REGULAR
) == 0)
1276 && (r_type
== R_386_32
1277 || r_type
== R_386_PC32
)
1278 && ((input_section
->flags
& SEC_ALLOC
) != 0
1279 /* DWARF will emit R_386_32 relocations in its
1280 sections against symbols defined externally
1281 in shared libraries. We can't do anything
1283 || (input_section
->flags
& SEC_DEBUGGING
) != 0)))
1285 /* In these cases, we don't need the relocation
1286 value. We check specially because in some
1287 obscure cases sec->output_section will be NULL. */
1290 else if (sec
->output_section
== NULL
)
1292 (*_bfd_error_handler
)
1293 (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
1294 bfd_get_filename (input_bfd
), h
->root
.root
.string
,
1295 bfd_get_section_name (input_bfd
, input_section
));
1299 relocation
= (h
->root
.u
.def
.value
1300 + sec
->output_section
->vma
1301 + sec
->output_offset
);
1303 else if (h
->root
.type
== bfd_link_hash_undefweak
)
1305 else if (info
->shared
&& !info
->symbolic
&& !info
->no_undefined
)
1309 if (! ((*info
->callbacks
->undefined_symbol
)
1310 (info
, h
->root
.root
.string
, input_bfd
,
1311 input_section
, rel
->r_offset
)))
1320 /* Relocation is to the entry for this symbol in the global
1324 sgot
= bfd_get_section_by_name (dynobj
, ".got");
1325 BFD_ASSERT (sgot
!= NULL
);
1332 off
= h
->got
.offset
;
1333 BFD_ASSERT (off
!= (bfd_vma
) -1);
1335 if (! elf_hash_table (info
)->dynamic_sections_created
1337 && (info
->symbolic
|| h
->dynindx
== -1)
1338 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
)))
1340 /* This is actually a static link, or it is a
1341 -Bsymbolic link and the symbol is defined
1342 locally, or the symbol was forced to be local
1343 because of a version file. We must initialize
1344 this entry in the global offset table. Since the
1345 offset must always be a multiple of 4, we use the
1346 least significant bit to record whether we have
1347 initialized it already.
1349 When doing a dynamic link, we create a .rel.got
1350 relocation entry to initialize the value. This
1351 is done in the finish_dynamic_symbol routine. */
1356 bfd_put_32 (output_bfd
, relocation
,
1357 sgot
->contents
+ off
);
1362 relocation
= sgot
->output_offset
+ off
;
1368 BFD_ASSERT (local_got_offsets
!= NULL
1369 && local_got_offsets
[r_symndx
] != (bfd_vma
) -1);
1371 off
= local_got_offsets
[r_symndx
];
1373 /* The offset must always be a multiple of 4. We use
1374 the least significant bit to record whether we have
1375 already generated the necessary reloc. */
1380 bfd_put_32 (output_bfd
, relocation
, sgot
->contents
+ off
);
1385 Elf_Internal_Rel outrel
;
1387 srelgot
= bfd_get_section_by_name (dynobj
, ".rel.got");
1388 BFD_ASSERT (srelgot
!= NULL
);
1390 outrel
.r_offset
= (sgot
->output_section
->vma
1391 + sgot
->output_offset
1393 outrel
.r_info
= ELF32_R_INFO (0, R_386_RELATIVE
);
1394 bfd_elf32_swap_reloc_out (output_bfd
, &outrel
,
1395 (((Elf32_External_Rel
*)
1397 + srelgot
->reloc_count
));
1398 ++srelgot
->reloc_count
;
1401 local_got_offsets
[r_symndx
] |= 1;
1404 relocation
= sgot
->output_offset
+ off
;
1410 /* Relocation is relative to the start of the global offset
1415 sgot
= bfd_get_section_by_name (dynobj
, ".got");
1416 BFD_ASSERT (sgot
!= NULL
);
1419 /* Note that sgot->output_offset is not involved in this
1420 calculation. We always want the start of .got. If we
1421 defined _GLOBAL_OFFSET_TABLE in a different way, as is
1422 permitted by the ABI, we might have to change this
1424 relocation
-= sgot
->output_section
->vma
;
1429 /* Use global offset table as symbol value. */
1433 sgot
= bfd_get_section_by_name (dynobj
, ".got");
1434 BFD_ASSERT (sgot
!= NULL
);
1437 relocation
= sgot
->output_section
->vma
;
1442 /* Relocation is to the entry for this symbol in the
1443 procedure linkage table. */
1445 /* Resolve a PLT32 reloc again a local symbol directly,
1446 without using the procedure linkage table. */
1450 if (h
->plt
.offset
== (bfd_vma
) -1)
1452 /* We didn't make a PLT entry for this symbol. This
1453 happens when statically linking PIC code, or when
1454 using -Bsymbolic. */
1460 splt
= bfd_get_section_by_name (dynobj
, ".plt");
1461 BFD_ASSERT (splt
!= NULL
);
1464 relocation
= (splt
->output_section
->vma
1465 + splt
->output_offset
1473 && (input_section
->flags
& SEC_ALLOC
) != 0
1474 && (r_type
!= R_386_PC32
1477 && (! info
->symbolic
1478 || (h
->elf_link_hash_flags
1479 & ELF_LINK_HASH_DEF_REGULAR
) == 0))))
1481 Elf_Internal_Rel outrel
;
1482 boolean skip
, relocate
;
1484 /* When generating a shared object, these relocations
1485 are copied into the output file to be resolved at run
1492 name
= (bfd_elf_string_from_elf_section
1494 elf_elfheader (input_bfd
)->e_shstrndx
,
1495 elf_section_data (input_section
)->rel_hdr
.sh_name
));
1499 BFD_ASSERT (strncmp (name
, ".rel", 4) == 0
1500 && strcmp (bfd_get_section_name (input_bfd
,
1504 sreloc
= bfd_get_section_by_name (dynobj
, name
);
1505 BFD_ASSERT (sreloc
!= NULL
);
1510 if (elf_section_data (input_section
)->stab_info
== NULL
)
1511 outrel
.r_offset
= rel
->r_offset
;
1516 off
= (_bfd_stab_section_offset
1517 (output_bfd
, &elf_hash_table (info
)->stab_info
,
1519 &elf_section_data (input_section
)->stab_info
,
1521 if (off
== (bfd_vma
) -1)
1523 outrel
.r_offset
= off
;
1526 outrel
.r_offset
+= (input_section
->output_section
->vma
1527 + input_section
->output_offset
);
1531 memset (&outrel
, 0, sizeof outrel
);
1534 else if (r_type
== R_386_PC32
)
1536 BFD_ASSERT (h
!= NULL
&& h
->dynindx
!= -1);
1538 outrel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_386_PC32
);
1542 /* h->dynindx may be -1 if this symbol was marked to
1545 || ((info
->symbolic
|| h
->dynindx
== -1)
1546 && (h
->elf_link_hash_flags
1547 & ELF_LINK_HASH_DEF_REGULAR
) != 0))
1550 outrel
.r_info
= ELF32_R_INFO (0, R_386_RELATIVE
);
1554 BFD_ASSERT (h
->dynindx
!= -1);
1556 outrel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_386_32
);
1560 bfd_elf32_swap_reloc_out (output_bfd
, &outrel
,
1561 (((Elf32_External_Rel
*)
1563 + sreloc
->reloc_count
));
1564 ++sreloc
->reloc_count
;
1566 /* If this reloc is against an external symbol, we do
1567 not want to fiddle with the addend. Otherwise, we
1568 need to include the symbol value so that it becomes
1569 an addend for the dynamic reloc. */
1580 r
= _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
1581 contents
, rel
->r_offset
,
1582 relocation
, (bfd_vma
) 0);
1584 if (r
!= bfd_reloc_ok
)
1589 case bfd_reloc_outofrange
:
1591 case bfd_reloc_overflow
:
1596 name
= h
->root
.root
.string
;
1599 name
= bfd_elf_string_from_elf_section (input_bfd
,
1600 symtab_hdr
->sh_link
,
1605 name
= bfd_section_name (input_bfd
, sec
);
1607 if (! ((*info
->callbacks
->reloc_overflow
)
1608 (info
, name
, howto
->name
, (bfd_vma
) 0,
1609 input_bfd
, input_section
, rel
->r_offset
)))
1620 /* Finish up dynamic symbol handling. We set the contents of various
1621 dynamic sections here. */
1624 elf_i386_finish_dynamic_symbol (output_bfd
, info
, h
, sym
)
1626 struct bfd_link_info
*info
;
1627 struct elf_link_hash_entry
*h
;
1628 Elf_Internal_Sym
*sym
;
1632 dynobj
= elf_hash_table (info
)->dynobj
;
1634 if (h
->plt
.offset
!= (bfd_vma
) -1)
1641 Elf_Internal_Rel rel
;
1643 /* This symbol has an entry in the procedure linkage table. Set
1646 BFD_ASSERT (h
->dynindx
!= -1);
1648 splt
= bfd_get_section_by_name (dynobj
, ".plt");
1649 sgot
= bfd_get_section_by_name (dynobj
, ".got.plt");
1650 srel
= bfd_get_section_by_name (dynobj
, ".rel.plt");
1651 BFD_ASSERT (splt
!= NULL
&& sgot
!= NULL
&& srel
!= NULL
);
1653 /* Get the index in the procedure linkage table which
1654 corresponds to this symbol. This is the index of this symbol
1655 in all the symbols for which we are making plt entries. The
1656 first entry in the procedure linkage table is reserved. */
1657 plt_index
= h
->plt
.offset
/ PLT_ENTRY_SIZE
- 1;
1659 /* Get the offset into the .got table of the entry that
1660 corresponds to this function. Each .got entry is 4 bytes.
1661 The first three are reserved. */
1662 got_offset
= (plt_index
+ 3) * 4;
1664 /* Fill in the entry in the procedure linkage table. */
1667 memcpy (splt
->contents
+ h
->plt
.offset
, elf_i386_plt_entry
,
1669 bfd_put_32 (output_bfd
,
1670 (sgot
->output_section
->vma
1671 + sgot
->output_offset
1673 splt
->contents
+ h
->plt
.offset
+ 2);
1677 memcpy (splt
->contents
+ h
->plt
.offset
, elf_i386_pic_plt_entry
,
1679 bfd_put_32 (output_bfd
, got_offset
,
1680 splt
->contents
+ h
->plt
.offset
+ 2);
1683 bfd_put_32 (output_bfd
, plt_index
* sizeof (Elf32_External_Rel
),
1684 splt
->contents
+ h
->plt
.offset
+ 7);
1685 bfd_put_32 (output_bfd
, - (h
->plt
.offset
+ PLT_ENTRY_SIZE
),
1686 splt
->contents
+ h
->plt
.offset
+ 12);
1688 /* Fill in the entry in the global offset table. */
1689 bfd_put_32 (output_bfd
,
1690 (splt
->output_section
->vma
1691 + splt
->output_offset
1694 sgot
->contents
+ got_offset
);
1696 /* Fill in the entry in the .rel.plt section. */
1697 rel
.r_offset
= (sgot
->output_section
->vma
1698 + sgot
->output_offset
1700 rel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_386_JUMP_SLOT
);
1701 bfd_elf32_swap_reloc_out (output_bfd
, &rel
,
1702 ((Elf32_External_Rel
*) srel
->contents
1705 if ((h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
) == 0)
1707 /* Mark the symbol as undefined, rather than as defined in
1708 the .plt section. Leave the value alone. */
1709 sym
->st_shndx
= SHN_UNDEF
;
1713 if (h
->got
.offset
!= (bfd_vma
) -1)
1717 Elf_Internal_Rel rel
;
1719 /* This symbol has an entry in the global offset table. Set it
1722 sgot
= bfd_get_section_by_name (dynobj
, ".got");
1723 srel
= bfd_get_section_by_name (dynobj
, ".rel.got");
1724 BFD_ASSERT (sgot
!= NULL
&& srel
!= NULL
);
1726 rel
.r_offset
= (sgot
->output_section
->vma
1727 + sgot
->output_offset
1728 + (h
->got
.offset
&~ 1));
1730 /* If this is a -Bsymbolic link, and the symbol is defined
1731 locally, we just want to emit a RELATIVE reloc. Likewise if
1732 the symbol was forced to be local because of a version file.
1733 The entry in the global offset table will already have been
1734 initialized in the relocate_section function. */
1736 && (info
->symbolic
|| h
->dynindx
== -1)
1737 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
))
1738 rel
.r_info
= ELF32_R_INFO (0, R_386_RELATIVE
);
1741 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
+ h
->got
.offset
);
1742 rel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_386_GLOB_DAT
);
1745 bfd_elf32_swap_reloc_out (output_bfd
, &rel
,
1746 ((Elf32_External_Rel
*) srel
->contents
1747 + srel
->reloc_count
));
1748 ++srel
->reloc_count
;
1751 if ((h
->elf_link_hash_flags
& ELF_LINK_HASH_NEEDS_COPY
) != 0)
1754 Elf_Internal_Rel rel
;
1756 /* This symbol needs a copy reloc. Set it up. */
1758 BFD_ASSERT (h
->dynindx
!= -1
1759 && (h
->root
.type
== bfd_link_hash_defined
1760 || h
->root
.type
== bfd_link_hash_defweak
));
1762 s
= bfd_get_section_by_name (h
->root
.u
.def
.section
->owner
,
1764 BFD_ASSERT (s
!= NULL
);
1766 rel
.r_offset
= (h
->root
.u
.def
.value
1767 + h
->root
.u
.def
.section
->output_section
->vma
1768 + h
->root
.u
.def
.section
->output_offset
);
1769 rel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_386_COPY
);
1770 bfd_elf32_swap_reloc_out (output_bfd
, &rel
,
1771 ((Elf32_External_Rel
*) s
->contents
1776 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
1777 if (strcmp (h
->root
.root
.string
, "_DYNAMIC") == 0
1778 || strcmp (h
->root
.root
.string
, "_GLOBAL_OFFSET_TABLE_") == 0)
1779 sym
->st_shndx
= SHN_ABS
;
1784 /* Finish up the dynamic sections. */
1787 elf_i386_finish_dynamic_sections (output_bfd
, info
)
1789 struct bfd_link_info
*info
;
1795 dynobj
= elf_hash_table (info
)->dynobj
;
1797 sgot
= bfd_get_section_by_name (dynobj
, ".got.plt");
1798 BFD_ASSERT (sgot
!= NULL
);
1799 sdyn
= bfd_get_section_by_name (dynobj
, ".dynamic");
1801 if (elf_hash_table (info
)->dynamic_sections_created
)
1804 Elf32_External_Dyn
*dyncon
, *dynconend
;
1806 BFD_ASSERT (sdyn
!= NULL
);
1808 dyncon
= (Elf32_External_Dyn
*) sdyn
->contents
;
1809 dynconend
= (Elf32_External_Dyn
*) (sdyn
->contents
+ sdyn
->_raw_size
);
1810 for (; dyncon
< dynconend
; dyncon
++)
1812 Elf_Internal_Dyn dyn
;
1816 bfd_elf32_swap_dyn_in (dynobj
, dyncon
, &dyn
);
1829 s
= bfd_get_section_by_name (output_bfd
, name
);
1830 BFD_ASSERT (s
!= NULL
);
1831 dyn
.d_un
.d_ptr
= s
->vma
;
1832 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
1836 s
= bfd_get_section_by_name (output_bfd
, ".rel.plt");
1837 BFD_ASSERT (s
!= NULL
);
1838 if (s
->_cooked_size
!= 0)
1839 dyn
.d_un
.d_val
= s
->_cooked_size
;
1841 dyn
.d_un
.d_val
= s
->_raw_size
;
1842 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
1846 /* My reading of the SVR4 ABI indicates that the
1847 procedure linkage table relocs (DT_JMPREL) should be
1848 included in the overall relocs (DT_REL). This is
1849 what Solaris does. However, UnixWare can not handle
1850 that case. Therefore, we override the DT_RELSZ entry
1851 here to make it not include the JMPREL relocs. Since
1852 the linker script arranges for .rel.plt to follow all
1853 other relocation sections, we don't have to worry
1854 about changing the DT_REL entry. */
1855 s
= bfd_get_section_by_name (output_bfd
, ".rel.plt");
1858 if (s
->_cooked_size
!= 0)
1859 dyn
.d_un
.d_val
-= s
->_cooked_size
;
1861 dyn
.d_un
.d_val
-= s
->_raw_size
;
1863 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
1868 /* Fill in the first entry in the procedure linkage table. */
1869 splt
= bfd_get_section_by_name (dynobj
, ".plt");
1870 if (splt
&& splt
->_raw_size
> 0)
1873 memcpy (splt
->contents
, elf_i386_pic_plt0_entry
, PLT_ENTRY_SIZE
);
1876 memcpy (splt
->contents
, elf_i386_plt0_entry
, PLT_ENTRY_SIZE
);
1877 bfd_put_32 (output_bfd
,
1878 sgot
->output_section
->vma
+ sgot
->output_offset
+ 4,
1879 splt
->contents
+ 2);
1880 bfd_put_32 (output_bfd
,
1881 sgot
->output_section
->vma
+ sgot
->output_offset
+ 8,
1882 splt
->contents
+ 8);
1885 /* UnixWare sets the entsize of .plt to 4, although that doesn't
1886 really seem like the right value. */
1887 elf_section_data (splt
->output_section
)->this_hdr
.sh_entsize
= 4;
1891 /* Fill in the first three entries in the global offset table. */
1892 if (sgot
->_raw_size
> 0)
1895 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
);
1897 bfd_put_32 (output_bfd
,
1898 sdyn
->output_section
->vma
+ sdyn
->output_offset
,
1900 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
+ 4);
1901 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
+ 8);
1904 elf_section_data (sgot
->output_section
)->this_hdr
.sh_entsize
= 4;
1909 #define TARGET_LITTLE_SYM bfd_elf32_i386_vec
1910 #define TARGET_LITTLE_NAME "elf32-i386"
1911 #define ELF_ARCH bfd_arch_i386
1912 #define ELF_MACHINE_CODE EM_386
1913 #define ELF_MAXPAGESIZE 0x1000
1914 #define elf_info_to_howto elf_i386_info_to_howto
1915 #define elf_info_to_howto_rel elf_i386_info_to_howto_rel
1916 #define bfd_elf32_bfd_reloc_type_lookup elf_i386_reloc_type_lookup
1917 #define bfd_elf32_bfd_is_local_label_name \
1918 elf_i386_is_local_label_name
1919 #define elf_backend_create_dynamic_sections \
1920 _bfd_elf_create_dynamic_sections
1921 #define bfd_elf32_bfd_link_hash_table_create \
1922 elf_i386_link_hash_table_create
1923 #define elf_backend_check_relocs elf_i386_check_relocs
1924 #define elf_backend_adjust_dynamic_symbol \
1925 elf_i386_adjust_dynamic_symbol
1926 #define elf_backend_size_dynamic_sections \
1927 elf_i386_size_dynamic_sections
1928 #define elf_backend_relocate_section elf_i386_relocate_section
1929 #define elf_backend_finish_dynamic_symbol \
1930 elf_i386_finish_dynamic_symbol
1931 #define elf_backend_finish_dynamic_sections \
1932 elf_i386_finish_dynamic_sections
1933 #define elf_backend_gc_mark_hook elf_i386_gc_mark_hook
1934 #define elf_backend_gc_sweep_hook elf_i386_gc_sweep_hook
1936 #define elf_backend_can_gc_sections 1
1937 #define elf_backend_want_got_plt 1
1938 #define elf_backend_plt_readonly 1
1939 #define elf_backend_want_plt_sym 0
1940 #define elf_backend_got_header_size 12
1941 #define elf_backend_plt_header_size PLT_ENTRY_SIZE
1943 #include "elf32-target.h"