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