* coff-rs6000.c: Add missing prototypes.
[deliverable/binutils-gdb.git] / bfd / elf32-i386.c
1 /* Intel 80386/80486-specific support for 32-bit ELF
2 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
3 Free Software Foundation, Inc.
4
5 This file is part of BFD, the Binary File Descriptor library.
6
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.
11
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.
16
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. */
20
21 #include "bfd.h"
22 #include "sysdep.h"
23 #include "bfdlink.h"
24 #include "libbfd.h"
25 #include "elf-bfd.h"
26
27 static reloc_howto_type *elf_i386_reloc_type_lookup
28 PARAMS ((bfd *, bfd_reloc_code_real_type));
29 static void elf_i386_info_to_howto
30 PARAMS ((bfd *, arelent *, Elf32_Internal_Rela *));
31 static void elf_i386_info_to_howto_rel
32 PARAMS ((bfd *, arelent *, Elf32_Internal_Rel *));
33 static boolean elf_i386_is_local_label_name PARAMS ((bfd *, const char *));
34 static struct bfd_hash_entry *elf_i386_link_hash_newfunc
35 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
36 static struct bfd_link_hash_table *elf_i386_link_hash_table_create
37 PARAMS ((bfd *));
38 static boolean create_got_section PARAMS((bfd *, struct bfd_link_info *));
39 static boolean elf_i386_create_dynamic_sections
40 PARAMS((bfd *, struct bfd_link_info *));
41 static boolean elf_i386_check_relocs
42 PARAMS ((bfd *, struct bfd_link_info *, asection *,
43 const Elf_Internal_Rela *));
44 static asection *elf_i386_gc_mark_hook
45 PARAMS ((bfd *, struct bfd_link_info *, Elf_Internal_Rela *,
46 struct elf_link_hash_entry *, Elf_Internal_Sym *));
47 static boolean elf_i386_gc_sweep_hook
48 PARAMS ((bfd *, struct bfd_link_info *, asection *,
49 const Elf_Internal_Rela *));
50 static boolean elf_i386_adjust_dynamic_symbol
51 PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
52 static boolean allocate_plt_and_got_and_discard_relocs
53 PARAMS ((struct elf_link_hash_entry *, PTR));
54 static boolean elf_i386_size_dynamic_sections
55 PARAMS ((bfd *, struct bfd_link_info *));
56 static boolean elf_i386_relocate_section
57 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
58 Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
59 static boolean elf_i386_finish_dynamic_symbol
60 PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
61 Elf_Internal_Sym *));
62 static boolean elf_i386_finish_dynamic_sections
63 PARAMS ((bfd *, struct bfd_link_info *));
64 static boolean elf_i386_fake_sections
65 PARAMS ((bfd *, Elf32_Internal_Shdr *, asection *));
66
67 #define USE_REL 1 /* 386 uses REL relocations instead of RELA */
68
69 #include "elf/i386.h"
70
71 static reloc_howto_type elf_howto_table[]=
72 {
73 HOWTO(R_386_NONE, 0, 0, 0, false, 0, complain_overflow_bitfield,
74 bfd_elf_generic_reloc, "R_386_NONE",
75 true, 0x00000000, 0x00000000, false),
76 HOWTO(R_386_32, 0, 2, 32, false, 0, complain_overflow_bitfield,
77 bfd_elf_generic_reloc, "R_386_32",
78 true, 0xffffffff, 0xffffffff, false),
79 HOWTO(R_386_PC32, 0, 2, 32, true, 0, complain_overflow_bitfield,
80 bfd_elf_generic_reloc, "R_386_PC32",
81 true, 0xffffffff, 0xffffffff, true),
82 HOWTO(R_386_GOT32, 0, 2, 32, false, 0, complain_overflow_bitfield,
83 bfd_elf_generic_reloc, "R_386_GOT32",
84 true, 0xffffffff, 0xffffffff, false),
85 HOWTO(R_386_PLT32, 0, 2, 32, true, 0, complain_overflow_bitfield,
86 bfd_elf_generic_reloc, "R_386_PLT32",
87 true, 0xffffffff, 0xffffffff, true),
88 HOWTO(R_386_COPY, 0, 2, 32, false, 0, complain_overflow_bitfield,
89 bfd_elf_generic_reloc, "R_386_COPY",
90 true, 0xffffffff, 0xffffffff, false),
91 HOWTO(R_386_GLOB_DAT, 0, 2, 32, false, 0, complain_overflow_bitfield,
92 bfd_elf_generic_reloc, "R_386_GLOB_DAT",
93 true, 0xffffffff, 0xffffffff, false),
94 HOWTO(R_386_JUMP_SLOT, 0, 2, 32, false, 0, complain_overflow_bitfield,
95 bfd_elf_generic_reloc, "R_386_JUMP_SLOT",
96 true, 0xffffffff, 0xffffffff, false),
97 HOWTO(R_386_RELATIVE, 0, 2, 32, false, 0, complain_overflow_bitfield,
98 bfd_elf_generic_reloc, "R_386_RELATIVE",
99 true, 0xffffffff, 0xffffffff, false),
100 HOWTO(R_386_GOTOFF, 0, 2, 32, false, 0, complain_overflow_bitfield,
101 bfd_elf_generic_reloc, "R_386_GOTOFF",
102 true, 0xffffffff, 0xffffffff, false),
103 HOWTO(R_386_GOTPC, 0, 2, 32, true, 0, complain_overflow_bitfield,
104 bfd_elf_generic_reloc, "R_386_GOTPC",
105 true, 0xffffffff, 0xffffffff, true),
106
107 /* We have a gap in the reloc numbers here.
108 R_386_standard counts the number up to this point, and
109 R_386_ext_offset is the value to subtract from a reloc type of
110 R_386_16 thru R_386_PC8 to form an index into this table. */
111 #define R_386_standard ((unsigned int) R_386_GOTPC + 1)
112 #define R_386_ext_offset ((unsigned int) R_386_16 - R_386_standard)
113
114 /* The remaining relocs are a GNU extension. */
115 HOWTO(R_386_16, 0, 1, 16, false, 0, complain_overflow_bitfield,
116 bfd_elf_generic_reloc, "R_386_16",
117 true, 0xffff, 0xffff, false),
118 HOWTO(R_386_PC16, 0, 1, 16, true, 0, complain_overflow_bitfield,
119 bfd_elf_generic_reloc, "R_386_PC16",
120 true, 0xffff, 0xffff, true),
121 HOWTO(R_386_8, 0, 0, 8, false, 0, complain_overflow_bitfield,
122 bfd_elf_generic_reloc, "R_386_8",
123 true, 0xff, 0xff, false),
124 HOWTO(R_386_PC8, 0, 0, 8, true, 0, complain_overflow_signed,
125 bfd_elf_generic_reloc, "R_386_PC8",
126 true, 0xff, 0xff, true),
127
128 /* Another gap. */
129 #define R_386_ext ((unsigned int) R_386_PC8 + 1 - R_386_ext_offset)
130 #define R_386_vt_offset ((unsigned int) R_386_GNU_VTINHERIT - R_386_ext)
131
132 /* GNU extension to record C++ vtable hierarchy. */
133 HOWTO (R_386_GNU_VTINHERIT, /* type */
134 0, /* rightshift */
135 2, /* size (0 = byte, 1 = short, 2 = long) */
136 0, /* bitsize */
137 false, /* pc_relative */
138 0, /* bitpos */
139 complain_overflow_dont, /* complain_on_overflow */
140 NULL, /* special_function */
141 "R_386_GNU_VTINHERIT", /* name */
142 false, /* partial_inplace */
143 0, /* src_mask */
144 0, /* dst_mask */
145 false),
146
147 /* GNU extension to record C++ vtable member usage. */
148 HOWTO (R_386_GNU_VTENTRY, /* type */
149 0, /* rightshift */
150 2, /* size (0 = byte, 1 = short, 2 = long) */
151 0, /* bitsize */
152 false, /* pc_relative */
153 0, /* bitpos */
154 complain_overflow_dont, /* complain_on_overflow */
155 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
156 "R_386_GNU_VTENTRY", /* name */
157 false, /* partial_inplace */
158 0, /* src_mask */
159 0, /* dst_mask */
160 false)
161
162 #define R_386_vt ((unsigned int) R_386_GNU_VTENTRY + 1 - R_386_vt_offset)
163
164 };
165
166 #ifdef DEBUG_GEN_RELOC
167 #define TRACE(str) fprintf (stderr, "i386 bfd reloc lookup %d (%s)\n", code, str)
168 #else
169 #define TRACE(str)
170 #endif
171
172 static reloc_howto_type *
173 elf_i386_reloc_type_lookup (abfd, code)
174 bfd *abfd ATTRIBUTE_UNUSED;
175 bfd_reloc_code_real_type code;
176 {
177 switch (code)
178 {
179 case BFD_RELOC_NONE:
180 TRACE ("BFD_RELOC_NONE");
181 return &elf_howto_table[(unsigned int) R_386_NONE ];
182
183 case BFD_RELOC_32:
184 TRACE ("BFD_RELOC_32");
185 return &elf_howto_table[(unsigned int) R_386_32 ];
186
187 case BFD_RELOC_CTOR:
188 TRACE ("BFD_RELOC_CTOR");
189 return &elf_howto_table[(unsigned int) R_386_32 ];
190
191 case BFD_RELOC_32_PCREL:
192 TRACE ("BFD_RELOC_PC32");
193 return &elf_howto_table[(unsigned int) R_386_PC32 ];
194
195 case BFD_RELOC_386_GOT32:
196 TRACE ("BFD_RELOC_386_GOT32");
197 return &elf_howto_table[(unsigned int) R_386_GOT32 ];
198
199 case BFD_RELOC_386_PLT32:
200 TRACE ("BFD_RELOC_386_PLT32");
201 return &elf_howto_table[(unsigned int) R_386_PLT32 ];
202
203 case BFD_RELOC_386_COPY:
204 TRACE ("BFD_RELOC_386_COPY");
205 return &elf_howto_table[(unsigned int) R_386_COPY ];
206
207 case BFD_RELOC_386_GLOB_DAT:
208 TRACE ("BFD_RELOC_386_GLOB_DAT");
209 return &elf_howto_table[(unsigned int) R_386_GLOB_DAT ];
210
211 case BFD_RELOC_386_JUMP_SLOT:
212 TRACE ("BFD_RELOC_386_JUMP_SLOT");
213 return &elf_howto_table[(unsigned int) R_386_JUMP_SLOT ];
214
215 case BFD_RELOC_386_RELATIVE:
216 TRACE ("BFD_RELOC_386_RELATIVE");
217 return &elf_howto_table[(unsigned int) R_386_RELATIVE ];
218
219 case BFD_RELOC_386_GOTOFF:
220 TRACE ("BFD_RELOC_386_GOTOFF");
221 return &elf_howto_table[(unsigned int) R_386_GOTOFF ];
222
223 case BFD_RELOC_386_GOTPC:
224 TRACE ("BFD_RELOC_386_GOTPC");
225 return &elf_howto_table[(unsigned int) R_386_GOTPC ];
226
227 /* The remaining relocs are a GNU extension. */
228 case BFD_RELOC_16:
229 TRACE ("BFD_RELOC_16");
230 return &elf_howto_table[(unsigned int) R_386_16 - R_386_ext_offset];
231
232 case BFD_RELOC_16_PCREL:
233 TRACE ("BFD_RELOC_16_PCREL");
234 return &elf_howto_table[(unsigned int) R_386_PC16 - R_386_ext_offset];
235
236 case BFD_RELOC_8:
237 TRACE ("BFD_RELOC_8");
238 return &elf_howto_table[(unsigned int) R_386_8 - R_386_ext_offset];
239
240 case BFD_RELOC_8_PCREL:
241 TRACE ("BFD_RELOC_8_PCREL");
242 return &elf_howto_table[(unsigned int) R_386_PC8 - R_386_ext_offset];
243
244 case BFD_RELOC_VTABLE_INHERIT:
245 TRACE ("BFD_RELOC_VTABLE_INHERIT");
246 return &elf_howto_table[(unsigned int) R_386_GNU_VTINHERIT
247 - R_386_vt_offset];
248
249 case BFD_RELOC_VTABLE_ENTRY:
250 TRACE ("BFD_RELOC_VTABLE_ENTRY");
251 return &elf_howto_table[(unsigned int) R_386_GNU_VTENTRY
252 - R_386_vt_offset];
253
254 default:
255 break;
256 }
257
258 TRACE ("Unknown");
259 return 0;
260 }
261
262 static void
263 elf_i386_info_to_howto (abfd, cache_ptr, dst)
264 bfd *abfd ATTRIBUTE_UNUSED;
265 arelent *cache_ptr ATTRIBUTE_UNUSED;
266 Elf32_Internal_Rela *dst ATTRIBUTE_UNUSED;
267 {
268 abort ();
269 }
270
271 static void
272 elf_i386_info_to_howto_rel (abfd, cache_ptr, dst)
273 bfd *abfd ATTRIBUTE_UNUSED;
274 arelent *cache_ptr;
275 Elf32_Internal_Rel *dst;
276 {
277 unsigned int r_type = ELF32_R_TYPE (dst->r_info);
278 unsigned int indx;
279
280 if ((indx = r_type) >= R_386_standard
281 && ((indx = r_type - R_386_ext_offset) - R_386_standard
282 >= R_386_ext - R_386_standard)
283 && ((indx = r_type - R_386_vt_offset) - R_386_ext
284 >= R_386_vt - R_386_ext))
285 {
286 (*_bfd_error_handler) (_("%s: invalid relocation type %d"),
287 bfd_get_filename (abfd), (int) r_type);
288 indx = (unsigned int) R_386_NONE;
289 }
290 cache_ptr->howto = &elf_howto_table[indx];
291 }
292
293 /* Return whether a symbol name implies a local label. The UnixWare
294 2.1 cc generates temporary symbols that start with .X, so we
295 recognize them here. FIXME: do other SVR4 compilers also use .X?.
296 If so, we should move the .X recognition into
297 _bfd_elf_is_local_label_name. */
298
299 static boolean
300 elf_i386_is_local_label_name (abfd, name)
301 bfd *abfd;
302 const char *name;
303 {
304 if (name[0] == '.' && name[1] == 'X')
305 return true;
306
307 return _bfd_elf_is_local_label_name (abfd, name);
308 }
309 \f
310 /* Functions for the i386 ELF linker. */
311
312 /* The name of the dynamic interpreter. This is put in the .interp
313 section. */
314
315 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1"
316
317 /* The size in bytes of an entry in the procedure linkage table. */
318
319 #define PLT_ENTRY_SIZE 16
320
321 /* The first entry in an absolute procedure linkage table looks like
322 this. See the SVR4 ABI i386 supplement to see how this works. */
323
324 static const bfd_byte elf_i386_plt0_entry[PLT_ENTRY_SIZE] =
325 {
326 0xff, 0x35, /* pushl contents of address */
327 0, 0, 0, 0, /* replaced with address of .got + 4. */
328 0xff, 0x25, /* jmp indirect */
329 0, 0, 0, 0, /* replaced with address of .got + 8. */
330 0, 0, 0, 0 /* pad out to 16 bytes. */
331 };
332
333 /* Subsequent entries in an absolute procedure linkage table look like
334 this. */
335
336 static const bfd_byte elf_i386_plt_entry[PLT_ENTRY_SIZE] =
337 {
338 0xff, 0x25, /* jmp indirect */
339 0, 0, 0, 0, /* replaced with address of this symbol in .got. */
340 0x68, /* pushl immediate */
341 0, 0, 0, 0, /* replaced with offset into relocation table. */
342 0xe9, /* jmp relative */
343 0, 0, 0, 0 /* replaced with offset to start of .plt. */
344 };
345
346 /* The first entry in a PIC procedure linkage table look like this. */
347
348 static const bfd_byte elf_i386_pic_plt0_entry[PLT_ENTRY_SIZE] =
349 {
350 0xff, 0xb3, 4, 0, 0, 0, /* pushl 4(%ebx) */
351 0xff, 0xa3, 8, 0, 0, 0, /* jmp *8(%ebx) */
352 0, 0, 0, 0 /* pad out to 16 bytes. */
353 };
354
355 /* Subsequent entries in a PIC procedure linkage table look like this. */
356
357 static const bfd_byte elf_i386_pic_plt_entry[PLT_ENTRY_SIZE] =
358 {
359 0xff, 0xa3, /* jmp *offset(%ebx) */
360 0, 0, 0, 0, /* replaced with offset of this symbol in .got. */
361 0x68, /* pushl immediate */
362 0, 0, 0, 0, /* replaced with offset into relocation table. */
363 0xe9, /* jmp relative */
364 0, 0, 0, 0 /* replaced with offset to start of .plt. */
365 };
366
367 /* The i386 linker needs to keep track of the number of relocs that it
368 decides to copy as dynamic relocs in check_relocs for each symbol.
369 This is so that it can later discard them if they are found to be
370 unnecessary. We store the information in a field extending the
371 regular ELF linker hash table. */
372
373 struct elf_i386_dyn_relocs
374 {
375 /* Next section. */
376 struct elf_i386_dyn_relocs *next;
377 /* A section in dynobj. */
378 asection *section;
379 /* Number of relocs copied in this section. */
380 bfd_size_type count;
381 };
382
383 /* i386 ELF linker hash entry. */
384
385 struct elf_i386_link_hash_entry
386 {
387 struct elf_link_hash_entry root;
388
389 /* Number of PC relative relocs copied for this symbol. */
390 struct elf_i386_dyn_relocs *dyn_relocs;
391 };
392
393 /* i386 ELF linker hash table. */
394
395 struct elf_i386_link_hash_table
396 {
397 struct elf_link_hash_table root;
398
399 /* Short-cuts to get to dynamic linker sections. */
400 asection *sgot;
401 asection *sgotplt;
402 asection *srelgot;
403 asection *splt;
404 asection *srelplt;
405 asection *sdynbss;
406 asection *srelbss;
407 };
408
409 /* Get the i386 ELF linker hash table from a link_info structure. */
410
411 #define elf_i386_hash_table(p) \
412 ((struct elf_i386_link_hash_table *) ((p)->hash))
413
414 /* Create an entry in an i386 ELF linker hash table. */
415
416 static struct bfd_hash_entry *
417 elf_i386_link_hash_newfunc (entry, table, string)
418 struct bfd_hash_entry *entry;
419 struct bfd_hash_table *table;
420 const char *string;
421 {
422 struct elf_i386_link_hash_entry *ret =
423 (struct elf_i386_link_hash_entry *) entry;
424
425 /* Allocate the structure if it has not already been allocated by a
426 subclass. */
427 if (ret == (struct elf_i386_link_hash_entry *) NULL)
428 ret = ((struct elf_i386_link_hash_entry *)
429 bfd_hash_allocate (table,
430 sizeof (struct elf_i386_link_hash_entry)));
431 if (ret == (struct elf_i386_link_hash_entry *) NULL)
432 return (struct bfd_hash_entry *) ret;
433
434 /* Call the allocation method of the superclass. */
435 ret = ((struct elf_i386_link_hash_entry *)
436 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
437 table, string));
438 if (ret != (struct elf_i386_link_hash_entry *) NULL)
439 {
440 ret->dyn_relocs = NULL;
441 }
442
443 return (struct bfd_hash_entry *) ret;
444 }
445
446 /* Create an i386 ELF linker hash table. */
447
448 static struct bfd_link_hash_table *
449 elf_i386_link_hash_table_create (abfd)
450 bfd *abfd;
451 {
452 struct elf_i386_link_hash_table *ret;
453
454 ret = ((struct elf_i386_link_hash_table *)
455 bfd_alloc (abfd, sizeof (struct elf_i386_link_hash_table)));
456 if (ret == (struct elf_i386_link_hash_table *) NULL)
457 return NULL;
458
459 if (! _bfd_elf_link_hash_table_init (&ret->root, abfd,
460 elf_i386_link_hash_newfunc))
461 {
462 bfd_release (abfd, ret);
463 return NULL;
464 }
465
466 ret->sgot = NULL;
467 ret->sgotplt = NULL;
468 ret->srelgot = NULL;
469 ret->splt = NULL;
470 ret->srelplt = NULL;
471 ret->sdynbss = NULL;
472 ret->srelbss = NULL;
473
474 return &ret->root.root;
475 }
476
477 /* Create .got, .gotplt, and .rel.got sections in DYNOBJ, and set up
478 shortcuts to them in our hash table. */
479
480 static boolean
481 create_got_section (dynobj, info)
482 bfd *dynobj;
483 struct bfd_link_info *info;
484 {
485 struct elf_i386_link_hash_table *htab;
486
487 if (! _bfd_elf_create_got_section (dynobj, info))
488 return false;
489
490 htab = elf_i386_hash_table (info);
491 htab->sgot = bfd_get_section_by_name (dynobj, ".got");
492 htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
493 if (!htab->sgot || !htab->sgotplt)
494 abort ();
495
496 htab->srelgot = bfd_make_section (dynobj, ".rel.got");
497 if (htab->srelgot == NULL
498 || ! bfd_set_section_flags (dynobj, htab->srelgot,
499 (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
500 | SEC_IN_MEMORY | SEC_LINKER_CREATED
501 | SEC_READONLY))
502 || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2))
503 return false;
504 return true;
505 }
506
507 /* Create .plt, .rel.plt, .got, .got.plt, .rel.got, .dynbss, and
508 .rel.bss sections in DYNOBJ, and set up shortcuts to them in our
509 hash table. */
510
511 static boolean
512 elf_i386_create_dynamic_sections (dynobj, info)
513 bfd *dynobj;
514 struct bfd_link_info *info;
515 {
516 struct elf_i386_link_hash_table *htab;
517
518 htab = elf_i386_hash_table (info);
519 if (!htab->sgot && !create_got_section (dynobj, info))
520 return false;
521
522 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
523 return false;
524
525 htab->splt = bfd_get_section_by_name (dynobj, ".plt");
526 htab->srelplt = bfd_get_section_by_name (dynobj, ".rel.plt");
527 htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
528 if (!info->shared)
529 htab->srelbss = bfd_get_section_by_name (dynobj, ".rel.bss");
530
531 if (!htab->splt || !htab->srelplt || !htab->sdynbss
532 || (!info->shared && !htab->srelbss))
533 abort ();
534
535 return true;
536 }
537
538 /* Look through the relocs for a section during the first phase, and
539 allocate space in the global offset table or procedure linkage
540 table. */
541
542 static boolean
543 elf_i386_check_relocs (abfd, info, sec, relocs)
544 bfd *abfd;
545 struct bfd_link_info *info;
546 asection *sec;
547 const Elf_Internal_Rela *relocs;
548 {
549 struct elf_i386_link_hash_table *htab;
550 bfd *dynobj;
551 Elf_Internal_Shdr *symtab_hdr;
552 struct elf_link_hash_entry **sym_hashes;
553 bfd_signed_vma *local_got_refcounts;
554 const Elf_Internal_Rela *rel;
555 const Elf_Internal_Rela *rel_end;
556 asection *sreloc;
557
558 if (info->relocateable)
559 return true;
560
561 htab = elf_i386_hash_table (info);
562 dynobj = htab->root.dynobj;
563 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
564 sym_hashes = elf_sym_hashes (abfd);
565 local_got_refcounts = elf_local_got_refcounts (abfd);
566
567 sreloc = NULL;
568
569 rel_end = relocs + sec->reloc_count;
570 for (rel = relocs; rel < rel_end; rel++)
571 {
572 unsigned long r_symndx;
573 struct elf_link_hash_entry *h;
574
575 r_symndx = ELF32_R_SYM (rel->r_info);
576
577 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
578 {
579 if (abfd->my_archive)
580 (*_bfd_error_handler) (_("%s(%s): bad symbol index: %d"),
581 bfd_get_filename (abfd->my_archive),
582 bfd_get_filename (abfd),
583 r_symndx);
584 else
585 (*_bfd_error_handler) (_("%s: bad symbol index: %d"),
586 bfd_get_filename (abfd),
587 r_symndx);
588 return false;
589 }
590
591 if (r_symndx < symtab_hdr->sh_info)
592 h = NULL;
593 else
594 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
595
596 /* Some relocs require a global offset table. */
597 if (htab->sgot == NULL)
598 {
599 switch (ELF32_R_TYPE (rel->r_info))
600 {
601 case R_386_GOT32:
602 case R_386_GOTOFF:
603 case R_386_GOTPC:
604 if (dynobj == NULL)
605 htab->root.dynobj = dynobj = abfd;
606 if (!create_got_section (dynobj, info))
607 return false;
608 break;
609
610 default:
611 break;
612 }
613 }
614
615 switch (ELF32_R_TYPE (rel->r_info))
616 {
617 case R_386_GOT32:
618 /* This symbol requires a global offset table entry. */
619 if (h != NULL)
620 {
621 if (h->got.refcount == -1)
622 h->got.refcount = 1;
623 else
624 h->got.refcount += 1;
625 }
626 else
627 {
628 /* This is a global offset table entry for a local symbol. */
629 if (local_got_refcounts == NULL)
630 {
631 size_t size;
632
633 size = symtab_hdr->sh_info * sizeof (bfd_signed_vma);
634 local_got_refcounts = ((bfd_signed_vma *)
635 bfd_alloc (abfd, size));
636 if (local_got_refcounts == NULL)
637 return false;
638 elf_local_got_refcounts (abfd) = local_got_refcounts;
639 memset (local_got_refcounts, -1, size);
640 }
641 if (local_got_refcounts[r_symndx] == -1)
642 local_got_refcounts[r_symndx] = 1;
643 else
644 local_got_refcounts[r_symndx] += 1;
645 }
646 break;
647
648 case R_386_PLT32:
649 /* This symbol requires a procedure linkage table entry. We
650 actually build the entry in adjust_dynamic_symbol,
651 because this might be a case of linking PIC code which is
652 never referenced by a dynamic object, in which case we
653 don't need to generate a procedure linkage table entry
654 after all. */
655
656 /* If this is a local symbol, we resolve it directly without
657 creating a procedure linkage table entry. */
658 if (h == NULL)
659 continue;
660
661 if (h->plt.refcount == -1)
662 {
663 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
664 h->plt.refcount = 1;
665 }
666 else
667 h->plt.refcount += 1;
668 break;
669
670 case R_386_32:
671 case R_386_PC32:
672 if (h != NULL && !info->shared)
673 {
674 /* If this reloc is in a read-only section, we might
675 need a copy reloc. */
676 if ((sec->flags & SEC_READONLY) != 0)
677 h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
678
679 /* We may need a .plt entry if the function this reloc
680 refers to is in a shared lib. */
681 if (h->plt.refcount == -1)
682 h->plt.refcount = 1;
683 else
684 h->plt.refcount += 1;
685 }
686
687 /* If we are creating a shared library, and this is a reloc
688 against a global symbol, or a non PC relative reloc
689 against a local symbol, then we need to copy the reloc
690 into the shared library. However, if we are linking with
691 -Bsymbolic, we do not need to copy a reloc against a
692 global symbol which is defined in an object we are
693 including in the link (i.e., DEF_REGULAR is set). At
694 this point we have not seen all the input files, so it is
695 possible that DEF_REGULAR is not set now but will be set
696 later (it is never cleared). In case of a weak definition,
697 DEF_REGULAR may be cleared later by a strong definition in
698 a shared library. We account for that possibility below by
699 storing information in the relocs_copied field of the hash
700 table entry. A similar situation occurs when creating
701 shared libraries and symbol visibility changes render the
702 symbol local.
703 If on the other hand, we are creating an executable, we
704 may need to keep relocations for symbols satisfied by a
705 dynamic library if we manage to avoid copy relocs for the
706 symbol. */
707 if ((info->shared
708 && (sec->flags & SEC_ALLOC) != 0
709 && (ELF32_R_TYPE (rel->r_info) != R_386_PC32
710 || (h != NULL
711 && (! info->symbolic
712 || h->root.type == bfd_link_hash_defweak
713 || (h->elf_link_hash_flags
714 & ELF_LINK_HASH_DEF_REGULAR) == 0))))
715 || (!info->shared
716 && (sec->flags & SEC_ALLOC) != 0
717 && h != NULL
718 && (h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
719 && (h->root.type == bfd_link_hash_defweak
720 || (h->elf_link_hash_flags
721 & ELF_LINK_HASH_DEF_REGULAR) == 0)))
722 {
723 /* We must copy these reloc types into the output file.
724 Create a reloc section in dynobj and make room for
725 this reloc. */
726 if (dynobj == NULL)
727 htab->root.dynobj = dynobj = abfd;
728
729 if (sreloc == NULL)
730 {
731 const char *name;
732
733 name = (bfd_elf_string_from_elf_section
734 (abfd,
735 elf_elfheader (abfd)->e_shstrndx,
736 elf_section_data (sec)->rel_hdr.sh_name));
737 if (name == NULL)
738 return false;
739
740 if (strncmp (name, ".rel", 4) != 0
741 || strcmp (bfd_get_section_name (abfd, sec),
742 name + 4) != 0)
743 {
744 if (abfd->my_archive)
745 (*_bfd_error_handler) (_("%s(%s): bad relocation section name `%s\'"),
746 bfd_get_filename (abfd->my_archive),
747 bfd_get_filename (abfd),
748 name);
749 else
750 (*_bfd_error_handler) (_("%s: bad relocation section name `%s\'"),
751 bfd_get_filename (abfd),
752 name);
753 }
754
755 sreloc = bfd_get_section_by_name (dynobj, name);
756 if (sreloc == NULL)
757 {
758 flagword flags;
759
760 sreloc = bfd_make_section (dynobj, name);
761 flags = (SEC_HAS_CONTENTS | SEC_READONLY
762 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
763 if ((sec->flags & SEC_ALLOC) != 0)
764 flags |= SEC_ALLOC | SEC_LOAD;
765 if (sreloc == NULL
766 || ! bfd_set_section_flags (dynobj, sreloc, flags)
767 || ! bfd_set_section_alignment (dynobj, sreloc, 2))
768 return false;
769 }
770 }
771
772 sreloc->_raw_size += sizeof (Elf32_External_Rel);
773
774 /* If this is a global symbol, we count the number of PC
775 relative relocations we have entered for this symbol,
776 so that we can discard them later as necessary. Note
777 that this function is only called if we are using an
778 elf_i386 linker hash table, which means that h is
779 really a pointer to an elf_i386_link_hash_entry. */
780 if (!info->shared
781 || (h != NULL
782 && ELF32_R_TYPE (rel->r_info) == R_386_PC32))
783 {
784 struct elf_i386_link_hash_entry *eh;
785 struct elf_i386_dyn_relocs *p;
786
787 eh = (struct elf_i386_link_hash_entry *) h;
788
789 for (p = eh->dyn_relocs; p != NULL; p = p->next)
790 if (p->section == sreloc)
791 break;
792
793 if (p == NULL)
794 {
795 p = ((struct elf_i386_dyn_relocs *)
796 bfd_alloc (dynobj, sizeof *p));
797 if (p == NULL)
798 return false;
799 p->next = eh->dyn_relocs;
800 eh->dyn_relocs = p;
801 p->section = sreloc;
802 p->count = 0;
803 }
804
805 ++p->count;
806 }
807 }
808
809 break;
810
811 /* This relocation describes the C++ object vtable hierarchy.
812 Reconstruct it for later use during GC. */
813 case R_386_GNU_VTINHERIT:
814 if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
815 return false;
816 break;
817
818 /* This relocation describes which C++ vtable entries are actually
819 used. Record for later use during GC. */
820 case R_386_GNU_VTENTRY:
821 if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_offset))
822 return false;
823 break;
824
825 default:
826 break;
827 }
828 }
829
830 return true;
831 }
832
833 /* Return the section that should be marked against GC for a given
834 relocation. */
835
836 static asection *
837 elf_i386_gc_mark_hook (abfd, info, rel, h, sym)
838 bfd *abfd;
839 struct bfd_link_info *info ATTRIBUTE_UNUSED;
840 Elf_Internal_Rela *rel;
841 struct elf_link_hash_entry *h;
842 Elf_Internal_Sym *sym;
843 {
844 if (h != NULL)
845 {
846 switch (ELF32_R_TYPE (rel->r_info))
847 {
848 case R_386_GNU_VTINHERIT:
849 case R_386_GNU_VTENTRY:
850 break;
851
852 default:
853 switch (h->root.type)
854 {
855 case bfd_link_hash_defined:
856 case bfd_link_hash_defweak:
857 return h->root.u.def.section;
858
859 case bfd_link_hash_common:
860 return h->root.u.c.p->section;
861
862 default:
863 break;
864 }
865 }
866 }
867 else
868 {
869 if (!(elf_bad_symtab (abfd)
870 && ELF_ST_BIND (sym->st_info) != STB_LOCAL)
871 && ! ((sym->st_shndx <= 0 || sym->st_shndx >= SHN_LORESERVE)
872 && sym->st_shndx != SHN_COMMON))
873 {
874 return bfd_section_from_elf_index (abfd, sym->st_shndx);
875 }
876 }
877
878 return NULL;
879 }
880
881 /* Update the got entry reference counts for the section being removed. */
882
883 static boolean
884 elf_i386_gc_sweep_hook (abfd, info, sec, relocs)
885 bfd *abfd;
886 struct bfd_link_info *info;
887 asection *sec;
888 const Elf_Internal_Rela *relocs;
889 {
890 Elf_Internal_Shdr *symtab_hdr;
891 struct elf_link_hash_entry **sym_hashes;
892 bfd_signed_vma *local_got_refcounts;
893 const Elf_Internal_Rela *rel, *relend;
894 unsigned long r_symndx;
895 struct elf_link_hash_entry *h;
896 bfd *dynobj;
897
898 dynobj = elf_hash_table (info)->dynobj;
899 if (dynobj == NULL)
900 return true;
901
902 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
903 sym_hashes = elf_sym_hashes (abfd);
904 local_got_refcounts = elf_local_got_refcounts (abfd);
905
906 relend = relocs + sec->reloc_count;
907 for (rel = relocs; rel < relend; rel++)
908 switch (ELF32_R_TYPE (rel->r_info))
909 {
910 case R_386_GOT32:
911 case R_386_GOTOFF:
912 case R_386_GOTPC:
913 r_symndx = ELF32_R_SYM (rel->r_info);
914 if (r_symndx >= symtab_hdr->sh_info)
915 {
916 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
917 if (h->got.refcount > 0)
918 h->got.refcount -= 1;
919 }
920 else if (local_got_refcounts != NULL)
921 {
922 if (local_got_refcounts[r_symndx] > 0)
923 local_got_refcounts[r_symndx] -= 1;
924 }
925 break;
926
927 case R_386_32:
928 case R_386_PC32:
929 if (info->shared)
930 break;
931 /* Fall through. */
932
933 case R_386_PLT32:
934 r_symndx = ELF32_R_SYM (rel->r_info);
935 if (r_symndx >= symtab_hdr->sh_info)
936 {
937 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
938 if (h->plt.refcount > 0)
939 h->plt.refcount -= 1;
940 }
941 break;
942
943 default:
944 break;
945 }
946
947 return true;
948 }
949
950 /* Adjust a symbol defined by a dynamic object and referenced by a
951 regular object. The current definition is in some section of the
952 dynamic object, but we're not including those sections. We have to
953 change the definition to something the rest of the link can
954 understand. */
955
956 static boolean
957 elf_i386_adjust_dynamic_symbol (info, h)
958 struct bfd_link_info *info;
959 struct elf_link_hash_entry *h;
960 {
961 struct elf_i386_link_hash_table *htab;
962 bfd *dynobj;
963 asection *s;
964 unsigned int power_of_two;
965
966 htab = elf_i386_hash_table (info);
967 dynobj = htab->root.dynobj;
968
969 /* If this is a function, put it in the procedure linkage table. We
970 will fill in the contents of the procedure linkage table later,
971 when we know the address of the .got section. */
972 if (h->type == STT_FUNC
973 || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
974 {
975 if (h->plt.refcount <= 0
976 || (! info->shared
977 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0
978 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0))
979 {
980 /* This case can occur if we saw a PLT32 reloc in an input
981 file, but the symbol was never referred to by a dynamic
982 object, or if all references were garbage collected. In
983 such a case, we don't actually need to build a procedure
984 linkage table, and we can just do a PC32 reloc instead. */
985 h->plt.refcount = (bfd_vma) -1;
986 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
987 }
988
989 return true;
990 }
991 else
992 /* It's possible that we incorrectly decided a .plt reloc was
993 needed for an R_386_PC32 reloc to a non-function sym in
994 check_relocs. We can't decide accurately between function and
995 non-function syms in check-relocs; Objects loaded later in
996 the link may change h->type. So fix it now. */
997 h->plt.refcount = (bfd_vma) -1;
998
999 /* If this is a weak symbol, and there is a real definition, the
1000 processor independent code will have arranged for us to see the
1001 real definition first, and we can just use the same value. */
1002 if (h->weakdef != NULL)
1003 {
1004 BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
1005 || h->weakdef->root.type == bfd_link_hash_defweak);
1006 h->root.u.def.section = h->weakdef->root.u.def.section;
1007 h->root.u.def.value = h->weakdef->root.u.def.value;
1008 return true;
1009 }
1010
1011 /* This is a reference to a symbol defined by a dynamic object which
1012 is not a function. */
1013
1014 /* If we are creating a shared library, we must presume that the
1015 only references to the symbol are via the global offset table.
1016 For such cases we need not do anything here; the relocations will
1017 be handled correctly by relocate_section. */
1018 if (info->shared)
1019 return true;
1020
1021 /* If there are no references to this symbol that do not use the
1022 GOT, we don't need to generate a copy reloc. */
1023 if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0)
1024 return true;
1025
1026 /* We must allocate the symbol in our .dynbss section, which will
1027 become part of the .bss section of the executable. There will be
1028 an entry for this symbol in the .dynsym section. The dynamic
1029 object will contain position independent code, so all references
1030 from the dynamic object to this symbol will go through the global
1031 offset table. The dynamic linker will use the .dynsym entry to
1032 determine the address it must put in the global offset table, so
1033 both the dynamic object and the regular object will refer to the
1034 same memory location for the variable. */
1035
1036 s = htab->sdynbss;
1037 if (s == NULL)
1038 abort ();
1039
1040 /* We must generate a R_386_COPY reloc to tell the dynamic linker to
1041 copy the initial value out of the dynamic object and into the
1042 runtime process image. We need to remember the offset into the
1043 .rel.bss section we are going to use. */
1044 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
1045 {
1046 asection *srel;
1047
1048 srel = htab->srelbss;
1049 if (srel == NULL)
1050 abort ();
1051 srel->_raw_size += sizeof (Elf32_External_Rel);
1052 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
1053 }
1054
1055 /* We need to figure out the alignment required for this symbol. I
1056 have no idea how ELF linkers handle this. */
1057 power_of_two = bfd_log2 (h->size);
1058 if (power_of_two > 3)
1059 power_of_two = 3;
1060
1061 /* Apply the required alignment. */
1062 s->_raw_size = BFD_ALIGN (s->_raw_size,
1063 (bfd_size_type) (1 << power_of_two));
1064 if (power_of_two > bfd_get_section_alignment (dynobj, s))
1065 {
1066 if (! bfd_set_section_alignment (dynobj, s, power_of_two))
1067 return false;
1068 }
1069
1070 /* Define the symbol as being at this point in the section. */
1071 h->root.u.def.section = s;
1072 h->root.u.def.value = s->_raw_size;
1073
1074 /* Increment the section size to make room for the symbol. */
1075 s->_raw_size += h->size;
1076
1077 return true;
1078 }
1079
1080 /* This is the condition under which elf_i386_finish_dynamic_symbol
1081 will be called from elflink.h. If elflink.h doesn't call our
1082 finish_dynamic_symbol routine, we'll need to do something about
1083 initializing any .plt and .got entries in elf_i386_relocate_section. */
1084 #define WILL_CALL_FINISH_DYNAMIC_SYMBOL(DYN, INFO, H) \
1085 ((DYN) \
1086 && ((INFO)->shared \
1087 || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) \
1088 && ((H)->dynindx != -1 \
1089 || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0))
1090
1091 /* Allocate space in .plt, .got and associated reloc sections for
1092 global syms. Also discards space allocated for relocs in the
1093 check_relocs function that we subsequently have found to be
1094 unneeded. */
1095
1096 static boolean
1097 allocate_plt_and_got_and_discard_relocs (h, inf)
1098 struct elf_link_hash_entry *h;
1099 PTR inf;
1100 {
1101 struct bfd_link_info *info;
1102 struct elf_i386_link_hash_table *htab;
1103 asection *s;
1104 struct elf_i386_link_hash_entry *eh;
1105
1106 if (h->root.type == bfd_link_hash_indirect
1107 || h->root.type == bfd_link_hash_warning)
1108 return true;
1109
1110 info = (struct bfd_link_info *) inf;
1111 htab = elf_i386_hash_table (info);
1112
1113 if (htab->root.dynamic_sections_created
1114 && h->plt.refcount > 0)
1115 {
1116 /* Make sure this symbol is output as a dynamic symbol.
1117 Undefined weak syms won't yet be marked as dynamic. */
1118 if (h->dynindx == -1
1119 && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1120 {
1121 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
1122 return false;
1123 }
1124
1125 s = htab->splt;
1126 if (s == NULL)
1127 abort ();
1128
1129 /* If this is the first .plt entry, make room for the special
1130 first entry. */
1131 if (s->_raw_size == 0)
1132 s->_raw_size += PLT_ENTRY_SIZE;
1133
1134 h->plt.offset = s->_raw_size;
1135
1136 /* If this symbol is not defined in a regular file, and we are
1137 not generating a shared library, then set the symbol to this
1138 location in the .plt. This is required to make function
1139 pointers compare as equal between the normal executable and
1140 the shared library. */
1141 if (! info->shared
1142 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1143 {
1144 h->root.u.def.section = s;
1145 h->root.u.def.value = h->plt.offset;
1146 }
1147
1148 /* Make room for this entry. */
1149 s->_raw_size += PLT_ENTRY_SIZE;
1150
1151 /* We also need to make an entry in the .got.plt section, which
1152 will be placed in the .got section by the linker script. */
1153 s = htab->sgotplt;
1154 if (s == NULL)
1155 abort ();
1156 s->_raw_size += 4;
1157
1158 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info, h))
1159 {
1160 /* We also need to make an entry in the .rel.plt section. */
1161 s = htab->srelplt;
1162 if (s == NULL)
1163 abort ();
1164 s->_raw_size += sizeof (Elf32_External_Rel);
1165 }
1166 }
1167 else
1168 {
1169 h->plt.offset = (bfd_vma) -1;
1170 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
1171 }
1172
1173 if (h->got.refcount > 0)
1174 {
1175 boolean dyn;
1176
1177 /* Make sure this symbol is output as a dynamic symbol.
1178 Undefined weak syms won't yet be marked as dynamic. */
1179 if (h->dynindx == -1
1180 && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1181 {
1182 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
1183 return false;
1184 }
1185
1186 s = htab->sgot;
1187 h->got.offset = s->_raw_size;
1188 s->_raw_size += 4;
1189 dyn = htab->root.dynamic_sections_created;
1190 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h))
1191 htab->srelgot->_raw_size += sizeof (Elf32_External_Rel);
1192 }
1193 else
1194 h->got.offset = (bfd_vma) -1;
1195
1196 /* In the shared -Bsymbolic case, discard space allocated for
1197 dynamic relocs against symbols which turn out to be defined
1198 in regular objects. For the normal shared case, discard space
1199 for relocs that have become local due to symbol visibility
1200 changes. For the non-shared case, discard space for symbols
1201 which turn out to need copy relocs or are not dynamic. */
1202
1203 eh = (struct elf_i386_link_hash_entry *) h;
1204 if (eh->dyn_relocs == NULL)
1205 return true;
1206
1207 if (!info->shared
1208 && (h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
1209 && ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
1210 || (htab->root.dynamic_sections_created
1211 && (h->root.type == bfd_link_hash_undefweak
1212 || h->root.type == bfd_link_hash_undefined))))
1213 {
1214 /* Make sure this symbol is output as a dynamic symbol.
1215 Undefined weak syms won't yet be marked as dynamic. */
1216 if (h->dynindx == -1
1217 && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1218 {
1219 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
1220 return false;
1221 }
1222
1223 /* If that succeeded, we know we'll be keeping all the relocs. */
1224 if (h->dynindx != -1)
1225 return true;
1226 }
1227
1228 if (!info->shared
1229 || ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0
1230 && ((h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0
1231 || info->symbolic)))
1232 {
1233 struct elf_i386_dyn_relocs *c;
1234
1235 for (c = eh->dyn_relocs; c != NULL; c = c->next)
1236 c->section->_raw_size -= c->count * sizeof (Elf32_External_Rel);
1237 }
1238
1239 return true;
1240 }
1241
1242 /* Set the sizes of the dynamic sections. */
1243
1244 static boolean
1245 elf_i386_size_dynamic_sections (output_bfd, info)
1246 bfd *output_bfd;
1247 struct bfd_link_info *info;
1248 {
1249 struct elf_i386_link_hash_table *htab;
1250 bfd *dynobj;
1251 asection *s;
1252 boolean relocs;
1253 boolean reltext;
1254 bfd *i;
1255
1256 htab = elf_i386_hash_table (info);
1257 dynobj = htab->root.dynobj;
1258 if (dynobj == NULL)
1259 abort ();
1260
1261 if (htab->root.dynamic_sections_created)
1262 {
1263 /* Set the contents of the .interp section to the interpreter. */
1264 if (! info->shared)
1265 {
1266 s = bfd_get_section_by_name (dynobj, ".interp");
1267 if (s == NULL)
1268 abort ();
1269 s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
1270 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1271 }
1272 }
1273
1274 /* Set up .got offsets for local syms. */
1275 for (i = info->input_bfds; i; i = i->link_next)
1276 {
1277 bfd_signed_vma *local_got;
1278 bfd_signed_vma *end_local_got;
1279 bfd_size_type locsymcount;
1280 Elf_Internal_Shdr *symtab_hdr;
1281 asection *srel;
1282
1283 if (bfd_get_flavour (i) != bfd_target_elf_flavour)
1284 continue;
1285
1286 local_got = elf_local_got_refcounts (i);
1287 if (!local_got)
1288 continue;
1289
1290 symtab_hdr = &elf_tdata (i)->symtab_hdr;
1291 locsymcount = symtab_hdr->sh_info;
1292 end_local_got = local_got + locsymcount;
1293 s = htab->sgot;
1294 srel = htab->srelgot;
1295 for (; local_got < end_local_got; ++local_got)
1296 {
1297 if (*local_got > 0)
1298 {
1299 *local_got = s->_raw_size;
1300 s->_raw_size += 4;
1301 if (info->shared)
1302 srel->_raw_size += sizeof (Elf32_External_Rel);
1303 }
1304 else
1305 *local_got = (bfd_vma) -1;
1306 }
1307 }
1308
1309 /* Allocate global sym .plt and .got entries. Also discard all
1310 unneeded relocs. */
1311 elf_link_hash_traverse (&htab->root,
1312 allocate_plt_and_got_and_discard_relocs,
1313 (PTR) info);
1314
1315 /* We now have determined the sizes of the various dynamic sections.
1316 Allocate memory for them. */
1317 relocs = false;
1318 reltext = false;
1319 for (s = dynobj->sections; s != NULL; s = s->next)
1320 {
1321 if ((s->flags & SEC_LINKER_CREATED) == 0)
1322 continue;
1323
1324 if (s == htab->splt
1325 || s == htab->sgot
1326 || s == htab->sgotplt)
1327 {
1328 /* Strip this section if we don't need it; see the
1329 comment below. */
1330 }
1331 else if (strncmp (bfd_get_section_name (dynobj, s), ".rel", 4) == 0)
1332 {
1333 if (s->_raw_size == 0)
1334 {
1335 /* If we don't need this section, strip it from the
1336 output file. This is mostly to handle .rel.bss and
1337 .rel.plt. We must create both sections in
1338 create_dynamic_sections, because they must be created
1339 before the linker maps input sections to output
1340 sections. The linker does that before
1341 adjust_dynamic_symbol is called, and it is that
1342 function which decides whether anything needs to go
1343 into these sections. */
1344 }
1345 else
1346 {
1347 asection *target;
1348
1349 /* Remember whether there are any reloc sections other
1350 than .rel.plt. */
1351 if (s != htab->srelplt)
1352 {
1353 const char *outname;
1354
1355 relocs = true;
1356
1357 /* If this relocation section applies to a read only
1358 section, then we probably need a DT_TEXTREL
1359 entry. The entries in the .rel.plt section
1360 really apply to the .got section, which we
1361 created ourselves and so know is not readonly. */
1362 outname = bfd_get_section_name (output_bfd,
1363 s->output_section);
1364 target = bfd_get_section_by_name (output_bfd, outname + 4);
1365 if (target != NULL
1366 && (target->flags & SEC_READONLY) != 0
1367 && (target->flags & SEC_ALLOC) != 0)
1368 reltext = true;
1369 }
1370
1371 /* We use the reloc_count field as a counter if we need
1372 to copy relocs into the output file. */
1373 s->reloc_count = 0;
1374 }
1375 }
1376 else
1377 {
1378 /* It's not one of our sections, so don't allocate space. */
1379 continue;
1380 }
1381
1382 if (s->_raw_size == 0)
1383 {
1384 _bfd_strip_section_from_output (info, s);
1385 continue;
1386 }
1387
1388 /* Allocate memory for the section contents. We use bfd_zalloc
1389 here in case unused entries are not reclaimed before the
1390 section's contents are written out. This should not happen,
1391 but this way if it does, we get a R_386_NONE reloc instead
1392 of garbage. */
1393 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size);
1394 if (s->contents == NULL)
1395 return false;
1396 }
1397
1398 if (htab->root.dynamic_sections_created)
1399 {
1400 /* Add some entries to the .dynamic section. We fill in the
1401 values later, in elf_i386_finish_dynamic_sections, but we
1402 must add the entries now so that we get the correct size for
1403 the .dynamic section. The DT_DEBUG entry is filled in by the
1404 dynamic linker and used by the debugger. */
1405 if (! info->shared)
1406 {
1407 if (! bfd_elf32_add_dynamic_entry (info, DT_DEBUG, 0))
1408 return false;
1409 }
1410
1411 if (htab->splt->_raw_size != 0)
1412 {
1413 if (! bfd_elf32_add_dynamic_entry (info, DT_PLTGOT, 0)
1414 || ! bfd_elf32_add_dynamic_entry (info, DT_PLTRELSZ, 0)
1415 || ! bfd_elf32_add_dynamic_entry (info, DT_PLTREL, DT_REL)
1416 || ! bfd_elf32_add_dynamic_entry (info, DT_JMPREL, 0))
1417 return false;
1418 }
1419
1420 if (relocs)
1421 {
1422 if (! bfd_elf32_add_dynamic_entry (info, DT_REL, 0)
1423 || ! bfd_elf32_add_dynamic_entry (info, DT_RELSZ, 0)
1424 || ! bfd_elf32_add_dynamic_entry (info, DT_RELENT,
1425 sizeof (Elf32_External_Rel)))
1426 return false;
1427 }
1428
1429 if (reltext)
1430 {
1431 if (! bfd_elf32_add_dynamic_entry (info, DT_TEXTREL, 0))
1432 return false;
1433 info->flags |= DF_TEXTREL;
1434 }
1435 }
1436
1437 return true;
1438 }
1439
1440 /* Relocate an i386 ELF section. */
1441
1442 static boolean
1443 elf_i386_relocate_section (output_bfd, info, input_bfd, input_section,
1444 contents, relocs, local_syms, local_sections)
1445 bfd *output_bfd;
1446 struct bfd_link_info *info;
1447 bfd *input_bfd;
1448 asection *input_section;
1449 bfd_byte *contents;
1450 Elf_Internal_Rela *relocs;
1451 Elf_Internal_Sym *local_syms;
1452 asection **local_sections;
1453 {
1454 struct elf_i386_link_hash_table *htab;
1455 bfd *dynobj;
1456 Elf_Internal_Shdr *symtab_hdr;
1457 struct elf_link_hash_entry **sym_hashes;
1458 bfd_vma *local_got_offsets;
1459 asection *sreloc;
1460 Elf_Internal_Rela *rel;
1461 Elf_Internal_Rela *relend;
1462
1463 htab = elf_i386_hash_table (info);
1464 dynobj = htab->root.dynobj;
1465 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1466 sym_hashes = elf_sym_hashes (input_bfd);
1467 local_got_offsets = elf_local_got_offsets (input_bfd);
1468
1469 sreloc = NULL;
1470 rel = relocs;
1471 relend = relocs + input_section->reloc_count;
1472 for (; rel < relend; rel++)
1473 {
1474 int r_type;
1475 reloc_howto_type *howto;
1476 unsigned long r_symndx;
1477 struct elf_link_hash_entry *h;
1478 Elf_Internal_Sym *sym;
1479 asection *sec;
1480 bfd_vma off;
1481 bfd_vma relocation;
1482 boolean unresolved_reloc;
1483 bfd_reloc_status_type r;
1484 unsigned int indx;
1485
1486 r_type = ELF32_R_TYPE (rel->r_info);
1487 if (r_type == (int) R_386_GNU_VTINHERIT
1488 || r_type == (int) R_386_GNU_VTENTRY)
1489 continue;
1490
1491 if ((indx = (unsigned) r_type) >= R_386_standard
1492 && ((indx = (unsigned) r_type - R_386_ext_offset) - R_386_standard
1493 >= R_386_ext - R_386_standard))
1494 {
1495 bfd_set_error (bfd_error_bad_value);
1496 return false;
1497 }
1498 howto = elf_howto_table + indx;
1499
1500 r_symndx = ELF32_R_SYM (rel->r_info);
1501
1502 if (info->relocateable)
1503 {
1504 /* This is a relocateable link. We don't have to change
1505 anything, unless the reloc is against a section symbol,
1506 in which case we have to adjust according to where the
1507 section symbol winds up in the output section. */
1508 if (r_symndx < symtab_hdr->sh_info)
1509 {
1510 sym = local_syms + r_symndx;
1511 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
1512 {
1513 bfd_vma val;
1514
1515 sec = local_sections[r_symndx];
1516 val = bfd_get_32 (input_bfd, contents + rel->r_offset);
1517 val += sec->output_offset + sym->st_value;
1518 bfd_put_32 (input_bfd, val, contents + rel->r_offset);
1519 }
1520 }
1521
1522 continue;
1523 }
1524
1525 /* This is a final link. */
1526 h = NULL;
1527 sym = NULL;
1528 sec = NULL;
1529 unresolved_reloc = false;
1530 if (r_symndx < symtab_hdr->sh_info)
1531 {
1532 sym = local_syms + r_symndx;
1533 sec = local_sections[r_symndx];
1534 relocation = (sec->output_section->vma
1535 + sec->output_offset
1536 + sym->st_value);
1537 }
1538 else
1539 {
1540 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1541 while (h->root.type == bfd_link_hash_indirect
1542 || h->root.type == bfd_link_hash_warning)
1543 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1544
1545 relocation = 0;
1546 if (h->root.type == bfd_link_hash_defined
1547 || h->root.type == bfd_link_hash_defweak)
1548 {
1549 sec = h->root.u.def.section;
1550 if (sec->output_section == NULL)
1551 /* Set a flag that will be cleared later if we find a
1552 relocation value for this symbol. output_section
1553 is typically NULL for symbols satisfied by a shared
1554 library. */
1555 unresolved_reloc = true;
1556 else
1557 relocation = (h->root.u.def.value
1558 + sec->output_section->vma
1559 + sec->output_offset);
1560 }
1561 else if (h->root.type == bfd_link_hash_undefweak)
1562 ;
1563 else if (info->shared && !info->symbolic
1564 && !info->no_undefined
1565 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
1566 ;
1567 else
1568 {
1569 if (! ((*info->callbacks->undefined_symbol)
1570 (info, h->root.root.string, input_bfd,
1571 input_section, rel->r_offset,
1572 (!info->shared || info->no_undefined
1573 || ELF_ST_VISIBILITY (h->other)))))
1574 return false;
1575 }
1576 }
1577
1578 switch (r_type)
1579 {
1580 case R_386_GOT32:
1581 /* Relocation is to the entry for this symbol in the global
1582 offset table. */
1583 if (htab->sgot == NULL)
1584 abort ();
1585
1586 if (h != NULL)
1587 {
1588 boolean dyn;
1589
1590 off = h->got.offset;
1591 dyn = htab->root.dynamic_sections_created;
1592 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h)
1593 || (info->shared
1594 && (info->symbolic
1595 || h->dynindx == -1
1596 || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL))
1597 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
1598 {
1599 /* This is actually a static link, or it is a
1600 -Bsymbolic link and the symbol is defined
1601 locally, or the symbol was forced to be local
1602 because of a version file. We must initialize
1603 this entry in the global offset table. Since the
1604 offset must always be a multiple of 4, we use the
1605 least significant bit to record whether we have
1606 initialized it already.
1607
1608 When doing a dynamic link, we create a .rel.got
1609 relocation entry to initialize the value. This
1610 is done in the finish_dynamic_symbol routine. */
1611 if ((off & 1) != 0)
1612 off &= ~1;
1613 else
1614 {
1615 bfd_put_32 (output_bfd, relocation,
1616 htab->sgot->contents + off);
1617 h->got.offset |= 1;
1618 }
1619 }
1620 else
1621 unresolved_reloc = false;
1622 }
1623 else
1624 {
1625 if (local_got_offsets == NULL)
1626 abort ();
1627
1628 off = local_got_offsets[r_symndx];
1629
1630 /* The offset must always be a multiple of 4. We use
1631 the least significant bit to record whether we have
1632 already generated the necessary reloc. */
1633 if ((off & 1) != 0)
1634 off &= ~1;
1635 else
1636 {
1637 bfd_put_32 (output_bfd, relocation,
1638 htab->sgot->contents + off);
1639
1640 if (info->shared)
1641 {
1642 asection *srelgot;
1643 Elf_Internal_Rel outrel;
1644
1645 srelgot = htab->srelgot;
1646 if (srelgot == NULL)
1647 abort ();
1648
1649 outrel.r_offset = (htab->sgot->output_section->vma
1650 + htab->sgot->output_offset
1651 + off);
1652 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
1653 bfd_elf32_swap_reloc_out (output_bfd, &outrel,
1654 (((Elf32_External_Rel *)
1655 srelgot->contents)
1656 + srelgot->reloc_count));
1657 ++srelgot->reloc_count;
1658 }
1659
1660 local_got_offsets[r_symndx] |= 1;
1661 }
1662 }
1663
1664 if (off >= (bfd_vma) -2)
1665 abort ();
1666
1667 relocation = htab->sgot->output_offset + off;
1668 break;
1669
1670 case R_386_GOTOFF:
1671 /* Relocation is relative to the start of the global offset
1672 table. */
1673
1674 /* Note that sgot->output_offset is not involved in this
1675 calculation. We always want the start of .got. If we
1676 defined _GLOBAL_OFFSET_TABLE in a different way, as is
1677 permitted by the ABI, we might have to change this
1678 calculation. */
1679 relocation -= htab->sgot->output_section->vma;
1680 break;
1681
1682 case R_386_GOTPC:
1683 /* Use global offset table as symbol value. */
1684 relocation = htab->sgot->output_section->vma;
1685 unresolved_reloc = false;
1686 break;
1687
1688 case R_386_PLT32:
1689 /* Relocation is to the entry for this symbol in the
1690 procedure linkage table. */
1691
1692 /* Resolve a PLT32 reloc against a local symbol directly,
1693 without using the procedure linkage table. */
1694 if (h == NULL)
1695 break;
1696
1697 if (h->plt.offset == (bfd_vma) -1
1698 || htab->splt == NULL)
1699 {
1700 /* We didn't make a PLT entry for this symbol. This
1701 happens when statically linking PIC code, or when
1702 using -Bsymbolic. */
1703 break;
1704 }
1705
1706 relocation = (htab->splt->output_section->vma
1707 + htab->splt->output_offset
1708 + h->plt.offset);
1709 unresolved_reloc = false;
1710 break;
1711
1712 case R_386_32:
1713 case R_386_PC32:
1714 if ((info->shared
1715 && (input_section->flags & SEC_ALLOC) != 0
1716 && (r_type != R_386_PC32
1717 || (h != NULL
1718 && h->dynindx != -1
1719 && (! info->symbolic
1720 || (h->elf_link_hash_flags
1721 & ELF_LINK_HASH_DEF_REGULAR) == 0))))
1722 || (!info->shared
1723 && (input_section->flags & SEC_ALLOC) != 0
1724 && h != NULL
1725 && h->dynindx != -1
1726 && (h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
1727 && ((h->elf_link_hash_flags
1728 & ELF_LINK_HASH_DEF_DYNAMIC) != 0
1729 || h->root.type == bfd_link_hash_undefweak
1730 || h->root.type == bfd_link_hash_undefined)))
1731 {
1732 Elf_Internal_Rel outrel;
1733 boolean skip, relocate;
1734
1735 /* When generating a shared object, these relocations
1736 are copied into the output file to be resolved at run
1737 time. */
1738
1739 if (sreloc == NULL)
1740 {
1741 const char *name;
1742
1743 name = (bfd_elf_string_from_elf_section
1744 (input_bfd,
1745 elf_elfheader (input_bfd)->e_shstrndx,
1746 elf_section_data (input_section)->rel_hdr.sh_name));
1747 if (name == NULL)
1748 return false;
1749
1750 if (strncmp (name, ".rel", 4) != 0
1751 || strcmp (bfd_get_section_name (input_bfd,
1752 input_section),
1753 name + 4) != 0)
1754 {
1755 if (input_bfd->my_archive)
1756 (*_bfd_error_handler)\
1757 (_("%s(%s): bad relocation section name `%s\'"),
1758 bfd_get_filename (input_bfd->my_archive),
1759 bfd_get_filename (input_bfd),
1760 name);
1761 else
1762 (*_bfd_error_handler)
1763 (_("%s: bad relocation section name `%s\'"),
1764 bfd_get_filename (input_bfd),
1765 name);
1766 return false;
1767 }
1768
1769 sreloc = bfd_get_section_by_name (dynobj, name);
1770 if (sreloc == NULL)
1771 abort ();
1772 }
1773
1774 skip = false;
1775
1776 if (elf_section_data (input_section)->stab_info == NULL)
1777 outrel.r_offset = rel->r_offset;
1778 else
1779 {
1780 bfd_vma off;
1781
1782 off = (_bfd_stab_section_offset
1783 (output_bfd, htab->root.stab_info, input_section,
1784 &elf_section_data (input_section)->stab_info,
1785 rel->r_offset));
1786 if (off == (bfd_vma) -1)
1787 skip = true;
1788 outrel.r_offset = off;
1789 }
1790
1791 outrel.r_offset += (input_section->output_section->vma
1792 + input_section->output_offset);
1793
1794 if (skip)
1795 {
1796 memset (&outrel, 0, sizeof outrel);
1797 relocate = false;
1798 }
1799 else if (h != NULL
1800 && h->dynindx != -1
1801 && (r_type == R_386_PC32
1802 || !info->shared
1803 || !info->symbolic
1804 || (h->elf_link_hash_flags
1805 & ELF_LINK_HASH_DEF_REGULAR) == 0))
1806
1807 {
1808 relocate = false;
1809 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
1810 }
1811 else
1812 {
1813 /* This symbol is local, or marked to become local. */
1814 relocate = true;
1815 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
1816 }
1817
1818 bfd_elf32_swap_reloc_out (output_bfd, &outrel,
1819 (((Elf32_External_Rel *)
1820 sreloc->contents)
1821 + sreloc->reloc_count));
1822 ++sreloc->reloc_count;
1823
1824 /* If this reloc is against an external symbol, we do
1825 not want to fiddle with the addend. Otherwise, we
1826 need to include the symbol value so that it becomes
1827 an addend for the dynamic reloc. */
1828 if (! relocate)
1829 continue;
1830 }
1831
1832 break;
1833
1834 default:
1835 break;
1836 }
1837
1838 /* FIXME: Why do we allow debugging sections to escape this error?
1839 More importantly, why do we not emit dynamic relocs for
1840 R_386_32 above in debugging sections (which are ! SEC_ALLOC)?
1841 If we had emitted the dynamic reloc, we could remove the
1842 fudge here. */
1843 if (unresolved_reloc
1844 && !(info->shared
1845 && (input_section->flags & SEC_DEBUGGING) != 0
1846 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0))
1847 (*_bfd_error_handler)
1848 (_("%s(%s+0x%lx): unresolvable relocation against symbol `%s'"),
1849 bfd_get_filename (input_bfd),
1850 bfd_get_section_name (input_bfd, input_section),
1851 (long) rel->r_offset,
1852 h->root.root.string);
1853
1854 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1855 contents, rel->r_offset,
1856 relocation, (bfd_vma) 0);
1857
1858 switch (r)
1859 {
1860 case bfd_reloc_ok:
1861 break;
1862
1863 case bfd_reloc_overflow:
1864 {
1865 const char *name;
1866
1867 if (h != NULL)
1868 name = h->root.root.string;
1869 else
1870 {
1871 name = bfd_elf_string_from_elf_section (input_bfd,
1872 symtab_hdr->sh_link,
1873 sym->st_name);
1874 if (name == NULL)
1875 return false;
1876 if (*name == '\0')
1877 name = bfd_section_name (input_bfd, sec);
1878 }
1879 if (! ((*info->callbacks->reloc_overflow)
1880 (info, name, howto->name, (bfd_vma) 0,
1881 input_bfd, input_section, rel->r_offset)))
1882 return false;
1883 }
1884 break;
1885
1886 default:
1887 case bfd_reloc_outofrange:
1888 abort ();
1889 break;
1890 }
1891 }
1892
1893 return true;
1894 }
1895
1896 /* Finish up dynamic symbol handling. We set the contents of various
1897 dynamic sections here. */
1898
1899 static boolean
1900 elf_i386_finish_dynamic_symbol (output_bfd, info, h, sym)
1901 bfd *output_bfd;
1902 struct bfd_link_info *info;
1903 struct elf_link_hash_entry *h;
1904 Elf_Internal_Sym *sym;
1905 {
1906 struct elf_i386_link_hash_table *htab;
1907 bfd *dynobj;
1908
1909 htab = elf_i386_hash_table (info);
1910 dynobj = htab->root.dynobj;
1911
1912 if (h->plt.offset != (bfd_vma) -1)
1913 {
1914 bfd_vma plt_index;
1915 bfd_vma got_offset;
1916 Elf_Internal_Rel rel;
1917
1918 /* This symbol has an entry in the procedure linkage table. Set
1919 it up. */
1920
1921 if (h->dynindx == -1
1922 || htab->splt == NULL
1923 || htab->sgotplt == NULL
1924 || htab->srelplt == NULL)
1925 abort ();
1926
1927 /* Get the index in the procedure linkage table which
1928 corresponds to this symbol. This is the index of this symbol
1929 in all the symbols for which we are making plt entries. The
1930 first entry in the procedure linkage table is reserved. */
1931 plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
1932
1933 /* Get the offset into the .got table of the entry that
1934 corresponds to this function. Each .got entry is 4 bytes.
1935 The first three are reserved. */
1936 got_offset = (plt_index + 3) * 4;
1937
1938 /* Fill in the entry in the procedure linkage table. */
1939 if (! info->shared)
1940 {
1941 memcpy (htab->splt->contents + h->plt.offset, elf_i386_plt_entry,
1942 PLT_ENTRY_SIZE);
1943 bfd_put_32 (output_bfd,
1944 (htab->sgotplt->output_section->vma
1945 + htab->sgotplt->output_offset
1946 + got_offset),
1947 htab->splt->contents + h->plt.offset + 2);
1948 }
1949 else
1950 {
1951 memcpy (htab->splt->contents + h->plt.offset, elf_i386_pic_plt_entry,
1952 PLT_ENTRY_SIZE);
1953 bfd_put_32 (output_bfd, got_offset,
1954 htab->splt->contents + h->plt.offset + 2);
1955 }
1956
1957 bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rel),
1958 htab->splt->contents + h->plt.offset + 7);
1959 bfd_put_32 (output_bfd, - (h->plt.offset + PLT_ENTRY_SIZE),
1960 htab->splt->contents + h->plt.offset + 12);
1961
1962 /* Fill in the entry in the global offset table. */
1963 bfd_put_32 (output_bfd,
1964 (htab->splt->output_section->vma
1965 + htab->splt->output_offset
1966 + h->plt.offset
1967 + 6),
1968 htab->sgotplt->contents + got_offset);
1969
1970 /* Fill in the entry in the .rel.plt section. */
1971 rel.r_offset = (htab->sgotplt->output_section->vma
1972 + htab->sgotplt->output_offset
1973 + got_offset);
1974 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_JUMP_SLOT);
1975 bfd_elf32_swap_reloc_out (output_bfd, &rel,
1976 ((Elf32_External_Rel *) htab->srelplt->contents
1977 + plt_index));
1978
1979 if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1980 {
1981 /* Mark the symbol as undefined, rather than as defined in
1982 the .plt section. Leave the value alone. */
1983 sym->st_shndx = SHN_UNDEF;
1984 }
1985 }
1986
1987 if (h->got.offset != (bfd_vma) -1)
1988 {
1989 Elf_Internal_Rel rel;
1990
1991 /* This symbol has an entry in the global offset table. Set it
1992 up. */
1993
1994 if (htab->sgot == NULL || htab->srelgot == NULL)
1995 abort ();
1996
1997 rel.r_offset = (htab->sgot->output_section->vma
1998 + htab->sgot->output_offset
1999 + (h->got.offset &~ 1));
2000
2001 /* If this is a static link, or it is a -Bsymbolic link and the
2002 symbol is defined locally or was forced to be local because
2003 of a version file, we just want to emit a RELATIVE reloc.
2004 The entry in the global offset table will already have been
2005 initialized in the relocate_section function. */
2006 if (info->shared
2007 && (info->symbolic
2008 || h->dynindx == -1
2009 || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL))
2010 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
2011 {
2012 BFD_ASSERT((h->got.offset & 1) != 0);
2013 rel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
2014 }
2015 else
2016 {
2017 BFD_ASSERT((h->got.offset & 1) == 0);
2018 bfd_put_32 (output_bfd, (bfd_vma) 0,
2019 htab->sgot->contents + h->got.offset);
2020 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_GLOB_DAT);
2021 }
2022
2023 bfd_elf32_swap_reloc_out (output_bfd, &rel,
2024 ((Elf32_External_Rel *) htab->srelgot->contents
2025 + htab->srelgot->reloc_count));
2026 ++htab->srelgot->reloc_count;
2027 }
2028
2029 if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
2030 {
2031 Elf_Internal_Rel rel;
2032
2033 /* This symbol needs a copy reloc. Set it up. */
2034
2035 if (h->dynindx == -1
2036 || (h->root.type != bfd_link_hash_defined
2037 && h->root.type != bfd_link_hash_defweak)
2038 || htab->srelbss == NULL)
2039 abort ();
2040
2041 rel.r_offset = (h->root.u.def.value
2042 + h->root.u.def.section->output_section->vma
2043 + h->root.u.def.section->output_offset);
2044 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_COPY);
2045 bfd_elf32_swap_reloc_out (output_bfd, &rel,
2046 ((Elf32_External_Rel *) htab->srelbss->contents
2047 + htab->srelbss->reloc_count));
2048 ++htab->srelbss->reloc_count;
2049 }
2050
2051 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
2052 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
2053 || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
2054 sym->st_shndx = SHN_ABS;
2055
2056 return true;
2057 }
2058
2059 /* Finish up the dynamic sections. */
2060
2061 static boolean
2062 elf_i386_finish_dynamic_sections (output_bfd, info)
2063 bfd *output_bfd;
2064 struct bfd_link_info *info;
2065 {
2066 struct elf_i386_link_hash_table *htab;
2067 bfd *dynobj;
2068 asection *sdyn;
2069
2070 htab = elf_i386_hash_table (info);
2071 dynobj = htab->root.dynobj;
2072 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
2073
2074 if (htab->root.dynamic_sections_created)
2075 {
2076 Elf32_External_Dyn *dyncon, *dynconend;
2077
2078 if (sdyn == NULL || htab->sgot == NULL)
2079 abort ();
2080
2081 dyncon = (Elf32_External_Dyn *) sdyn->contents;
2082 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
2083 for (; dyncon < dynconend; dyncon++)
2084 {
2085 Elf_Internal_Dyn dyn;
2086
2087 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
2088
2089 switch (dyn.d_tag)
2090 {
2091 default:
2092 break;
2093
2094 case DT_PLTGOT:
2095 dyn.d_un.d_ptr = htab->sgot->output_section->vma;
2096 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2097 break;
2098
2099 case DT_JMPREL:
2100 dyn.d_un.d_ptr = htab->srelplt->output_section->vma;
2101 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2102 break;
2103
2104 case DT_PLTRELSZ:
2105 if (htab->srelplt->output_section->_cooked_size != 0)
2106 dyn.d_un.d_val = htab->srelplt->output_section->_cooked_size;
2107 else
2108 dyn.d_un.d_val = htab->srelplt->output_section->_raw_size;
2109 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2110 break;
2111
2112 case DT_RELSZ:
2113 /* My reading of the SVR4 ABI indicates that the
2114 procedure linkage table relocs (DT_JMPREL) should be
2115 included in the overall relocs (DT_REL). This is
2116 what Solaris does. However, UnixWare can not handle
2117 that case. Therefore, we override the DT_RELSZ entry
2118 here to make it not include the JMPREL relocs. Since
2119 the linker script arranges for .rel.plt to follow all
2120 other relocation sections, we don't have to worry
2121 about changing the DT_REL entry. */
2122 if (htab->srelplt != NULL)
2123 {
2124 if (htab->srelplt->output_section->_cooked_size != 0)
2125 dyn.d_un.d_val -= htab->srelplt->output_section->_cooked_size;
2126 else
2127 dyn.d_un.d_val -= htab->srelplt->output_section->_raw_size;
2128 }
2129 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2130 break;
2131 }
2132 }
2133
2134 /* Fill in the first entry in the procedure linkage table. */
2135 if (htab->splt && htab->splt->_raw_size > 0)
2136 {
2137 if (info->shared)
2138 memcpy (htab->splt->contents,
2139 elf_i386_pic_plt0_entry, PLT_ENTRY_SIZE);
2140 else
2141 {
2142 memcpy (htab->splt->contents,
2143 elf_i386_plt0_entry, PLT_ENTRY_SIZE);
2144 bfd_put_32 (output_bfd,
2145 (htab->sgotplt->output_section->vma
2146 + htab->sgotplt->output_offset
2147 + 4),
2148 htab->splt->contents + 2);
2149 bfd_put_32 (output_bfd,
2150 (htab->sgotplt->output_section->vma
2151 + htab->sgotplt->output_offset
2152 + 8),
2153 htab->splt->contents + 8);
2154 }
2155
2156 /* UnixWare sets the entsize of .plt to 4, although that doesn't
2157 really seem like the right value. */
2158 elf_section_data (htab->splt->output_section)
2159 ->this_hdr.sh_entsize = 4;
2160 }
2161 }
2162
2163 if (htab->sgotplt)
2164 {
2165 /* Fill in the first three entries in the global offset table. */
2166 if (htab->sgotplt->_raw_size > 0)
2167 {
2168 bfd_put_32 (output_bfd,
2169 (sdyn == NULL ? (bfd_vma) 0
2170 : sdyn->output_section->vma + sdyn->output_offset),
2171 htab->sgotplt->contents);
2172 bfd_put_32 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + 4);
2173 bfd_put_32 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + 8);
2174 }
2175
2176 elf_section_data (htab->sgotplt->output_section)->this_hdr.sh_entsize = 4;
2177 }
2178 return true;
2179 }
2180
2181 /* Set the correct type for an x86 ELF section. We do this by the
2182 section name, which is a hack, but ought to work. */
2183
2184 static boolean
2185 elf_i386_fake_sections (abfd, hdr, sec)
2186 bfd *abfd ATTRIBUTE_UNUSED;
2187 Elf32_Internal_Shdr *hdr;
2188 asection *sec;
2189 {
2190 register const char *name;
2191
2192 name = bfd_get_section_name (abfd, sec);
2193
2194 if (strcmp (name, ".reloc") == 0)
2195 /*
2196 * This is an ugly, but unfortunately necessary hack that is
2197 * needed when producing EFI binaries on x86. It tells
2198 * elf.c:elf_fake_sections() not to consider ".reloc" as a section
2199 * containing ELF relocation info. We need this hack in order to
2200 * be able to generate ELF binaries that can be translated into
2201 * EFI applications (which are essentially COFF objects). Those
2202 * files contain a COFF ".reloc" section inside an ELFNN object,
2203 * which would normally cause BFD to segfault because it would
2204 * attempt to interpret this section as containing relocation
2205 * entries for section "oc". With this hack enabled, ".reloc"
2206 * will be treated as a normal data section, which will avoid the
2207 * segfault. However, you won't be able to create an ELFNN binary
2208 * with a section named "oc" that needs relocations, but that's
2209 * the kind of ugly side-effects you get when detecting section
2210 * types based on their names... In practice, this limitation is
2211 * unlikely to bite.
2212 */
2213 hdr->sh_type = SHT_PROGBITS;
2214
2215 return true;
2216 }
2217
2218
2219 #define TARGET_LITTLE_SYM bfd_elf32_i386_vec
2220 #define TARGET_LITTLE_NAME "elf32-i386"
2221 #define ELF_ARCH bfd_arch_i386
2222 #define ELF_MACHINE_CODE EM_386
2223 #define ELF_MAXPAGESIZE 0x1000
2224
2225 #define elf_backend_can_gc_sections 1
2226 #define elf_backend_want_got_plt 1
2227 #define elf_backend_plt_readonly 1
2228 #define elf_backend_want_plt_sym 0
2229 #define elf_backend_got_header_size 12
2230 #define elf_backend_plt_header_size PLT_ENTRY_SIZE
2231
2232 #define elf_info_to_howto elf_i386_info_to_howto
2233 #define elf_info_to_howto_rel elf_i386_info_to_howto_rel
2234
2235 #define bfd_elf32_bfd_is_local_label_name elf_i386_is_local_label_name
2236 #define bfd_elf32_bfd_link_hash_table_create elf_i386_link_hash_table_create
2237 #define bfd_elf32_bfd_reloc_type_lookup elf_i386_reloc_type_lookup
2238
2239 #define elf_backend_adjust_dynamic_symbol elf_i386_adjust_dynamic_symbol
2240 #define elf_backend_check_relocs elf_i386_check_relocs
2241 #define elf_backend_create_dynamic_sections elf_i386_create_dynamic_sections
2242 #define elf_backend_finish_dynamic_sections elf_i386_finish_dynamic_sections
2243 #define elf_backend_finish_dynamic_symbol elf_i386_finish_dynamic_symbol
2244 #define elf_backend_gc_mark_hook elf_i386_gc_mark_hook
2245 #define elf_backend_gc_sweep_hook elf_i386_gc_sweep_hook
2246 #define elf_backend_relocate_section elf_i386_relocate_section
2247 #define elf_backend_size_dynamic_sections elf_i386_size_dynamic_sections
2248 #define elf_backend_fake_sections elf_i386_fake_sections
2249
2250 #include "elf32-target.h"
This page took 0.077664 seconds and 5 git commands to generate.