]> Git Repo - binutils.git/blob - bfd/elf32-i386.c
* v850.h (v850_operands): Add flags field.
[binutils.git] / bfd / elf32-i386.c
1 /* Intel 80386/80486-specific support for 32-bit ELF
2    Copyright 1993, 1994, 1995, 1996 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_check_relocs
33   PARAMS ((bfd *, struct bfd_link_info *, asection *,
34            const Elf_Internal_Rela *));
35 static boolean elf_i386_adjust_dynamic_symbol
36   PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
37 static boolean elf_i386_size_dynamic_sections
38   PARAMS ((bfd *, struct bfd_link_info *));
39 static boolean elf_i386_relocate_section
40   PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
41            Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
42 static boolean elf_i386_finish_dynamic_symbol
43   PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
44            Elf_Internal_Sym *));
45 static boolean elf_i386_finish_dynamic_sections
46   PARAMS ((bfd *, struct bfd_link_info *));
47
48 #define USE_REL 1               /* 386 uses REL relocations instead of RELA */
49
50 enum reloc_type
51   {
52     R_386_NONE = 0,
53     R_386_32,
54     R_386_PC32,
55     R_386_GOT32,
56     R_386_PLT32,
57     R_386_COPY,
58     R_386_GLOB_DAT,
59     R_386_JUMP_SLOT,
60     R_386_RELATIVE,
61     R_386_GOTOFF,
62     R_386_GOTPC,
63     R_386_max
64   };
65
66 #if 0
67 static CONST char *CONST reloc_type_names[] =
68 {
69   "R_386_NONE",
70   "R_386_32",
71   "R_386_PC32",
72   "R_386_GOT32",
73   "R_386_PLT32",
74   "R_386_COPY",
75   "R_386_GLOB_DAT",
76   "R_386_JUMP_SLOT",
77   "R_386_RELATIVE",
78   "R_386_GOTOFF",
79   "R_386_GOTPC",
80 };
81 #endif
82
83 static reloc_howto_type elf_howto_table[]=
84 {
85   HOWTO(R_386_NONE,      0,0, 0,false,0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_NONE",     true,0x00000000,0x00000000,false),
86   HOWTO(R_386_32,        0,2,32,false,0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_32",       true,0xffffffff,0xffffffff,false),
87   HOWTO(R_386_PC32,      0,2,32,true, 0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_PC32",     true,0xffffffff,0xffffffff,true),
88   HOWTO(R_386_GOT32,     0,2,32,false,0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_GOT32",    true,0xffffffff,0xffffffff,false),
89   HOWTO(R_386_PLT32,     0,2,32,true,0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_PLT32",    true,0xffffffff,0xffffffff,true),
90   HOWTO(R_386_COPY,      0,2,32,false,0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_COPY",     true,0xffffffff,0xffffffff,false),
91   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),
92   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),
93   HOWTO(R_386_RELATIVE,  0,2,32,false,0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_RELATIVE", true,0xffffffff,0xffffffff,false),
94   HOWTO(R_386_GOTOFF,    0,2,32,false,0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_GOTOFF",   true,0xffffffff,0xffffffff,false),
95   HOWTO(R_386_GOTPC,     0,2,32,true,0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_GOTPC",    true,0xffffffff,0xffffffff,true),
96 };
97
98 #ifdef DEBUG_GEN_RELOC
99 #define TRACE(str) fprintf (stderr, "i386 bfd reloc lookup %d (%s)\n", code, str)
100 #else
101 #define TRACE(str)
102 #endif
103
104 static reloc_howto_type *
105 elf_i386_reloc_type_lookup (abfd, code)
106      bfd *abfd;
107      bfd_reloc_code_real_type code;
108 {
109   switch (code)
110     {
111     case BFD_RELOC_NONE:
112       TRACE ("BFD_RELOC_NONE");
113       return &elf_howto_table[ (int)R_386_NONE ];
114
115     case BFD_RELOC_32:
116       TRACE ("BFD_RELOC_32");
117       return &elf_howto_table[ (int)R_386_32 ];
118
119     case BFD_RELOC_32_PCREL:
120       TRACE ("BFD_RELOC_PC32");
121       return &elf_howto_table[ (int)R_386_PC32 ];
122
123     case BFD_RELOC_386_GOT32:
124       TRACE ("BFD_RELOC_386_GOT32");
125       return &elf_howto_table[ (int)R_386_GOT32 ];
126
127     case BFD_RELOC_386_PLT32:
128       TRACE ("BFD_RELOC_386_PLT32");
129       return &elf_howto_table[ (int)R_386_PLT32 ];
130
131     case BFD_RELOC_386_COPY:
132       TRACE ("BFD_RELOC_386_COPY");
133       return &elf_howto_table[ (int)R_386_COPY ];
134
135     case BFD_RELOC_386_GLOB_DAT:
136       TRACE ("BFD_RELOC_386_GLOB_DAT");
137       return &elf_howto_table[ (int)R_386_GLOB_DAT ];
138
139     case BFD_RELOC_386_JUMP_SLOT:
140       TRACE ("BFD_RELOC_386_JUMP_SLOT");
141       return &elf_howto_table[ (int)R_386_JUMP_SLOT ];
142
143     case BFD_RELOC_386_RELATIVE:
144       TRACE ("BFD_RELOC_386_RELATIVE");
145       return &elf_howto_table[ (int)R_386_RELATIVE ];
146
147     case BFD_RELOC_386_GOTOFF:
148       TRACE ("BFD_RELOC_386_GOTOFF");
149       return &elf_howto_table[ (int)R_386_GOTOFF ];
150
151     case BFD_RELOC_386_GOTPC:
152       TRACE ("BFD_RELOC_386_GOTPC");
153       return &elf_howto_table[ (int)R_386_GOTPC ];
154
155     default:
156       break;
157     }
158
159   TRACE ("Unknown");
160   return 0;
161 }
162
163 static void
164 elf_i386_info_to_howto (abfd, cache_ptr, dst)
165      bfd                *abfd;
166      arelent            *cache_ptr;
167      Elf32_Internal_Rela *dst;
168 {
169   BFD_ASSERT (ELF32_R_TYPE(dst->r_info) < (unsigned int) R_386_max);
170
171   cache_ptr->howto = &elf_howto_table[ELF32_R_TYPE(dst->r_info)];
172 }
173
174 static void
175 elf_i386_info_to_howto_rel (abfd, cache_ptr, dst)
176      bfd                *abfd;
177      arelent            *cache_ptr;
178      Elf32_Internal_Rel *dst;
179 {
180   BFD_ASSERT (ELF32_R_TYPE(dst->r_info) < (unsigned int) R_386_max);
181
182   cache_ptr->howto = &elf_howto_table[ELF32_R_TYPE(dst->r_info)];
183 }
184 \f
185 /* Functions for the i386 ELF linker.  */
186
187 /* The name of the dynamic interpreter.  This is put in the .interp
188    section.  */
189
190 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1"
191
192 /* The size in bytes of an entry in the procedure linkage table.  */
193
194 #define PLT_ENTRY_SIZE 16
195
196 /* The first entry in an absolute procedure linkage table looks like
197    this.  See the SVR4 ABI i386 supplement to see how this works.  */
198
199 static const bfd_byte elf_i386_plt0_entry[PLT_ENTRY_SIZE] =
200 {
201   0xff, 0x35,   /* pushl contents of address */
202   0, 0, 0, 0,   /* replaced with address of .got + 4.  */
203   0xff, 0x25,   /* jmp indirect */
204   0, 0, 0, 0,   /* replaced with address of .got + 8.  */
205   0, 0, 0, 0    /* pad out to 16 bytes.  */
206 };
207
208 /* Subsequent entries in an absolute procedure linkage table look like
209    this.  */
210
211 static const bfd_byte elf_i386_plt_entry[PLT_ENTRY_SIZE] =
212 {
213   0xff, 0x25,   /* jmp indirect */
214   0, 0, 0, 0,   /* replaced with address of this symbol in .got.  */
215   0x68,         /* pushl immediate */
216   0, 0, 0, 0,   /* replaced with offset into relocation table.  */
217   0xe9,         /* jmp relative */
218   0, 0, 0, 0    /* replaced with offset to start of .plt.  */
219 };
220
221 /* The first entry in a PIC procedure linkage table look like this.  */
222
223 static const bfd_byte elf_i386_pic_plt0_entry[PLT_ENTRY_SIZE] =
224 {
225   0xff, 0xb3, 4, 0, 0, 0,       /* pushl 4(%ebx) */     
226   0xff, 0xa3, 8, 0, 0, 0,       /* jmp *8(%ebx) */      
227   0, 0, 0, 0                    /* pad out to 16 bytes.  */
228 };
229
230 /* Subsequent entries in a PIC procedure linkage table look like this.  */
231
232 static const bfd_byte elf_i386_pic_plt_entry[PLT_ENTRY_SIZE] =
233 {
234   0xff, 0xa3,   /* jmp *offset(%ebx) */
235   0, 0, 0, 0,   /* replaced with offset of this symbol in .got.  */
236   0x68,         /* pushl immediate */
237   0, 0, 0, 0,   /* replaced with offset into relocation table.  */
238   0xe9,         /* jmp relative */
239   0, 0, 0, 0    /* replaced with offset to start of .plt.  */
240 };
241
242 /* Look through the relocs for a section during the first phase, and
243    allocate space in the global offset table or procedure linkage
244    table.  */
245
246 static boolean
247 elf_i386_check_relocs (abfd, info, sec, relocs)
248      bfd *abfd;
249      struct bfd_link_info *info;
250      asection *sec;
251      const Elf_Internal_Rela *relocs;
252 {
253   bfd *dynobj;
254   Elf_Internal_Shdr *symtab_hdr;
255   struct elf_link_hash_entry **sym_hashes;
256   bfd_vma *local_got_offsets;
257   const Elf_Internal_Rela *rel;
258   const Elf_Internal_Rela *rel_end;
259   asection *sgot;
260   asection *srelgot;
261   asection *sreloc;
262
263   if (info->relocateable)
264     return true;
265
266   dynobj = elf_hash_table (info)->dynobj;
267   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
268   sym_hashes = elf_sym_hashes (abfd);
269   local_got_offsets = elf_local_got_offsets (abfd);
270
271   sgot = NULL;
272   srelgot = NULL;
273   sreloc = NULL;
274
275   rel_end = relocs + sec->reloc_count;
276   for (rel = relocs; rel < rel_end; rel++)
277     {
278       unsigned long r_symndx;
279       struct elf_link_hash_entry *h;
280
281       r_symndx = ELF32_R_SYM (rel->r_info);
282
283       if (r_symndx < symtab_hdr->sh_info)
284         h = NULL;
285       else
286         h = sym_hashes[r_symndx - symtab_hdr->sh_info];
287
288       /* Some relocs require a global offset table.  */
289       if (dynobj == NULL)
290         {
291           switch (ELF32_R_TYPE (rel->r_info))
292             {
293             case R_386_GOT32:
294             case R_386_GOTOFF:
295             case R_386_GOTPC:
296               elf_hash_table (info)->dynobj = dynobj = abfd;
297               if (! _bfd_elf_create_got_section (dynobj, info))
298                 return false;
299               break;
300
301             default:
302               break;
303             }
304         }
305
306       switch (ELF32_R_TYPE (rel->r_info))
307         {
308         case R_386_GOT32:
309           /* This symbol requires a global offset table entry.  */
310      
311           if (sgot == NULL)
312             {
313               sgot = bfd_get_section_by_name (dynobj, ".got");
314               BFD_ASSERT (sgot != NULL);
315             }
316
317           if (srelgot == NULL
318               && (h != NULL || info->shared))
319             {
320               srelgot = bfd_get_section_by_name (dynobj, ".rel.got");
321               if (srelgot == NULL)
322                 {
323                   srelgot = bfd_make_section (dynobj, ".rel.got");
324                   if (srelgot == NULL
325                       || ! bfd_set_section_flags (dynobj, srelgot,
326                                                   (SEC_ALLOC
327                                                    | SEC_LOAD
328                                                    | SEC_HAS_CONTENTS
329                                                    | SEC_IN_MEMORY
330                                                    | SEC_READONLY))
331                       || ! bfd_set_section_alignment (dynobj, srelgot, 2))
332                     return false;
333                 }
334             }
335
336           if (h != NULL)
337             {
338               if (h->got_offset != (bfd_vma) -1)
339                 {
340                   /* We have already allocated space in the .got.  */
341                   break;
342                 }
343               h->got_offset = sgot->_raw_size;
344
345               /* Make sure this symbol is output as a dynamic symbol.  */
346               if (h->dynindx == -1)
347                 {
348                   if (! bfd_elf32_link_record_dynamic_symbol (info, h))
349                     return false;
350                 }
351
352               srelgot->_raw_size += sizeof (Elf32_External_Rel);
353             }
354           else
355             {
356               /* This is a global offset table entry for a local
357                  symbol.  */
358               if (local_got_offsets == NULL)
359                 {
360                   size_t size;
361                   register unsigned int i;
362
363                   size = symtab_hdr->sh_info * sizeof (bfd_vma);
364                   local_got_offsets = (bfd_vma *) bfd_alloc (abfd, size);
365                   if (local_got_offsets == NULL)
366                     return false;
367                   elf_local_got_offsets (abfd) = local_got_offsets;
368                   for (i = 0; i < symtab_hdr->sh_info; i++)
369                     local_got_offsets[i] = (bfd_vma) -1;
370                 }
371               if (local_got_offsets[r_symndx] != (bfd_vma) -1)
372                 {
373                   /* We have already allocated space in the .got.  */
374                   break;
375                 }
376               local_got_offsets[r_symndx] = sgot->_raw_size;
377
378               if (info->shared)
379                 {
380                   /* If we are generating a shared object, we need to
381                      output a R_386_RELATIVE reloc so that the dynamic
382                      linker can adjust this GOT entry.  */
383                   srelgot->_raw_size += sizeof (Elf32_External_Rel);
384                 }
385             }
386
387           sgot->_raw_size += 4;
388
389           break;
390
391         case R_386_PLT32:
392           /* This symbol requires a procedure linkage table entry.  We
393              actually build the entry in adjust_dynamic_symbol,
394              because this might be a case of linking PIC code without
395              linking in any dynamic objects, in which case we don't
396              need to generate a procedure linkage table after all.  */
397           
398           /* If this is a local symbol, we resolve it directly without
399              creating a procedure linkage table entry.  */
400           if (h == NULL)
401             continue;
402
403           /* Make sure this symbol is output as a dynamic symbol.  */
404           if (h->dynindx == -1)
405             {
406               if (! bfd_elf32_link_record_dynamic_symbol (info, h))
407                 return false;
408             }
409
410           h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
411
412           break;
413
414         case R_386_32:
415         case R_386_PC32:
416           if (info->shared
417               && (sec->flags & SEC_ALLOC) != 0
418               && (ELF32_R_TYPE (rel->r_info) != R_386_PC32 || h != NULL))
419             {
420               /* When creating a shared object, we must copy these
421                  reloc types into the output file.  We create a reloc
422                  section in dynobj and make room for this reloc.  */
423               if (sreloc == NULL)
424                 {
425                   const char *name;
426
427                   name = (bfd_elf_string_from_elf_section
428                           (abfd,
429                            elf_elfheader (abfd)->e_shstrndx,
430                            elf_section_data (sec)->rel_hdr.sh_name));
431                   if (name == NULL)
432                     return false;
433
434                   BFD_ASSERT (strncmp (name, ".rel", 4) == 0
435                               && strcmp (bfd_get_section_name (abfd, sec),
436                                          name + 4) == 0);
437
438                   sreloc = bfd_get_section_by_name (dynobj, name);
439                   if (sreloc == NULL)
440                     {
441                       sreloc = bfd_make_section (dynobj, name);
442                       if (sreloc == NULL
443                           || ! bfd_set_section_flags (dynobj, sreloc,
444                                                       (SEC_ALLOC
445                                                        | SEC_LOAD
446                                                        | SEC_HAS_CONTENTS
447                                                        | SEC_IN_MEMORY
448                                                        | SEC_READONLY))
449                           || ! bfd_set_section_alignment (dynobj, sreloc, 2))
450                         return false;
451                     }
452                 }
453
454               sreloc->_raw_size += sizeof (Elf32_External_Rel);
455             }
456              
457           break;
458
459         default:
460           break;
461         }
462     }
463
464   return true;
465 }
466
467 /* Adjust a symbol defined by a dynamic object and referenced by a
468    regular object.  The current definition is in some section of the
469    dynamic object, but we're not including those sections.  We have to
470    change the definition to something the rest of the link can
471    understand.  */
472
473 static boolean
474 elf_i386_adjust_dynamic_symbol (info, h)
475      struct bfd_link_info *info;
476      struct elf_link_hash_entry *h;
477 {
478   bfd *dynobj;
479   asection *s;
480   unsigned int power_of_two;
481
482   dynobj = elf_hash_table (info)->dynobj;
483
484   /* Make sure we know what is going on here.  */
485   BFD_ASSERT (dynobj != NULL
486               && ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT)
487                   || h->weakdef != NULL
488                   || ((h->elf_link_hash_flags
489                        & ELF_LINK_HASH_DEF_DYNAMIC) != 0
490                       && (h->elf_link_hash_flags
491                           & ELF_LINK_HASH_REF_REGULAR) != 0
492                       && (h->elf_link_hash_flags
493                           & ELF_LINK_HASH_DEF_REGULAR) == 0)));
494
495   /* If this is a function, put it in the procedure linkage table.  We
496      will fill in the contents of the procedure linkage table later,
497      when we know the address of the .got section.  */
498   if (h->type == STT_FUNC
499       || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
500     {
501       if (! elf_hash_table (info)->dynamic_sections_created)
502         {
503           /* This case can occur if we saw a PLT32 reloc in an input
504              file, but none of the input files were dynamic objects.
505              In such a case, we don't actually need to build a
506              procedure linkage table, and we can just do a PC32 reloc
507              instead.  */
508           BFD_ASSERT ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0);
509           return true;
510         }
511
512       s = bfd_get_section_by_name (dynobj, ".plt");
513       BFD_ASSERT (s != NULL);
514
515       /* If this is the first .plt entry, make room for the special
516          first entry.  */
517       if (s->_raw_size == 0)
518         s->_raw_size += PLT_ENTRY_SIZE;
519
520       /* If this symbol is not defined in a regular file, and we are
521          not generating a shared library, then set the symbol to this
522          location in the .plt.  This is required to make function
523          pointers compare as equal between the normal executable and
524          the shared library.  */
525       if (! info->shared
526           && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
527         {
528           h->root.u.def.section = s;
529           h->root.u.def.value = s->_raw_size;
530         }
531
532       h->plt_offset = s->_raw_size;
533
534       /* Make room for this entry.  */
535       s->_raw_size += PLT_ENTRY_SIZE;
536
537       /* We also need to make an entry in the .got.plt section, which
538          will be placed in the .got section by the linker script.  */
539
540       s = bfd_get_section_by_name (dynobj, ".got.plt");
541       BFD_ASSERT (s != NULL);
542       s->_raw_size += 4;
543
544       /* We also need to make an entry in the .rel.plt section.  */
545
546       s = bfd_get_section_by_name (dynobj, ".rel.plt");
547       BFD_ASSERT (s != NULL);
548       s->_raw_size += sizeof (Elf32_External_Rel);
549
550       return true;
551     }
552
553   /* If this is a weak symbol, and there is a real definition, the
554      processor independent code will have arranged for us to see the
555      real definition first, and we can just use the same value.  */
556   if (h->weakdef != NULL)
557     {
558       BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
559                   || h->weakdef->root.type == bfd_link_hash_defweak);
560       h->root.u.def.section = h->weakdef->root.u.def.section;
561       h->root.u.def.value = h->weakdef->root.u.def.value;
562       return true;
563     }
564
565   /* This is a reference to a symbol defined by a dynamic object which
566      is not a function.  */
567
568   /* If we are creating a shared library, we must presume that the
569      only references to the symbol are via the global offset table.
570      For such cases we need not do anything here; the relocations will
571      be handled correctly by relocate_section.  */
572   if (info->shared)
573     return true;
574
575   /* We must allocate the symbol in our .dynbss section, which will
576      become part of the .bss section of the executable.  There will be
577      an entry for this symbol in the .dynsym section.  The dynamic
578      object will contain position independent code, so all references
579      from the dynamic object to this symbol will go through the global
580      offset table.  The dynamic linker will use the .dynsym entry to
581      determine the address it must put in the global offset table, so
582      both the dynamic object and the regular object will refer to the
583      same memory location for the variable.  */
584
585   s = bfd_get_section_by_name (dynobj, ".dynbss");
586   BFD_ASSERT (s != NULL);
587
588   /* If the symbol is currently defined in the .bss section of the
589      dynamic object, then it is OK to simply initialize it to zero.
590      If the symbol is in some other section, we must generate a
591      R_386_COPY reloc to tell the dynamic linker to copy the initial
592      value out of the dynamic object and into the runtime process
593      image.  We need to remember the offset into the .rel.bss section
594      we are going to use.  */
595   if ((h->root.u.def.section->flags & SEC_LOAD) != 0)
596     {
597       asection *srel;
598
599       srel = bfd_get_section_by_name (dynobj, ".rel.bss");
600       BFD_ASSERT (srel != NULL);
601       srel->_raw_size += sizeof (Elf32_External_Rel);
602       h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
603     }
604
605   /* We need to figure out the alignment required for this symbol.  I
606      have no idea how ELF linkers handle this.  */
607   power_of_two = bfd_log2 (h->size);
608   if (power_of_two > 3)
609     power_of_two = 3;
610
611   /* Apply the required alignment.  */
612   s->_raw_size = BFD_ALIGN (s->_raw_size,
613                             (bfd_size_type) (1 << power_of_two));
614   if (power_of_two > bfd_get_section_alignment (dynobj, s))
615     {
616       if (! bfd_set_section_alignment (dynobj, s, power_of_two))
617         return false;
618     }
619
620   /* Define the symbol as being at this point in the section.  */
621   h->root.u.def.section = s;
622   h->root.u.def.value = s->_raw_size;
623
624   /* Increment the section size to make room for the symbol.  */
625   s->_raw_size += h->size;
626
627   return true;
628 }
629
630 /* Set the sizes of the dynamic sections.  */
631
632 static boolean
633 elf_i386_size_dynamic_sections (output_bfd, info)
634      bfd *output_bfd;
635      struct bfd_link_info *info;
636 {
637   bfd *dynobj;
638   asection *s;
639   boolean plt;
640   boolean relocs;
641   boolean reltext;
642
643   dynobj = elf_hash_table (info)->dynobj;
644   BFD_ASSERT (dynobj != NULL);
645
646   if (elf_hash_table (info)->dynamic_sections_created)
647     {
648       /* Set the contents of the .interp section to the interpreter.  */
649       if (! info->shared)
650         {
651           s = bfd_get_section_by_name (dynobj, ".interp");
652           BFD_ASSERT (s != NULL);
653           s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
654           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
655         }
656     }
657   else
658     {
659       /* We may have created entries in the .rel.got section.
660          However, if we are not creating the dynamic sections, we will
661          not actually use these entries.  Reset the size of .rel.got,
662          which will cause it to get stripped from the output file
663          below.  */
664       s = bfd_get_section_by_name (dynobj, ".rel.got");
665       if (s != NULL)
666         s->_raw_size = 0;
667     }
668
669   /* The check_relocs and adjust_dynamic_symbol entry points have
670      determined the sizes of the various dynamic sections.  Allocate
671      memory for them.  */
672   plt = false;
673   relocs = false;
674   reltext = false;
675   for (s = dynobj->sections; s != NULL; s = s->next)
676     {
677       const char *name;
678       boolean strip;
679
680       if ((s->flags & SEC_IN_MEMORY) == 0)
681         continue;
682
683       /* It's OK to base decisions on the section name, because none
684          of the dynobj section names depend upon the input files.  */
685       name = bfd_get_section_name (dynobj, s);
686
687       strip = false;
688
689       if (strcmp (name, ".plt") == 0)
690         {
691           if (s->_raw_size == 0)
692             {
693               /* Strip this section if we don't need it; see the
694                  comment below.  */
695               strip = true;
696             }
697           else
698             {
699               /* Remember whether there is a PLT.  */
700               plt = true;
701             }
702         }
703       else if (strncmp (name, ".rel", 4) == 0)
704         {
705           if (s->_raw_size == 0)
706             {
707               /* If we don't need this section, strip it from the
708                  output file.  This is mostly to handle .rel.bss and
709                  .rel.plt.  We must create both sections in
710                  create_dynamic_sections, because they must be created
711                  before the linker maps input sections to output
712                  sections.  The linker does that before
713                  adjust_dynamic_symbol is called, and it is that
714                  function which decides whether anything needs to go
715                  into these sections.  */
716               strip = true;
717             }
718           else
719             {
720               asection *target;
721
722               /* Remember whether there are any reloc sections other
723                  than .rel.plt.  */
724               if (strcmp (name, ".rel.plt") != 0)
725                 {
726                   relocs = true;
727
728                   /* If this relocation section applies to a read only
729                      section, then we probably need a DT_TEXTREL
730                      entry.  The entries in the .rel.plt section
731                      really apply to the .got section, which we
732                      created ourselves and so know is not readonly.  */
733                   target = bfd_get_section_by_name (output_bfd, name + 4);
734                   if (target != NULL
735                       && (target->flags & SEC_READONLY) != 0)
736                     reltext = true;
737                 }
738
739               /* We use the reloc_count field as a counter if we need
740                  to copy relocs into the output file.  */
741               s->reloc_count = 0;
742             }
743         }
744       else if (strncmp (name, ".got", 4) != 0)
745         {
746           /* It's not one of our sections, so don't allocate space.  */
747           continue;
748         }
749
750       if (strip)
751         {
752           asection **spp;
753
754           for (spp = &s->output_section->owner->sections;
755                *spp != s->output_section;
756                spp = &(*spp)->next)
757             ;
758           *spp = s->output_section->next;
759           --s->output_section->owner->section_count;
760
761           continue;
762         }
763
764       /* Allocate memory for the section contents.  */
765       s->contents = (bfd_byte *) bfd_alloc (dynobj, s->_raw_size);
766       if (s->contents == NULL && s->_raw_size != 0)
767         return false;
768     }
769           
770   if (elf_hash_table (info)->dynamic_sections_created)
771     {
772       /* Add some entries to the .dynamic section.  We fill in the
773          values later, in elf_i386_finish_dynamic_sections, but we
774          must add the entries now so that we get the correct size for
775          the .dynamic section.  The DT_DEBUG entry is filled in by the
776          dynamic linker and used by the debugger.  */
777       if (! info->shared)
778         {
779           if (! bfd_elf32_add_dynamic_entry (info, DT_DEBUG, 0))
780             return false;
781         }
782
783       if (plt)
784         {
785           if (! bfd_elf32_add_dynamic_entry (info, DT_PLTGOT, 0)
786               || ! bfd_elf32_add_dynamic_entry (info, DT_PLTRELSZ, 0)
787               || ! bfd_elf32_add_dynamic_entry (info, DT_PLTREL, DT_REL)
788               || ! bfd_elf32_add_dynamic_entry (info, DT_JMPREL, 0))
789             return false;
790         }
791
792       if (relocs)
793         {
794           if (! bfd_elf32_add_dynamic_entry (info, DT_REL, 0)
795               || ! bfd_elf32_add_dynamic_entry (info, DT_RELSZ, 0)
796               || ! bfd_elf32_add_dynamic_entry (info, DT_RELENT,
797                                                 sizeof (Elf32_External_Rel)))
798             return false;
799         }
800
801       if (reltext)
802         {
803           if (! bfd_elf32_add_dynamic_entry (info, DT_TEXTREL, 0))
804             return false;
805         }
806     }
807
808   return true;
809 }
810
811 /* Relocate an i386 ELF section.  */
812
813 static boolean
814 elf_i386_relocate_section (output_bfd, info, input_bfd, input_section,
815                            contents, relocs, local_syms, local_sections)
816      bfd *output_bfd;
817      struct bfd_link_info *info;
818      bfd *input_bfd;
819      asection *input_section;
820      bfd_byte *contents;
821      Elf_Internal_Rela *relocs;
822      Elf_Internal_Sym *local_syms;
823      asection **local_sections;
824 {
825   bfd *dynobj;
826   Elf_Internal_Shdr *symtab_hdr;
827   struct elf_link_hash_entry **sym_hashes;
828   bfd_vma *local_got_offsets;
829   asection *sgot;
830   asection *splt;
831   asection *sreloc;
832   Elf_Internal_Rela *rel;
833   Elf_Internal_Rela *relend;
834
835   dynobj = elf_hash_table (info)->dynobj;
836   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
837   sym_hashes = elf_sym_hashes (input_bfd);
838   local_got_offsets = elf_local_got_offsets (input_bfd);
839
840   sgot = NULL;
841   splt = NULL;
842   sreloc = NULL;
843
844   rel = relocs;
845   relend = relocs + input_section->reloc_count;
846   for (; rel < relend; rel++)
847     {
848       int r_type;
849       reloc_howto_type *howto;
850       unsigned long r_symndx;
851       struct elf_link_hash_entry *h;
852       Elf_Internal_Sym *sym;
853       asection *sec;
854       bfd_vma relocation;
855       bfd_reloc_status_type r;
856
857       r_type = ELF32_R_TYPE (rel->r_info);
858       if (r_type < 0 || r_type >= (int) R_386_max)
859         {
860           bfd_set_error (bfd_error_bad_value);
861           return false;
862         }
863       howto = elf_howto_table + r_type;
864
865       r_symndx = ELF32_R_SYM (rel->r_info);
866
867       if (info->relocateable)
868         {
869           /* This is a relocateable link.  We don't have to change
870              anything, unless the reloc is against a section symbol,
871              in which case we have to adjust according to where the
872              section symbol winds up in the output section.  */
873           if (r_symndx < symtab_hdr->sh_info)
874             {
875               sym = local_syms + r_symndx;
876               if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
877                 {
878                   bfd_vma val;
879
880                   sec = local_sections[r_symndx];
881                   val = bfd_get_32 (input_bfd, contents + rel->r_offset);
882                   val += sec->output_offset + sym->st_value;
883                   bfd_put_32 (input_bfd, val, contents + rel->r_offset);
884                 }
885             }
886
887           continue;
888         }
889
890       /* This is a final link.  */
891       h = NULL;
892       sym = NULL;
893       sec = NULL;
894       if (r_symndx < symtab_hdr->sh_info)
895         {
896           sym = local_syms + r_symndx;
897           sec = local_sections[r_symndx];
898           relocation = (sec->output_section->vma
899                         + sec->output_offset
900                         + sym->st_value);
901         }
902       else
903         {
904           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
905           while (h->root.type == bfd_link_hash_indirect
906                  || h->root.type == bfd_link_hash_warning)
907             h = (struct elf_link_hash_entry *) h->root.u.i.link;
908           if (h->root.type == bfd_link_hash_defined
909               || h->root.type == bfd_link_hash_defweak)
910             {
911               sec = h->root.u.def.section;
912               if (r_type == R_386_GOTPC
913                   || (r_type == R_386_PLT32
914                       && h->plt_offset != (bfd_vma) -1)
915                   || (r_type == R_386_GOT32
916                       && elf_hash_table (info)->dynamic_sections_created
917                       && (! info->shared
918                           || ! info->symbolic
919                           || (h->elf_link_hash_flags
920                               & ELF_LINK_HASH_DEF_REGULAR) == 0))
921                   || (info->shared
922                       && (! info->symbolic
923                           || (h->elf_link_hash_flags
924                               & ELF_LINK_HASH_DEF_REGULAR) == 0)
925                       && (r_type == R_386_32
926                           || r_type == R_386_PC32)
927                       && (input_section->flags & SEC_ALLOC) != 0))
928                 {
929                   /* In these cases, we don't need the relocation
930                      value.  We check specially because in some
931                      obscure cases sec->output_section will be NULL.  */
932                   relocation = 0;
933                 }
934               else
935                 relocation = (h->root.u.def.value
936                               + sec->output_section->vma
937                               + sec->output_offset);
938             }
939           else if (h->root.type == bfd_link_hash_undefweak)
940             relocation = 0;
941           else if (info->shared && !info->symbolic)
942             relocation = 0;
943           else
944             {
945               if (! ((*info->callbacks->undefined_symbol)
946                      (info, h->root.root.string, input_bfd,
947                       input_section, rel->r_offset)))
948                 return false;
949               relocation = 0;
950             }
951         }
952
953       switch (r_type)
954         {
955         case R_386_GOT32:
956           /* Relocation is to the entry for this symbol in the global
957              offset table.  */
958           if (sgot == NULL)
959             {
960               sgot = bfd_get_section_by_name (dynobj, ".got");
961               BFD_ASSERT (sgot != NULL);
962             }
963
964           if (h != NULL)
965             {
966               bfd_vma off;
967
968               off = h->got_offset;
969               BFD_ASSERT (off != (bfd_vma) -1);
970
971               if (! elf_hash_table (info)->dynamic_sections_created
972                   || (info->shared
973                       && info->symbolic
974                       && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
975                 {
976                   /* This is actually a static link, or it is a
977                      -Bsymbolic link and the symbol is defined
978                      locally.  We must initialize this entry in the
979                      global offset table.  Since the offset must
980                      always be a multiple of 4, we use the least
981                      significant bit to record whether we have
982                      initialized it already.
983
984                      When doing a dynamic link, we create a .rel.got
985                      relocation entry to initialize the value.  This
986                      is done in the finish_dynamic_symbol routine.  */
987                   if ((off & 1) != 0)
988                     off &= ~1;
989                   else
990                     {
991                       bfd_put_32 (output_bfd, relocation,
992                                   sgot->contents + off);
993                       h->got_offset |= 1;
994                     }
995                 }
996
997               relocation = sgot->output_offset + off;
998             }
999           else
1000             {
1001               bfd_vma off;
1002
1003               BFD_ASSERT (local_got_offsets != NULL
1004                           && local_got_offsets[r_symndx] != (bfd_vma) -1);
1005
1006               off = local_got_offsets[r_symndx];
1007
1008               /* The offset must always be a multiple of 4.  We use
1009                  the least significant bit to record whether we have
1010                  already generated the necessary reloc.  */
1011               if ((off & 1) != 0)
1012                 off &= ~1;
1013               else
1014                 {
1015                   bfd_put_32 (output_bfd, relocation, sgot->contents + off);
1016
1017                   if (info->shared)
1018                     {
1019                       asection *srelgot;
1020                       Elf_Internal_Rel outrel;
1021
1022                       srelgot = bfd_get_section_by_name (dynobj, ".rel.got");
1023                       BFD_ASSERT (srelgot != NULL);
1024
1025                       outrel.r_offset = (sgot->output_section->vma
1026                                          + sgot->output_offset
1027                                          + off);
1028                       outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
1029                       bfd_elf32_swap_reloc_out (output_bfd, &outrel,
1030                                                 (((Elf32_External_Rel *)
1031                                                   srelgot->contents)
1032                                                  + srelgot->reloc_count));
1033                       ++srelgot->reloc_count;
1034                     }
1035
1036                   local_got_offsets[r_symndx] |= 1;
1037                 }
1038
1039               relocation = sgot->output_offset + off;
1040             }
1041
1042           break;
1043
1044         case R_386_GOTOFF:
1045           /* Relocation is relative to the start of the global offset
1046              table.  */
1047
1048           if (sgot == NULL)
1049             {
1050               sgot = bfd_get_section_by_name (dynobj, ".got");
1051               BFD_ASSERT (sgot != NULL);
1052             }
1053
1054           /* Note that sgot->output_offset is not involved in this
1055              calculation.  We always want the start of .got.  If we
1056              defined _GLOBAL_OFFSET_TABLE in a different way, as is
1057              permitted by the ABI, we might have to change this
1058              calculation.  */
1059           relocation -= sgot->output_section->vma;
1060
1061           break;
1062
1063         case R_386_GOTPC:
1064           /* Use global offset table as symbol value.  */
1065
1066           if (sgot == NULL)
1067             {
1068               sgot = bfd_get_section_by_name (dynobj, ".got");
1069               BFD_ASSERT (sgot != NULL);
1070             }
1071
1072           relocation = sgot->output_section->vma;
1073
1074           break;
1075
1076         case R_386_PLT32:
1077           /* Relocation is to the entry for this symbol in the
1078              procedure linkage table.  */
1079
1080           /* Resolve a PLT32 reloc again a local symbol directly,
1081              without using the procedure linkage table.  */
1082           if (h == NULL)
1083             break;
1084
1085           if (h->plt_offset == (bfd_vma) -1)
1086             {
1087               /* We didn't make a PLT entry for this symbol.  This
1088                  happens when statically linking PIC code, or when
1089                  using -Bsymbolic.  */
1090               break;
1091             }
1092
1093           if (splt == NULL)
1094             {
1095               splt = bfd_get_section_by_name (dynobj, ".plt");
1096               BFD_ASSERT (splt != NULL);
1097             }
1098
1099           relocation = (splt->output_section->vma
1100                         + splt->output_offset
1101                         + h->plt_offset);
1102
1103           break;
1104
1105         case R_386_32:
1106         case R_386_PC32:
1107           if (info->shared
1108               && (input_section->flags & SEC_ALLOC) != 0
1109               && (r_type != R_386_PC32
1110                   || (h != NULL
1111                       && (! info->symbolic
1112                           || (h->elf_link_hash_flags
1113                               & ELF_LINK_HASH_DEF_REGULAR) == 0))))
1114             {
1115               Elf_Internal_Rel outrel;
1116               boolean relocate;
1117
1118               /* When generating a shared object, these relocations
1119                  are copied into the output file to be resolved at run
1120                  time.  */
1121
1122               if (sreloc == NULL)
1123                 {
1124                   const char *name;
1125
1126                   name = (bfd_elf_string_from_elf_section
1127                           (input_bfd,
1128                            elf_elfheader (input_bfd)->e_shstrndx,
1129                            elf_section_data (input_section)->rel_hdr.sh_name));
1130                   if (name == NULL)
1131                     return false;
1132
1133                   BFD_ASSERT (strncmp (name, ".rel", 4) == 0
1134                               && strcmp (bfd_get_section_name (input_bfd,
1135                                                                input_section),
1136                                          name + 4) == 0);
1137
1138                   sreloc = bfd_get_section_by_name (dynobj, name);
1139                   BFD_ASSERT (sreloc != NULL);
1140                 }
1141
1142               outrel.r_offset = (rel->r_offset
1143                                  + input_section->output_section->vma
1144                                  + input_section->output_offset);
1145               if (r_type == R_386_PC32)
1146                 {
1147                   BFD_ASSERT (h != NULL && h->dynindx != -1);
1148                   relocate = false;
1149                   outrel.r_info = ELF32_R_INFO (h->dynindx, R_386_PC32);
1150                 }
1151               else
1152                 {
1153                   if (h == NULL
1154                       || (info->symbolic
1155                           && (h->elf_link_hash_flags
1156                               & ELF_LINK_HASH_DEF_REGULAR) != 0))
1157                     {
1158                       relocate = true;
1159                       outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
1160                     }
1161                   else
1162                     {
1163                       BFD_ASSERT (h->dynindx != -1);
1164                       relocate = false;
1165                       outrel.r_info = ELF32_R_INFO (h->dynindx, R_386_32);
1166                     }
1167                 }
1168
1169               bfd_elf32_swap_reloc_out (output_bfd, &outrel,
1170                                         (((Elf32_External_Rel *)
1171                                           sreloc->contents)
1172                                          + sreloc->reloc_count));
1173               ++sreloc->reloc_count;
1174
1175               /* If this reloc is against an external symbol, we do
1176                  not want to fiddle with the addend.  Otherwise, we
1177                  need to include the symbol value so that it becomes
1178                  an addend for the dynamic reloc.  */
1179               if (! relocate)
1180                 continue;
1181             }
1182
1183           break;
1184
1185         default:
1186           break;
1187         }
1188
1189       r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1190                                     contents, rel->r_offset,
1191                                     relocation, (bfd_vma) 0);
1192
1193       if (r != bfd_reloc_ok)
1194         {
1195           switch (r)
1196             {
1197             default:
1198             case bfd_reloc_outofrange:
1199               abort ();
1200             case bfd_reloc_overflow:
1201               {
1202                 const char *name;
1203
1204                 if (h != NULL)
1205                   name = h->root.root.string;
1206                 else
1207                   {
1208                     name = bfd_elf_string_from_elf_section (input_bfd,
1209                                                             symtab_hdr->sh_link,
1210                                                             sym->st_name);
1211                     if (name == NULL)
1212                       return false;
1213                     if (*name == '\0')
1214                       name = bfd_section_name (input_bfd, sec);
1215                   }
1216                 if (! ((*info->callbacks->reloc_overflow)
1217                        (info, name, howto->name, (bfd_vma) 0,
1218                         input_bfd, input_section, rel->r_offset)))
1219                   return false;
1220               }
1221               break;
1222             }
1223         }
1224     }
1225
1226   return true;
1227 }
1228
1229 /* Finish up dynamic symbol handling.  We set the contents of various
1230    dynamic sections here.  */
1231
1232 static boolean
1233 elf_i386_finish_dynamic_symbol (output_bfd, info, h, sym)
1234      bfd *output_bfd;
1235      struct bfd_link_info *info;
1236      struct elf_link_hash_entry *h;
1237      Elf_Internal_Sym *sym;
1238 {
1239   bfd *dynobj;
1240
1241   dynobj = elf_hash_table (info)->dynobj;
1242
1243   if (h->plt_offset != (bfd_vma) -1)
1244     {
1245       asection *splt;
1246       asection *sgot;
1247       asection *srel;
1248       bfd_vma plt_index;
1249       bfd_vma got_offset;
1250       Elf_Internal_Rel rel;
1251
1252       /* This symbol has an entry in the procedure linkage table.  Set
1253          it up.  */
1254
1255       BFD_ASSERT (h->dynindx != -1);
1256
1257       splt = bfd_get_section_by_name (dynobj, ".plt");
1258       sgot = bfd_get_section_by_name (dynobj, ".got.plt");
1259       srel = bfd_get_section_by_name (dynobj, ".rel.plt");
1260       BFD_ASSERT (splt != NULL && sgot != NULL && srel != NULL);
1261
1262       /* Get the index in the procedure linkage table which
1263          corresponds to this symbol.  This is the index of this symbol
1264          in all the symbols for which we are making plt entries.  The
1265          first entry in the procedure linkage table is reserved.  */
1266       plt_index = h->plt_offset / PLT_ENTRY_SIZE - 1;
1267
1268       /* Get the offset into the .got table of the entry that
1269          corresponds to this function.  Each .got entry is 4 bytes.
1270          The first three are reserved.  */
1271       got_offset = (plt_index + 3) * 4;
1272
1273       /* Fill in the entry in the procedure linkage table.  */
1274       if (! info->shared)
1275         {
1276           memcpy (splt->contents + h->plt_offset, elf_i386_plt_entry,
1277                   PLT_ENTRY_SIZE);
1278           bfd_put_32 (output_bfd,
1279                       (sgot->output_section->vma
1280                        + sgot->output_offset
1281                        + got_offset),
1282                       splt->contents + h->plt_offset + 2);
1283         }
1284       else
1285         {
1286           memcpy (splt->contents + h->plt_offset, elf_i386_pic_plt_entry,
1287                   PLT_ENTRY_SIZE);
1288           bfd_put_32 (output_bfd, got_offset,
1289                       splt->contents + h->plt_offset + 2);
1290         }
1291
1292       bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rel),
1293                   splt->contents + h->plt_offset + 7);
1294       bfd_put_32 (output_bfd, - (h->plt_offset + PLT_ENTRY_SIZE),
1295                   splt->contents + h->plt_offset + 12);
1296
1297       /* Fill in the entry in the global offset table.  */
1298       bfd_put_32 (output_bfd,
1299                   (splt->output_section->vma
1300                    + splt->output_offset
1301                    + h->plt_offset
1302                    + 6),
1303                   sgot->contents + got_offset);
1304
1305       /* Fill in the entry in the .rel.plt section.  */
1306       rel.r_offset = (sgot->output_section->vma
1307                       + sgot->output_offset
1308                       + got_offset);
1309       rel.r_info = ELF32_R_INFO (h->dynindx, R_386_JUMP_SLOT);
1310       bfd_elf32_swap_reloc_out (output_bfd, &rel,
1311                                 ((Elf32_External_Rel *) srel->contents
1312                                  + plt_index));
1313
1314       if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1315         {
1316           /* Mark the symbol as undefined, rather than as defined in
1317              the .plt section.  Leave the value alone.  */
1318           sym->st_shndx = SHN_UNDEF;
1319         }
1320     }
1321
1322   if (h->got_offset != (bfd_vma) -1)
1323     {
1324       asection *sgot;
1325       asection *srel;
1326       Elf_Internal_Rel rel;
1327
1328       /* This symbol has an entry in the global offset table.  Set it
1329          up.  */
1330       
1331       BFD_ASSERT (h->dynindx != -1);
1332
1333       sgot = bfd_get_section_by_name (dynobj, ".got");
1334       srel = bfd_get_section_by_name (dynobj, ".rel.got");
1335       BFD_ASSERT (sgot != NULL && srel != NULL);
1336
1337       rel.r_offset = (sgot->output_section->vma
1338                       + sgot->output_offset
1339                       + (h->got_offset &~ 1));
1340
1341       /* If this is a -Bsymbolic link, and the symbol is defined
1342          locally, we just want to emit a RELATIVE reloc.  The entry in
1343          the global offset table will already have been initialized in
1344          the relocate_section function.  */
1345       if (info->shared
1346           && info->symbolic
1347           && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
1348         rel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
1349       else
1350         {
1351           bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got_offset);
1352           rel.r_info = ELF32_R_INFO (h->dynindx, R_386_GLOB_DAT);
1353         }
1354
1355       bfd_elf32_swap_reloc_out (output_bfd, &rel,
1356                                 ((Elf32_External_Rel *) srel->contents
1357                                  + srel->reloc_count));
1358       ++srel->reloc_count;
1359     }
1360
1361   if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
1362     {
1363       asection *s;
1364       Elf_Internal_Rel rel;
1365
1366       /* This symbol needs a copy reloc.  Set it up.  */
1367
1368       BFD_ASSERT (h->dynindx != -1
1369                   && (h->root.type == bfd_link_hash_defined
1370                       || h->root.type == bfd_link_hash_defweak));
1371
1372       s = bfd_get_section_by_name (h->root.u.def.section->owner,
1373                                    ".rel.bss");
1374       BFD_ASSERT (s != NULL);
1375
1376       rel.r_offset = (h->root.u.def.value
1377                       + h->root.u.def.section->output_section->vma
1378                       + h->root.u.def.section->output_offset);
1379       rel.r_info = ELF32_R_INFO (h->dynindx, R_386_COPY);
1380       bfd_elf32_swap_reloc_out (output_bfd, &rel,
1381                                 ((Elf32_External_Rel *) s->contents
1382                                  + s->reloc_count));
1383       ++s->reloc_count;
1384     }
1385
1386   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
1387   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
1388       || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
1389     sym->st_shndx = SHN_ABS;
1390
1391   return true;
1392 }
1393
1394 /* Finish up the dynamic sections.  */
1395
1396 static boolean
1397 elf_i386_finish_dynamic_sections (output_bfd, info)
1398      bfd *output_bfd;
1399      struct bfd_link_info *info;
1400 {
1401   bfd *dynobj;
1402   asection *sgot;
1403   asection *sdyn;
1404
1405   dynobj = elf_hash_table (info)->dynobj;
1406
1407   sgot = bfd_get_section_by_name (dynobj, ".got.plt");
1408   BFD_ASSERT (sgot != NULL);
1409   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
1410
1411   if (elf_hash_table (info)->dynamic_sections_created)
1412     {
1413       asection *splt;
1414       Elf32_External_Dyn *dyncon, *dynconend;
1415
1416       splt = bfd_get_section_by_name (dynobj, ".plt");
1417       BFD_ASSERT (splt != NULL && sdyn != NULL);
1418
1419       dyncon = (Elf32_External_Dyn *) sdyn->contents;
1420       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
1421       for (; dyncon < dynconend; dyncon++)
1422         {
1423           Elf_Internal_Dyn dyn;
1424           const char *name;
1425           asection *s;
1426
1427           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
1428
1429           switch (dyn.d_tag)
1430             {
1431             default:
1432               break;
1433
1434             case DT_PLTGOT:
1435               name = ".got";
1436               goto get_vma;
1437             case DT_JMPREL:
1438               name = ".rel.plt";
1439             get_vma:
1440               s = bfd_get_section_by_name (output_bfd, name);
1441               BFD_ASSERT (s != NULL);
1442               dyn.d_un.d_ptr = s->vma;
1443               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
1444               break;
1445
1446             case DT_PLTRELSZ:
1447               s = bfd_get_section_by_name (output_bfd, ".rel.plt");
1448               BFD_ASSERT (s != NULL);
1449               if (s->_cooked_size != 0)
1450                 dyn.d_un.d_val = s->_cooked_size;
1451               else
1452                 dyn.d_un.d_val = s->_raw_size;
1453               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
1454               break;
1455
1456             case DT_RELSZ:
1457               /* My reading of the SVR4 ABI indicates that the
1458                  procedure linkage table relocs (DT_JMPREL) should be
1459                  included in the overall relocs (DT_REL).  This is
1460                  what Solaris does.  However, UnixWare can not handle
1461                  that case.  Therefore, we override the DT_RELSZ entry
1462                  here to make it not include the JMPREL relocs.  Since
1463                  the linker script arranges for .rel.plt to follow all
1464                  other relocation sections, we don't have to worry
1465                  about changing the DT_REL entry.  */
1466               s = bfd_get_section_by_name (output_bfd, ".rel.plt");
1467               if (s != NULL)
1468                 {
1469                   if (s->_cooked_size != 0)
1470                     dyn.d_un.d_val -= s->_cooked_size;
1471                   else
1472                     dyn.d_un.d_val -= s->_raw_size;
1473                 }
1474               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
1475               break;
1476             }
1477         }
1478
1479       /* Fill in the first entry in the procedure linkage table.  */
1480       if (splt->_raw_size > 0)
1481         {
1482           if (info->shared)
1483             memcpy (splt->contents, elf_i386_pic_plt0_entry, PLT_ENTRY_SIZE);
1484           else
1485             {
1486               memcpy (splt->contents, elf_i386_plt0_entry, PLT_ENTRY_SIZE);
1487               bfd_put_32 (output_bfd,
1488                           sgot->output_section->vma + sgot->output_offset + 4,
1489                           splt->contents + 2);
1490               bfd_put_32 (output_bfd,
1491                           sgot->output_section->vma + sgot->output_offset + 8,
1492                           splt->contents + 8);
1493             }
1494         }
1495
1496       /* UnixWare sets the entsize of .plt to 4, although that doesn't
1497          really seem like the right value.  */
1498       elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
1499     }
1500
1501   /* Fill in the first three entries in the global offset table.  */
1502   if (sgot->_raw_size > 0)
1503     {
1504       if (sdyn == NULL)
1505         bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
1506       else
1507         bfd_put_32 (output_bfd,
1508                     sdyn->output_section->vma + sdyn->output_offset,
1509                     sgot->contents);
1510       bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
1511       bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
1512     }
1513
1514   elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
1515
1516   return true;
1517 }
1518
1519 #define TARGET_LITTLE_SYM               bfd_elf32_i386_vec
1520 #define TARGET_LITTLE_NAME              "elf32-i386"
1521 #define ELF_ARCH                        bfd_arch_i386
1522 #define ELF_MACHINE_CODE                EM_386
1523 #define elf_info_to_howto               elf_i386_info_to_howto
1524 #define elf_info_to_howto_rel           elf_i386_info_to_howto_rel
1525 #define bfd_elf32_bfd_reloc_type_lookup elf_i386_reloc_type_lookup
1526 #define ELF_MAXPAGESIZE                 0x1000
1527 #define elf_backend_create_dynamic_sections \
1528                                         _bfd_elf_create_dynamic_sections
1529 #define elf_backend_check_relocs        elf_i386_check_relocs
1530 #define elf_backend_adjust_dynamic_symbol \
1531                                         elf_i386_adjust_dynamic_symbol
1532 #define elf_backend_size_dynamic_sections \
1533                                         elf_i386_size_dynamic_sections
1534 #define elf_backend_relocate_section    elf_i386_relocate_section
1535 #define elf_backend_finish_dynamic_symbol \
1536                                         elf_i386_finish_dynamic_symbol
1537 #define elf_backend_finish_dynamic_sections \
1538                                         elf_i386_finish_dynamic_sections
1539 #define elf_backend_want_got_plt 1
1540 #define elf_backend_plt_readonly 1
1541 #define elf_backend_want_plt_sym 0
1542
1543 #include "elf32-target.h"
This page took 0.110611 seconds and 4 git commands to generate.