Touches most files in bfd/, so likely will be blamed for everything..
[external/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   bfd_size_type amt = sizeof (struct elf_i386_link_hash_table);
459
460   ret = (struct elf_i386_link_hash_table *) bfd_alloc (abfd, amt);
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                   bfd_size_type size;
637
638                   size = symtab_hdr->sh_info;
639                   size *= sizeof (bfd_signed_vma);
640                   local_got_refcounts = ((bfd_signed_vma *)
641                                          bfd_alloc (abfd, size));
642                   if (local_got_refcounts == NULL)
643                     return false;
644                   elf_local_got_refcounts (abfd) = local_got_refcounts;
645                   memset (local_got_refcounts, -1, (size_t) size);
646                 }
647               if (local_got_refcounts[r_symndx] == -1)
648                 local_got_refcounts[r_symndx] = 1;
649               else
650                 local_got_refcounts[r_symndx] += 1;
651             }
652           break;
653
654         case R_386_PLT32:
655           /* This symbol requires a procedure linkage table entry.  We
656              actually build the entry in adjust_dynamic_symbol,
657              because this might be a case of linking PIC code which is
658              never referenced by a dynamic object, in which case we
659              don't need to generate a procedure linkage table entry
660              after all.  */
661
662           /* If this is a local symbol, we resolve it directly without
663              creating a procedure linkage table entry.  */
664           if (h == NULL)
665             continue;
666
667           if (h->plt.refcount == -1)
668             {
669               h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
670               h->plt.refcount = 1;
671             }
672           else
673             h->plt.refcount += 1;
674           break;
675
676         case R_386_32:
677         case R_386_PC32:
678           if (h != NULL && !info->shared)
679             {
680               /* If this reloc is in a read-only section, we might
681                  need a copy reloc.  */
682               if ((sec->flags & SEC_READONLY) != 0)
683                 h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
684
685               /* We may need a .plt entry if the function this reloc
686                  refers to is in a shared lib.  */
687               if (h->plt.refcount == -1)
688                 h->plt.refcount = 1;
689               else
690                 h->plt.refcount += 1;
691             }
692
693           /* If we are creating a shared library, and this is a reloc
694              against a global symbol, or a non PC relative reloc
695              against a local symbol, then we need to copy the reloc
696              into the shared library.  However, if we are linking with
697              -Bsymbolic, we do not need to copy a reloc against a
698              global symbol which is defined in an object we are
699              including in the link (i.e., DEF_REGULAR is set).  At
700              this point we have not seen all the input files, so it is
701              possible that DEF_REGULAR is not set now but will be set
702              later (it is never cleared).  In case of a weak definition,
703              DEF_REGULAR may be cleared later by a strong definition in
704              a shared library. We account for that possibility below by
705              storing information in the relocs_copied field of the hash
706              table entry.  A similar situation occurs when creating
707              shared libraries and symbol visibility changes render the
708              symbol local.
709
710              If on the other hand, we are creating an executable, we
711              may need to keep relocations for symbols satisfied by a
712              dynamic library if we manage to avoid copy relocs for the
713              symbol.  */
714           if ((info->shared
715                && (sec->flags & SEC_ALLOC) != 0
716                && (ELF32_R_TYPE (rel->r_info) != R_386_PC32
717                    || (h != NULL
718                        && (! info->symbolic
719                            || h->root.type == bfd_link_hash_defweak
720                            || (h->elf_link_hash_flags
721                                & ELF_LINK_HASH_DEF_REGULAR) == 0))))
722               || (!info->shared
723                   && (sec->flags & SEC_ALLOC) != 0
724                   && h != NULL
725                   && (h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
726                   && (h->root.type == bfd_link_hash_defweak
727                       || (h->elf_link_hash_flags
728                           & ELF_LINK_HASH_DEF_REGULAR) == 0)))
729             {
730               /* We must copy these reloc types into the output file.
731                  Create a reloc section in dynobj and make room for
732                  this reloc.  */
733               if (dynobj == NULL)
734                 htab->root.dynobj = dynobj = abfd;
735
736               if (sreloc == NULL)
737                 {
738                   const char *name;
739
740                   name = (bfd_elf_string_from_elf_section
741                           (abfd,
742                            elf_elfheader (abfd)->e_shstrndx,
743                            elf_section_data (sec)->rel_hdr.sh_name));
744                   if (name == NULL)
745                     return false;
746
747                   if (strncmp (name, ".rel", 4) != 0
748                       || strcmp (bfd_get_section_name (abfd, sec),
749                                  name + 4) != 0)
750                     {
751                       if (abfd->my_archive)
752                         (*_bfd_error_handler) (_("%s(%s): bad relocation section name `%s\'"),
753                                                bfd_get_filename (abfd->my_archive),
754                                                bfd_get_filename (abfd),
755                                                name);
756                       else
757                         (*_bfd_error_handler) (_("%s: bad relocation section name `%s\'"),
758                                                bfd_get_filename (abfd),
759                                                name);
760                     }
761
762                   sreloc = bfd_get_section_by_name (dynobj, name);
763                   if (sreloc == NULL)
764                     {
765                       flagword flags;
766
767                       sreloc = bfd_make_section (dynobj, name);
768                       flags = (SEC_HAS_CONTENTS | SEC_READONLY
769                                | SEC_IN_MEMORY | SEC_LINKER_CREATED);
770                       if ((sec->flags & SEC_ALLOC) != 0)
771                         flags |= SEC_ALLOC | SEC_LOAD;
772                       if (sreloc == NULL
773                           || ! bfd_set_section_flags (dynobj, sreloc, flags)
774                           || ! bfd_set_section_alignment (dynobj, sreloc, 2))
775                         return false;
776                     }
777                   if (sec->flags & SEC_READONLY)
778                     info->flags |= DF_TEXTREL;
779                 }
780
781               sreloc->_raw_size += sizeof (Elf32_External_Rel);
782
783               /* If this is a global symbol, we count the number of PC
784                  relative relocations we have entered for this symbol,
785                  so that we can discard them later as necessary.  Note
786                  that this function is only called if we are using an
787                  elf_i386 linker hash table, which means that h is
788                  really a pointer to an elf_i386_link_hash_entry.  */
789               if (!info->shared
790                   || (h != NULL
791                       && ELF32_R_TYPE (rel->r_info) == R_386_PC32))
792                 {
793                   struct elf_i386_link_hash_entry *eh;
794                   struct elf_i386_dyn_relocs *p;
795
796                   eh = (struct elf_i386_link_hash_entry *) h;
797
798                   for (p = eh->dyn_relocs; p != NULL; p = p->next)
799                     if (p->section == sreloc)
800                       break;
801
802                   if (p == NULL)
803                     {
804                       p = ((struct elf_i386_dyn_relocs *)
805                            bfd_alloc (dynobj, (bfd_size_type) sizeof *p));
806                       if (p == NULL)
807                         return false;
808                       p->next = eh->dyn_relocs;
809                       eh->dyn_relocs = p;
810                       p->section = sreloc;
811                       p->count = 0;
812                     }
813
814                   ++p->count;
815                 }
816             }
817
818           break;
819
820           /* This relocation describes the C++ object vtable hierarchy.
821              Reconstruct it for later use during GC.  */
822         case R_386_GNU_VTINHERIT:
823           if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
824             return false;
825           break;
826
827           /* This relocation describes which C++ vtable entries are actually
828              used.  Record for later use during GC.  */
829         case R_386_GNU_VTENTRY:
830           if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_offset))
831             return false;
832           break;
833
834         default:
835           break;
836         }
837     }
838
839   return true;
840 }
841
842 /* Return the section that should be marked against GC for a given
843    relocation.  */
844
845 static asection *
846 elf_i386_gc_mark_hook (abfd, info, rel, h, sym)
847      bfd *abfd;
848      struct bfd_link_info *info ATTRIBUTE_UNUSED;
849      Elf_Internal_Rela *rel;
850      struct elf_link_hash_entry *h;
851      Elf_Internal_Sym *sym;
852 {
853   if (h != NULL)
854     {
855       switch (ELF32_R_TYPE (rel->r_info))
856         {
857         case R_386_GNU_VTINHERIT:
858         case R_386_GNU_VTENTRY:
859           break;
860
861         default:
862           switch (h->root.type)
863             {
864             case bfd_link_hash_defined:
865             case bfd_link_hash_defweak:
866               return h->root.u.def.section;
867
868             case bfd_link_hash_common:
869               return h->root.u.c.p->section;
870
871             default:
872               break;
873             }
874         }
875     }
876   else
877     {
878       if (!(elf_bad_symtab (abfd)
879             && ELF_ST_BIND (sym->st_info) != STB_LOCAL)
880           && ! ((sym->st_shndx <= 0 || sym->st_shndx >= SHN_LORESERVE)
881                 && sym->st_shndx != SHN_COMMON))
882         {
883           return bfd_section_from_elf_index (abfd, sym->st_shndx);
884         }
885     }
886
887   return NULL;
888 }
889
890 /* Update the got entry reference counts for the section being removed.  */
891
892 static boolean
893 elf_i386_gc_sweep_hook (abfd, info, sec, relocs)
894      bfd *abfd;
895      struct bfd_link_info *info;
896      asection *sec;
897      const Elf_Internal_Rela *relocs;
898 {
899   Elf_Internal_Shdr *symtab_hdr;
900   struct elf_link_hash_entry **sym_hashes;
901   bfd_signed_vma *local_got_refcounts;
902   const Elf_Internal_Rela *rel, *relend;
903   unsigned long r_symndx;
904   struct elf_link_hash_entry *h;
905   bfd *dynobj;
906
907   dynobj = elf_hash_table (info)->dynobj;
908   if (dynobj == NULL)
909     return true;
910
911   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
912   sym_hashes = elf_sym_hashes (abfd);
913   local_got_refcounts = elf_local_got_refcounts (abfd);
914
915   relend = relocs + sec->reloc_count;
916   for (rel = relocs; rel < relend; rel++)
917     switch (ELF32_R_TYPE (rel->r_info))
918       {
919       case R_386_GOT32:
920       case R_386_GOTOFF:
921       case R_386_GOTPC:
922         r_symndx = ELF32_R_SYM (rel->r_info);
923         if (r_symndx >= symtab_hdr->sh_info)
924           {
925             h = sym_hashes[r_symndx - symtab_hdr->sh_info];
926             if (h->got.refcount > 0)
927               h->got.refcount -= 1;
928           }
929         else if (local_got_refcounts != NULL)
930           {
931             if (local_got_refcounts[r_symndx] > 0)
932               local_got_refcounts[r_symndx] -= 1;
933           }
934         break;
935
936       case R_386_32:
937       case R_386_PC32:
938         if (info->shared)
939           break;
940         /* Fall through.  */
941
942       case R_386_PLT32:
943         r_symndx = ELF32_R_SYM (rel->r_info);
944         if (r_symndx >= symtab_hdr->sh_info)
945           {
946             h = sym_hashes[r_symndx - symtab_hdr->sh_info];
947             if (h->plt.refcount > 0)
948               h->plt.refcount -= 1;
949           }
950         break;
951
952       default:
953         break;
954       }
955
956   return true;
957 }
958
959 /* Adjust a symbol defined by a dynamic object and referenced by a
960    regular object.  The current definition is in some section of the
961    dynamic object, but we're not including those sections.  We have to
962    change the definition to something the rest of the link can
963    understand.  */
964
965 static boolean
966 elf_i386_adjust_dynamic_symbol (info, h)
967      struct bfd_link_info *info;
968      struct elf_link_hash_entry *h;
969 {
970   struct elf_i386_link_hash_table *htab;
971   bfd *dynobj;
972   asection *s;
973   unsigned int power_of_two;
974
975   htab = elf_i386_hash_table (info);
976   dynobj = htab->root.dynobj;
977
978   /* If this is a function, put it in the procedure linkage table.  We
979      will fill in the contents of the procedure linkage table later,
980      when we know the address of the .got section.  */
981   if (h->type == STT_FUNC
982       || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
983     {
984       if (h->plt.refcount <= 0
985           || (! info->shared
986               && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0
987               && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0))
988         {
989           /* This case can occur if we saw a PLT32 reloc in an input
990              file, but the symbol was never referred to by a dynamic
991              object, or if all references were garbage collected.  In
992              such a case, we don't actually need to build a procedure
993              linkage table, and we can just do a PC32 reloc instead.  */
994           h->plt.refcount = (bfd_vma) -1;
995           h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
996         }
997
998       return true;
999     }
1000   else
1001     /* It's possible that we incorrectly decided a .plt reloc was
1002        needed for an R_386_PC32 reloc to a non-function sym in
1003        check_relocs.  We can't decide accurately between function and
1004        non-function syms in check-relocs;  Objects loaded later in
1005        the link may change h->type.  So fix it now.  */
1006     h->plt.refcount = (bfd_vma) -1;
1007
1008   /* If this is a weak symbol, and there is a real definition, the
1009      processor independent code will have arranged for us to see the
1010      real definition first, and we can just use the same value.  */
1011   if (h->weakdef != NULL)
1012     {
1013       BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
1014                   || h->weakdef->root.type == bfd_link_hash_defweak);
1015       h->root.u.def.section = h->weakdef->root.u.def.section;
1016       h->root.u.def.value = h->weakdef->root.u.def.value;
1017       return true;
1018     }
1019
1020   /* This is a reference to a symbol defined by a dynamic object which
1021      is not a function.  */
1022
1023   /* If we are creating a shared library, we must presume that the
1024      only references to the symbol are via the global offset table.
1025      For such cases we need not do anything here; the relocations will
1026      be handled correctly by relocate_section.  */
1027   if (info->shared)
1028     return true;
1029
1030   /* If there are no references to this symbol that do not use the
1031      GOT, we don't need to generate a copy reloc.  */
1032   if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0)
1033     return true;
1034
1035   /* We must allocate the symbol in our .dynbss section, which will
1036      become part of the .bss section of the executable.  There will be
1037      an entry for this symbol in the .dynsym section.  The dynamic
1038      object will contain position independent code, so all references
1039      from the dynamic object to this symbol will go through the global
1040      offset table.  The dynamic linker will use the .dynsym entry to
1041      determine the address it must put in the global offset table, so
1042      both the dynamic object and the regular object will refer to the
1043      same memory location for the variable.  */
1044
1045   s = htab->sdynbss;
1046   if (s == NULL)
1047     abort ();
1048
1049   /* We must generate a R_386_COPY reloc to tell the dynamic linker to
1050      copy the initial value out of the dynamic object and into the
1051      runtime process image.  We need to remember the offset into the
1052      .rel.bss section we are going to use.  */
1053   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
1054     {
1055       asection *srel;
1056
1057       srel = htab->srelbss;
1058       if (srel == NULL)
1059         abort ();
1060       srel->_raw_size += sizeof (Elf32_External_Rel);
1061       h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
1062     }
1063
1064   /* We need to figure out the alignment required for this symbol.  I
1065      have no idea how ELF linkers handle this.  */
1066   power_of_two = bfd_log2 (h->size);
1067   if (power_of_two > 3)
1068     power_of_two = 3;
1069
1070   /* Apply the required alignment.  */
1071   s->_raw_size = BFD_ALIGN (s->_raw_size,
1072                             (bfd_size_type) (1 << power_of_two));
1073   if (power_of_two > bfd_get_section_alignment (dynobj, s))
1074     {
1075       if (! bfd_set_section_alignment (dynobj, s, power_of_two))
1076         return false;
1077     }
1078
1079   /* Define the symbol as being at this point in the section.  */
1080   h->root.u.def.section = s;
1081   h->root.u.def.value = s->_raw_size;
1082
1083   /* Increment the section size to make room for the symbol.  */
1084   s->_raw_size += h->size;
1085
1086   return true;
1087 }
1088
1089 /* This is the condition under which elf_i386_finish_dynamic_symbol
1090    will be called from elflink.h.  If elflink.h doesn't call our
1091    finish_dynamic_symbol routine, we'll need to do something about
1092    initializing any .plt and .got entries in elf_i386_relocate_section.  */
1093 #define WILL_CALL_FINISH_DYNAMIC_SYMBOL(DYN, INFO, H) \
1094   ((DYN)                                                                \
1095    && ((INFO)->shared                                                   \
1096        || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)      \
1097    && ((H)->dynindx != -1                                               \
1098        || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0))
1099
1100 /* Allocate space in .plt, .got and associated reloc sections for
1101    global syms. Also discards space allocated for relocs in the
1102    check_relocs function that we subsequently have found to be
1103    unneeded.  */
1104
1105 static boolean
1106 allocate_plt_and_got_and_discard_relocs (h, inf)
1107      struct elf_link_hash_entry *h;
1108      PTR inf;
1109 {
1110   struct bfd_link_info *info;
1111   struct elf_i386_link_hash_table *htab;
1112   asection *s;
1113   struct elf_i386_link_hash_entry *eh;
1114
1115   if (h->root.type == bfd_link_hash_indirect
1116       || h->root.type == bfd_link_hash_warning)
1117     return true;
1118
1119   info = (struct bfd_link_info *) inf;
1120   htab = elf_i386_hash_table (info);
1121
1122   if (htab->root.dynamic_sections_created
1123       && h->plt.refcount > 0)
1124     {
1125       /* Make sure this symbol is output as a dynamic symbol.
1126          Undefined weak syms won't yet be marked as dynamic.  */
1127       if (h->dynindx == -1
1128           && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1129         {
1130           if (! bfd_elf32_link_record_dynamic_symbol (info, h))
1131             return false;
1132         }
1133
1134       s = htab->splt;
1135       if (s == NULL)
1136         abort ();
1137
1138       /* If this is the first .plt entry, make room for the special
1139          first entry.  */
1140       if (s->_raw_size == 0)
1141         s->_raw_size += PLT_ENTRY_SIZE;
1142
1143       h->plt.offset = s->_raw_size;
1144
1145       /* If this symbol is not defined in a regular file, and we are
1146          not generating a shared library, then set the symbol to this
1147          location in the .plt.  This is required to make function
1148          pointers compare as equal between the normal executable and
1149          the shared library.  */
1150       if (! info->shared
1151           && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1152         {
1153           h->root.u.def.section = s;
1154           h->root.u.def.value = h->plt.offset;
1155         }
1156
1157       /* Make room for this entry.  */
1158       s->_raw_size += PLT_ENTRY_SIZE;
1159
1160       /* We also need to make an entry in the .got.plt section, which
1161          will be placed in the .got section by the linker script.  */
1162       s = htab->sgotplt;
1163       if (s == NULL)
1164         abort ();
1165       s->_raw_size += 4;
1166
1167       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info, h))
1168         {
1169           /* We also need to make an entry in the .rel.plt section.  */
1170           s = htab->srelplt;
1171           if (s == NULL)
1172             abort ();
1173           s->_raw_size += sizeof (Elf32_External_Rel);
1174         }
1175     }
1176   else
1177     {
1178       h->plt.offset = (bfd_vma) -1;
1179       h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
1180     }
1181
1182   if (h->got.refcount > 0)
1183     {
1184       boolean dyn;
1185
1186       /* Make sure this symbol is output as a dynamic symbol.
1187          Undefined weak syms won't yet be marked as dynamic.  */
1188       if (h->dynindx == -1
1189           && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1190         {
1191           if (! bfd_elf32_link_record_dynamic_symbol (info, h))
1192             return false;
1193         }
1194
1195       s = htab->sgot;
1196       h->got.offset = s->_raw_size;
1197       s->_raw_size += 4;
1198       dyn = htab->root.dynamic_sections_created;
1199       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h))
1200         htab->srelgot->_raw_size += sizeof (Elf32_External_Rel);
1201     }
1202   else
1203     h->got.offset = (bfd_vma) -1;
1204
1205   /* In the shared -Bsymbolic case, discard space allocated for
1206      dynamic relocs against symbols which turn out to be defined
1207      in regular objects.  For the normal shared case, discard space
1208      for relocs that have become local due to symbol visibility
1209      changes.  For the non-shared case, discard space for symbols
1210      which turn out to need copy relocs or are not dynamic.  */
1211
1212   eh = (struct elf_i386_link_hash_entry *) h;
1213   if (eh->dyn_relocs == NULL)
1214     return true;
1215
1216   if (!info->shared
1217       && (h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
1218       && (((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
1219            && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1220           || (htab->root.dynamic_sections_created
1221               && (h->root.type == bfd_link_hash_undefweak
1222                   || h->root.type == bfd_link_hash_undefined))))
1223     {
1224       /* Make sure this symbol is output as a dynamic symbol.
1225          Undefined weak syms won't yet be marked as dynamic.  */
1226       if (h->dynindx == -1
1227           && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1228         {
1229           if (! bfd_elf32_link_record_dynamic_symbol (info, h))
1230             return false;
1231         }
1232
1233       /* If that succeeded, we know we'll be keeping all the relocs.  */
1234       if (h->dynindx != -1)
1235         return true;
1236     }
1237
1238   if (!info->shared
1239       || ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0
1240           && ((h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0
1241               || info->symbolic)))
1242     {
1243       struct elf_i386_dyn_relocs *c;
1244
1245       for (c = eh->dyn_relocs; c != NULL; c = c->next)
1246         c->section->_raw_size -= c->count * sizeof (Elf32_External_Rel);
1247     }
1248
1249   return true;
1250 }
1251
1252 /* Set the sizes of the dynamic sections.  */
1253
1254 static boolean
1255 elf_i386_size_dynamic_sections (output_bfd, info)
1256      bfd *output_bfd ATTRIBUTE_UNUSED;
1257      struct bfd_link_info *info;
1258 {
1259   struct elf_i386_link_hash_table *htab;
1260   bfd *dynobj;
1261   asection *s;
1262   boolean relocs;
1263   bfd *i;
1264
1265   htab = elf_i386_hash_table (info);
1266   dynobj = htab->root.dynobj;
1267   if (dynobj == NULL)
1268     abort ();
1269
1270   if (htab->root.dynamic_sections_created)
1271     {
1272       /* Set the contents of the .interp section to the interpreter.  */
1273       if (! info->shared)
1274         {
1275           s = bfd_get_section_by_name (dynobj, ".interp");
1276           if (s == NULL)
1277             abort ();
1278           s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
1279           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1280         }
1281     }
1282
1283   /* Set up .got offsets for local syms.  */
1284   for (i = info->input_bfds; i; i = i->link_next)
1285     {
1286       bfd_signed_vma *local_got;
1287       bfd_signed_vma *end_local_got;
1288       bfd_size_type locsymcount;
1289       Elf_Internal_Shdr *symtab_hdr;
1290       asection *srel;
1291
1292       if (bfd_get_flavour (i) != bfd_target_elf_flavour)
1293         continue;
1294
1295       local_got = elf_local_got_refcounts (i);
1296       if (!local_got)
1297         continue;
1298
1299       symtab_hdr = &elf_tdata (i)->symtab_hdr;
1300       locsymcount = symtab_hdr->sh_info;
1301       end_local_got = local_got + locsymcount;
1302       s = htab->sgot;
1303       srel = htab->srelgot;
1304       for (; local_got < end_local_got; ++local_got)
1305         {
1306           if (*local_got > 0)
1307             {
1308               *local_got = s->_raw_size;
1309               s->_raw_size += 4;
1310               if (info->shared)
1311                 srel->_raw_size += sizeof (Elf32_External_Rel);
1312             }
1313           else
1314             *local_got = (bfd_vma) -1;
1315         }
1316     }
1317
1318   /* Allocate global sym .plt and .got entries.  Also discard all
1319      unneeded relocs.  */
1320   elf_link_hash_traverse (&htab->root,
1321                           allocate_plt_and_got_and_discard_relocs,
1322                           (PTR) info);
1323
1324   /* We now have determined the sizes of the various dynamic sections.
1325      Allocate memory for them.  */
1326   relocs = false;
1327   for (s = dynobj->sections; s != NULL; s = s->next)
1328     {
1329       if ((s->flags & SEC_LINKER_CREATED) == 0)
1330         continue;
1331
1332       if (s == htab->splt
1333           || s == htab->sgot
1334           || s == htab->sgotplt)
1335         {
1336           /* Strip this section if we don't need it; see the
1337              comment below.  */
1338         }
1339       else if (strncmp (bfd_get_section_name (dynobj, s), ".rel", 4) == 0)
1340         {
1341           if (s->_raw_size == 0)
1342             {
1343               /* If we don't need this section, strip it from the
1344                  output file.  This is mostly to handle .rel.bss and
1345                  .rel.plt.  We must create both sections in
1346                  create_dynamic_sections, because they must be created
1347                  before the linker maps input sections to output
1348                  sections.  The linker does that before
1349                  adjust_dynamic_symbol is called, and it is that
1350                  function which decides whether anything needs to go
1351                  into these sections.  */
1352             }
1353           else
1354             {
1355               if (s != htab->srelplt)
1356                 relocs = true;
1357
1358               /* We use the reloc_count field as a counter if we need
1359                  to copy relocs into the output file.  */
1360               s->reloc_count = 0;
1361             }
1362         }
1363       else
1364         {
1365           /* It's not one of our sections, so don't allocate space.  */
1366           continue;
1367         }
1368
1369       if (s->_raw_size == 0)
1370         {
1371           _bfd_strip_section_from_output (info, s);
1372           continue;
1373         }
1374
1375       /* Allocate memory for the section contents.  We use bfd_zalloc
1376          here in case unused entries are not reclaimed before the
1377          section's contents are written out.  This should not happen,
1378          but this way if it does, we get a R_386_NONE reloc instead
1379          of garbage.  */
1380       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size);
1381       if (s->contents == NULL)
1382         return false;
1383     }
1384
1385   if (htab->root.dynamic_sections_created)
1386     {
1387       /* Add some entries to the .dynamic section.  We fill in the
1388          values later, in elf_i386_finish_dynamic_sections, but we
1389          must add the entries now so that we get the correct size for
1390          the .dynamic section.  The DT_DEBUG entry is filled in by the
1391          dynamic linker and used by the debugger.  */
1392 #define add_dynamic_entry(TAG, VAL) \
1393   bfd_elf32_add_dynamic_entry (info, (bfd_vma) (TAG), (bfd_vma) (VAL))
1394
1395       if (! info->shared)
1396         {
1397           if (!add_dynamic_entry (DT_DEBUG, 0))
1398             return false;
1399         }
1400
1401       if (htab->splt->_raw_size != 0)
1402         {
1403           if (!add_dynamic_entry (DT_PLTGOT, 0)
1404               || !add_dynamic_entry (DT_PLTRELSZ, 0)
1405               || !add_dynamic_entry (DT_PLTREL, DT_REL)
1406               || !add_dynamic_entry (DT_JMPREL, 0))
1407             return false;
1408         }
1409
1410       if (relocs)
1411         {
1412           if (!add_dynamic_entry (DT_REL, 0)
1413               || !add_dynamic_entry (DT_RELSZ, 0)
1414               || !add_dynamic_entry (DT_RELENT, sizeof (Elf32_External_Rel)))
1415             return false;
1416         }
1417
1418       if ((info->flags & DF_TEXTREL) != 0)
1419         {
1420           if (!add_dynamic_entry (DT_TEXTREL, 0))
1421             return false;
1422         }
1423     }
1424 #undef add_dynamic_entry
1425
1426   return true;
1427 }
1428
1429 /* Relocate an i386 ELF section.  */
1430
1431 static boolean
1432 elf_i386_relocate_section (output_bfd, info, input_bfd, input_section,
1433                            contents, relocs, local_syms, local_sections)
1434      bfd *output_bfd;
1435      struct bfd_link_info *info;
1436      bfd *input_bfd;
1437      asection *input_section;
1438      bfd_byte *contents;
1439      Elf_Internal_Rela *relocs;
1440      Elf_Internal_Sym *local_syms;
1441      asection **local_sections;
1442 {
1443   struct elf_i386_link_hash_table *htab;
1444   bfd *dynobj;
1445   Elf_Internal_Shdr *symtab_hdr;
1446   struct elf_link_hash_entry **sym_hashes;
1447   bfd_vma *local_got_offsets;
1448   asection *sreloc;
1449   Elf_Internal_Rela *rel;
1450   Elf_Internal_Rela *relend;
1451
1452   htab = elf_i386_hash_table (info);
1453   dynobj = htab->root.dynobj;
1454   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1455   sym_hashes = elf_sym_hashes (input_bfd);
1456   local_got_offsets = elf_local_got_offsets (input_bfd);
1457
1458   sreloc = NULL;
1459   rel = relocs;
1460   relend = relocs + input_section->reloc_count;
1461   for (; rel < relend; rel++)
1462     {
1463       int r_type;
1464       reloc_howto_type *howto;
1465       unsigned long r_symndx;
1466       struct elf_link_hash_entry *h;
1467       Elf_Internal_Sym *sym;
1468       asection *sec;
1469       bfd_vma off;
1470       bfd_vma relocation;
1471       boolean unresolved_reloc;
1472       bfd_reloc_status_type r;
1473       unsigned int indx;
1474
1475       r_type = ELF32_R_TYPE (rel->r_info);
1476       if (r_type == (int) R_386_GNU_VTINHERIT
1477           || r_type == (int) R_386_GNU_VTENTRY)
1478         continue;
1479
1480       if ((indx = (unsigned) r_type) >= R_386_standard
1481           && ((indx = (unsigned) r_type - R_386_ext_offset) - R_386_standard
1482               >= R_386_ext - R_386_standard))
1483         {
1484           bfd_set_error (bfd_error_bad_value);
1485           return false;
1486         }
1487       howto = elf_howto_table + indx;
1488
1489       r_symndx = ELF32_R_SYM (rel->r_info);
1490
1491       if (info->relocateable)
1492         {
1493           /* This is a relocateable link.  We don't have to change
1494              anything, unless the reloc is against a section symbol,
1495              in which case we have to adjust according to where the
1496              section symbol winds up in the output section.  */
1497           if (r_symndx < symtab_hdr->sh_info)
1498             {
1499               sym = local_syms + r_symndx;
1500               if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
1501                 {
1502                   bfd_vma val;
1503
1504                   sec = local_sections[r_symndx];
1505                   val = bfd_get_32 (input_bfd, contents + rel->r_offset);
1506                   val += sec->output_offset + sym->st_value;
1507                   bfd_put_32 (input_bfd, val, contents + rel->r_offset);
1508                 }
1509             }
1510
1511           continue;
1512         }
1513
1514       /* This is a final link.  */
1515       h = NULL;
1516       sym = NULL;
1517       sec = NULL;
1518       unresolved_reloc = false;
1519       if (r_symndx < symtab_hdr->sh_info)
1520         {
1521           sym = local_syms + r_symndx;
1522           sec = local_sections[r_symndx];
1523           relocation = (sec->output_section->vma
1524                         + sec->output_offset
1525                         + sym->st_value);
1526         }
1527       else
1528         {
1529           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1530           while (h->root.type == bfd_link_hash_indirect
1531                  || h->root.type == bfd_link_hash_warning)
1532             h = (struct elf_link_hash_entry *) h->root.u.i.link;
1533
1534           relocation = 0;
1535           if (h->root.type == bfd_link_hash_defined
1536               || h->root.type == bfd_link_hash_defweak)
1537             {
1538               sec = h->root.u.def.section;
1539               if (sec->output_section == NULL)
1540                 /* Set a flag that will be cleared later if we find a
1541                    relocation value for this symbol.  output_section
1542                    is typically NULL for symbols satisfied by a shared
1543                    library.  */
1544                 unresolved_reloc = true;
1545               else
1546                 relocation = (h->root.u.def.value
1547                               + sec->output_section->vma
1548                               + sec->output_offset);
1549             }
1550           else if (h->root.type == bfd_link_hash_undefweak)
1551             ;
1552           else if (info->shared && !info->symbolic
1553                    && !info->no_undefined
1554                    && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
1555             ;
1556           else
1557             {
1558               if (! ((*info->callbacks->undefined_symbol)
1559                      (info, h->root.root.string, input_bfd,
1560                       input_section, rel->r_offset,
1561                       (!info->shared || info->no_undefined
1562                        || ELF_ST_VISIBILITY (h->other)))))
1563                 return false;
1564             }
1565         }
1566
1567       switch (r_type)
1568         {
1569         case R_386_GOT32:
1570           /* Relocation is to the entry for this symbol in the global
1571              offset table.  */
1572           if (htab->sgot == NULL)
1573             abort ();
1574
1575           if (h != NULL)
1576             {
1577               boolean dyn;
1578
1579               off = h->got.offset;
1580               dyn = htab->root.dynamic_sections_created;
1581               if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h)
1582                   || (info->shared
1583                       && (info->symbolic
1584                           || h->dynindx == -1
1585                           || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL))
1586                       && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
1587                 {
1588                   /* This is actually a static link, or it is a
1589                      -Bsymbolic link and the symbol is defined
1590                      locally, or the symbol was forced to be local
1591                      because of a version file.  We must initialize
1592                      this entry in the global offset table.  Since the
1593                      offset must always be a multiple of 4, we use the
1594                      least significant bit to record whether we have
1595                      initialized it already.
1596
1597                      When doing a dynamic link, we create a .rel.got
1598                      relocation entry to initialize the value.  This
1599                      is done in the finish_dynamic_symbol routine.  */
1600                   if ((off & 1) != 0)
1601                     off &= ~1;
1602                   else
1603                     {
1604                       bfd_put_32 (output_bfd, relocation,
1605                                   htab->sgot->contents + off);
1606                       h->got.offset |= 1;
1607                     }
1608                 }
1609               else
1610                 unresolved_reloc = false;
1611             }
1612           else
1613             {
1614               if (local_got_offsets == NULL)
1615                 abort ();
1616
1617               off = local_got_offsets[r_symndx];
1618
1619               /* The offset must always be a multiple of 4.  We use
1620                  the least significant bit to record whether we have
1621                  already generated the necessary reloc.  */
1622               if ((off & 1) != 0)
1623                 off &= ~1;
1624               else
1625                 {
1626                   bfd_put_32 (output_bfd, relocation,
1627                               htab->sgot->contents + off);
1628
1629                   if (info->shared)
1630                     {
1631                       asection *srelgot;
1632                       Elf_Internal_Rel outrel;
1633
1634                       srelgot = htab->srelgot;
1635                       if (srelgot == NULL)
1636                         abort ();
1637
1638                       outrel.r_offset = (htab->sgot->output_section->vma
1639                                          + htab->sgot->output_offset
1640                                          + off);
1641                       outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
1642                       bfd_elf32_swap_reloc_out (output_bfd, &outrel,
1643                                                 (((Elf32_External_Rel *)
1644                                                   srelgot->contents)
1645                                                  + srelgot->reloc_count));
1646                       ++srelgot->reloc_count;
1647                     }
1648
1649                   local_got_offsets[r_symndx] |= 1;
1650                 }
1651             }
1652
1653           if (off >= (bfd_vma) -2)
1654             abort ();
1655
1656           relocation = htab->sgot->output_offset + off;
1657           break;
1658
1659         case R_386_GOTOFF:
1660           /* Relocation is relative to the start of the global offset
1661              table.  */
1662
1663           /* Note that sgot->output_offset is not involved in this
1664              calculation.  We always want the start of .got.  If we
1665              defined _GLOBAL_OFFSET_TABLE in a different way, as is
1666              permitted by the ABI, we might have to change this
1667              calculation.  */
1668           relocation -= htab->sgot->output_section->vma;
1669           break;
1670
1671         case R_386_GOTPC:
1672           /* Use global offset table as symbol value.  */
1673           relocation = htab->sgot->output_section->vma;
1674           unresolved_reloc = false;
1675           break;
1676
1677         case R_386_PLT32:
1678           /* Relocation is to the entry for this symbol in the
1679              procedure linkage table.  */
1680
1681           /* Resolve a PLT32 reloc against a local symbol directly,
1682              without using the procedure linkage table.  */
1683           if (h == NULL)
1684             break;
1685
1686           if (h->plt.offset == (bfd_vma) -1
1687               || htab->splt == NULL)
1688             {
1689               /* We didn't make a PLT entry for this symbol.  This
1690                  happens when statically linking PIC code, or when
1691                  using -Bsymbolic.  */
1692               break;
1693             }
1694
1695           relocation = (htab->splt->output_section->vma
1696                         + htab->splt->output_offset
1697                         + h->plt.offset);
1698           unresolved_reloc = false;
1699           break;
1700
1701         case R_386_32:
1702         case R_386_PC32:
1703           if ((info->shared
1704                && (input_section->flags & SEC_ALLOC) != 0
1705                && (r_type != R_386_PC32
1706                    || (h != NULL
1707                        && h->dynindx != -1
1708                        && (! info->symbolic
1709                            || (h->elf_link_hash_flags
1710                                & ELF_LINK_HASH_DEF_REGULAR) == 0))))
1711               || (!info->shared
1712                   && (input_section->flags & SEC_ALLOC) != 0
1713                   && h != NULL
1714                   && h->dynindx != -1
1715                   && (h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
1716                   && (((h->elf_link_hash_flags
1717                         & ELF_LINK_HASH_DEF_DYNAMIC) != 0
1718                        && (h->elf_link_hash_flags
1719                            & ELF_LINK_HASH_DEF_REGULAR) == 0)
1720                       || h->root.type == bfd_link_hash_undefweak
1721                       || h->root.type == bfd_link_hash_undefined)))
1722             {
1723               Elf_Internal_Rel outrel;
1724               boolean skip, relocate;
1725
1726               /* When generating a shared object, these relocations
1727                  are copied into the output file to be resolved at run
1728                  time.  */
1729
1730               if (sreloc == NULL)
1731                 {
1732                   const char *name;
1733
1734                   name = (bfd_elf_string_from_elf_section
1735                           (input_bfd,
1736                            elf_elfheader (input_bfd)->e_shstrndx,
1737                            elf_section_data (input_section)->rel_hdr.sh_name));
1738                   if (name == NULL)
1739                     return false;
1740
1741                   if (strncmp (name, ".rel", 4) != 0
1742                       || strcmp (bfd_get_section_name (input_bfd,
1743                                                        input_section),
1744                                  name + 4) != 0)
1745                     {
1746                       if (input_bfd->my_archive)
1747                         (*_bfd_error_handler)\
1748                           (_("%s(%s): bad relocation section name `%s\'"),
1749                            bfd_get_filename (input_bfd->my_archive),
1750                            bfd_get_filename (input_bfd),
1751                            name);
1752                       else
1753                         (*_bfd_error_handler)
1754                           (_("%s: bad relocation section name `%s\'"),
1755                            bfd_get_filename (input_bfd),
1756                            name);
1757                       return false;
1758                     }
1759
1760                   sreloc = bfd_get_section_by_name (dynobj, name);
1761                   if (sreloc == NULL)
1762                     abort ();
1763                 }
1764
1765               skip = false;
1766
1767               if (elf_section_data (input_section)->stab_info == NULL)
1768                 outrel.r_offset = rel->r_offset;
1769               else
1770                 {
1771                   off = (_bfd_stab_section_offset
1772                          (output_bfd, htab->root.stab_info, input_section,
1773                           &elf_section_data (input_section)->stab_info,
1774                           rel->r_offset));
1775                   if (off == (bfd_vma) -1)
1776                     skip = true;
1777                   outrel.r_offset = off;
1778                 }
1779
1780               outrel.r_offset += (input_section->output_section->vma
1781                                   + input_section->output_offset);
1782
1783               if (skip)
1784                 {
1785                   memset (&outrel, 0, sizeof outrel);
1786                   relocate = false;
1787                 }
1788               else if (h != NULL
1789                        && h->dynindx != -1
1790                        && (r_type == R_386_PC32
1791                            || !info->shared
1792                            || !info->symbolic
1793                            || (h->elf_link_hash_flags
1794                                & ELF_LINK_HASH_DEF_REGULAR) == 0))
1795
1796                 {
1797                   relocate = false;
1798                   outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
1799                 }
1800               else
1801                 {
1802                   /* This symbol is local, or marked to become local.  */
1803                   relocate = true;
1804                   outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
1805                 }
1806
1807               bfd_elf32_swap_reloc_out (output_bfd, &outrel,
1808                                         (((Elf32_External_Rel *)
1809                                           sreloc->contents)
1810                                          + sreloc->reloc_count));
1811               ++sreloc->reloc_count;
1812
1813               /* If this reloc is against an external symbol, we do
1814                  not want to fiddle with the addend.  Otherwise, we
1815                  need to include the symbol value so that it becomes
1816                  an addend for the dynamic reloc.  */
1817               if (! relocate)
1818                 continue;
1819             }
1820
1821           break;
1822
1823         default:
1824           break;
1825         }
1826
1827       /* FIXME: Why do we allow debugging sections to escape this error?
1828          More importantly, why do we not emit dynamic relocs for
1829          R_386_32 above in debugging sections (which are ! SEC_ALLOC)?
1830          If we had emitted the dynamic reloc, we could remove the
1831          fudge here.  */
1832       if (unresolved_reloc
1833           && !(info->shared
1834                && (input_section->flags & SEC_DEBUGGING) != 0
1835                && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0))
1836         (*_bfd_error_handler)
1837           (_("%s(%s+0x%lx): unresolvable relocation against symbol `%s'"),
1838            bfd_get_filename (input_bfd),
1839            bfd_get_section_name (input_bfd, input_section),
1840            (long) rel->r_offset,
1841            h->root.root.string);
1842
1843       r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1844                                     contents, rel->r_offset,
1845                                     relocation, (bfd_vma) 0);
1846
1847       switch (r)
1848         {
1849         case bfd_reloc_ok:
1850           break;
1851
1852         case bfd_reloc_overflow:
1853           {
1854             const char *name;
1855
1856             if (h != NULL)
1857               name = h->root.root.string;
1858             else
1859               {
1860                 name = bfd_elf_string_from_elf_section (input_bfd,
1861                                                         symtab_hdr->sh_link,
1862                                                         sym->st_name);
1863                 if (name == NULL)
1864                   return false;
1865                 if (*name == '\0')
1866                   name = bfd_section_name (input_bfd, sec);
1867               }
1868             if (! ((*info->callbacks->reloc_overflow)
1869                    (info, name, howto->name, (bfd_vma) 0,
1870                     input_bfd, input_section, rel->r_offset)))
1871               return false;
1872           }
1873           break;
1874
1875         default:
1876         case bfd_reloc_outofrange:
1877           abort ();
1878           break;
1879         }
1880     }
1881
1882   return true;
1883 }
1884
1885 /* Finish up dynamic symbol handling.  We set the contents of various
1886    dynamic sections here.  */
1887
1888 static boolean
1889 elf_i386_finish_dynamic_symbol (output_bfd, info, h, sym)
1890      bfd *output_bfd;
1891      struct bfd_link_info *info;
1892      struct elf_link_hash_entry *h;
1893      Elf_Internal_Sym *sym;
1894 {
1895   struct elf_i386_link_hash_table *htab;
1896   bfd *dynobj;
1897
1898   htab = elf_i386_hash_table (info);
1899   dynobj = htab->root.dynobj;
1900
1901   if (h->plt.offset != (bfd_vma) -1)
1902     {
1903       bfd_vma plt_index;
1904       bfd_vma got_offset;
1905       Elf_Internal_Rel rel;
1906
1907       /* This symbol has an entry in the procedure linkage table.  Set
1908          it up.  */
1909
1910       if (h->dynindx == -1
1911           || htab->splt == NULL
1912           || htab->sgotplt == NULL
1913           || htab->srelplt == NULL)
1914         abort ();
1915
1916       /* Get the index in the procedure linkage table which
1917          corresponds to this symbol.  This is the index of this symbol
1918          in all the symbols for which we are making plt entries.  The
1919          first entry in the procedure linkage table is reserved.  */
1920       plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
1921
1922       /* Get the offset into the .got table of the entry that
1923          corresponds to this function.  Each .got entry is 4 bytes.
1924          The first three are reserved.  */
1925       got_offset = (plt_index + 3) * 4;
1926
1927       /* Fill in the entry in the procedure linkage table.  */
1928       if (! info->shared)
1929         {
1930           memcpy (htab->splt->contents + h->plt.offset, elf_i386_plt_entry,
1931                   PLT_ENTRY_SIZE);
1932           bfd_put_32 (output_bfd,
1933                       (htab->sgotplt->output_section->vma
1934                        + htab->sgotplt->output_offset
1935                        + got_offset),
1936                       htab->splt->contents + h->plt.offset + 2);
1937         }
1938       else
1939         {
1940           memcpy (htab->splt->contents + h->plt.offset, elf_i386_pic_plt_entry,
1941                   PLT_ENTRY_SIZE);
1942           bfd_put_32 (output_bfd, got_offset,
1943                       htab->splt->contents + h->plt.offset + 2);
1944         }
1945
1946       bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rel),
1947                   htab->splt->contents + h->plt.offset + 7);
1948       bfd_put_32 (output_bfd, - (h->plt.offset + PLT_ENTRY_SIZE),
1949                   htab->splt->contents + h->plt.offset + 12);
1950
1951       /* Fill in the entry in the global offset table.  */
1952       bfd_put_32 (output_bfd,
1953                   (htab->splt->output_section->vma
1954                    + htab->splt->output_offset
1955                    + h->plt.offset
1956                    + 6),
1957                   htab->sgotplt->contents + got_offset);
1958
1959       /* Fill in the entry in the .rel.plt section.  */
1960       rel.r_offset = (htab->sgotplt->output_section->vma
1961                       + htab->sgotplt->output_offset
1962                       + got_offset);
1963       rel.r_info = ELF32_R_INFO (h->dynindx, R_386_JUMP_SLOT);
1964       bfd_elf32_swap_reloc_out (output_bfd, &rel,
1965                                 ((Elf32_External_Rel *) htab->srelplt->contents
1966                                  + plt_index));
1967
1968       if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1969         {
1970           /* Mark the symbol as undefined, rather than as defined in
1971              the .plt section.  Leave the value alone.  */
1972           sym->st_shndx = SHN_UNDEF;
1973         }
1974     }
1975
1976   if (h->got.offset != (bfd_vma) -1)
1977     {
1978       Elf_Internal_Rel rel;
1979
1980       /* This symbol has an entry in the global offset table.  Set it
1981          up.  */
1982
1983       if (htab->sgot == NULL || htab->srelgot == NULL)
1984         abort ();
1985
1986       rel.r_offset = (htab->sgot->output_section->vma
1987                       + htab->sgot->output_offset
1988                       + (h->got.offset & ~(bfd_vma) 1));
1989
1990       /* If this is a static link, or it is a -Bsymbolic link and the
1991          symbol is defined locally or was forced to be local because
1992          of a version file, we just want to emit a RELATIVE reloc.
1993          The entry in the global offset table will already have been
1994          initialized in the relocate_section function.  */
1995       if (info->shared
1996           && (info->symbolic
1997               || h->dynindx == -1
1998               || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL))
1999           && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
2000         {
2001           BFD_ASSERT((h->got.offset & 1) != 0);
2002           rel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
2003         }
2004       else
2005         {
2006           BFD_ASSERT((h->got.offset & 1) == 0);
2007           bfd_put_32 (output_bfd, (bfd_vma) 0,
2008                       htab->sgot->contents + h->got.offset);
2009           rel.r_info = ELF32_R_INFO (h->dynindx, R_386_GLOB_DAT);
2010         }
2011
2012       bfd_elf32_swap_reloc_out (output_bfd, &rel,
2013                                 ((Elf32_External_Rel *) htab->srelgot->contents
2014                                  + htab->srelgot->reloc_count));
2015       ++htab->srelgot->reloc_count;
2016     }
2017
2018   if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
2019     {
2020       Elf_Internal_Rel rel;
2021
2022       /* This symbol needs a copy reloc.  Set it up.  */
2023
2024       if (h->dynindx == -1
2025           || (h->root.type != bfd_link_hash_defined
2026               && h->root.type != bfd_link_hash_defweak)
2027           || htab->srelbss == NULL)
2028         abort ();
2029
2030       rel.r_offset = (h->root.u.def.value
2031                       + h->root.u.def.section->output_section->vma
2032                       + h->root.u.def.section->output_offset);
2033       rel.r_info = ELF32_R_INFO (h->dynindx, R_386_COPY);
2034       bfd_elf32_swap_reloc_out (output_bfd, &rel,
2035                                 ((Elf32_External_Rel *) htab->srelbss->contents
2036                                  + htab->srelbss->reloc_count));
2037       ++htab->srelbss->reloc_count;
2038     }
2039
2040   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
2041   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
2042       || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
2043     sym->st_shndx = SHN_ABS;
2044
2045   return true;
2046 }
2047
2048 /* Finish up the dynamic sections.  */
2049
2050 static boolean
2051 elf_i386_finish_dynamic_sections (output_bfd, info)
2052      bfd *output_bfd;
2053      struct bfd_link_info *info;
2054 {
2055   struct elf_i386_link_hash_table *htab;
2056   bfd *dynobj;
2057   asection *sdyn;
2058
2059   htab = elf_i386_hash_table (info);
2060   dynobj = htab->root.dynobj;
2061   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
2062
2063   if (htab->root.dynamic_sections_created)
2064     {
2065       Elf32_External_Dyn *dyncon, *dynconend;
2066
2067       if (sdyn == NULL || htab->sgot == NULL)
2068         abort ();
2069
2070       dyncon = (Elf32_External_Dyn *) sdyn->contents;
2071       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
2072       for (; dyncon < dynconend; dyncon++)
2073         {
2074           Elf_Internal_Dyn dyn;
2075
2076           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
2077
2078           switch (dyn.d_tag)
2079             {
2080             default:
2081               break;
2082
2083             case DT_PLTGOT:
2084               dyn.d_un.d_ptr = htab->sgot->output_section->vma;
2085               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2086               break;
2087
2088             case DT_JMPREL:
2089               dyn.d_un.d_ptr = htab->srelplt->output_section->vma;
2090               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2091               break;
2092
2093             case DT_PLTRELSZ:
2094               if (htab->srelplt->output_section->_cooked_size != 0)
2095                 dyn.d_un.d_val = htab->srelplt->output_section->_cooked_size;
2096               else
2097                 dyn.d_un.d_val = htab->srelplt->output_section->_raw_size;
2098               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2099               break;
2100
2101             case DT_RELSZ:
2102               /* My reading of the SVR4 ABI indicates that the
2103                  procedure linkage table relocs (DT_JMPREL) should be
2104                  included in the overall relocs (DT_REL).  This is
2105                  what Solaris does.  However, UnixWare can not handle
2106                  that case.  Therefore, we override the DT_RELSZ entry
2107                  here to make it not include the JMPREL relocs.  Since
2108                  the linker script arranges for .rel.plt to follow all
2109                  other relocation sections, we don't have to worry
2110                  about changing the DT_REL entry.  */
2111               if (htab->srelplt != NULL)
2112                 {
2113                   if (htab->srelplt->output_section->_cooked_size != 0)
2114                     dyn.d_un.d_val -= htab->srelplt->output_section->_cooked_size;
2115                   else
2116                     dyn.d_un.d_val -= htab->srelplt->output_section->_raw_size;
2117                 }
2118               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2119               break;
2120             }
2121         }
2122
2123       /* Fill in the first entry in the procedure linkage table.  */
2124       if (htab->splt && htab->splt->_raw_size > 0)
2125         {
2126           if (info->shared)
2127             memcpy (htab->splt->contents,
2128                     elf_i386_pic_plt0_entry, PLT_ENTRY_SIZE);
2129           else
2130             {
2131               memcpy (htab->splt->contents,
2132                       elf_i386_plt0_entry, PLT_ENTRY_SIZE);
2133               bfd_put_32 (output_bfd,
2134                           (htab->sgotplt->output_section->vma
2135                            + htab->sgotplt->output_offset
2136                            + 4),
2137                           htab->splt->contents + 2);
2138               bfd_put_32 (output_bfd,
2139                           (htab->sgotplt->output_section->vma
2140                            + htab->sgotplt->output_offset
2141                            + 8),
2142                           htab->splt->contents + 8);
2143             }
2144
2145           /* UnixWare sets the entsize of .plt to 4, although that doesn't
2146              really seem like the right value.  */
2147           elf_section_data (htab->splt->output_section)
2148             ->this_hdr.sh_entsize = 4;
2149         }
2150     }
2151
2152   if (htab->sgotplt)
2153     {
2154       /* Fill in the first three entries in the global offset table.  */
2155       if (htab->sgotplt->_raw_size > 0)
2156         {
2157           bfd_put_32 (output_bfd,
2158                       (sdyn == NULL ? (bfd_vma) 0
2159                        : sdyn->output_section->vma + sdyn->output_offset),
2160                       htab->sgotplt->contents);
2161           bfd_put_32 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + 4);
2162           bfd_put_32 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + 8);
2163         }
2164
2165       elf_section_data (htab->sgotplt->output_section)->this_hdr.sh_entsize = 4;
2166     }
2167   return true;
2168 }
2169
2170 /* Set the correct type for an x86 ELF section.  We do this by the
2171    section name, which is a hack, but ought to work.  */
2172
2173 static boolean
2174 elf_i386_fake_sections (abfd, hdr, sec)
2175      bfd *abfd ATTRIBUTE_UNUSED;
2176      Elf32_Internal_Shdr *hdr;
2177      asection *sec;
2178 {
2179   register const char *name;
2180
2181   name = bfd_get_section_name (abfd, sec);
2182
2183   if (strcmp (name, ".reloc") == 0)
2184     /*
2185      * This is an ugly, but unfortunately necessary hack that is
2186      * needed when producing EFI binaries on x86. It tells
2187      * elf.c:elf_fake_sections() not to consider ".reloc" as a section
2188      * containing ELF relocation info.  We need this hack in order to
2189      * be able to generate ELF binaries that can be translated into
2190      * EFI applications (which are essentially COFF objects).  Those
2191      * files contain a COFF ".reloc" section inside an ELFNN object,
2192      * which would normally cause BFD to segfault because it would
2193      * attempt to interpret this section as containing relocation
2194      * entries for section "oc".  With this hack enabled, ".reloc"
2195      * will be treated as a normal data section, which will avoid the
2196      * segfault.  However, you won't be able to create an ELFNN binary
2197      * with a section named "oc" that needs relocations, but that's
2198      * the kind of ugly side-effects you get when detecting section
2199      * types based on their names...  In practice, this limitation is
2200      * unlikely to bite.
2201      */
2202     hdr->sh_type = SHT_PROGBITS;
2203
2204   return true;
2205 }
2206
2207 static enum elf_reloc_type_class
2208 elf_i386_reloc_type_class (type)
2209      int type;
2210 {
2211   switch (type)
2212     {
2213     case R_386_RELATIVE:
2214       return reloc_class_relative;
2215     case R_386_JUMP_SLOT:
2216       return reloc_class_plt;
2217     case R_386_COPY:
2218       return reloc_class_copy;
2219     default:
2220       return reloc_class_normal;
2221     }
2222 }
2223
2224 /* Support for core dump NOTE sections */
2225 static boolean
2226 elf_i386_grok_prstatus (abfd, note)
2227      bfd *abfd;
2228      Elf_Internal_Note *note;
2229 {
2230   int offset;
2231   size_t raw_size;
2232
2233   switch (note->descsz)
2234     {
2235       default:
2236         return false;
2237
2238       case 144:         /* Linux/i386 */
2239         /* pr_cursig */
2240         elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
2241
2242         /* pr_pid */
2243         elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
2244
2245         /* pr_reg */
2246         offset = 72;
2247         raw_size = 68;
2248
2249         break;
2250     }
2251
2252   /* Make a ".reg/999" section.  */
2253   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
2254                                           raw_size, note->descpos + offset);
2255 }
2256
2257 static boolean
2258 elf_i386_grok_psinfo (abfd, note)
2259      bfd *abfd;
2260      Elf_Internal_Note *note;
2261 {
2262   switch (note->descsz)
2263     {
2264       default:
2265         return false;
2266
2267       case 128:         /* Linux/MIPS elf_prpsinfo */
2268         elf_tdata (abfd)->core_program
2269          = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
2270         elf_tdata (abfd)->core_command
2271          = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
2272     }
2273
2274   /* Note that for some reason, a spurious space is tacked
2275      onto the end of the args in some (at least one anyway)
2276      implementations, so strip it off if it exists.  */
2277
2278   {
2279     char *command = elf_tdata (abfd)->core_command;
2280     int n = strlen (command);
2281
2282     if (0 < n && command[n - 1] == ' ')
2283       command[n - 1] = '\0';
2284   }
2285
2286   return true;
2287 }
2288
2289 #define TARGET_LITTLE_SYM               bfd_elf32_i386_vec
2290 #define TARGET_LITTLE_NAME              "elf32-i386"
2291 #define ELF_ARCH                        bfd_arch_i386
2292 #define ELF_MACHINE_CODE                EM_386
2293 #define ELF_MAXPAGESIZE                 0x1000
2294
2295 #define elf_backend_can_gc_sections     1
2296 #define elf_backend_want_got_plt        1
2297 #define elf_backend_plt_readonly        1
2298 #define elf_backend_want_plt_sym        0
2299 #define elf_backend_got_header_size     12
2300 #define elf_backend_plt_header_size     PLT_ENTRY_SIZE
2301
2302 #define elf_info_to_howto                     elf_i386_info_to_howto
2303 #define elf_info_to_howto_rel                 elf_i386_info_to_howto_rel
2304
2305 #define bfd_elf32_bfd_is_local_label_name     elf_i386_is_local_label_name
2306 #define bfd_elf32_bfd_link_hash_table_create  elf_i386_link_hash_table_create
2307 #define bfd_elf32_bfd_reloc_type_lookup       elf_i386_reloc_type_lookup
2308
2309 #define elf_backend_adjust_dynamic_symbol     elf_i386_adjust_dynamic_symbol
2310 #define elf_backend_check_relocs              elf_i386_check_relocs
2311 #define elf_backend_create_dynamic_sections   elf_i386_create_dynamic_sections
2312 #define elf_backend_finish_dynamic_sections   elf_i386_finish_dynamic_sections
2313 #define elf_backend_finish_dynamic_symbol     elf_i386_finish_dynamic_symbol
2314 #define elf_backend_gc_mark_hook              elf_i386_gc_mark_hook
2315 #define elf_backend_gc_sweep_hook             elf_i386_gc_sweep_hook
2316 #define elf_backend_relocate_section          elf_i386_relocate_section
2317 #define elf_backend_size_dynamic_sections     elf_i386_size_dynamic_sections
2318 #define elf_backend_fake_sections             elf_i386_fake_sections
2319 #define elf_backend_grok_prstatus             elf_i386_grok_prstatus
2320 #define elf_backend_grok_psinfo               elf_i386_grok_psinfo
2321 #define elf_backend_reloc_type_class          elf_i386_reloc_type_class
2322
2323 #include "elf32-target.h"