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