Fix compile error with use of 'typename' outside of template
[external/binutils.git] / gold / i386.cc
1 // i386.cc -- i386 target support for gold.
2
3 // Copyright (C) 2006-2016 Free Software Foundation, Inc.
4 // Written by Ian Lance Taylor <iant@google.com>.
5
6 // This file is part of gold.
7
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 3 of the License, or
11 // (at your option) any later version.
12
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 // GNU General Public License for more details.
17
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the Free Software
20 // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 // MA 02110-1301, USA.
22
23 #include "gold.h"
24
25 #include <cstring>
26
27 #include "elfcpp.h"
28 #include "dwarf.h"
29 #include "parameters.h"
30 #include "reloc.h"
31 #include "i386.h"
32 #include "object.h"
33 #include "symtab.h"
34 #include "layout.h"
35 #include "output.h"
36 #include "copy-relocs.h"
37 #include "target.h"
38 #include "target-reloc.h"
39 #include "target-select.h"
40 #include "tls.h"
41 #include "freebsd.h"
42 #include "nacl.h"
43 #include "gc.h"
44
45 namespace
46 {
47
48 using namespace gold;
49
50 // A class to handle the .got.plt section.
51
52 class Output_data_got_plt_i386 : public Output_section_data_build
53 {
54  public:
55   Output_data_got_plt_i386(Layout* layout)
56     : Output_section_data_build(4),
57       layout_(layout)
58   { }
59
60  protected:
61   // Write out the PLT data.
62   void
63   do_write(Output_file*);
64
65   // Write to a map file.
66   void
67   do_print_to_mapfile(Mapfile* mapfile) const
68   { mapfile->print_output_data(this, "** GOT PLT"); }
69
70  private:
71   // A pointer to the Layout class, so that we can find the .dynamic
72   // section when we write out the GOT PLT section.
73   Layout* layout_;
74 };
75
76 // A class to handle the PLT data.
77 // This is an abstract base class that handles most of the linker details
78 // but does not know the actual contents of PLT entries.  The derived
79 // classes below fill in those details.
80
81 class Output_data_plt_i386 : public Output_section_data
82 {
83  public:
84   typedef Output_data_reloc<elfcpp::SHT_REL, true, 32, false> Reloc_section;
85
86   Output_data_plt_i386(Layout*, uint64_t addralign,
87                        Output_data_got_plt_i386*, Output_data_space*);
88
89   // Add an entry to the PLT.
90   void
91   add_entry(Symbol_table*, Layout*, Symbol* gsym);
92
93   // Add an entry to the PLT for a local STT_GNU_IFUNC symbol.
94   unsigned int
95   add_local_ifunc_entry(Symbol_table*, Layout*,
96                         Sized_relobj_file<32, false>* relobj,
97                         unsigned int local_sym_index);
98
99   // Return the .rel.plt section data.
100   Reloc_section*
101   rel_plt() const
102   { return this->rel_; }
103
104   // Return where the TLS_DESC relocations should go.
105   Reloc_section*
106   rel_tls_desc(Layout*);
107
108   // Return where the IRELATIVE relocations should go.
109   Reloc_section*
110   rel_irelative(Symbol_table*, Layout*);
111
112   // Return whether we created a section for IRELATIVE relocations.
113   bool
114   has_irelative_section() const
115   { return this->irelative_rel_ != NULL; }
116
117   // Return the number of PLT entries.
118   unsigned int
119   entry_count() const
120   { return this->count_ + this->irelative_count_; }
121
122   // Return the offset of the first non-reserved PLT entry.
123   unsigned int
124   first_plt_entry_offset()
125   { return this->get_plt_entry_size(); }
126
127   // Return the size of a PLT entry.
128   unsigned int
129   get_plt_entry_size() const
130   { return this->do_get_plt_entry_size(); }
131
132   // Return the PLT address to use for a global symbol.
133   uint64_t
134   address_for_global(const Symbol*);
135
136   // Return the PLT address to use for a local symbol.
137   uint64_t
138   address_for_local(const Relobj*, unsigned int symndx);
139
140   // Add .eh_frame information for the PLT.
141   void
142   add_eh_frame(Layout* layout)
143   { this->do_add_eh_frame(layout); }
144
145  protected:
146   // Fill the first PLT entry, given the pointer to the PLT section data
147   // and the runtime address of the GOT.
148   void
149   fill_first_plt_entry(unsigned char* pov,
150                        elfcpp::Elf_types<32>::Elf_Addr got_address)
151   { this->do_fill_first_plt_entry(pov, got_address); }
152
153   // Fill a normal PLT entry, given the pointer to the entry's data in the
154   // section, the runtime address of the GOT, the offset into the GOT of
155   // the corresponding slot, the offset into the relocation section of the
156   // corresponding reloc, and the offset of this entry within the whole
157   // PLT.  Return the offset from this PLT entry's runtime address that
158   // should be used to compute the initial value of the GOT slot.
159   unsigned int
160   fill_plt_entry(unsigned char* pov,
161                  elfcpp::Elf_types<32>::Elf_Addr got_address,
162                  unsigned int got_offset,
163                  unsigned int plt_offset,
164                  unsigned int plt_rel_offset)
165   {
166     return this->do_fill_plt_entry(pov, got_address, got_offset,
167                                    plt_offset, plt_rel_offset);
168   }
169
170   virtual unsigned int
171   do_get_plt_entry_size() const = 0;
172
173   virtual void
174   do_fill_first_plt_entry(unsigned char* pov,
175                           elfcpp::Elf_types<32>::Elf_Addr got_address) = 0;
176
177   virtual unsigned int
178   do_fill_plt_entry(unsigned char* pov,
179                     elfcpp::Elf_types<32>::Elf_Addr got_address,
180                     unsigned int got_offset,
181                     unsigned int plt_offset,
182                     unsigned int plt_rel_offset) = 0;
183
184   virtual void
185   do_add_eh_frame(Layout*) = 0;
186
187   void
188   do_adjust_output_section(Output_section* os);
189
190   // Write to a map file.
191   void
192   do_print_to_mapfile(Mapfile* mapfile) const
193   { mapfile->print_output_data(this, _("** PLT")); }
194
195   // The .eh_frame unwind information for the PLT.
196   // The CIE is common across variants of the PLT format.
197   static const int plt_eh_frame_cie_size = 16;
198   static const unsigned char plt_eh_frame_cie[plt_eh_frame_cie_size];
199
200  private:
201   // Set the final size.
202   void
203   set_final_data_size()
204   {
205     this->set_data_size((this->count_ + this->irelative_count_ + 1)
206                         * this->get_plt_entry_size());
207   }
208
209   // Write out the PLT data.
210   void
211   do_write(Output_file*);
212
213   // We keep a list of global STT_GNU_IFUNC symbols, each with its
214   // offset in the GOT.
215   struct Global_ifunc
216   {
217     Symbol* sym;
218     unsigned int got_offset;
219   };
220
221   // We keep a list of local STT_GNU_IFUNC symbols, each with its
222   // offset in the GOT.
223   struct Local_ifunc
224   {
225     Sized_relobj_file<32, false>* object;
226     unsigned int local_sym_index;
227     unsigned int got_offset;
228   };
229
230   // The reloc section.
231   Reloc_section* rel_;
232   // The TLS_DESC relocations, if necessary.  These must follow the
233   // regular PLT relocs.
234   Reloc_section* tls_desc_rel_;
235   // The IRELATIVE relocations, if necessary.  These must follow the
236   // regular relocatoins and the TLS_DESC relocations.
237   Reloc_section* irelative_rel_;
238   // The .got.plt section.
239   Output_data_got_plt_i386* got_plt_;
240   // The part of the .got.plt section used for IRELATIVE relocs.
241   Output_data_space* got_irelative_;
242   // The number of PLT entries.
243   unsigned int count_;
244   // Number of PLT entries with R_386_IRELATIVE relocs.  These follow
245   // the regular PLT entries.
246   unsigned int irelative_count_;
247   // Global STT_GNU_IFUNC symbols.
248   std::vector<Global_ifunc> global_ifuncs_;
249   // Local STT_GNU_IFUNC symbols.
250   std::vector<Local_ifunc> local_ifuncs_;
251 };
252
253 // This is an abstract class for the standard PLT layout.
254 // The derived classes below handle the actual PLT contents
255 // for the executable (non-PIC) and shared-library (PIC) cases.
256 // The unwind information is uniform across those two, so it's here.
257
258 class Output_data_plt_i386_standard : public Output_data_plt_i386
259 {
260  public:
261   Output_data_plt_i386_standard(Layout* layout,
262                                 Output_data_got_plt_i386* got_plt,
263                                 Output_data_space* got_irelative)
264     : Output_data_plt_i386(layout, plt_entry_size, got_plt, got_irelative)
265   { }
266
267  protected:
268   virtual unsigned int
269   do_get_plt_entry_size() const
270   { return plt_entry_size; }
271
272   virtual void
273   do_add_eh_frame(Layout* layout)
274   {
275     layout->add_eh_frame_for_plt(this, plt_eh_frame_cie, plt_eh_frame_cie_size,
276                                  plt_eh_frame_fde, plt_eh_frame_fde_size);
277   }
278
279   // The size of an entry in the PLT.
280   static const int plt_entry_size = 16;
281
282   // The .eh_frame unwind information for the PLT.
283   static const int plt_eh_frame_fde_size = 32;
284   static const unsigned char plt_eh_frame_fde[plt_eh_frame_fde_size];
285 };
286
287 // Actually fill the PLT contents for an executable (non-PIC).
288
289 class Output_data_plt_i386_exec : public Output_data_plt_i386_standard
290 {
291 public:
292   Output_data_plt_i386_exec(Layout* layout,
293                             Output_data_got_plt_i386* got_plt,
294                             Output_data_space* got_irelative)
295     : Output_data_plt_i386_standard(layout, got_plt, got_irelative)
296   { }
297
298  protected:
299   virtual void
300   do_fill_first_plt_entry(unsigned char* pov,
301                           elfcpp::Elf_types<32>::Elf_Addr got_address);
302
303   virtual unsigned int
304   do_fill_plt_entry(unsigned char* pov,
305                     elfcpp::Elf_types<32>::Elf_Addr got_address,
306                     unsigned int got_offset,
307                     unsigned int plt_offset,
308                     unsigned int plt_rel_offset);
309
310  private:
311   // The first entry in the PLT for an executable.
312   static const unsigned char first_plt_entry[plt_entry_size];
313
314   // Other entries in the PLT for an executable.
315   static const unsigned char plt_entry[plt_entry_size];
316 };
317
318 // Actually fill the PLT contents for a shared library (PIC).
319
320 class Output_data_plt_i386_dyn : public Output_data_plt_i386_standard
321 {
322  public:
323   Output_data_plt_i386_dyn(Layout* layout,
324                            Output_data_got_plt_i386* got_plt,
325                            Output_data_space* got_irelative)
326     : Output_data_plt_i386_standard(layout, got_plt, got_irelative)
327   { }
328
329  protected:
330   virtual void
331   do_fill_first_plt_entry(unsigned char* pov, elfcpp::Elf_types<32>::Elf_Addr);
332
333   virtual unsigned int
334   do_fill_plt_entry(unsigned char* pov,
335                     elfcpp::Elf_types<32>::Elf_Addr,
336                     unsigned int got_offset,
337                     unsigned int plt_offset,
338                     unsigned int plt_rel_offset);
339
340  private:
341   // The first entry in the PLT for a shared object.
342   static const unsigned char first_plt_entry[plt_entry_size];
343
344   // Other entries in the PLT for a shared object.
345   static const unsigned char plt_entry[plt_entry_size];
346 };
347
348 // The i386 target class.
349 // TLS info comes from
350 //   http://people.redhat.com/drepper/tls.pdf
351 //   http://www.lsd.ic.unicamp.br/~oliva/writeups/TLS/RFC-TLSDESC-x86.txt
352
353 class Target_i386 : public Sized_target<32, false>
354 {
355  public:
356   typedef Output_data_reloc<elfcpp::SHT_REL, true, 32, false> Reloc_section;
357
358   Target_i386(const Target::Target_info* info = &i386_info)
359     : Sized_target<32, false>(info),
360       got_(NULL), plt_(NULL), got_plt_(NULL), got_irelative_(NULL),
361       got_tlsdesc_(NULL), global_offset_table_(NULL), rel_dyn_(NULL),
362       rel_irelative_(NULL), copy_relocs_(elfcpp::R_386_COPY),
363       got_mod_index_offset_(-1U), tls_base_symbol_defined_(false)
364   { }
365
366   // Process the relocations to determine unreferenced sections for
367   // garbage collection.
368   void
369   gc_process_relocs(Symbol_table* symtab,
370                     Layout* layout,
371                     Sized_relobj_file<32, false>* object,
372                     unsigned int data_shndx,
373                     unsigned int sh_type,
374                     const unsigned char* prelocs,
375                     size_t reloc_count,
376                     Output_section* output_section,
377                     bool needs_special_offset_handling,
378                     size_t local_symbol_count,
379                     const unsigned char* plocal_symbols);
380
381   // Scan the relocations to look for symbol adjustments.
382   void
383   scan_relocs(Symbol_table* symtab,
384               Layout* layout,
385               Sized_relobj_file<32, false>* object,
386               unsigned int data_shndx,
387               unsigned int sh_type,
388               const unsigned char* prelocs,
389               size_t reloc_count,
390               Output_section* output_section,
391               bool needs_special_offset_handling,
392               size_t local_symbol_count,
393               const unsigned char* plocal_symbols);
394
395   // Finalize the sections.
396   void
397   do_finalize_sections(Layout*, const Input_objects*, Symbol_table*);
398
399   // Return the value to use for a dynamic which requires special
400   // treatment.
401   uint64_t
402   do_dynsym_value(const Symbol*) const;
403
404   // Relocate a section.
405   void
406   relocate_section(const Relocate_info<32, false>*,
407                    unsigned int sh_type,
408                    const unsigned char* prelocs,
409                    size_t reloc_count,
410                    Output_section* output_section,
411                    bool needs_special_offset_handling,
412                    unsigned char* view,
413                    elfcpp::Elf_types<32>::Elf_Addr view_address,
414                    section_size_type view_size,
415                    const Reloc_symbol_changes*);
416
417   // Scan the relocs during a relocatable link.
418   void
419   scan_relocatable_relocs(Symbol_table* symtab,
420                           Layout* layout,
421                           Sized_relobj_file<32, false>* object,
422                           unsigned int data_shndx,
423                           unsigned int sh_type,
424                           const unsigned char* prelocs,
425                           size_t reloc_count,
426                           Output_section* output_section,
427                           bool needs_special_offset_handling,
428                           size_t local_symbol_count,
429                           const unsigned char* plocal_symbols,
430                           Relocatable_relocs*);
431
432   // Scan the relocs for --emit-relocs.
433   void
434   emit_relocs_scan(Symbol_table* symtab,
435                    Layout* layout,
436                    Sized_relobj_file<32, false>* object,
437                    unsigned int data_shndx,
438                    unsigned int sh_type,
439                    const unsigned char* prelocs,
440                    size_t reloc_count,
441                    Output_section* output_section,
442                    bool needs_special_offset_handling,
443                    size_t local_symbol_count,
444                    const unsigned char* plocal_syms,
445                    Relocatable_relocs* rr);
446
447   // Emit relocations for a section.
448   void
449   relocate_relocs(const Relocate_info<32, false>*,
450                   unsigned int sh_type,
451                   const unsigned char* prelocs,
452                   size_t reloc_count,
453                   Output_section* output_section,
454                   elfcpp::Elf_types<32>::Elf_Off offset_in_output_section,
455                   unsigned char* view,
456                   elfcpp::Elf_types<32>::Elf_Addr view_address,
457                   section_size_type view_size,
458                   unsigned char* reloc_view,
459                   section_size_type reloc_view_size);
460
461   // Return a string used to fill a code section with nops.
462   std::string
463   do_code_fill(section_size_type length) const;
464
465   // Return whether SYM is defined by the ABI.
466   bool
467   do_is_defined_by_abi(const Symbol* sym) const
468   { return strcmp(sym->name(), "___tls_get_addr") == 0; }
469
470   // Return whether a symbol name implies a local label.  The UnixWare
471   // 2.1 cc generates temporary symbols that start with .X, so we
472   // recognize them here.  FIXME: do other SVR4 compilers also use .X?.
473   // If so, we should move the .X recognition into
474   // Target::do_is_local_label_name.
475   bool
476   do_is_local_label_name(const char* name) const
477   {
478     if (name[0] == '.' && name[1] == 'X')
479       return true;
480     return Target::do_is_local_label_name(name);
481   }
482
483   // Return the PLT address to use for a global symbol.
484   uint64_t
485   do_plt_address_for_global(const Symbol* gsym) const
486   { return this->plt_section()->address_for_global(gsym); }
487
488   uint64_t
489   do_plt_address_for_local(const Relobj* relobj, unsigned int symndx) const
490   { return this->plt_section()->address_for_local(relobj, symndx); }
491
492   // We can tell whether we take the address of a function.
493   inline bool
494   do_can_check_for_function_pointers() const
495   { return true; }
496
497   // Return the base for a DW_EH_PE_datarel encoding.
498   uint64_t
499   do_ehframe_datarel_base() const;
500
501   // Return whether SYM is call to a non-split function.
502   bool
503   do_is_call_to_non_split(const Symbol* sym, const unsigned char*) const;
504
505   // Adjust -fsplit-stack code which calls non-split-stack code.
506   void
507   do_calls_non_split(Relobj* object, unsigned int shndx,
508                      section_offset_type fnoffset, section_size_type fnsize,
509                      const unsigned char* prelocs, size_t reloc_count,
510                      unsigned char* view, section_size_type view_size,
511                      std::string* from, std::string* to) const;
512
513   // Return the size of the GOT section.
514   section_size_type
515   got_size() const
516   {
517     gold_assert(this->got_ != NULL);
518     return this->got_->data_size();
519   }
520
521   // Return the number of entries in the GOT.
522   unsigned int
523   got_entry_count() const
524   {
525     if (this->got_ == NULL)
526       return 0;
527     return this->got_size() / 4;
528   }
529
530   // Return the number of entries in the PLT.
531   unsigned int
532   plt_entry_count() const;
533
534   // Return the offset of the first non-reserved PLT entry.
535   unsigned int
536   first_plt_entry_offset() const;
537
538   // Return the size of each PLT entry.
539   unsigned int
540   plt_entry_size() const;
541
542  protected:
543   // Instantiate the plt_ member.
544   // This chooses the right PLT flavor for an executable or a shared object.
545   Output_data_plt_i386*
546   make_data_plt(Layout* layout,
547                 Output_data_got_plt_i386* got_plt,
548                 Output_data_space* got_irelative,
549                 bool dyn)
550   { return this->do_make_data_plt(layout, got_plt, got_irelative, dyn); }
551
552   virtual Output_data_plt_i386*
553   do_make_data_plt(Layout* layout,
554                    Output_data_got_plt_i386* got_plt,
555                    Output_data_space* got_irelative,
556                    bool dyn)
557   {
558     if (dyn)
559       return new Output_data_plt_i386_dyn(layout, got_plt, got_irelative);
560     else
561       return new Output_data_plt_i386_exec(layout, got_plt, got_irelative);
562   }
563
564  private:
565   // The class which scans relocations.
566   struct Scan
567   {
568     static inline int
569
570     get_reference_flags(unsigned int r_type);
571
572     inline void
573     local(Symbol_table* symtab, Layout* layout, Target_i386* target,
574           Sized_relobj_file<32, false>* object,
575           unsigned int data_shndx,
576           Output_section* output_section,
577           const elfcpp::Rel<32, false>& reloc, unsigned int r_type,
578           const elfcpp::Sym<32, false>& lsym,
579           bool is_discarded);
580
581     inline void
582     global(Symbol_table* symtab, Layout* layout, Target_i386* target,
583            Sized_relobj_file<32, false>* object,
584            unsigned int data_shndx,
585            Output_section* output_section,
586            const elfcpp::Rel<32, false>& reloc, unsigned int r_type,
587            Symbol* gsym);
588
589     inline bool
590     local_reloc_may_be_function_pointer(Symbol_table* symtab, Layout* layout,
591                                         Target_i386* target,
592                                         Sized_relobj_file<32, false>* object,
593                                         unsigned int data_shndx,
594                                         Output_section* output_section,
595                                         const elfcpp::Rel<32, false>& reloc,
596                                         unsigned int r_type,
597                                         const elfcpp::Sym<32, false>& lsym);
598
599     inline bool
600     global_reloc_may_be_function_pointer(Symbol_table* symtab, Layout* layout,
601                                          Target_i386* target,
602                                          Sized_relobj_file<32, false>* object,
603                                          unsigned int data_shndx,
604                                          Output_section* output_section,
605                                          const elfcpp::Rel<32, false>& reloc,
606                                          unsigned int r_type,
607                                          Symbol* gsym);
608
609     inline bool
610     possible_function_pointer_reloc(unsigned int r_type);
611
612     bool
613     reloc_needs_plt_for_ifunc(Sized_relobj_file<32, false>*,
614                               unsigned int r_type);
615
616     static void
617     unsupported_reloc_local(Sized_relobj_file<32, false>*, unsigned int r_type);
618
619     static void
620     unsupported_reloc_global(Sized_relobj_file<32, false>*, unsigned int r_type,
621                              Symbol*);
622   };
623
624   // The class which implements relocation.
625   class Relocate
626   {
627    public:
628     Relocate()
629       : skip_call_tls_get_addr_(false),
630         local_dynamic_type_(LOCAL_DYNAMIC_NONE)
631     { }
632
633     ~Relocate()
634     {
635       if (this->skip_call_tls_get_addr_)
636         {
637           // FIXME: This needs to specify the location somehow.
638           gold_error(_("missing expected TLS relocation"));
639         }
640     }
641
642     // Return whether the static relocation needs to be applied.
643     inline bool
644     should_apply_static_reloc(const Sized_symbol<32>* gsym,
645                               unsigned int r_type,
646                               bool is_32bit,
647                               Output_section* output_section);
648
649     // Do a relocation.  Return false if the caller should not issue
650     // any warnings about this relocation.
651     inline bool
652     relocate(const Relocate_info<32, false>*, unsigned int,
653              Target_i386*, Output_section*, size_t, const unsigned char*,
654              const Sized_symbol<32>*, const Symbol_value<32>*,
655              unsigned char*, elfcpp::Elf_types<32>::Elf_Addr,
656              section_size_type);
657
658    private:
659     // Do a TLS relocation.
660     inline void
661     relocate_tls(const Relocate_info<32, false>*, Target_i386* target,
662                  size_t relnum, const elfcpp::Rel<32, false>&,
663                  unsigned int r_type, const Sized_symbol<32>*,
664                  const Symbol_value<32>*,
665                  unsigned char*, elfcpp::Elf_types<32>::Elf_Addr,
666                  section_size_type);
667
668     // Do a TLS General-Dynamic to Initial-Exec transition.
669     inline void
670     tls_gd_to_ie(const Relocate_info<32, false>*, size_t relnum,
671                  const elfcpp::Rel<32, false>&, unsigned int r_type,
672                  elfcpp::Elf_types<32>::Elf_Addr value,
673                  unsigned char* view,
674                  section_size_type view_size);
675
676     // Do a TLS General-Dynamic to Local-Exec transition.
677     inline void
678     tls_gd_to_le(const Relocate_info<32, false>*, size_t relnum,
679                  Output_segment* tls_segment,
680                  const elfcpp::Rel<32, false>&, unsigned int r_type,
681                  elfcpp::Elf_types<32>::Elf_Addr value,
682                  unsigned char* view,
683                  section_size_type view_size);
684
685     // Do a TLS_GOTDESC or TLS_DESC_CALL General-Dynamic to Initial-Exec
686     // transition.
687     inline void
688     tls_desc_gd_to_ie(const Relocate_info<32, false>*, size_t relnum,
689                       const elfcpp::Rel<32, false>&, unsigned int r_type,
690                       elfcpp::Elf_types<32>::Elf_Addr value,
691                       unsigned char* view,
692                       section_size_type view_size);
693
694     // Do a TLS_GOTDESC or TLS_DESC_CALL General-Dynamic to Local-Exec
695     // transition.
696     inline void
697     tls_desc_gd_to_le(const Relocate_info<32, false>*, size_t relnum,
698                       Output_segment* tls_segment,
699                       const elfcpp::Rel<32, false>&, unsigned int r_type,
700                       elfcpp::Elf_types<32>::Elf_Addr value,
701                       unsigned char* view,
702                       section_size_type view_size);
703
704     // Do a TLS Local-Dynamic to Local-Exec transition.
705     inline void
706     tls_ld_to_le(const Relocate_info<32, false>*, size_t relnum,
707                  Output_segment* tls_segment,
708                  const elfcpp::Rel<32, false>&, unsigned int r_type,
709                  elfcpp::Elf_types<32>::Elf_Addr value,
710                  unsigned char* view,
711                  section_size_type view_size);
712
713     // Do a TLS Initial-Exec to Local-Exec transition.
714     static inline void
715     tls_ie_to_le(const Relocate_info<32, false>*, size_t relnum,
716                  Output_segment* tls_segment,
717                  const elfcpp::Rel<32, false>&, unsigned int r_type,
718                  elfcpp::Elf_types<32>::Elf_Addr value,
719                  unsigned char* view,
720                  section_size_type view_size);
721
722     // We need to keep track of which type of local dynamic relocation
723     // we have seen, so that we can optimize R_386_TLS_LDO_32 correctly.
724     enum Local_dynamic_type
725     {
726       LOCAL_DYNAMIC_NONE,
727       LOCAL_DYNAMIC_SUN,
728       LOCAL_DYNAMIC_GNU
729     };
730
731     // This is set if we should skip the next reloc, which should be a
732     // PLT32 reloc against ___tls_get_addr.
733     bool skip_call_tls_get_addr_;
734     // The type of local dynamic relocation we have seen in the section
735     // being relocated, if any.
736     Local_dynamic_type local_dynamic_type_;
737   };
738
739   // A class for inquiring about properties of a relocation,
740   // used while scanning relocs during a relocatable link and
741   // garbage collection.
742   class Classify_reloc :
743       public gold::Default_classify_reloc<elfcpp::SHT_REL, 32, false>
744   {
745    public:
746     typedef Reloc_types<elfcpp::SHT_REL, 32, false>::Reloc Reltype;
747
748     // Return the explicit addend of the relocation (return 0 for SHT_REL).
749     static elfcpp::Elf_types<32>::Elf_Swxword
750     get_r_addend(const Reltype*)
751     { return 0; }
752
753     // Return the size of the addend of the relocation (only used for SHT_REL).
754     static unsigned int
755     get_size_for_reloc(unsigned int, Relobj*);
756   };
757
758   // Adjust TLS relocation type based on the options and whether this
759   // is a local symbol.
760   static tls::Tls_optimization
761   optimize_tls_reloc(bool is_final, int r_type);
762
763   // Check if relocation against this symbol is a candidate for
764   // conversion from
765   // mov foo@GOT(%reg), %reg
766   // to
767   // lea foo@GOTOFF(%reg), %reg.
768   static bool
769   can_convert_mov_to_lea(const Symbol* gsym)
770   {
771     gold_assert(gsym != NULL);
772     return (gsym->type() != elfcpp::STT_GNU_IFUNC
773             && !gsym->is_undefined ()
774             && !gsym->is_from_dynobj()
775             && !gsym->is_preemptible()
776             && (!parameters->options().shared()
777                 || (gsym->visibility() != elfcpp::STV_DEFAULT
778                     && gsym->visibility() != elfcpp::STV_PROTECTED)
779                 || parameters->options().Bsymbolic())
780             && strcmp(gsym->name(), "_DYNAMIC") != 0);
781   }
782
783   // Get the GOT section, creating it if necessary.
784   Output_data_got<32, false>*
785   got_section(Symbol_table*, Layout*);
786
787   // Get the GOT PLT section.
788   Output_data_got_plt_i386*
789   got_plt_section() const
790   {
791     gold_assert(this->got_plt_ != NULL);
792     return this->got_plt_;
793   }
794
795   // Get the GOT section for TLSDESC entries.
796   Output_data_got<32, false>*
797   got_tlsdesc_section() const
798   {
799     gold_assert(this->got_tlsdesc_ != NULL);
800     return this->got_tlsdesc_;
801   }
802
803   // Create the PLT section.
804   void
805   make_plt_section(Symbol_table* symtab, Layout* layout);
806
807   // Create a PLT entry for a global symbol.
808   void
809   make_plt_entry(Symbol_table*, Layout*, Symbol*);
810
811   // Create a PLT entry for a local STT_GNU_IFUNC symbol.
812   void
813   make_local_ifunc_plt_entry(Symbol_table*, Layout*,
814                              Sized_relobj_file<32, false>* relobj,
815                              unsigned int local_sym_index);
816
817   // Define the _TLS_MODULE_BASE_ symbol in the TLS segment.
818   void
819   define_tls_base_symbol(Symbol_table*, Layout*);
820
821   // Create a GOT entry for the TLS module index.
822   unsigned int
823   got_mod_index_entry(Symbol_table* symtab, Layout* layout,
824                       Sized_relobj_file<32, false>* object);
825
826   // Get the PLT section.
827   Output_data_plt_i386*
828   plt_section() const
829   {
830     gold_assert(this->plt_ != NULL);
831     return this->plt_;
832   }
833
834   // Get the dynamic reloc section, creating it if necessary.
835   Reloc_section*
836   rel_dyn_section(Layout*);
837
838   // Get the section to use for TLS_DESC relocations.
839   Reloc_section*
840   rel_tls_desc_section(Layout*) const;
841
842   // Get the section to use for IRELATIVE relocations.
843   Reloc_section*
844   rel_irelative_section(Layout*);
845
846   // Add a potential copy relocation.
847   void
848   copy_reloc(Symbol_table* symtab, Layout* layout,
849              Sized_relobj_file<32, false>* object,
850              unsigned int shndx, Output_section* output_section,
851              Symbol* sym, const elfcpp::Rel<32, false>& reloc)
852   {
853     unsigned int r_type = elfcpp::elf_r_type<32>(reloc.get_r_info());
854     this->copy_relocs_.copy_reloc(symtab, layout,
855                                   symtab->get_sized_symbol<32>(sym),
856                                   object, shndx, output_section,
857                                   r_type, reloc.get_r_offset(), 0,
858                                   this->rel_dyn_section(layout));
859   }
860
861   // Information about this specific target which we pass to the
862   // general Target structure.
863   static const Target::Target_info i386_info;
864
865   // The types of GOT entries needed for this platform.
866   // These values are exposed to the ABI in an incremental link.
867   // Do not renumber existing values without changing the version
868   // number of the .gnu_incremental_inputs section.
869   enum Got_type
870   {
871     GOT_TYPE_STANDARD = 0,      // GOT entry for a regular symbol
872     GOT_TYPE_TLS_NOFFSET = 1,   // GOT entry for negative TLS offset
873     GOT_TYPE_TLS_OFFSET = 2,    // GOT entry for positive TLS offset
874     GOT_TYPE_TLS_PAIR = 3,      // GOT entry for TLS module/offset pair
875     GOT_TYPE_TLS_DESC = 4       // GOT entry for TLS_DESC pair
876   };
877
878   // The GOT section.
879   Output_data_got<32, false>* got_;
880   // The PLT section.
881   Output_data_plt_i386* plt_;
882   // The GOT PLT section.
883   Output_data_got_plt_i386* got_plt_;
884   // The GOT section for IRELATIVE relocations.
885   Output_data_space* got_irelative_;
886   // The GOT section for TLSDESC relocations.
887   Output_data_got<32, false>* got_tlsdesc_;
888   // The _GLOBAL_OFFSET_TABLE_ symbol.
889   Symbol* global_offset_table_;
890   // The dynamic reloc section.
891   Reloc_section* rel_dyn_;
892   // The section to use for IRELATIVE relocs.
893   Reloc_section* rel_irelative_;
894   // Relocs saved to avoid a COPY reloc.
895   Copy_relocs<elfcpp::SHT_REL, 32, false> copy_relocs_;
896   // Offset of the GOT entry for the TLS module index.
897   unsigned int got_mod_index_offset_;
898   // True if the _TLS_MODULE_BASE_ symbol has been defined.
899   bool tls_base_symbol_defined_;
900 };
901
902 const Target::Target_info Target_i386::i386_info =
903 {
904   32,                   // size
905   false,                // is_big_endian
906   elfcpp::EM_386,       // machine_code
907   false,                // has_make_symbol
908   false,                // has_resolve
909   true,                 // has_code_fill
910   true,                 // is_default_stack_executable
911   true,                 // can_icf_inline_merge_sections
912   '\0',                 // wrap_char
913   "/usr/lib/libc.so.1", // dynamic_linker
914   0x08048000,           // default_text_segment_address
915   0x1000,               // abi_pagesize (overridable by -z max-page-size)
916   0x1000,               // common_pagesize (overridable by -z common-page-size)
917   false,                // isolate_execinstr
918   0,                    // rosegment_gap
919   elfcpp::SHN_UNDEF,    // small_common_shndx
920   elfcpp::SHN_UNDEF,    // large_common_shndx
921   0,                    // small_common_section_flags
922   0,                    // large_common_section_flags
923   NULL,                 // attributes_section
924   NULL,                 // attributes_vendor
925   "_start",             // entry_symbol_name
926   32,                   // hash_entry_size
927 };
928
929 // Get the GOT section, creating it if necessary.
930
931 Output_data_got<32, false>*
932 Target_i386::got_section(Symbol_table* symtab, Layout* layout)
933 {
934   if (this->got_ == NULL)
935     {
936       gold_assert(symtab != NULL && layout != NULL);
937
938       this->got_ = new Output_data_got<32, false>();
939
940       // When using -z now, we can treat .got.plt as a relro section.
941       // Without -z now, it is modified after program startup by lazy
942       // PLT relocations.
943       bool is_got_plt_relro = parameters->options().now();
944       Output_section_order got_order = (is_got_plt_relro
945                                         ? ORDER_RELRO
946                                         : ORDER_RELRO_LAST);
947       Output_section_order got_plt_order = (is_got_plt_relro
948                                             ? ORDER_RELRO
949                                             : ORDER_NON_RELRO_FIRST);
950
951       layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS,
952                                       (elfcpp::SHF_ALLOC
953                                        | elfcpp::SHF_WRITE),
954                                       this->got_, got_order, true);
955
956       this->got_plt_ = new Output_data_got_plt_i386(layout);
957       layout->add_output_section_data(".got.plt", elfcpp::SHT_PROGBITS,
958                                       (elfcpp::SHF_ALLOC
959                                        | elfcpp::SHF_WRITE),
960                                       this->got_plt_, got_plt_order,
961                                       is_got_plt_relro);
962
963       // The first three entries are reserved.
964       this->got_plt_->set_current_data_size(3 * 4);
965
966       if (!is_got_plt_relro)
967         {
968           // Those bytes can go into the relro segment.
969           layout->increase_relro(3 * 4);
970         }
971
972       // Define _GLOBAL_OFFSET_TABLE_ at the start of the PLT.
973       this->global_offset_table_ =
974         symtab->define_in_output_data("_GLOBAL_OFFSET_TABLE_", NULL,
975                                       Symbol_table::PREDEFINED,
976                                       this->got_plt_,
977                                       0, 0, elfcpp::STT_OBJECT,
978                                       elfcpp::STB_LOCAL,
979                                       elfcpp::STV_HIDDEN, 0,
980                                       false, false);
981
982       // If there are any IRELATIVE relocations, they get GOT entries
983       // in .got.plt after the jump slot relocations.
984       this->got_irelative_ = new Output_data_space(4, "** GOT IRELATIVE PLT");
985       layout->add_output_section_data(".got.plt", elfcpp::SHT_PROGBITS,
986                                       (elfcpp::SHF_ALLOC
987                                        | elfcpp::SHF_WRITE),
988                                       this->got_irelative_,
989                                       got_plt_order, is_got_plt_relro);
990
991       // If there are any TLSDESC relocations, they get GOT entries in
992       // .got.plt after the jump slot entries.
993       this->got_tlsdesc_ = new Output_data_got<32, false>();
994       layout->add_output_section_data(".got.plt", elfcpp::SHT_PROGBITS,
995                                       (elfcpp::SHF_ALLOC
996                                        | elfcpp::SHF_WRITE),
997                                       this->got_tlsdesc_,
998                                       got_plt_order, is_got_plt_relro);
999     }
1000
1001   return this->got_;
1002 }
1003
1004 // Get the dynamic reloc section, creating it if necessary.
1005
1006 Target_i386::Reloc_section*
1007 Target_i386::rel_dyn_section(Layout* layout)
1008 {
1009   if (this->rel_dyn_ == NULL)
1010     {
1011       gold_assert(layout != NULL);
1012       this->rel_dyn_ = new Reloc_section(parameters->options().combreloc());
1013       layout->add_output_section_data(".rel.dyn", elfcpp::SHT_REL,
1014                                       elfcpp::SHF_ALLOC, this->rel_dyn_,
1015                                       ORDER_DYNAMIC_RELOCS, false);
1016     }
1017   return this->rel_dyn_;
1018 }
1019
1020 // Get the section to use for IRELATIVE relocs, creating it if
1021 // necessary.  These go in .rel.dyn, but only after all other dynamic
1022 // relocations.  They need to follow the other dynamic relocations so
1023 // that they can refer to global variables initialized by those
1024 // relocs.
1025
1026 Target_i386::Reloc_section*
1027 Target_i386::rel_irelative_section(Layout* layout)
1028 {
1029   if (this->rel_irelative_ == NULL)
1030     {
1031       // Make sure we have already create the dynamic reloc section.
1032       this->rel_dyn_section(layout);
1033       this->rel_irelative_ = new Reloc_section(false);
1034       layout->add_output_section_data(".rel.dyn", elfcpp::SHT_REL,
1035                                       elfcpp::SHF_ALLOC, this->rel_irelative_,
1036                                       ORDER_DYNAMIC_RELOCS, false);
1037       gold_assert(this->rel_dyn_->output_section()
1038                   == this->rel_irelative_->output_section());
1039     }
1040   return this->rel_irelative_;
1041 }
1042
1043 // Write the first three reserved words of the .got.plt section.
1044 // The remainder of the section is written while writing the PLT
1045 // in Output_data_plt_i386::do_write.
1046
1047 void
1048 Output_data_got_plt_i386::do_write(Output_file* of)
1049 {
1050   // The first entry in the GOT is the address of the .dynamic section
1051   // aka the PT_DYNAMIC segment.  The next two entries are reserved.
1052   // We saved space for them when we created the section in
1053   // Target_i386::got_section.
1054   const off_t got_file_offset = this->offset();
1055   gold_assert(this->data_size() >= 12);
1056   unsigned char* const got_view = of->get_output_view(got_file_offset, 12);
1057   Output_section* dynamic = this->layout_->dynamic_section();
1058   uint32_t dynamic_addr = dynamic == NULL ? 0 : dynamic->address();
1059   elfcpp::Swap<32, false>::writeval(got_view, dynamic_addr);
1060   memset(got_view + 4, 0, 8);
1061   of->write_output_view(got_file_offset, 12, got_view);
1062 }
1063
1064 // Create the PLT section.  The ordinary .got section is an argument,
1065 // since we need to refer to the start.  We also create our own .got
1066 // section just for PLT entries.
1067
1068 Output_data_plt_i386::Output_data_plt_i386(Layout* layout,
1069                                            uint64_t addralign,
1070                                            Output_data_got_plt_i386* got_plt,
1071                                            Output_data_space* got_irelative)
1072   : Output_section_data(addralign),
1073     tls_desc_rel_(NULL), irelative_rel_(NULL), got_plt_(got_plt),
1074     got_irelative_(got_irelative), count_(0), irelative_count_(0),
1075     global_ifuncs_(), local_ifuncs_()
1076 {
1077   this->rel_ = new Reloc_section(false);
1078   layout->add_output_section_data(".rel.plt", elfcpp::SHT_REL,
1079                                   elfcpp::SHF_ALLOC, this->rel_,
1080                                   ORDER_DYNAMIC_PLT_RELOCS, false);
1081 }
1082
1083 void
1084 Output_data_plt_i386::do_adjust_output_section(Output_section* os)
1085 {
1086   // UnixWare sets the entsize of .plt to 4, and so does the old GNU
1087   // linker, and so do we.
1088   os->set_entsize(4);
1089 }
1090
1091 // Add an entry to the PLT.
1092
1093 void
1094 Output_data_plt_i386::add_entry(Symbol_table* symtab, Layout* layout,
1095                                 Symbol* gsym)
1096 {
1097   gold_assert(!gsym->has_plt_offset());
1098
1099   // Every PLT entry needs a reloc.
1100   if (gsym->type() == elfcpp::STT_GNU_IFUNC
1101       && gsym->can_use_relative_reloc(false))
1102     {
1103       gsym->set_plt_offset(this->irelative_count_ * this->get_plt_entry_size());
1104       ++this->irelative_count_;
1105       section_offset_type got_offset =
1106         this->got_irelative_->current_data_size();
1107       this->got_irelative_->set_current_data_size(got_offset + 4);
1108       Reloc_section* rel = this->rel_irelative(symtab, layout);
1109       rel->add_symbolless_global_addend(gsym, elfcpp::R_386_IRELATIVE,
1110                                         this->got_irelative_, got_offset);
1111       struct Global_ifunc gi;
1112       gi.sym = gsym;
1113       gi.got_offset = got_offset;
1114       this->global_ifuncs_.push_back(gi);
1115     }
1116   else
1117     {
1118       // When setting the PLT offset we skip the initial reserved PLT
1119       // entry.
1120       gsym->set_plt_offset((this->count_ + 1) * this->get_plt_entry_size());
1121
1122       ++this->count_;
1123
1124       section_offset_type got_offset = this->got_plt_->current_data_size();
1125
1126       // Every PLT entry needs a GOT entry which points back to the
1127       // PLT entry (this will be changed by the dynamic linker,
1128       // normally lazily when the function is called).
1129       this->got_plt_->set_current_data_size(got_offset + 4);
1130
1131       gsym->set_needs_dynsym_entry();
1132       this->rel_->add_global(gsym, elfcpp::R_386_JUMP_SLOT, this->got_plt_,
1133                              got_offset);
1134     }
1135
1136   // Note that we don't need to save the symbol.  The contents of the
1137   // PLT are independent of which symbols are used.  The symbols only
1138   // appear in the relocations.
1139 }
1140
1141 // Add an entry to the PLT for a local STT_GNU_IFUNC symbol.  Return
1142 // the PLT offset.
1143
1144 unsigned int
1145 Output_data_plt_i386::add_local_ifunc_entry(
1146     Symbol_table* symtab,
1147     Layout* layout,
1148     Sized_relobj_file<32, false>* relobj,
1149     unsigned int local_sym_index)
1150 {
1151   unsigned int plt_offset = this->irelative_count_ * this->get_plt_entry_size();
1152   ++this->irelative_count_;
1153
1154   section_offset_type got_offset = this->got_irelative_->current_data_size();
1155
1156   // Every PLT entry needs a GOT entry which points back to the PLT
1157   // entry.
1158   this->got_irelative_->set_current_data_size(got_offset + 4);
1159
1160   // Every PLT entry needs a reloc.
1161   Reloc_section* rel = this->rel_irelative(symtab, layout);
1162   rel->add_symbolless_local_addend(relobj, local_sym_index,
1163                                    elfcpp::R_386_IRELATIVE,
1164                                    this->got_irelative_, got_offset);
1165
1166   struct Local_ifunc li;
1167   li.object = relobj;
1168   li.local_sym_index = local_sym_index;
1169   li.got_offset = got_offset;
1170   this->local_ifuncs_.push_back(li);
1171
1172   return plt_offset;
1173 }
1174
1175 // Return where the TLS_DESC relocations should go, creating it if
1176 // necessary. These follow the JUMP_SLOT relocations.
1177
1178 Output_data_plt_i386::Reloc_section*
1179 Output_data_plt_i386::rel_tls_desc(Layout* layout)
1180 {
1181   if (this->tls_desc_rel_ == NULL)
1182     {
1183       this->tls_desc_rel_ = new Reloc_section(false);
1184       layout->add_output_section_data(".rel.plt", elfcpp::SHT_REL,
1185                                       elfcpp::SHF_ALLOC, this->tls_desc_rel_,
1186                                       ORDER_DYNAMIC_PLT_RELOCS, false);
1187       gold_assert(this->tls_desc_rel_->output_section()
1188                   == this->rel_->output_section());
1189     }
1190   return this->tls_desc_rel_;
1191 }
1192
1193 // Return where the IRELATIVE relocations should go in the PLT.  These
1194 // follow the JUMP_SLOT and TLS_DESC relocations.
1195
1196 Output_data_plt_i386::Reloc_section*
1197 Output_data_plt_i386::rel_irelative(Symbol_table* symtab, Layout* layout)
1198 {
1199   if (this->irelative_rel_ == NULL)
1200     {
1201       // Make sure we have a place for the TLS_DESC relocations, in
1202       // case we see any later on.
1203       this->rel_tls_desc(layout);
1204       this->irelative_rel_ = new Reloc_section(false);
1205       layout->add_output_section_data(".rel.plt", elfcpp::SHT_REL,
1206                                       elfcpp::SHF_ALLOC, this->irelative_rel_,
1207                                       ORDER_DYNAMIC_PLT_RELOCS, false);
1208       gold_assert(this->irelative_rel_->output_section()
1209                   == this->rel_->output_section());
1210
1211       if (parameters->doing_static_link())
1212         {
1213           // A statically linked executable will only have a .rel.plt
1214           // section to hold R_386_IRELATIVE relocs for STT_GNU_IFUNC
1215           // symbols.  The library will use these symbols to locate
1216           // the IRELATIVE relocs at program startup time.
1217           symtab->define_in_output_data("__rel_iplt_start", NULL,
1218                                         Symbol_table::PREDEFINED,
1219                                         this->irelative_rel_, 0, 0,
1220                                         elfcpp::STT_NOTYPE, elfcpp::STB_GLOBAL,
1221                                         elfcpp::STV_HIDDEN, 0, false, true);
1222           symtab->define_in_output_data("__rel_iplt_end", NULL,
1223                                         Symbol_table::PREDEFINED,
1224                                         this->irelative_rel_, 0, 0,
1225                                         elfcpp::STT_NOTYPE, elfcpp::STB_GLOBAL,
1226                                         elfcpp::STV_HIDDEN, 0, true, true);
1227         }
1228     }
1229   return this->irelative_rel_;
1230 }
1231
1232 // Return the PLT address to use for a global symbol.
1233
1234 uint64_t
1235 Output_data_plt_i386::address_for_global(const Symbol* gsym)
1236 {
1237   uint64_t offset = 0;
1238   if (gsym->type() == elfcpp::STT_GNU_IFUNC
1239       && gsym->can_use_relative_reloc(false))
1240     offset = (this->count_ + 1) * this->get_plt_entry_size();
1241   return this->address() + offset + gsym->plt_offset();
1242 }
1243
1244 // Return the PLT address to use for a local symbol.  These are always
1245 // IRELATIVE relocs.
1246
1247 uint64_t
1248 Output_data_plt_i386::address_for_local(const Relobj* object,
1249                                         unsigned int r_sym)
1250 {
1251   return (this->address()
1252           + (this->count_ + 1) * this->get_plt_entry_size()
1253           + object->local_plt_offset(r_sym));
1254 }
1255
1256 // The first entry in the PLT for an executable.
1257
1258 const unsigned char Output_data_plt_i386_exec::first_plt_entry[plt_entry_size] =
1259 {
1260   0xff, 0x35,   // pushl contents of memory address
1261   0, 0, 0, 0,   // replaced with address of .got + 4
1262   0xff, 0x25,   // jmp indirect
1263   0, 0, 0, 0,   // replaced with address of .got + 8
1264   0, 0, 0, 0    // unused
1265 };
1266
1267 void
1268 Output_data_plt_i386_exec::do_fill_first_plt_entry(
1269     unsigned char* pov,
1270     elfcpp::Elf_types<32>::Elf_Addr got_address)
1271 {
1272   memcpy(pov, first_plt_entry, plt_entry_size);
1273   elfcpp::Swap_unaligned<32, false>::writeval(pov + 2, got_address + 4);
1274   elfcpp::Swap<32, false>::writeval(pov + 8, got_address + 8);
1275 }
1276
1277 // The first entry in the PLT for a shared object.
1278
1279 const unsigned char Output_data_plt_i386_dyn::first_plt_entry[plt_entry_size] =
1280 {
1281   0xff, 0xb3, 4, 0, 0, 0,       // pushl 4(%ebx)
1282   0xff, 0xa3, 8, 0, 0, 0,       // jmp *8(%ebx)
1283   0, 0, 0, 0                    // unused
1284 };
1285
1286 void
1287 Output_data_plt_i386_dyn::do_fill_first_plt_entry(
1288     unsigned char* pov,
1289     elfcpp::Elf_types<32>::Elf_Addr)
1290 {
1291   memcpy(pov, first_plt_entry, plt_entry_size);
1292 }
1293
1294 // Subsequent entries in the PLT for an executable.
1295
1296 const unsigned char Output_data_plt_i386_exec::plt_entry[plt_entry_size] =
1297 {
1298   0xff, 0x25,   // jmp indirect
1299   0, 0, 0, 0,   // replaced with address of symbol in .got
1300   0x68,         // pushl immediate
1301   0, 0, 0, 0,   // replaced with offset into relocation table
1302   0xe9,         // jmp relative
1303   0, 0, 0, 0    // replaced with offset to start of .plt
1304 };
1305
1306 unsigned int
1307 Output_data_plt_i386_exec::do_fill_plt_entry(
1308     unsigned char* pov,
1309     elfcpp::Elf_types<32>::Elf_Addr got_address,
1310     unsigned int got_offset,
1311     unsigned int plt_offset,
1312     unsigned int plt_rel_offset)
1313 {
1314   memcpy(pov, plt_entry, plt_entry_size);
1315   elfcpp::Swap_unaligned<32, false>::writeval(pov + 2,
1316                                               got_address + got_offset);
1317   elfcpp::Swap_unaligned<32, false>::writeval(pov + 7, plt_rel_offset);
1318   elfcpp::Swap<32, false>::writeval(pov + 12, - (plt_offset + 12 + 4));
1319   return 6;
1320 }
1321
1322 // Subsequent entries in the PLT for a shared object.
1323
1324 const unsigned char Output_data_plt_i386_dyn::plt_entry[plt_entry_size] =
1325 {
1326   0xff, 0xa3,   // jmp *offset(%ebx)
1327   0, 0, 0, 0,   // replaced with offset of symbol in .got
1328   0x68,         // pushl immediate
1329   0, 0, 0, 0,   // replaced with offset into relocation table
1330   0xe9,         // jmp relative
1331   0, 0, 0, 0    // replaced with offset to start of .plt
1332 };
1333
1334 unsigned int
1335 Output_data_plt_i386_dyn::do_fill_plt_entry(unsigned char* pov,
1336                                             elfcpp::Elf_types<32>::Elf_Addr,
1337                                             unsigned int got_offset,
1338                                             unsigned int plt_offset,
1339                                             unsigned int plt_rel_offset)
1340 {
1341   memcpy(pov, plt_entry, plt_entry_size);
1342   elfcpp::Swap_unaligned<32, false>::writeval(pov + 2, got_offset);
1343   elfcpp::Swap_unaligned<32, false>::writeval(pov + 7, plt_rel_offset);
1344   elfcpp::Swap<32, false>::writeval(pov + 12, - (plt_offset + 12 + 4));
1345   return 6;
1346 }
1347
1348 // The .eh_frame unwind information for the PLT.
1349
1350 const unsigned char
1351 Output_data_plt_i386::plt_eh_frame_cie[plt_eh_frame_cie_size] =
1352 {
1353   1,                            // CIE version.
1354   'z',                          // Augmentation: augmentation size included.
1355   'R',                          // Augmentation: FDE encoding included.
1356   '\0',                         // End of augmentation string.
1357   1,                            // Code alignment factor.
1358   0x7c,                         // Data alignment factor.
1359   8,                            // Return address column.
1360   1,                            // Augmentation size.
1361   (elfcpp::DW_EH_PE_pcrel       // FDE encoding.
1362    | elfcpp::DW_EH_PE_sdata4),
1363   elfcpp::DW_CFA_def_cfa, 4, 4, // DW_CFA_def_cfa: r4 (esp) ofs 4.
1364   elfcpp::DW_CFA_offset + 8, 1, // DW_CFA_offset: r8 (eip) at cfa-4.
1365   elfcpp::DW_CFA_nop,           // Align to 16 bytes.
1366   elfcpp::DW_CFA_nop
1367 };
1368
1369 const unsigned char
1370 Output_data_plt_i386_standard::plt_eh_frame_fde[plt_eh_frame_fde_size] =
1371 {
1372   0, 0, 0, 0,                           // Replaced with offset to .plt.
1373   0, 0, 0, 0,                           // Replaced with size of .plt.
1374   0,                                    // Augmentation size.
1375   elfcpp::DW_CFA_def_cfa_offset, 8,     // DW_CFA_def_cfa_offset: 8.
1376   elfcpp::DW_CFA_advance_loc + 6,       // Advance 6 to __PLT__ + 6.
1377   elfcpp::DW_CFA_def_cfa_offset, 12,    // DW_CFA_def_cfa_offset: 12.
1378   elfcpp::DW_CFA_advance_loc + 10,      // Advance 10 to __PLT__ + 16.
1379   elfcpp::DW_CFA_def_cfa_expression,    // DW_CFA_def_cfa_expression.
1380   11,                                   // Block length.
1381   elfcpp::DW_OP_breg4, 4,               // Push %esp + 4.
1382   elfcpp::DW_OP_breg8, 0,               // Push %eip.
1383   elfcpp::DW_OP_lit15,                  // Push 0xf.
1384   elfcpp::DW_OP_and,                    // & (%eip & 0xf).
1385   elfcpp::DW_OP_lit11,                  // Push 0xb.
1386   elfcpp::DW_OP_ge,                     // >= ((%eip & 0xf) >= 0xb)
1387   elfcpp::DW_OP_lit2,                   // Push 2.
1388   elfcpp::DW_OP_shl,                    // << (((%eip & 0xf) >= 0xb) << 2)
1389   elfcpp::DW_OP_plus,                   // + ((((%eip&0xf)>=0xb)<<2)+%esp+4
1390   elfcpp::DW_CFA_nop,                   // Align to 32 bytes.
1391   elfcpp::DW_CFA_nop,
1392   elfcpp::DW_CFA_nop,
1393   elfcpp::DW_CFA_nop
1394 };
1395
1396 // Write out the PLT.  This uses the hand-coded instructions above,
1397 // and adjusts them as needed.  This is all specified by the i386 ELF
1398 // Processor Supplement.
1399
1400 void
1401 Output_data_plt_i386::do_write(Output_file* of)
1402 {
1403   const off_t offset = this->offset();
1404   const section_size_type oview_size =
1405     convert_to_section_size_type(this->data_size());
1406   unsigned char* const oview = of->get_output_view(offset, oview_size);
1407
1408   const off_t got_file_offset = this->got_plt_->offset();
1409   gold_assert(parameters->incremental_update()
1410               || (got_file_offset + this->got_plt_->data_size()
1411                   == this->got_irelative_->offset()));
1412   const section_size_type got_size =
1413     convert_to_section_size_type(this->got_plt_->data_size()
1414                                  + this->got_irelative_->data_size());
1415
1416   unsigned char* const got_view = of->get_output_view(got_file_offset,
1417                                                       got_size);
1418
1419   unsigned char* pov = oview;
1420
1421   elfcpp::Elf_types<32>::Elf_Addr plt_address = this->address();
1422   elfcpp::Elf_types<32>::Elf_Addr got_address = this->got_plt_->address();
1423
1424   this->fill_first_plt_entry(pov, got_address);
1425   pov += this->get_plt_entry_size();
1426
1427   // The first three entries in the GOT are reserved, and are written
1428   // by Output_data_got_plt_i386::do_write.
1429   unsigned char* got_pov = got_view + 12;
1430
1431   const int rel_size = elfcpp::Elf_sizes<32>::rel_size;
1432
1433   unsigned int plt_offset = this->get_plt_entry_size();
1434   unsigned int plt_rel_offset = 0;
1435   unsigned int got_offset = 12;
1436   const unsigned int count = this->count_ + this->irelative_count_;
1437   for (unsigned int i = 0;
1438        i < count;
1439        ++i,
1440          pov += this->get_plt_entry_size(),
1441          got_pov += 4,
1442          plt_offset += this->get_plt_entry_size(),
1443          plt_rel_offset += rel_size,
1444          got_offset += 4)
1445     {
1446       // Set and adjust the PLT entry itself.
1447       unsigned int lazy_offset = this->fill_plt_entry(pov,
1448                                                       got_address,
1449                                                       got_offset,
1450                                                       plt_offset,
1451                                                       plt_rel_offset);
1452
1453       // Set the entry in the GOT.
1454       elfcpp::Swap<32, false>::writeval(got_pov,
1455                                         plt_address + plt_offset + lazy_offset);
1456     }
1457
1458   // If any STT_GNU_IFUNC symbols have PLT entries, we need to change
1459   // the GOT to point to the actual symbol value, rather than point to
1460   // the PLT entry.  That will let the dynamic linker call the right
1461   // function when resolving IRELATIVE relocations.
1462   unsigned char* got_irelative_view = got_view + this->got_plt_->data_size();
1463   for (std::vector<Global_ifunc>::const_iterator p =
1464          this->global_ifuncs_.begin();
1465        p != this->global_ifuncs_.end();
1466        ++p)
1467     {
1468       const Sized_symbol<32>* ssym =
1469         static_cast<const Sized_symbol<32>*>(p->sym);
1470       elfcpp::Swap<32, false>::writeval(got_irelative_view + p->got_offset,
1471                                         ssym->value());
1472     }
1473
1474   for (std::vector<Local_ifunc>::const_iterator p =
1475          this->local_ifuncs_.begin();
1476        p != this->local_ifuncs_.end();
1477        ++p)
1478     {
1479       const Symbol_value<32>* psymval =
1480         p->object->local_symbol(p->local_sym_index);
1481       elfcpp::Swap<32, false>::writeval(got_irelative_view + p->got_offset,
1482                                         psymval->value(p->object, 0));
1483     }
1484
1485   gold_assert(static_cast<section_size_type>(pov - oview) == oview_size);
1486   gold_assert(static_cast<section_size_type>(got_pov - got_view) == got_size);
1487
1488   of->write_output_view(offset, oview_size, oview);
1489   of->write_output_view(got_file_offset, got_size, got_view);
1490 }
1491
1492 // Create the PLT section.
1493
1494 void
1495 Target_i386::make_plt_section(Symbol_table* symtab, Layout* layout)
1496 {
1497   if (this->plt_ == NULL)
1498     {
1499       // Create the GOT sections first.
1500       this->got_section(symtab, layout);
1501
1502       const bool dyn = parameters->options().output_is_position_independent();
1503       this->plt_ = this->make_data_plt(layout,
1504                                        this->got_plt_,
1505                                        this->got_irelative_,
1506                                        dyn);
1507
1508       // Add unwind information if requested.
1509       if (parameters->options().ld_generated_unwind_info())
1510         this->plt_->add_eh_frame(layout);
1511
1512       layout->add_output_section_data(".plt", elfcpp::SHT_PROGBITS,
1513                                       (elfcpp::SHF_ALLOC
1514                                        | elfcpp::SHF_EXECINSTR),
1515                                       this->plt_, ORDER_PLT, false);
1516
1517       // Make the sh_info field of .rel.plt point to .plt.
1518       Output_section* rel_plt_os = this->plt_->rel_plt()->output_section();
1519       rel_plt_os->set_info_section(this->plt_->output_section());
1520     }
1521 }
1522
1523 // Create a PLT entry for a global symbol.
1524
1525 void
1526 Target_i386::make_plt_entry(Symbol_table* symtab, Layout* layout, Symbol* gsym)
1527 {
1528   if (gsym->has_plt_offset())
1529     return;
1530   if (this->plt_ == NULL)
1531     this->make_plt_section(symtab, layout);
1532   this->plt_->add_entry(symtab, layout, gsym);
1533 }
1534
1535 // Make a PLT entry for a local STT_GNU_IFUNC symbol.
1536
1537 void
1538 Target_i386::make_local_ifunc_plt_entry(Symbol_table* symtab, Layout* layout,
1539                                         Sized_relobj_file<32, false>* relobj,
1540                                         unsigned int local_sym_index)
1541 {
1542   if (relobj->local_has_plt_offset(local_sym_index))
1543     return;
1544   if (this->plt_ == NULL)
1545     this->make_plt_section(symtab, layout);
1546   unsigned int plt_offset = this->plt_->add_local_ifunc_entry(symtab, layout,
1547                                                               relobj,
1548                                                               local_sym_index);
1549   relobj->set_local_plt_offset(local_sym_index, plt_offset);
1550 }
1551
1552 // Return the number of entries in the PLT.
1553
1554 unsigned int
1555 Target_i386::plt_entry_count() const
1556 {
1557   if (this->plt_ == NULL)
1558     return 0;
1559   return this->plt_->entry_count();
1560 }
1561
1562 // Return the offset of the first non-reserved PLT entry.
1563
1564 unsigned int
1565 Target_i386::first_plt_entry_offset() const
1566 {
1567   return this->plt_->first_plt_entry_offset();
1568 }
1569
1570 // Return the size of each PLT entry.
1571
1572 unsigned int
1573 Target_i386::plt_entry_size() const
1574 {
1575   return this->plt_->get_plt_entry_size();
1576 }
1577
1578 // Get the section to use for TLS_DESC relocations.
1579
1580 Target_i386::Reloc_section*
1581 Target_i386::rel_tls_desc_section(Layout* layout) const
1582 {
1583   return this->plt_section()->rel_tls_desc(layout);
1584 }
1585
1586 // Define the _TLS_MODULE_BASE_ symbol in the TLS segment.
1587
1588 void
1589 Target_i386::define_tls_base_symbol(Symbol_table* symtab, Layout* layout)
1590 {
1591   if (this->tls_base_symbol_defined_)
1592     return;
1593
1594   Output_segment* tls_segment = layout->tls_segment();
1595   if (tls_segment != NULL)
1596     {
1597       bool is_exec = parameters->options().output_is_executable();
1598       symtab->define_in_output_segment("_TLS_MODULE_BASE_", NULL,
1599                                        Symbol_table::PREDEFINED,
1600                                        tls_segment, 0, 0,
1601                                        elfcpp::STT_TLS,
1602                                        elfcpp::STB_LOCAL,
1603                                        elfcpp::STV_HIDDEN, 0,
1604                                        (is_exec
1605                                         ? Symbol::SEGMENT_END
1606                                         : Symbol::SEGMENT_START),
1607                                        true);
1608     }
1609   this->tls_base_symbol_defined_ = true;
1610 }
1611
1612 // Create a GOT entry for the TLS module index.
1613
1614 unsigned int
1615 Target_i386::got_mod_index_entry(Symbol_table* symtab, Layout* layout,
1616                                  Sized_relobj_file<32, false>* object)
1617 {
1618   if (this->got_mod_index_offset_ == -1U)
1619     {
1620       gold_assert(symtab != NULL && layout != NULL && object != NULL);
1621       Reloc_section* rel_dyn = this->rel_dyn_section(layout);
1622       Output_data_got<32, false>* got = this->got_section(symtab, layout);
1623       unsigned int got_offset = got->add_constant(0);
1624       rel_dyn->add_local(object, 0, elfcpp::R_386_TLS_DTPMOD32, got,
1625                          got_offset);
1626       got->add_constant(0);
1627       this->got_mod_index_offset_ = got_offset;
1628     }
1629   return this->got_mod_index_offset_;
1630 }
1631
1632 // Optimize the TLS relocation type based on what we know about the
1633 // symbol.  IS_FINAL is true if the final address of this symbol is
1634 // known at link time.
1635
1636 tls::Tls_optimization
1637 Target_i386::optimize_tls_reloc(bool is_final, int r_type)
1638 {
1639   // If we are generating a shared library, then we can't do anything
1640   // in the linker.
1641   if (parameters->options().shared())
1642     return tls::TLSOPT_NONE;
1643
1644   switch (r_type)
1645     {
1646     case elfcpp::R_386_TLS_GD:
1647     case elfcpp::R_386_TLS_GOTDESC:
1648     case elfcpp::R_386_TLS_DESC_CALL:
1649       // These are General-Dynamic which permits fully general TLS
1650       // access.  Since we know that we are generating an executable,
1651       // we can convert this to Initial-Exec.  If we also know that
1652       // this is a local symbol, we can further switch to Local-Exec.
1653       if (is_final)
1654         return tls::TLSOPT_TO_LE;
1655       return tls::TLSOPT_TO_IE;
1656
1657     case elfcpp::R_386_TLS_LDM:
1658       // This is Local-Dynamic, which refers to a local symbol in the
1659       // dynamic TLS block.  Since we know that we generating an
1660       // executable, we can switch to Local-Exec.
1661       return tls::TLSOPT_TO_LE;
1662
1663     case elfcpp::R_386_TLS_LDO_32:
1664       // Another type of Local-Dynamic relocation.
1665       return tls::TLSOPT_TO_LE;
1666
1667     case elfcpp::R_386_TLS_IE:
1668     case elfcpp::R_386_TLS_GOTIE:
1669     case elfcpp::R_386_TLS_IE_32:
1670       // These are Initial-Exec relocs which get the thread offset
1671       // from the GOT.  If we know that we are linking against the
1672       // local symbol, we can switch to Local-Exec, which links the
1673       // thread offset into the instruction.
1674       if (is_final)
1675         return tls::TLSOPT_TO_LE;
1676       return tls::TLSOPT_NONE;
1677
1678     case elfcpp::R_386_TLS_LE:
1679     case elfcpp::R_386_TLS_LE_32:
1680       // When we already have Local-Exec, there is nothing further we
1681       // can do.
1682       return tls::TLSOPT_NONE;
1683
1684     default:
1685       gold_unreachable();
1686     }
1687 }
1688
1689 // Get the Reference_flags for a particular relocation.
1690
1691 int
1692 Target_i386::Scan::get_reference_flags(unsigned int r_type)
1693 {
1694   switch (r_type)
1695     {
1696     case elfcpp::R_386_NONE:
1697     case elfcpp::R_386_GNU_VTINHERIT:
1698     case elfcpp::R_386_GNU_VTENTRY:
1699     case elfcpp::R_386_GOTPC:
1700       // No symbol reference.
1701       return 0;
1702
1703     case elfcpp::R_386_32:
1704     case elfcpp::R_386_16:
1705     case elfcpp::R_386_8:
1706       return Symbol::ABSOLUTE_REF;
1707
1708     case elfcpp::R_386_PC32:
1709     case elfcpp::R_386_PC16:
1710     case elfcpp::R_386_PC8:
1711     case elfcpp::R_386_GOTOFF:
1712       return Symbol::RELATIVE_REF;
1713
1714     case elfcpp::R_386_PLT32:
1715       return Symbol::FUNCTION_CALL | Symbol::RELATIVE_REF;
1716
1717     case elfcpp::R_386_GOT32:
1718     case elfcpp::R_386_GOT32X:
1719       // Absolute in GOT.
1720       return Symbol::ABSOLUTE_REF;
1721
1722     case elfcpp::R_386_TLS_GD:            // Global-dynamic
1723     case elfcpp::R_386_TLS_GOTDESC:       // Global-dynamic (from ~oliva url)
1724     case elfcpp::R_386_TLS_DESC_CALL:
1725     case elfcpp::R_386_TLS_LDM:           // Local-dynamic
1726     case elfcpp::R_386_TLS_LDO_32:        // Alternate local-dynamic
1727     case elfcpp::R_386_TLS_IE:            // Initial-exec
1728     case elfcpp::R_386_TLS_IE_32:
1729     case elfcpp::R_386_TLS_GOTIE:
1730     case elfcpp::R_386_TLS_LE:            // Local-exec
1731     case elfcpp::R_386_TLS_LE_32:
1732       return Symbol::TLS_REF;
1733
1734     case elfcpp::R_386_COPY:
1735     case elfcpp::R_386_GLOB_DAT:
1736     case elfcpp::R_386_JUMP_SLOT:
1737     case elfcpp::R_386_RELATIVE:
1738     case elfcpp::R_386_IRELATIVE:
1739     case elfcpp::R_386_TLS_TPOFF:
1740     case elfcpp::R_386_TLS_DTPMOD32:
1741     case elfcpp::R_386_TLS_DTPOFF32:
1742     case elfcpp::R_386_TLS_TPOFF32:
1743     case elfcpp::R_386_TLS_DESC:
1744     case elfcpp::R_386_32PLT:
1745     case elfcpp::R_386_TLS_GD_32:
1746     case elfcpp::R_386_TLS_GD_PUSH:
1747     case elfcpp::R_386_TLS_GD_CALL:
1748     case elfcpp::R_386_TLS_GD_POP:
1749     case elfcpp::R_386_TLS_LDM_32:
1750     case elfcpp::R_386_TLS_LDM_PUSH:
1751     case elfcpp::R_386_TLS_LDM_CALL:
1752     case elfcpp::R_386_TLS_LDM_POP:
1753     case elfcpp::R_386_USED_BY_INTEL_200:
1754     default:
1755       // Not expected.  We will give an error later.
1756       return 0;
1757     }
1758 }
1759
1760 // Report an unsupported relocation against a local symbol.
1761
1762 void
1763 Target_i386::Scan::unsupported_reloc_local(Sized_relobj_file<32, false>* object,
1764                                            unsigned int r_type)
1765 {
1766   gold_error(_("%s: unsupported reloc %u against local symbol"),
1767              object->name().c_str(), r_type);
1768 }
1769
1770 // Return whether we need to make a PLT entry for a relocation of a
1771 // given type against a STT_GNU_IFUNC symbol.
1772
1773 bool
1774 Target_i386::Scan::reloc_needs_plt_for_ifunc(
1775     Sized_relobj_file<32, false>* object,
1776     unsigned int r_type)
1777 {
1778   int flags = Scan::get_reference_flags(r_type);
1779   if (flags & Symbol::TLS_REF)
1780     gold_error(_("%s: unsupported TLS reloc %u for IFUNC symbol"),
1781                object->name().c_str(), r_type);
1782   return flags != 0;
1783 }
1784
1785 // Scan a relocation for a local symbol.
1786
1787 inline void
1788 Target_i386::Scan::local(Symbol_table* symtab,
1789                          Layout* layout,
1790                          Target_i386* target,
1791                          Sized_relobj_file<32, false>* object,
1792                          unsigned int data_shndx,
1793                          Output_section* output_section,
1794                          const elfcpp::Rel<32, false>& reloc,
1795                          unsigned int r_type,
1796                          const elfcpp::Sym<32, false>& lsym,
1797                          bool is_discarded)
1798 {
1799   if (is_discarded)
1800     return;
1801
1802   // A local STT_GNU_IFUNC symbol may require a PLT entry.
1803   if (lsym.get_st_type() == elfcpp::STT_GNU_IFUNC
1804       && this->reloc_needs_plt_for_ifunc(object, r_type))
1805     {
1806       unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
1807       target->make_local_ifunc_plt_entry(symtab, layout, object, r_sym);
1808     }
1809
1810   switch (r_type)
1811     {
1812     case elfcpp::R_386_NONE:
1813     case elfcpp::R_386_GNU_VTINHERIT:
1814     case elfcpp::R_386_GNU_VTENTRY:
1815       break;
1816
1817     case elfcpp::R_386_32:
1818       // If building a shared library (or a position-independent
1819       // executable), we need to create a dynamic relocation for
1820       // this location. The relocation applied at link time will
1821       // apply the link-time value, so we flag the location with
1822       // an R_386_RELATIVE relocation so the dynamic loader can
1823       // relocate it easily.
1824       if (parameters->options().output_is_position_independent())
1825         {
1826           Reloc_section* rel_dyn = target->rel_dyn_section(layout);
1827           unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
1828           rel_dyn->add_local_relative(object, r_sym, elfcpp::R_386_RELATIVE,
1829                                       output_section, data_shndx,
1830                                       reloc.get_r_offset());
1831         }
1832       break;
1833
1834     case elfcpp::R_386_16:
1835     case elfcpp::R_386_8:
1836       // If building a shared library (or a position-independent
1837       // executable), we need to create a dynamic relocation for
1838       // this location. Because the addend needs to remain in the
1839       // data section, we need to be careful not to apply this
1840       // relocation statically.
1841       if (parameters->options().output_is_position_independent())
1842         {
1843           Reloc_section* rel_dyn = target->rel_dyn_section(layout);
1844           unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
1845           if (lsym.get_st_type() != elfcpp::STT_SECTION)
1846             rel_dyn->add_local(object, r_sym, r_type, output_section,
1847                                data_shndx, reloc.get_r_offset());
1848           else
1849             {
1850               gold_assert(lsym.get_st_value() == 0);
1851               unsigned int shndx = lsym.get_st_shndx();
1852               bool is_ordinary;
1853               shndx = object->adjust_sym_shndx(r_sym, shndx,
1854                                                &is_ordinary);
1855               if (!is_ordinary)
1856                 object->error(_("section symbol %u has bad shndx %u"),
1857                               r_sym, shndx);
1858               else
1859                 rel_dyn->add_local_section(object, shndx,
1860                                            r_type, output_section,
1861                                            data_shndx, reloc.get_r_offset());
1862             }
1863         }
1864       break;
1865
1866     case elfcpp::R_386_PC32:
1867     case elfcpp::R_386_PC16:
1868     case elfcpp::R_386_PC8:
1869       break;
1870
1871     case elfcpp::R_386_PLT32:
1872       // Since we know this is a local symbol, we can handle this as a
1873       // PC32 reloc.
1874       break;
1875
1876     case elfcpp::R_386_GOTOFF:
1877     case elfcpp::R_386_GOTPC:
1878       // We need a GOT section.
1879       target->got_section(symtab, layout);
1880       break;
1881
1882     case elfcpp::R_386_GOT32:
1883     case elfcpp::R_386_GOT32X:
1884       {
1885         // We need GOT section.
1886         Output_data_got<32, false>* got = target->got_section(symtab, layout);
1887
1888         // If the relocation symbol isn't IFUNC,
1889         // and is local, then we will convert
1890         // mov foo@GOT(%reg), %reg
1891         // to
1892         // lea foo@GOTOFF(%reg), %reg
1893         // in Relocate::relocate.
1894         if (reloc.get_r_offset() >= 2
1895             && lsym.get_st_type() != elfcpp::STT_GNU_IFUNC)
1896           {
1897             section_size_type stype;
1898             const unsigned char* view = object->section_contents(data_shndx,
1899                                                                  &stype, true);
1900             if (view[reloc.get_r_offset() - 2] == 0x8b)
1901               break;
1902           }
1903
1904         // Otherwise, the symbol requires a GOT entry.
1905         unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
1906
1907         // For a STT_GNU_IFUNC symbol we want the PLT offset.  That
1908         // lets function pointers compare correctly with shared
1909         // libraries.  Otherwise we would need an IRELATIVE reloc.
1910         bool is_new;
1911         if (lsym.get_st_type() == elfcpp::STT_GNU_IFUNC)
1912           is_new = got->add_local_plt(object, r_sym, GOT_TYPE_STANDARD);
1913         else
1914           is_new = got->add_local(object, r_sym, GOT_TYPE_STANDARD);
1915         if (is_new)
1916           {
1917             // If we are generating a shared object, we need to add a
1918             // dynamic RELATIVE relocation for this symbol's GOT entry.
1919             if (parameters->options().output_is_position_independent())
1920               {
1921                 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
1922                 unsigned int got_offset =
1923                   object->local_got_offset(r_sym, GOT_TYPE_STANDARD);
1924                 rel_dyn->add_local_relative(object, r_sym,
1925                                             elfcpp::R_386_RELATIVE,
1926                                             got, got_offset);
1927               }
1928           }
1929       }
1930       break;
1931
1932       // These are relocations which should only be seen by the
1933       // dynamic linker, and should never be seen here.
1934     case elfcpp::R_386_COPY:
1935     case elfcpp::R_386_GLOB_DAT:
1936     case elfcpp::R_386_JUMP_SLOT:
1937     case elfcpp::R_386_RELATIVE:
1938     case elfcpp::R_386_IRELATIVE:
1939     case elfcpp::R_386_TLS_TPOFF:
1940     case elfcpp::R_386_TLS_DTPMOD32:
1941     case elfcpp::R_386_TLS_DTPOFF32:
1942     case elfcpp::R_386_TLS_TPOFF32:
1943     case elfcpp::R_386_TLS_DESC:
1944       gold_error(_("%s: unexpected reloc %u in object file"),
1945                  object->name().c_str(), r_type);
1946       break;
1947
1948       // These are initial TLS relocs, which are expected when
1949       // linking.
1950     case elfcpp::R_386_TLS_GD:            // Global-dynamic
1951     case elfcpp::R_386_TLS_GOTDESC:       // Global-dynamic (from ~oliva url)
1952     case elfcpp::R_386_TLS_DESC_CALL:
1953     case elfcpp::R_386_TLS_LDM:           // Local-dynamic
1954     case elfcpp::R_386_TLS_LDO_32:        // Alternate local-dynamic
1955     case elfcpp::R_386_TLS_IE:            // Initial-exec
1956     case elfcpp::R_386_TLS_IE_32:
1957     case elfcpp::R_386_TLS_GOTIE:
1958     case elfcpp::R_386_TLS_LE:            // Local-exec
1959     case elfcpp::R_386_TLS_LE_32:
1960       {
1961         bool output_is_shared = parameters->options().shared();
1962         const tls::Tls_optimization optimized_type
1963             = Target_i386::optimize_tls_reloc(!output_is_shared, r_type);
1964         switch (r_type)
1965           {
1966           case elfcpp::R_386_TLS_GD:          // Global-dynamic
1967             if (optimized_type == tls::TLSOPT_NONE)
1968               {
1969                 // Create a pair of GOT entries for the module index and
1970                 // dtv-relative offset.
1971                 Output_data_got<32, false>* got
1972                     = target->got_section(symtab, layout);
1973                 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
1974                 unsigned int shndx = lsym.get_st_shndx();
1975                 bool is_ordinary;
1976                 shndx = object->adjust_sym_shndx(r_sym, shndx, &is_ordinary);
1977                 if (!is_ordinary)
1978                   object->error(_("local symbol %u has bad shndx %u"),
1979                               r_sym, shndx);
1980                 else
1981                   got->add_local_pair_with_rel(object, r_sym, shndx,
1982                                                GOT_TYPE_TLS_PAIR,
1983                                                target->rel_dyn_section(layout),
1984                                                elfcpp::R_386_TLS_DTPMOD32);
1985               }
1986             else if (optimized_type != tls::TLSOPT_TO_LE)
1987               unsupported_reloc_local(object, r_type);
1988             break;
1989
1990           case elfcpp::R_386_TLS_GOTDESC:     // Global-dynamic (from ~oliva)
1991             target->define_tls_base_symbol(symtab, layout);
1992             if (optimized_type == tls::TLSOPT_NONE)
1993               {
1994                 // Create a double GOT entry with an R_386_TLS_DESC
1995                 // reloc.  The R_386_TLS_DESC reloc is resolved
1996                 // lazily, so the GOT entry needs to be in an area in
1997                 // .got.plt, not .got.  Call got_section to make sure
1998                 // the section has been created.
1999                 target->got_section(symtab, layout);
2000                 Output_data_got<32, false>* got = target->got_tlsdesc_section();
2001                 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
2002                 if (!object->local_has_got_offset(r_sym, GOT_TYPE_TLS_DESC))
2003                   {
2004                     unsigned int got_offset = got->add_constant(0);
2005                     // The local symbol value is stored in the second
2006                     // GOT entry.
2007                     got->add_local(object, r_sym, GOT_TYPE_TLS_DESC);
2008                     // That set the GOT offset of the local symbol to
2009                     // point to the second entry, but we want it to
2010                     // point to the first.
2011                     object->set_local_got_offset(r_sym, GOT_TYPE_TLS_DESC,
2012                                                  got_offset);
2013                     Reloc_section* rt = target->rel_tls_desc_section(layout);
2014                     rt->add_absolute(elfcpp::R_386_TLS_DESC, got, got_offset);
2015                   }
2016               }
2017             else if (optimized_type != tls::TLSOPT_TO_LE)
2018               unsupported_reloc_local(object, r_type);
2019             break;
2020
2021           case elfcpp::R_386_TLS_DESC_CALL:
2022             break;
2023
2024           case elfcpp::R_386_TLS_LDM:         // Local-dynamic
2025             if (optimized_type == tls::TLSOPT_NONE)
2026               {
2027                 // Create a GOT entry for the module index.
2028                 target->got_mod_index_entry(symtab, layout, object);
2029               }
2030             else if (optimized_type != tls::TLSOPT_TO_LE)
2031               unsupported_reloc_local(object, r_type);
2032             break;
2033
2034           case elfcpp::R_386_TLS_LDO_32:      // Alternate local-dynamic
2035             break;
2036
2037           case elfcpp::R_386_TLS_IE:          // Initial-exec
2038           case elfcpp::R_386_TLS_IE_32:
2039           case elfcpp::R_386_TLS_GOTIE:
2040             layout->set_has_static_tls();
2041             if (optimized_type == tls::TLSOPT_NONE)
2042               {
2043                 // For the R_386_TLS_IE relocation, we need to create a
2044                 // dynamic relocation when building a shared library.
2045                 if (r_type == elfcpp::R_386_TLS_IE
2046                     && parameters->options().shared())
2047                   {
2048                     Reloc_section* rel_dyn = target->rel_dyn_section(layout);
2049                     unsigned int r_sym
2050                         = elfcpp::elf_r_sym<32>(reloc.get_r_info());
2051                     rel_dyn->add_local_relative(object, r_sym,
2052                                                 elfcpp::R_386_RELATIVE,
2053                                                 output_section, data_shndx,
2054                                                 reloc.get_r_offset());
2055                   }
2056                 // Create a GOT entry for the tp-relative offset.
2057                 Output_data_got<32, false>* got
2058                     = target->got_section(symtab, layout);
2059                 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
2060                 unsigned int dyn_r_type = (r_type == elfcpp::R_386_TLS_IE_32
2061                                            ? elfcpp::R_386_TLS_TPOFF32
2062                                            : elfcpp::R_386_TLS_TPOFF);
2063                 unsigned int got_type = (r_type == elfcpp::R_386_TLS_IE_32
2064                                          ? GOT_TYPE_TLS_OFFSET
2065                                          : GOT_TYPE_TLS_NOFFSET);
2066                 got->add_local_with_rel(object, r_sym, got_type,
2067                                         target->rel_dyn_section(layout),
2068                                         dyn_r_type);
2069               }
2070             else if (optimized_type != tls::TLSOPT_TO_LE)
2071               unsupported_reloc_local(object, r_type);
2072             break;
2073
2074           case elfcpp::R_386_TLS_LE:          // Local-exec
2075           case elfcpp::R_386_TLS_LE_32:
2076             layout->set_has_static_tls();
2077             if (output_is_shared)
2078               {
2079                 // We need to create a dynamic relocation.
2080                 gold_assert(lsym.get_st_type() != elfcpp::STT_SECTION);
2081                 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
2082                 unsigned int dyn_r_type = (r_type == elfcpp::R_386_TLS_LE_32
2083                                            ? elfcpp::R_386_TLS_TPOFF32
2084                                            : elfcpp::R_386_TLS_TPOFF);
2085                 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
2086                 rel_dyn->add_local(object, r_sym, dyn_r_type, output_section,
2087                                    data_shndx, reloc.get_r_offset());
2088               }
2089             break;
2090
2091           default:
2092             gold_unreachable();
2093           }
2094       }
2095       break;
2096
2097     case elfcpp::R_386_32PLT:
2098     case elfcpp::R_386_TLS_GD_32:
2099     case elfcpp::R_386_TLS_GD_PUSH:
2100     case elfcpp::R_386_TLS_GD_CALL:
2101     case elfcpp::R_386_TLS_GD_POP:
2102     case elfcpp::R_386_TLS_LDM_32:
2103     case elfcpp::R_386_TLS_LDM_PUSH:
2104     case elfcpp::R_386_TLS_LDM_CALL:
2105     case elfcpp::R_386_TLS_LDM_POP:
2106     case elfcpp::R_386_USED_BY_INTEL_200:
2107     default:
2108       unsupported_reloc_local(object, r_type);
2109       break;
2110     }
2111 }
2112
2113 // Report an unsupported relocation against a global symbol.
2114
2115 void
2116 Target_i386::Scan::unsupported_reloc_global(
2117     Sized_relobj_file<32, false>* object,
2118     unsigned int r_type,
2119     Symbol* gsym)
2120 {
2121   gold_error(_("%s: unsupported reloc %u against global symbol %s"),
2122              object->name().c_str(), r_type, gsym->demangled_name().c_str());
2123 }
2124
2125 inline bool
2126 Target_i386::Scan::possible_function_pointer_reloc(unsigned int r_type)
2127 {
2128   switch (r_type)
2129     {
2130     case elfcpp::R_386_32:
2131     case elfcpp::R_386_16:
2132     case elfcpp::R_386_8:
2133     case elfcpp::R_386_GOTOFF:
2134     case elfcpp::R_386_GOT32:
2135     case elfcpp::R_386_GOT32X:
2136       {
2137         return true;
2138       }
2139     default:
2140       return false;
2141     }
2142   return false;
2143 }
2144
2145 inline bool
2146 Target_i386::Scan::local_reloc_may_be_function_pointer(
2147   Symbol_table* ,
2148   Layout* ,
2149   Target_i386* ,
2150   Sized_relobj_file<32, false>* ,
2151   unsigned int ,
2152   Output_section* ,
2153   const elfcpp::Rel<32, false>& ,
2154   unsigned int r_type,
2155   const elfcpp::Sym<32, false>&)
2156 {
2157   return possible_function_pointer_reloc(r_type);
2158 }
2159
2160 inline bool
2161 Target_i386::Scan::global_reloc_may_be_function_pointer(
2162   Symbol_table* ,
2163   Layout* ,
2164   Target_i386* ,
2165   Sized_relobj_file<32, false>* ,
2166   unsigned int ,
2167   Output_section* ,
2168   const elfcpp::Rel<32, false>& ,
2169   unsigned int r_type,
2170   Symbol*)
2171 {
2172   return possible_function_pointer_reloc(r_type);
2173 }
2174
2175 // Scan a relocation for a global symbol.
2176
2177 inline void
2178 Target_i386::Scan::global(Symbol_table* symtab,
2179                                  Layout* layout,
2180                                  Target_i386* target,
2181                                  Sized_relobj_file<32, false>* object,
2182                                  unsigned int data_shndx,
2183                                  Output_section* output_section,
2184                                  const elfcpp::Rel<32, false>& reloc,
2185                                  unsigned int r_type,
2186                                  Symbol* gsym)
2187 {
2188   // A STT_GNU_IFUNC symbol may require a PLT entry.
2189   if (gsym->type() == elfcpp::STT_GNU_IFUNC
2190       && this->reloc_needs_plt_for_ifunc(object, r_type))
2191     target->make_plt_entry(symtab, layout, gsym);
2192
2193   switch (r_type)
2194     {
2195     case elfcpp::R_386_NONE:
2196     case elfcpp::R_386_GNU_VTINHERIT:
2197     case elfcpp::R_386_GNU_VTENTRY:
2198       break;
2199
2200     case elfcpp::R_386_32:
2201     case elfcpp::R_386_16:
2202     case elfcpp::R_386_8:
2203       {
2204         // Make a PLT entry if necessary.
2205         if (gsym->needs_plt_entry())
2206           {
2207             target->make_plt_entry(symtab, layout, gsym);
2208             // Since this is not a PC-relative relocation, we may be
2209             // taking the address of a function. In that case we need to
2210             // set the entry in the dynamic symbol table to the address of
2211             // the PLT entry.
2212             if (gsym->is_from_dynobj() && !parameters->options().shared())
2213               gsym->set_needs_dynsym_value();
2214           }
2215         // Make a dynamic relocation if necessary.
2216         if (gsym->needs_dynamic_reloc(Scan::get_reference_flags(r_type)))
2217           {
2218             if (!parameters->options().output_is_position_independent()
2219                 && gsym->may_need_copy_reloc())
2220               {
2221                 target->copy_reloc(symtab, layout, object,
2222                                    data_shndx, output_section, gsym, reloc);
2223               }
2224             else if (r_type == elfcpp::R_386_32
2225                      && gsym->type() == elfcpp::STT_GNU_IFUNC
2226                      && gsym->can_use_relative_reloc(false)
2227                      && !gsym->is_from_dynobj()
2228                      && !gsym->is_undefined()
2229                      && !gsym->is_preemptible())
2230               {
2231                 // Use an IRELATIVE reloc for a locally defined
2232                 // STT_GNU_IFUNC symbol.  This makes a function
2233                 // address in a PIE executable match the address in a
2234                 // shared library that it links against.
2235                 Reloc_section* rel_dyn = target->rel_irelative_section(layout);
2236                 rel_dyn->add_symbolless_global_addend(gsym,
2237                                                       elfcpp::R_386_IRELATIVE,
2238                                                       output_section,
2239                                                       object, data_shndx,
2240                                                       reloc.get_r_offset());
2241               }
2242             else if (r_type == elfcpp::R_386_32
2243                      && gsym->can_use_relative_reloc(false))
2244               {
2245                 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
2246                 rel_dyn->add_global_relative(gsym, elfcpp::R_386_RELATIVE,
2247                                              output_section, object,
2248                                              data_shndx, reloc.get_r_offset());
2249               }
2250             else
2251               {
2252                 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
2253                 rel_dyn->add_global(gsym, r_type, output_section, object,
2254                                     data_shndx, reloc.get_r_offset());
2255               }
2256           }
2257       }
2258       break;
2259
2260     case elfcpp::R_386_PC32:
2261     case elfcpp::R_386_PC16:
2262     case elfcpp::R_386_PC8:
2263       {
2264         // Make a PLT entry if necessary.
2265         if (gsym->needs_plt_entry())
2266           {
2267             // These relocations are used for function calls only in
2268             // non-PIC code.  For a 32-bit relocation in a shared library,
2269             // we'll need a text relocation anyway, so we can skip the
2270             // PLT entry and let the dynamic linker bind the call directly
2271             // to the target.  For smaller relocations, we should use a
2272             // PLT entry to ensure that the call can reach.
2273             if (!parameters->options().shared()
2274                 || r_type != elfcpp::R_386_PC32)
2275               target->make_plt_entry(symtab, layout, gsym);
2276           }
2277         // Make a dynamic relocation if necessary.
2278         if (gsym->needs_dynamic_reloc(Scan::get_reference_flags(r_type)))
2279           {
2280             if (parameters->options().output_is_executable()
2281                 && gsym->may_need_copy_reloc())
2282               {
2283                 target->copy_reloc(symtab, layout, object,
2284                                    data_shndx, output_section, gsym, reloc);
2285               }
2286             else
2287               {
2288                 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
2289                 rel_dyn->add_global(gsym, r_type, output_section, object,
2290                                     data_shndx, reloc.get_r_offset());
2291               }
2292           }
2293       }
2294       break;
2295
2296     case elfcpp::R_386_GOT32:
2297     case elfcpp::R_386_GOT32X:
2298       {
2299         // The symbol requires a GOT section.
2300         Output_data_got<32, false>* got = target->got_section(symtab, layout);
2301
2302         // If we convert this from
2303         // mov foo@GOT(%reg), %reg
2304         // to
2305         // lea foo@GOTOFF(%reg), %reg
2306         // in Relocate::relocate, then there is nothing to do here.
2307         if (reloc.get_r_offset() >= 2
2308             && Target_i386::can_convert_mov_to_lea(gsym))
2309           {
2310             section_size_type stype;
2311             const unsigned char* view = object->section_contents(data_shndx,
2312                                                                  &stype, true);
2313             if (view[reloc.get_r_offset() - 2] == 0x8b)
2314               break;
2315           }
2316
2317         if (gsym->final_value_is_known())
2318           {
2319             // For a STT_GNU_IFUNC symbol we want the PLT address.
2320             if (gsym->type() == elfcpp::STT_GNU_IFUNC)
2321               got->add_global_plt(gsym, GOT_TYPE_STANDARD);
2322             else
2323               got->add_global(gsym, GOT_TYPE_STANDARD);
2324           }
2325         else
2326           {
2327             // If this symbol is not fully resolved, we need to add a
2328             // GOT entry with a dynamic relocation.
2329             Reloc_section* rel_dyn = target->rel_dyn_section(layout);
2330
2331             // Use a GLOB_DAT rather than a RELATIVE reloc if:
2332             //
2333             // 1) The symbol may be defined in some other module.
2334             //
2335             // 2) We are building a shared library and this is a
2336             // protected symbol; using GLOB_DAT means that the dynamic
2337             // linker can use the address of the PLT in the main
2338             // executable when appropriate so that function address
2339             // comparisons work.
2340             //
2341             // 3) This is a STT_GNU_IFUNC symbol in position dependent
2342             // code, again so that function address comparisons work.
2343             if (gsym->is_from_dynobj()
2344                 || gsym->is_undefined()
2345                 || gsym->is_preemptible()
2346                 || (gsym->visibility() == elfcpp::STV_PROTECTED
2347                     && parameters->options().shared())
2348                 || (gsym->type() == elfcpp::STT_GNU_IFUNC
2349                     && parameters->options().output_is_position_independent()))
2350               got->add_global_with_rel(gsym, GOT_TYPE_STANDARD,
2351                                        rel_dyn, elfcpp::R_386_GLOB_DAT);
2352             else
2353               {
2354                 // For a STT_GNU_IFUNC symbol we want to write the PLT
2355                 // offset into the GOT, so that function pointer
2356                 // comparisons work correctly.
2357                 bool is_new;
2358                 if (gsym->type() != elfcpp::STT_GNU_IFUNC)
2359                   is_new = got->add_global(gsym, GOT_TYPE_STANDARD);
2360                 else
2361                   {
2362                     is_new = got->add_global_plt(gsym, GOT_TYPE_STANDARD);
2363                     // Tell the dynamic linker to use the PLT address
2364                     // when resolving relocations.
2365                     if (gsym->is_from_dynobj()
2366                         && !parameters->options().shared())
2367                       gsym->set_needs_dynsym_value();
2368                   }
2369                 if (is_new)
2370                   {
2371                     unsigned int got_off = gsym->got_offset(GOT_TYPE_STANDARD);
2372                     rel_dyn->add_global_relative(gsym, elfcpp::R_386_RELATIVE,
2373                                                  got, got_off);
2374                   }
2375               }
2376           }
2377       }
2378       break;
2379
2380     case elfcpp::R_386_PLT32:
2381       // If the symbol is fully resolved, this is just a PC32 reloc.
2382       // Otherwise we need a PLT entry.
2383       if (gsym->final_value_is_known())
2384         break;
2385       // If building a shared library, we can also skip the PLT entry
2386       // if the symbol is defined in the output file and is protected
2387       // or hidden.
2388       if (gsym->is_defined()
2389           && !gsym->is_from_dynobj()
2390           && !gsym->is_preemptible())
2391         break;
2392       target->make_plt_entry(symtab, layout, gsym);
2393       break;
2394
2395     case elfcpp::R_386_GOTOFF:
2396     case elfcpp::R_386_GOTPC:
2397       // We need a GOT section.
2398       target->got_section(symtab, layout);
2399       break;
2400
2401       // These are relocations which should only be seen by the
2402       // dynamic linker, and should never be seen here.
2403     case elfcpp::R_386_COPY:
2404     case elfcpp::R_386_GLOB_DAT:
2405     case elfcpp::R_386_JUMP_SLOT:
2406     case elfcpp::R_386_RELATIVE:
2407     case elfcpp::R_386_IRELATIVE:
2408     case elfcpp::R_386_TLS_TPOFF:
2409     case elfcpp::R_386_TLS_DTPMOD32:
2410     case elfcpp::R_386_TLS_DTPOFF32:
2411     case elfcpp::R_386_TLS_TPOFF32:
2412     case elfcpp::R_386_TLS_DESC:
2413       gold_error(_("%s: unexpected reloc %u in object file"),
2414                  object->name().c_str(), r_type);
2415       break;
2416
2417       // These are initial tls relocs, which are expected when
2418       // linking.
2419     case elfcpp::R_386_TLS_GD:            // Global-dynamic
2420     case elfcpp::R_386_TLS_GOTDESC:       // Global-dynamic (from ~oliva url)
2421     case elfcpp::R_386_TLS_DESC_CALL:
2422     case elfcpp::R_386_TLS_LDM:           // Local-dynamic
2423     case elfcpp::R_386_TLS_LDO_32:        // Alternate local-dynamic
2424     case elfcpp::R_386_TLS_IE:            // Initial-exec
2425     case elfcpp::R_386_TLS_IE_32:
2426     case elfcpp::R_386_TLS_GOTIE:
2427     case elfcpp::R_386_TLS_LE:            // Local-exec
2428     case elfcpp::R_386_TLS_LE_32:
2429       {
2430         const bool is_final = gsym->final_value_is_known();
2431         const tls::Tls_optimization optimized_type
2432             = Target_i386::optimize_tls_reloc(is_final, r_type);
2433         switch (r_type)
2434           {
2435           case elfcpp::R_386_TLS_GD:          // Global-dynamic
2436             if (optimized_type == tls::TLSOPT_NONE)
2437               {
2438                 // Create a pair of GOT entries for the module index and
2439                 // dtv-relative offset.
2440                 Output_data_got<32, false>* got
2441                     = target->got_section(symtab, layout);
2442                 got->add_global_pair_with_rel(gsym, GOT_TYPE_TLS_PAIR,
2443                                              target->rel_dyn_section(layout),
2444                                              elfcpp::R_386_TLS_DTPMOD32,
2445                                              elfcpp::R_386_TLS_DTPOFF32);
2446               }
2447             else if (optimized_type == tls::TLSOPT_TO_IE)
2448               {
2449                 // Create a GOT entry for the tp-relative offset.
2450                 Output_data_got<32, false>* got
2451                     = target->got_section(symtab, layout);
2452                 got->add_global_with_rel(gsym, GOT_TYPE_TLS_NOFFSET,
2453                                          target->rel_dyn_section(layout),
2454                                          elfcpp::R_386_TLS_TPOFF);
2455               }
2456             else if (optimized_type != tls::TLSOPT_TO_LE)
2457               unsupported_reloc_global(object, r_type, gsym);
2458             break;
2459
2460           case elfcpp::R_386_TLS_GOTDESC:     // Global-dynamic (~oliva url)
2461             target->define_tls_base_symbol(symtab, layout);
2462             if (optimized_type == tls::TLSOPT_NONE)
2463               {
2464                 // Create a double GOT entry with an R_386_TLS_DESC
2465                 // reloc.  The R_386_TLS_DESC reloc is resolved
2466                 // lazily, so the GOT entry needs to be in an area in
2467                 // .got.plt, not .got.  Call got_section to make sure
2468                 // the section has been created.
2469                 target->got_section(symtab, layout);
2470                 Output_data_got<32, false>* got = target->got_tlsdesc_section();
2471                 Reloc_section* rt = target->rel_tls_desc_section(layout);
2472                 got->add_global_pair_with_rel(gsym, GOT_TYPE_TLS_DESC, rt,
2473                                              elfcpp::R_386_TLS_DESC, 0);
2474               }
2475             else if (optimized_type == tls::TLSOPT_TO_IE)
2476               {
2477                 // Create a GOT entry for the tp-relative offset.
2478                 Output_data_got<32, false>* got
2479                     = target->got_section(symtab, layout);
2480                 got->add_global_with_rel(gsym, GOT_TYPE_TLS_NOFFSET,
2481                                          target->rel_dyn_section(layout),
2482                                          elfcpp::R_386_TLS_TPOFF);
2483               }
2484             else if (optimized_type != tls::TLSOPT_TO_LE)
2485               unsupported_reloc_global(object, r_type, gsym);
2486             break;
2487
2488           case elfcpp::R_386_TLS_DESC_CALL:
2489             break;
2490
2491           case elfcpp::R_386_TLS_LDM:         // Local-dynamic
2492             if (optimized_type == tls::TLSOPT_NONE)
2493               {
2494                 // Create a GOT entry for the module index.
2495                 target->got_mod_index_entry(symtab, layout, object);
2496               }
2497             else if (optimized_type != tls::TLSOPT_TO_LE)
2498               unsupported_reloc_global(object, r_type, gsym);
2499             break;
2500
2501           case elfcpp::R_386_TLS_LDO_32:      // Alternate local-dynamic
2502             break;
2503
2504           case elfcpp::R_386_TLS_IE:          // Initial-exec
2505           case elfcpp::R_386_TLS_IE_32:
2506           case elfcpp::R_386_TLS_GOTIE:
2507             layout->set_has_static_tls();
2508             if (optimized_type == tls::TLSOPT_NONE)
2509               {
2510                 // For the R_386_TLS_IE relocation, we need to create a
2511                 // dynamic relocation when building a shared library.
2512                 if (r_type == elfcpp::R_386_TLS_IE
2513                     && parameters->options().shared())
2514                   {
2515                     Reloc_section* rel_dyn = target->rel_dyn_section(layout);
2516                     rel_dyn->add_global_relative(gsym, elfcpp::R_386_RELATIVE,
2517                                                  output_section, object,
2518                                                  data_shndx,
2519                                                  reloc.get_r_offset());
2520                   }
2521                 // Create a GOT entry for the tp-relative offset.
2522                 Output_data_got<32, false>* got
2523                     = target->got_section(symtab, layout);
2524                 unsigned int dyn_r_type = (r_type == elfcpp::R_386_TLS_IE_32
2525                                            ? elfcpp::R_386_TLS_TPOFF32
2526                                            : elfcpp::R_386_TLS_TPOFF);
2527                 unsigned int got_type = (r_type == elfcpp::R_386_TLS_IE_32
2528                                          ? GOT_TYPE_TLS_OFFSET
2529                                          : GOT_TYPE_TLS_NOFFSET);
2530                 got->add_global_with_rel(gsym, got_type,
2531                                          target->rel_dyn_section(layout),
2532                                          dyn_r_type);
2533               }
2534             else if (optimized_type != tls::TLSOPT_TO_LE)
2535               unsupported_reloc_global(object, r_type, gsym);
2536             break;
2537
2538           case elfcpp::R_386_TLS_LE:          // Local-exec
2539           case elfcpp::R_386_TLS_LE_32:
2540             layout->set_has_static_tls();
2541             if (parameters->options().shared())
2542               {
2543                 // We need to create a dynamic relocation.
2544                 unsigned int dyn_r_type = (r_type == elfcpp::R_386_TLS_LE_32
2545                                            ? elfcpp::R_386_TLS_TPOFF32
2546                                            : elfcpp::R_386_TLS_TPOFF);
2547                 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
2548                 rel_dyn->add_global(gsym, dyn_r_type, output_section, object,
2549                                     data_shndx, reloc.get_r_offset());
2550               }
2551             break;
2552
2553           default:
2554             gold_unreachable();
2555           }
2556       }
2557       break;
2558
2559     case elfcpp::R_386_32PLT:
2560     case elfcpp::R_386_TLS_GD_32:
2561     case elfcpp::R_386_TLS_GD_PUSH:
2562     case elfcpp::R_386_TLS_GD_CALL:
2563     case elfcpp::R_386_TLS_GD_POP:
2564     case elfcpp::R_386_TLS_LDM_32:
2565     case elfcpp::R_386_TLS_LDM_PUSH:
2566     case elfcpp::R_386_TLS_LDM_CALL:
2567     case elfcpp::R_386_TLS_LDM_POP:
2568     case elfcpp::R_386_USED_BY_INTEL_200:
2569     default:
2570       unsupported_reloc_global(object, r_type, gsym);
2571       break;
2572     }
2573 }
2574
2575 // Process relocations for gc.
2576
2577 void
2578 Target_i386::gc_process_relocs(Symbol_table* symtab,
2579                                       Layout* layout,
2580                                       Sized_relobj_file<32, false>* object,
2581                                       unsigned int data_shndx,
2582                                       unsigned int,
2583                                       const unsigned char* prelocs,
2584                                       size_t reloc_count,
2585                                       Output_section* output_section,
2586                                       bool needs_special_offset_handling,
2587                                       size_t local_symbol_count,
2588                                       const unsigned char* plocal_symbols)
2589 {
2590   gold::gc_process_relocs<32, false, Target_i386, Scan, Classify_reloc>(
2591     symtab,
2592     layout,
2593     this,
2594     object,
2595     data_shndx,
2596     prelocs,
2597     reloc_count,
2598     output_section,
2599     needs_special_offset_handling,
2600     local_symbol_count,
2601     plocal_symbols);
2602 }
2603
2604 // Scan relocations for a section.
2605
2606 void
2607 Target_i386::scan_relocs(Symbol_table* symtab,
2608                                 Layout* layout,
2609                                 Sized_relobj_file<32, false>* object,
2610                                 unsigned int data_shndx,
2611                                 unsigned int sh_type,
2612                                 const unsigned char* prelocs,
2613                                 size_t reloc_count,
2614                                 Output_section* output_section,
2615                                 bool needs_special_offset_handling,
2616                                 size_t local_symbol_count,
2617                                 const unsigned char* plocal_symbols)
2618 {
2619   if (sh_type == elfcpp::SHT_RELA)
2620     {
2621       gold_error(_("%s: unsupported RELA reloc section"),
2622                  object->name().c_str());
2623       return;
2624     }
2625
2626   gold::scan_relocs<32, false, Target_i386, Scan, Classify_reloc>(
2627     symtab,
2628     layout,
2629     this,
2630     object,
2631     data_shndx,
2632     prelocs,
2633     reloc_count,
2634     output_section,
2635     needs_special_offset_handling,
2636     local_symbol_count,
2637     plocal_symbols);
2638 }
2639
2640 // Finalize the sections.
2641
2642 void
2643 Target_i386::do_finalize_sections(
2644     Layout* layout,
2645     const Input_objects*,
2646     Symbol_table* symtab)
2647 {
2648   const Reloc_section* rel_plt = (this->plt_ == NULL
2649                                   ? NULL
2650                                   : this->plt_->rel_plt());
2651   layout->add_target_dynamic_tags(true, this->got_plt_, rel_plt,
2652                                   this->rel_dyn_, true, false);
2653
2654   // Emit any relocs we saved in an attempt to avoid generating COPY
2655   // relocs.
2656   if (this->copy_relocs_.any_saved_relocs())
2657     this->copy_relocs_.emit(this->rel_dyn_section(layout));
2658
2659   // Set the size of the _GLOBAL_OFFSET_TABLE_ symbol to the size of
2660   // the .got.plt section.
2661   Symbol* sym = this->global_offset_table_;
2662   if (sym != NULL)
2663     {
2664       uint32_t data_size = this->got_plt_->current_data_size();
2665       symtab->get_sized_symbol<32>(sym)->set_symsize(data_size);
2666     }
2667
2668   if (parameters->doing_static_link()
2669       && (this->plt_ == NULL || !this->plt_->has_irelative_section()))
2670     {
2671       // If linking statically, make sure that the __rel_iplt symbols
2672       // were defined if necessary, even if we didn't create a PLT.
2673       static const Define_symbol_in_segment syms[] =
2674         {
2675           {
2676             "__rel_iplt_start",         // name
2677             elfcpp::PT_LOAD,            // segment_type
2678             elfcpp::PF_W,               // segment_flags_set
2679             elfcpp::PF(0),              // segment_flags_clear
2680             0,                          // value
2681             0,                          // size
2682             elfcpp::STT_NOTYPE,         // type
2683             elfcpp::STB_GLOBAL,         // binding
2684             elfcpp::STV_HIDDEN,         // visibility
2685             0,                          // nonvis
2686             Symbol::SEGMENT_START,      // offset_from_base
2687             true                        // only_if_ref
2688           },
2689           {
2690             "__rel_iplt_end",           // name
2691             elfcpp::PT_LOAD,            // segment_type
2692             elfcpp::PF_W,               // segment_flags_set
2693             elfcpp::PF(0),              // segment_flags_clear
2694             0,                          // value
2695             0,                          // size
2696             elfcpp::STT_NOTYPE,         // type
2697             elfcpp::STB_GLOBAL,         // binding
2698             elfcpp::STV_HIDDEN,         // visibility
2699             0,                          // nonvis
2700             Symbol::SEGMENT_START,      // offset_from_base
2701             true                        // only_if_ref
2702           }
2703         };
2704
2705       symtab->define_symbols(layout, 2, syms,
2706                              layout->script_options()->saw_sections_clause());
2707     }
2708 }
2709
2710 // Return whether a direct absolute static relocation needs to be applied.
2711 // In cases where Scan::local() or Scan::global() has created
2712 // a dynamic relocation other than R_386_RELATIVE, the addend
2713 // of the relocation is carried in the data, and we must not
2714 // apply the static relocation.
2715
2716 inline bool
2717 Target_i386::Relocate::should_apply_static_reloc(const Sized_symbol<32>* gsym,
2718                                                  unsigned int r_type,
2719                                                  bool is_32bit,
2720                                                  Output_section* output_section)
2721 {
2722   // If the output section is not allocated, then we didn't call
2723   // scan_relocs, we didn't create a dynamic reloc, and we must apply
2724   // the reloc here.
2725   if ((output_section->flags() & elfcpp::SHF_ALLOC) == 0)
2726     return true;
2727
2728   int ref_flags = Scan::get_reference_flags(r_type);
2729
2730   // For local symbols, we will have created a non-RELATIVE dynamic
2731   // relocation only if (a) the output is position independent,
2732   // (b) the relocation is absolute (not pc- or segment-relative), and
2733   // (c) the relocation is not 32 bits wide.
2734   if (gsym == NULL)
2735     return !(parameters->options().output_is_position_independent()
2736              && (ref_flags & Symbol::ABSOLUTE_REF)
2737              && !is_32bit);
2738
2739   // For global symbols, we use the same helper routines used in the
2740   // scan pass.  If we did not create a dynamic relocation, or if we
2741   // created a RELATIVE dynamic relocation, we should apply the static
2742   // relocation.
2743   bool has_dyn = gsym->needs_dynamic_reloc(ref_flags);
2744   bool is_rel = (ref_flags & Symbol::ABSOLUTE_REF)
2745                 && gsym->can_use_relative_reloc(ref_flags
2746                                                 & Symbol::FUNCTION_CALL);
2747   return !has_dyn || is_rel;
2748 }
2749
2750 // Perform a relocation.
2751
2752 inline bool
2753 Target_i386::Relocate::relocate(const Relocate_info<32, false>* relinfo,
2754                                 unsigned int,
2755                                 Target_i386* target,
2756                                 Output_section* output_section,
2757                                 size_t relnum,
2758                                 const unsigned char* preloc,
2759                                 const Sized_symbol<32>* gsym,
2760                                 const Symbol_value<32>* psymval,
2761                                 unsigned char* view,
2762                                 elfcpp::Elf_types<32>::Elf_Addr address,
2763                                 section_size_type view_size)
2764 {
2765   const elfcpp::Rel<32, false> rel(preloc);
2766   unsigned int r_type = elfcpp::elf_r_type<32>(rel.get_r_info());
2767
2768   if (this->skip_call_tls_get_addr_)
2769     {
2770       if ((r_type != elfcpp::R_386_PLT32
2771            && r_type != elfcpp::R_386_PC32)
2772           || gsym == NULL
2773           || strcmp(gsym->name(), "___tls_get_addr") != 0)
2774         gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
2775                                _("missing expected TLS relocation"));
2776       else
2777         {
2778           this->skip_call_tls_get_addr_ = false;
2779           return false;
2780         }
2781     }
2782
2783   if (view == NULL)
2784     return true;
2785
2786   const Sized_relobj_file<32, false>* object = relinfo->object;
2787
2788   // Pick the value to use for symbols defined in shared objects.
2789   Symbol_value<32> symval;
2790   if (gsym != NULL
2791       && gsym->type() == elfcpp::STT_GNU_IFUNC
2792       && r_type == elfcpp::R_386_32
2793       && gsym->needs_dynamic_reloc(Scan::get_reference_flags(r_type))
2794       && gsym->can_use_relative_reloc(false)
2795       && !gsym->is_from_dynobj()
2796       && !gsym->is_undefined()
2797       && !gsym->is_preemptible())
2798     {
2799       // In this case we are generating a R_386_IRELATIVE reloc.  We
2800       // want to use the real value of the symbol, not the PLT offset.
2801     }
2802   else if (gsym != NULL
2803            && gsym->use_plt_offset(Scan::get_reference_flags(r_type)))
2804     {
2805       symval.set_output_value(target->plt_address_for_global(gsym));
2806       psymval = &symval;
2807     }
2808   else if (gsym == NULL && psymval->is_ifunc_symbol())
2809     {
2810       unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
2811       if (object->local_has_plt_offset(r_sym))
2812         {
2813           symval.set_output_value(target->plt_address_for_local(object, r_sym));
2814           psymval = &symval;
2815         }
2816     }
2817
2818   bool baseless;
2819
2820   switch (r_type)
2821     {
2822     case elfcpp::R_386_NONE:
2823     case elfcpp::R_386_GNU_VTINHERIT:
2824     case elfcpp::R_386_GNU_VTENTRY:
2825       break;
2826
2827     case elfcpp::R_386_32:
2828       if (should_apply_static_reloc(gsym, r_type, true, output_section))
2829         Relocate_functions<32, false>::rel32(view, object, psymval);
2830       break;
2831
2832     case elfcpp::R_386_PC32:
2833       if (should_apply_static_reloc(gsym, r_type, true, output_section))
2834         Relocate_functions<32, false>::pcrel32(view, object, psymval, address);
2835       break;
2836
2837     case elfcpp::R_386_16:
2838       if (should_apply_static_reloc(gsym, r_type, false, output_section))
2839         Relocate_functions<32, false>::rel16(view, object, psymval);
2840       break;
2841
2842     case elfcpp::R_386_PC16:
2843       if (should_apply_static_reloc(gsym, r_type, false, output_section))
2844         Relocate_functions<32, false>::pcrel16(view, object, psymval, address);
2845       break;
2846
2847     case elfcpp::R_386_8:
2848       if (should_apply_static_reloc(gsym, r_type, false, output_section))
2849         Relocate_functions<32, false>::rel8(view, object, psymval);
2850       break;
2851
2852     case elfcpp::R_386_PC8:
2853       if (should_apply_static_reloc(gsym, r_type, false, output_section))
2854         Relocate_functions<32, false>::pcrel8(view, object, psymval, address);
2855       break;
2856
2857     case elfcpp::R_386_PLT32:
2858       gold_assert(gsym == NULL
2859                   || gsym->has_plt_offset()
2860                   || gsym->final_value_is_known()
2861                   || (gsym->is_defined()
2862                       && !gsym->is_from_dynobj()
2863                       && !gsym->is_preemptible()));
2864       Relocate_functions<32, false>::pcrel32(view, object, psymval, address);
2865       break;
2866
2867     case elfcpp::R_386_GOT32:
2868     case elfcpp::R_386_GOT32X:
2869       baseless = (view[-1] & 0xc7) == 0x5;
2870       // R_386_GOT32 and R_386_GOT32X don't work without base register
2871       // when generating a position-independent output file.
2872       if (baseless
2873           && parameters->options().output_is_position_independent())
2874         {
2875           if(gsym)
2876             gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
2877                                    _("unexpected reloc %u against global symbol %s without base register in object file when generating a position-independent output file"),
2878                                    r_type, gsym->demangled_name().c_str());
2879           else
2880             gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
2881                                    _("unexpected reloc %u against local symbol without base register in object file when generating a position-independent output file"),
2882                                    r_type);
2883         }
2884
2885       // Convert
2886       // mov foo@GOT(%reg), %reg
2887       // to
2888       // lea foo@GOTOFF(%reg), %reg
2889       // if possible.
2890       if (rel.get_r_offset() >= 2
2891           && view[-2] == 0x8b
2892           && ((gsym == NULL && !psymval->is_ifunc_symbol())
2893               || (gsym != NULL
2894                   && Target_i386::can_convert_mov_to_lea(gsym))))
2895         {
2896           view[-2] = 0x8d;
2897           elfcpp::Elf_types<32>::Elf_Addr value;
2898           value = psymval->value(object, 0);
2899           // Don't subtract the .got.plt section address for baseless
2900           // addressing.
2901           if (!baseless)
2902             value -= target->got_plt_section()->address();
2903           Relocate_functions<32, false>::rel32(view, value);
2904         }
2905       else
2906         {
2907           // The GOT pointer points to the end of the GOT section.
2908           // We need to subtract the size of the GOT section to get
2909           // the actual offset to use in the relocation.
2910           unsigned int got_offset = 0;
2911           if (gsym != NULL)
2912             {
2913               gold_assert(gsym->has_got_offset(GOT_TYPE_STANDARD));
2914               got_offset = (gsym->got_offset(GOT_TYPE_STANDARD)
2915                             - target->got_size());
2916             }
2917           else
2918             {
2919               unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
2920               gold_assert(object->local_has_got_offset(r_sym, GOT_TYPE_STANDARD));
2921               got_offset = (object->local_got_offset(r_sym, GOT_TYPE_STANDARD)
2922                             - target->got_size());
2923             }
2924           // Add the .got.plt section address for baseless addressing.
2925           if (baseless)
2926             got_offset += target->got_plt_section()->address();
2927           Relocate_functions<32, false>::rel32(view, got_offset);
2928         }
2929       break;
2930
2931     case elfcpp::R_386_GOTOFF:
2932       {
2933         elfcpp::Elf_types<32>::Elf_Addr value;
2934         value = (psymval->value(object, 0)
2935                  - target->got_plt_section()->address());
2936         Relocate_functions<32, false>::rel32(view, value);
2937       }
2938       break;
2939
2940     case elfcpp::R_386_GOTPC:
2941       {
2942         elfcpp::Elf_types<32>::Elf_Addr value;
2943         value = target->got_plt_section()->address();
2944         Relocate_functions<32, false>::pcrel32(view, value, address);
2945       }
2946       break;
2947
2948     case elfcpp::R_386_COPY:
2949     case elfcpp::R_386_GLOB_DAT:
2950     case elfcpp::R_386_JUMP_SLOT:
2951     case elfcpp::R_386_RELATIVE:
2952     case elfcpp::R_386_IRELATIVE:
2953       // These are outstanding tls relocs, which are unexpected when
2954       // linking.
2955     case elfcpp::R_386_TLS_TPOFF:
2956     case elfcpp::R_386_TLS_DTPMOD32:
2957     case elfcpp::R_386_TLS_DTPOFF32:
2958     case elfcpp::R_386_TLS_TPOFF32:
2959     case elfcpp::R_386_TLS_DESC:
2960       gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
2961                              _("unexpected reloc %u in object file"),
2962                              r_type);
2963       break;
2964
2965       // These are initial tls relocs, which are expected when
2966       // linking.
2967     case elfcpp::R_386_TLS_GD:             // Global-dynamic
2968     case elfcpp::R_386_TLS_GOTDESC:        // Global-dynamic (from ~oliva url)
2969     case elfcpp::R_386_TLS_DESC_CALL:
2970     case elfcpp::R_386_TLS_LDM:            // Local-dynamic
2971     case elfcpp::R_386_TLS_LDO_32:         // Alternate local-dynamic
2972     case elfcpp::R_386_TLS_IE:             // Initial-exec
2973     case elfcpp::R_386_TLS_IE_32:
2974     case elfcpp::R_386_TLS_GOTIE:
2975     case elfcpp::R_386_TLS_LE:             // Local-exec
2976     case elfcpp::R_386_TLS_LE_32:
2977       this->relocate_tls(relinfo, target, relnum, rel, r_type, gsym, psymval,
2978                          view, address, view_size);
2979       break;
2980
2981     case elfcpp::R_386_32PLT:
2982     case elfcpp::R_386_TLS_GD_32:
2983     case elfcpp::R_386_TLS_GD_PUSH:
2984     case elfcpp::R_386_TLS_GD_CALL:
2985     case elfcpp::R_386_TLS_GD_POP:
2986     case elfcpp::R_386_TLS_LDM_32:
2987     case elfcpp::R_386_TLS_LDM_PUSH:
2988     case elfcpp::R_386_TLS_LDM_CALL:
2989     case elfcpp::R_386_TLS_LDM_POP:
2990     case elfcpp::R_386_USED_BY_INTEL_200:
2991     default:
2992       gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
2993                              _("unsupported reloc %u"),
2994                              r_type);
2995       break;
2996     }
2997
2998   return true;
2999 }
3000
3001 // Perform a TLS relocation.
3002
3003 inline void
3004 Target_i386::Relocate::relocate_tls(const Relocate_info<32, false>* relinfo,
3005                                     Target_i386* target,
3006                                     size_t relnum,
3007                                     const elfcpp::Rel<32, false>& rel,
3008                                     unsigned int r_type,
3009                                     const Sized_symbol<32>* gsym,
3010                                     const Symbol_value<32>* psymval,
3011                                     unsigned char* view,
3012                                     elfcpp::Elf_types<32>::Elf_Addr,
3013                                     section_size_type view_size)
3014 {
3015   Output_segment* tls_segment = relinfo->layout->tls_segment();
3016
3017   const Sized_relobj_file<32, false>* object = relinfo->object;
3018
3019   elfcpp::Elf_types<32>::Elf_Addr value = psymval->value(object, 0);
3020
3021   const bool is_final = (gsym == NULL
3022                          ? !parameters->options().shared()
3023                          : gsym->final_value_is_known());
3024   const tls::Tls_optimization optimized_type
3025       = Target_i386::optimize_tls_reloc(is_final, r_type);
3026   switch (r_type)
3027     {
3028     case elfcpp::R_386_TLS_GD:           // Global-dynamic
3029       if (optimized_type == tls::TLSOPT_TO_LE)
3030         {
3031           if (tls_segment == NULL)
3032             {
3033               gold_assert(parameters->errors()->error_count() > 0
3034                           || issue_undefined_symbol_error(gsym));
3035               return;
3036             }
3037           this->tls_gd_to_le(relinfo, relnum, tls_segment,
3038                              rel, r_type, value, view,
3039                              view_size);
3040           break;
3041         }
3042       else
3043         {
3044           unsigned int got_type = (optimized_type == tls::TLSOPT_TO_IE
3045                                    ? GOT_TYPE_TLS_NOFFSET
3046                                    : GOT_TYPE_TLS_PAIR);
3047           unsigned int got_offset;
3048           if (gsym != NULL)
3049             {
3050               gold_assert(gsym->has_got_offset(got_type));
3051               got_offset = gsym->got_offset(got_type) - target->got_size();
3052             }
3053           else
3054             {
3055               unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
3056               gold_assert(object->local_has_got_offset(r_sym, got_type));
3057               got_offset = (object->local_got_offset(r_sym, got_type)
3058                             - target->got_size());
3059             }
3060           if (optimized_type == tls::TLSOPT_TO_IE)
3061             {
3062               this->tls_gd_to_ie(relinfo, relnum, rel, r_type,
3063                                  got_offset, view, view_size);
3064               break;
3065             }
3066           else if (optimized_type == tls::TLSOPT_NONE)
3067             {
3068               // Relocate the field with the offset of the pair of GOT
3069               // entries.
3070               Relocate_functions<32, false>::rel32(view, got_offset);
3071               break;
3072             }
3073         }
3074       gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
3075                              _("unsupported reloc %u"),
3076                              r_type);
3077       break;
3078
3079     case elfcpp::R_386_TLS_GOTDESC:      // Global-dynamic (from ~oliva url)
3080     case elfcpp::R_386_TLS_DESC_CALL:
3081       this->local_dynamic_type_ = LOCAL_DYNAMIC_GNU;
3082       if (optimized_type == tls::TLSOPT_TO_LE)
3083         {
3084           if (tls_segment == NULL)
3085             {
3086               gold_assert(parameters->errors()->error_count() > 0
3087                           || issue_undefined_symbol_error(gsym));
3088               return;
3089             }
3090           this->tls_desc_gd_to_le(relinfo, relnum, tls_segment,
3091                                   rel, r_type, value, view,
3092                                   view_size);
3093           break;
3094         }
3095       else
3096         {
3097           unsigned int got_type = (optimized_type == tls::TLSOPT_TO_IE
3098                                    ? GOT_TYPE_TLS_NOFFSET
3099                                    : GOT_TYPE_TLS_DESC);
3100           unsigned int got_offset = 0;
3101           if (r_type == elfcpp::R_386_TLS_GOTDESC
3102               && optimized_type == tls::TLSOPT_NONE)
3103             {
3104               // We created GOT entries in the .got.tlsdesc portion of
3105               // the .got.plt section, but the offset stored in the
3106               // symbol is the offset within .got.tlsdesc.
3107               got_offset = (target->got_size()
3108                             + target->got_plt_section()->data_size());
3109             }
3110           if (gsym != NULL)
3111             {
3112               gold_assert(gsym->has_got_offset(got_type));
3113               got_offset += gsym->got_offset(got_type) - target->got_size();
3114             }
3115           else
3116             {
3117               unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
3118               gold_assert(object->local_has_got_offset(r_sym, got_type));
3119               got_offset += (object->local_got_offset(r_sym, got_type)
3120                              - target->got_size());
3121             }
3122           if (optimized_type == tls::TLSOPT_TO_IE)
3123             {
3124               this->tls_desc_gd_to_ie(relinfo, relnum, rel, r_type,
3125                                       got_offset, view, view_size);
3126               break;
3127             }
3128           else if (optimized_type == tls::TLSOPT_NONE)
3129             {
3130               if (r_type == elfcpp::R_386_TLS_GOTDESC)
3131                 {
3132                   // Relocate the field with the offset of the pair of GOT
3133                   // entries.
3134                   Relocate_functions<32, false>::rel32(view, got_offset);
3135                 }
3136               break;
3137             }
3138         }
3139       gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
3140                              _("unsupported reloc %u"),
3141                              r_type);
3142       break;
3143
3144     case elfcpp::R_386_TLS_LDM:          // Local-dynamic
3145       if (this->local_dynamic_type_ == LOCAL_DYNAMIC_SUN)
3146         {
3147           gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
3148                                  _("both SUN and GNU model "
3149                                    "TLS relocations"));
3150           break;
3151         }
3152       this->local_dynamic_type_ = LOCAL_DYNAMIC_GNU;
3153       if (optimized_type == tls::TLSOPT_TO_LE)
3154         {
3155           if (tls_segment == NULL)
3156             {
3157               gold_assert(parameters->errors()->error_count() > 0
3158                           || issue_undefined_symbol_error(gsym));
3159               return;
3160             }
3161           this->tls_ld_to_le(relinfo, relnum, tls_segment, rel, r_type,
3162                              value, view, view_size);
3163           break;
3164         }
3165       else if (optimized_type == tls::TLSOPT_NONE)
3166         {
3167           // Relocate the field with the offset of the GOT entry for
3168           // the module index.
3169           unsigned int got_offset;
3170           got_offset = (target->got_mod_index_entry(NULL, NULL, NULL)
3171                         - target->got_size());
3172           Relocate_functions<32, false>::rel32(view, got_offset);
3173           break;
3174         }
3175       gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
3176                              _("unsupported reloc %u"),
3177                              r_type);
3178       break;
3179
3180     case elfcpp::R_386_TLS_LDO_32:       // Alternate local-dynamic
3181       if (optimized_type == tls::TLSOPT_TO_LE)
3182         {
3183           // This reloc can appear in debugging sections, in which
3184           // case we must not convert to local-exec.  We decide what
3185           // to do based on whether the section is marked as
3186           // containing executable code.  That is what the GNU linker
3187           // does as well.
3188           elfcpp::Shdr<32, false> shdr(relinfo->data_shdr);
3189           if ((shdr.get_sh_flags() & elfcpp::SHF_EXECINSTR) != 0)
3190             {
3191               if (tls_segment == NULL)
3192                 {
3193                   gold_assert(parameters->errors()->error_count() > 0
3194                               || issue_undefined_symbol_error(gsym));
3195                   return;
3196                 }
3197               value -= tls_segment->memsz();
3198             }
3199         }
3200       Relocate_functions<32, false>::rel32(view, value);
3201       break;
3202
3203     case elfcpp::R_386_TLS_IE:           // Initial-exec
3204     case elfcpp::R_386_TLS_GOTIE:
3205     case elfcpp::R_386_TLS_IE_32:
3206       if (optimized_type == tls::TLSOPT_TO_LE)
3207         {
3208           if (tls_segment == NULL)
3209             {
3210               gold_assert(parameters->errors()->error_count() > 0
3211                           || issue_undefined_symbol_error(gsym));
3212               return;
3213             }
3214           Target_i386::Relocate::tls_ie_to_le(relinfo, relnum, tls_segment,
3215                                               rel, r_type, value, view,
3216                                               view_size);
3217           break;
3218         }
3219       else if (optimized_type == tls::TLSOPT_NONE)
3220         {
3221           // Relocate the field with the offset of the GOT entry for
3222           // the tp-relative offset of the symbol.
3223           unsigned int got_type = (r_type == elfcpp::R_386_TLS_IE_32
3224                                    ? GOT_TYPE_TLS_OFFSET
3225                                    : GOT_TYPE_TLS_NOFFSET);
3226           unsigned int got_offset;
3227           if (gsym != NULL)
3228             {
3229               gold_assert(gsym->has_got_offset(got_type));
3230               got_offset = gsym->got_offset(got_type);
3231             }
3232           else
3233             {
3234               unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
3235               gold_assert(object->local_has_got_offset(r_sym, got_type));
3236               got_offset = object->local_got_offset(r_sym, got_type);
3237             }
3238           // For the R_386_TLS_IE relocation, we need to apply the
3239           // absolute address of the GOT entry.
3240           if (r_type == elfcpp::R_386_TLS_IE)
3241             got_offset += target->got_plt_section()->address();
3242           // All GOT offsets are relative to the end of the GOT.
3243           got_offset -= target->got_size();
3244           Relocate_functions<32, false>::rel32(view, got_offset);
3245           break;
3246         }
3247       gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
3248                              _("unsupported reloc %u"),
3249                              r_type);
3250       break;
3251
3252     case elfcpp::R_386_TLS_LE:           // Local-exec
3253       // If we're creating a shared library, a dynamic relocation will
3254       // have been created for this location, so do not apply it now.
3255       if (!parameters->options().shared())
3256         {
3257           if (tls_segment == NULL)
3258             {
3259               gold_assert(parameters->errors()->error_count() > 0
3260                           || issue_undefined_symbol_error(gsym));
3261               return;
3262             }
3263           value -= tls_segment->memsz();
3264           Relocate_functions<32, false>::rel32(view, value);
3265         }
3266       break;
3267
3268     case elfcpp::R_386_TLS_LE_32:
3269       // If we're creating a shared library, a dynamic relocation will
3270       // have been created for this location, so do not apply it now.
3271       if (!parameters->options().shared())
3272         {
3273           if (tls_segment == NULL)
3274             {
3275               gold_assert(parameters->errors()->error_count() > 0
3276                           || issue_undefined_symbol_error(gsym));
3277               return;
3278             }
3279           value = tls_segment->memsz() - value;
3280           Relocate_functions<32, false>::rel32(view, value);
3281         }
3282       break;
3283     }
3284 }
3285
3286 // Do a relocation in which we convert a TLS General-Dynamic to a
3287 // Local-Exec.
3288
3289 inline void
3290 Target_i386::Relocate::tls_gd_to_le(const Relocate_info<32, false>* relinfo,
3291                                     size_t relnum,
3292                                     Output_segment* tls_segment,
3293                                     const elfcpp::Rel<32, false>& rel,
3294                                     unsigned int,
3295                                     elfcpp::Elf_types<32>::Elf_Addr value,
3296                                     unsigned char* view,
3297                                     section_size_type view_size)
3298 {
3299   // leal foo(,%reg,1),%eax; call ___tls_get_addr
3300   //  ==> movl %gs:0,%eax; subl $foo@tpoff,%eax
3301   // leal foo(%reg),%eax; call ___tls_get_addr
3302   //  ==> movl %gs:0,%eax; subl $foo@tpoff,%eax
3303
3304   tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, -2);
3305   tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, 9);
3306
3307   unsigned char op1 = view[-1];
3308   unsigned char op2 = view[-2];
3309
3310   tls::check_tls(relinfo, relnum, rel.get_r_offset(),
3311                  op2 == 0x8d || op2 == 0x04);
3312   tls::check_tls(relinfo, relnum, rel.get_r_offset(), view[4] == 0xe8);
3313
3314   int roff = 5;
3315
3316   if (op2 == 0x04)
3317     {
3318       tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, -3);
3319       tls::check_tls(relinfo, relnum, rel.get_r_offset(), view[-3] == 0x8d);
3320       tls::check_tls(relinfo, relnum, rel.get_r_offset(),
3321                      ((op1 & 0xc7) == 0x05 && op1 != (4 << 3)));
3322       memcpy(view - 3, "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12);
3323     }
3324   else
3325     {
3326       tls::check_tls(relinfo, relnum, rel.get_r_offset(),
3327                      (op1 & 0xf8) == 0x80 && (op1 & 7) != 4);
3328       if (rel.get_r_offset() + 9 < view_size
3329           && view[9] == 0x90)
3330         {
3331           // There is a trailing nop.  Use the size byte subl.
3332           memcpy(view - 2, "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12);
3333           roff = 6;
3334         }
3335       else
3336         {
3337           // Use the five byte subl.
3338           memcpy(view - 2, "\x65\xa1\0\0\0\0\x2d\0\0\0", 11);
3339         }
3340     }
3341
3342   value = tls_segment->memsz() - value;
3343   Relocate_functions<32, false>::rel32(view + roff, value);
3344
3345   // The next reloc should be a PLT32 reloc against __tls_get_addr.
3346   // We can skip it.
3347   this->skip_call_tls_get_addr_ = true;
3348 }
3349
3350 // Do a relocation in which we convert a TLS General-Dynamic to an
3351 // Initial-Exec.
3352
3353 inline void
3354 Target_i386::Relocate::tls_gd_to_ie(const Relocate_info<32, false>* relinfo,
3355                                     size_t relnum,
3356                                     const elfcpp::Rel<32, false>& rel,
3357                                     unsigned int,
3358                                     elfcpp::Elf_types<32>::Elf_Addr value,
3359                                     unsigned char* view,
3360                                     section_size_type view_size)
3361 {
3362   // leal foo(,%ebx,1),%eax; call ___tls_get_addr
3363   //  ==> movl %gs:0,%eax; addl foo@gotntpoff(%ebx),%eax
3364   // leal foo(%ebx),%eax; call ___tls_get_addr; nop
3365   //  ==> movl %gs:0,%eax; addl foo@gotntpoff(%ebx),%eax
3366
3367   tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, -2);
3368   tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, 9);
3369
3370   unsigned char op1 = view[-1];
3371   unsigned char op2 = view[-2];
3372
3373   tls::check_tls(relinfo, relnum, rel.get_r_offset(),
3374                  op2 == 0x8d || op2 == 0x04);
3375   tls::check_tls(relinfo, relnum, rel.get_r_offset(), view[4] == 0xe8);
3376
3377   int roff;
3378
3379   if (op2 == 0x04)
3380     {
3381       tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, -3);
3382       tls::check_tls(relinfo, relnum, rel.get_r_offset(), view[-3] == 0x8d);
3383       tls::check_tls(relinfo, relnum, rel.get_r_offset(),
3384                      ((op1 & 0xc7) == 0x05 && op1 != (4 << 3)));
3385       roff = 5;
3386     }
3387   else
3388     {
3389       tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, 10);
3390       tls::check_tls(relinfo, relnum, rel.get_r_offset(),
3391                      (op1 & 0xf8) == 0x80 && (op1 & 7) != 4);
3392       tls::check_tls(relinfo, relnum, rel.get_r_offset(), view[9] == 0x90);
3393       roff = 6;
3394     }
3395
3396   memcpy(view + roff - 8, "\x65\xa1\0\0\0\0\x03\x83\0\0\0", 12);
3397   Relocate_functions<32, false>::rel32(view + roff, value);
3398
3399   // The next reloc should be a PLT32 reloc against __tls_get_addr.
3400   // We can skip it.
3401   this->skip_call_tls_get_addr_ = true;
3402 }
3403
3404 // Do a relocation in which we convert a TLS_GOTDESC or TLS_DESC_CALL
3405 // General-Dynamic to a Local-Exec.
3406
3407 inline void
3408 Target_i386::Relocate::tls_desc_gd_to_le(
3409     const Relocate_info<32, false>* relinfo,
3410     size_t relnum,
3411     Output_segment* tls_segment,
3412     const elfcpp::Rel<32, false>& rel,
3413     unsigned int r_type,
3414     elfcpp::Elf_types<32>::Elf_Addr value,
3415     unsigned char* view,
3416     section_size_type view_size)
3417 {
3418   if (r_type == elfcpp::R_386_TLS_GOTDESC)
3419     {
3420       // leal foo@TLSDESC(%ebx), %eax
3421       // ==> leal foo@NTPOFF, %eax
3422       tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, -2);
3423       tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, 4);
3424       tls::check_tls(relinfo, relnum, rel.get_r_offset(),
3425                      view[-2] == 0x8d && view[-1] == 0x83);
3426       view[-1] = 0x05;
3427       value -= tls_segment->memsz();
3428       Relocate_functions<32, false>::rel32(view, value);
3429     }
3430   else
3431     {
3432       // call *foo@TLSCALL(%eax)
3433       // ==> nop; nop
3434       gold_assert(r_type == elfcpp::R_386_TLS_DESC_CALL);
3435       tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, 2);
3436       tls::check_tls(relinfo, relnum, rel.get_r_offset(),
3437                      view[0] == 0xff && view[1] == 0x10);
3438       view[0] = 0x66;
3439       view[1] = 0x90;
3440     }
3441 }
3442
3443 // Do a relocation in which we convert a TLS_GOTDESC or TLS_DESC_CALL
3444 // General-Dynamic to an Initial-Exec.
3445
3446 inline void
3447 Target_i386::Relocate::tls_desc_gd_to_ie(
3448     const Relocate_info<32, false>* relinfo,
3449     size_t relnum,
3450     const elfcpp::Rel<32, false>& rel,
3451     unsigned int r_type,
3452     elfcpp::Elf_types<32>::Elf_Addr value,
3453     unsigned char* view,
3454     section_size_type view_size)
3455 {
3456   if (r_type == elfcpp::R_386_TLS_GOTDESC)
3457     {
3458       // leal foo@TLSDESC(%ebx), %eax
3459       // ==> movl foo@GOTNTPOFF(%ebx), %eax
3460       tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, -2);
3461       tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, 4);
3462       tls::check_tls(relinfo, relnum, rel.get_r_offset(),
3463                      view[-2] == 0x8d && view[-1] == 0x83);
3464       view[-2] = 0x8b;
3465       Relocate_functions<32, false>::rel32(view, value);
3466     }
3467   else
3468     {
3469       // call *foo@TLSCALL(%eax)
3470       // ==> nop; nop
3471       gold_assert(r_type == elfcpp::R_386_TLS_DESC_CALL);
3472       tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, 2);
3473       tls::check_tls(relinfo, relnum, rel.get_r_offset(),
3474                      view[0] == 0xff && view[1] == 0x10);
3475       view[0] = 0x66;
3476       view[1] = 0x90;
3477     }
3478 }
3479
3480 // Do a relocation in which we convert a TLS Local-Dynamic to a
3481 // Local-Exec.
3482
3483 inline void
3484 Target_i386::Relocate::tls_ld_to_le(const Relocate_info<32, false>* relinfo,
3485                                     size_t relnum,
3486                                     Output_segment*,
3487                                     const elfcpp::Rel<32, false>& rel,
3488                                     unsigned int,
3489                                     elfcpp::Elf_types<32>::Elf_Addr,
3490                                     unsigned char* view,
3491                                     section_size_type view_size)
3492 {
3493   // leal foo(%reg), %eax; call ___tls_get_addr
3494   // ==> movl %gs:0,%eax; nop; leal 0(%esi,1),%esi
3495
3496   tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, -2);
3497   tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, 9);
3498
3499   // FIXME: Does this test really always pass?
3500   tls::check_tls(relinfo, relnum, rel.get_r_offset(),
3501                  view[-2] == 0x8d && view[-1] == 0x83);
3502
3503   tls::check_tls(relinfo, relnum, rel.get_r_offset(), view[4] == 0xe8);
3504
3505   memcpy(view - 2, "\x65\xa1\0\0\0\0\x90\x8d\x74\x26\0", 11);
3506
3507   // The next reloc should be a PLT32 reloc against __tls_get_addr.
3508   // We can skip it.
3509   this->skip_call_tls_get_addr_ = true;
3510 }
3511
3512 // Do a relocation in which we convert a TLS Initial-Exec to a
3513 // Local-Exec.
3514
3515 inline void
3516 Target_i386::Relocate::tls_ie_to_le(const Relocate_info<32, false>* relinfo,
3517                                     size_t relnum,
3518                                     Output_segment* tls_segment,
3519                                     const elfcpp::Rel<32, false>& rel,
3520                                     unsigned int r_type,
3521                                     elfcpp::Elf_types<32>::Elf_Addr value,
3522                                     unsigned char* view,
3523                                     section_size_type view_size)
3524 {
3525   // We have to actually change the instructions, which means that we
3526   // need to examine the opcodes to figure out which instruction we
3527   // are looking at.
3528   if (r_type == elfcpp::R_386_TLS_IE)
3529     {
3530       // movl %gs:XX,%eax  ==>  movl $YY,%eax
3531       // movl %gs:XX,%reg  ==>  movl $YY,%reg
3532       // addl %gs:XX,%reg  ==>  addl $YY,%reg
3533       tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, -1);
3534       tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, 4);
3535
3536       unsigned char op1 = view[-1];
3537       if (op1 == 0xa1)
3538         {
3539           // movl XX,%eax  ==>  movl $YY,%eax
3540           view[-1] = 0xb8;
3541         }
3542       else
3543         {
3544           tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, -2);
3545
3546           unsigned char op2 = view[-2];
3547           if (op2 == 0x8b)
3548             {
3549               // movl XX,%reg  ==>  movl $YY,%reg
3550               tls::check_tls(relinfo, relnum, rel.get_r_offset(),
3551                              (op1 & 0xc7) == 0x05);
3552               view[-2] = 0xc7;
3553               view[-1] = 0xc0 | ((op1 >> 3) & 7);
3554             }
3555           else if (op2 == 0x03)
3556             {
3557               // addl XX,%reg  ==>  addl $YY,%reg
3558               tls::check_tls(relinfo, relnum, rel.get_r_offset(),
3559                              (op1 & 0xc7) == 0x05);
3560               view[-2] = 0x81;
3561               view[-1] = 0xc0 | ((op1 >> 3) & 7);
3562             }
3563           else
3564             tls::check_tls(relinfo, relnum, rel.get_r_offset(), 0);
3565         }
3566     }
3567   else
3568     {
3569       // subl %gs:XX(%reg1),%reg2  ==>  subl $YY,%reg2
3570       // movl %gs:XX(%reg1),%reg2  ==>  movl $YY,%reg2
3571       // addl %gs:XX(%reg1),%reg2  ==>  addl $YY,$reg2
3572       tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, -2);
3573       tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, 4);
3574
3575       unsigned char op1 = view[-1];
3576       unsigned char op2 = view[-2];
3577       tls::check_tls(relinfo, relnum, rel.get_r_offset(),
3578                      (op1 & 0xc0) == 0x80 && (op1 & 7) != 4);
3579       if (op2 == 0x8b)
3580         {
3581           // movl %gs:XX(%reg1),%reg2  ==>  movl $YY,%reg2
3582           view[-2] = 0xc7;
3583           view[-1] = 0xc0 | ((op1 >> 3) & 7);
3584         }
3585       else if (op2 == 0x2b)
3586         {
3587           // subl %gs:XX(%reg1),%reg2  ==>  subl $YY,%reg2
3588           view[-2] = 0x81;
3589           view[-1] = 0xe8 | ((op1 >> 3) & 7);
3590         }
3591       else if (op2 == 0x03)
3592         {
3593           // addl %gs:XX(%reg1),%reg2  ==>  addl $YY,$reg2
3594           view[-2] = 0x81;
3595           view[-1] = 0xc0 | ((op1 >> 3) & 7);
3596         }
3597       else
3598         tls::check_tls(relinfo, relnum, rel.get_r_offset(), 0);
3599     }
3600
3601   value = tls_segment->memsz() - value;
3602   if (r_type == elfcpp::R_386_TLS_IE || r_type == elfcpp::R_386_TLS_GOTIE)
3603     value = - value;
3604
3605   Relocate_functions<32, false>::rel32(view, value);
3606 }
3607
3608 // Relocate section data.
3609
3610 void
3611 Target_i386::relocate_section(const Relocate_info<32, false>* relinfo,
3612                               unsigned int sh_type,
3613                               const unsigned char* prelocs,
3614                               size_t reloc_count,
3615                               Output_section* output_section,
3616                               bool needs_special_offset_handling,
3617                               unsigned char* view,
3618                               elfcpp::Elf_types<32>::Elf_Addr address,
3619                               section_size_type view_size,
3620                               const Reloc_symbol_changes* reloc_symbol_changes)
3621 {
3622   gold_assert(sh_type == elfcpp::SHT_REL);
3623
3624   gold::relocate_section<32, false, Target_i386, Relocate,
3625                          gold::Default_comdat_behavior, Classify_reloc>(
3626     relinfo,
3627     this,
3628     prelocs,
3629     reloc_count,
3630     output_section,
3631     needs_special_offset_handling,
3632     view,
3633     address,
3634     view_size,
3635     reloc_symbol_changes);
3636 }
3637
3638 // Return the size of a relocation while scanning during a relocatable
3639 // link.
3640
3641 unsigned int
3642 Target_i386::Classify_reloc::get_size_for_reloc(
3643     unsigned int r_type,
3644     Relobj* object)
3645 {
3646   switch (r_type)
3647     {
3648     case elfcpp::R_386_NONE:
3649     case elfcpp::R_386_GNU_VTINHERIT:
3650     case elfcpp::R_386_GNU_VTENTRY:
3651     case elfcpp::R_386_TLS_GD:            // Global-dynamic
3652     case elfcpp::R_386_TLS_GOTDESC:       // Global-dynamic (from ~oliva url)
3653     case elfcpp::R_386_TLS_DESC_CALL:
3654     case elfcpp::R_386_TLS_LDM:           // Local-dynamic
3655     case elfcpp::R_386_TLS_LDO_32:        // Alternate local-dynamic
3656     case elfcpp::R_386_TLS_IE:            // Initial-exec
3657     case elfcpp::R_386_TLS_IE_32:
3658     case elfcpp::R_386_TLS_GOTIE:
3659     case elfcpp::R_386_TLS_LE:            // Local-exec
3660     case elfcpp::R_386_TLS_LE_32:
3661       return 0;
3662
3663     case elfcpp::R_386_32:
3664     case elfcpp::R_386_PC32:
3665     case elfcpp::R_386_GOT32:
3666     case elfcpp::R_386_GOT32X:
3667     case elfcpp::R_386_PLT32:
3668     case elfcpp::R_386_GOTOFF:
3669     case elfcpp::R_386_GOTPC:
3670      return 4;
3671
3672     case elfcpp::R_386_16:
3673     case elfcpp::R_386_PC16:
3674       return 2;
3675
3676     case elfcpp::R_386_8:
3677     case elfcpp::R_386_PC8:
3678       return 1;
3679
3680       // These are relocations which should only be seen by the
3681       // dynamic linker, and should never be seen here.
3682     case elfcpp::R_386_COPY:
3683     case elfcpp::R_386_GLOB_DAT:
3684     case elfcpp::R_386_JUMP_SLOT:
3685     case elfcpp::R_386_RELATIVE:
3686     case elfcpp::R_386_IRELATIVE:
3687     case elfcpp::R_386_TLS_TPOFF:
3688     case elfcpp::R_386_TLS_DTPMOD32:
3689     case elfcpp::R_386_TLS_DTPOFF32:
3690     case elfcpp::R_386_TLS_TPOFF32:
3691     case elfcpp::R_386_TLS_DESC:
3692       object->error(_("unexpected reloc %u in object file"), r_type);
3693       return 0;
3694
3695     case elfcpp::R_386_32PLT:
3696     case elfcpp::R_386_TLS_GD_32:
3697     case elfcpp::R_386_TLS_GD_PUSH:
3698     case elfcpp::R_386_TLS_GD_CALL:
3699     case elfcpp::R_386_TLS_GD_POP:
3700     case elfcpp::R_386_TLS_LDM_32:
3701     case elfcpp::R_386_TLS_LDM_PUSH:
3702     case elfcpp::R_386_TLS_LDM_CALL:
3703     case elfcpp::R_386_TLS_LDM_POP:
3704     case elfcpp::R_386_USED_BY_INTEL_200:
3705     default:
3706       object->error(_("unsupported reloc %u in object file"), r_type);
3707       return 0;
3708     }
3709 }
3710
3711 // Scan the relocs during a relocatable link.
3712
3713 void
3714 Target_i386::scan_relocatable_relocs(Symbol_table* symtab,
3715                                      Layout* layout,
3716                                      Sized_relobj_file<32, false>* object,
3717                                      unsigned int data_shndx,
3718                                      unsigned int sh_type,
3719                                      const unsigned char* prelocs,
3720                                      size_t reloc_count,
3721                                      Output_section* output_section,
3722                                      bool needs_special_offset_handling,
3723                                      size_t local_symbol_count,
3724                                      const unsigned char* plocal_symbols,
3725                                      Relocatable_relocs* rr)
3726 {
3727   typedef gold::Default_scan_relocatable_relocs<Classify_reloc>
3728       Scan_relocatable_relocs;
3729
3730   gold_assert(sh_type == elfcpp::SHT_REL);
3731
3732   gold::scan_relocatable_relocs<32, false, Scan_relocatable_relocs>(
3733     symtab,
3734     layout,
3735     object,
3736     data_shndx,
3737     prelocs,
3738     reloc_count,
3739     output_section,
3740     needs_special_offset_handling,
3741     local_symbol_count,
3742     plocal_symbols,
3743     rr);
3744 }
3745
3746 // Scan the relocs for --emit-relocs.
3747
3748 void
3749 Target_i386::emit_relocs_scan(Symbol_table* symtab,
3750                               Layout* layout,
3751                               Sized_relobj_file<32, false>* object,
3752                               unsigned int data_shndx,
3753                               unsigned int sh_type,
3754                               const unsigned char* prelocs,
3755                               size_t reloc_count,
3756                               Output_section* output_section,
3757                               bool needs_special_offset_handling,
3758                               size_t local_symbol_count,
3759                               const unsigned char* plocal_syms,
3760                               Relocatable_relocs* rr)
3761 {
3762   typedef gold::Default_classify_reloc<elfcpp::SHT_REL, 32, false>
3763       Classify_reloc;
3764   typedef gold::Default_emit_relocs_strategy<Classify_reloc>
3765       Emit_relocs_strategy;
3766
3767   gold_assert(sh_type == elfcpp::SHT_REL);
3768
3769   gold::scan_relocatable_relocs<32, false, Emit_relocs_strategy>(
3770     symtab,
3771     layout,
3772     object,
3773     data_shndx,
3774     prelocs,
3775     reloc_count,
3776     output_section,
3777     needs_special_offset_handling,
3778     local_symbol_count,
3779     plocal_syms,
3780     rr);
3781 }
3782
3783 // Emit relocations for a section.
3784
3785 void
3786 Target_i386::relocate_relocs(
3787     const Relocate_info<32, false>* relinfo,
3788     unsigned int sh_type,
3789     const unsigned char* prelocs,
3790     size_t reloc_count,
3791     Output_section* output_section,
3792     elfcpp::Elf_types<32>::Elf_Off offset_in_output_section,
3793     unsigned char* view,
3794     elfcpp::Elf_types<32>::Elf_Addr view_address,
3795     section_size_type view_size,
3796     unsigned char* reloc_view,
3797     section_size_type reloc_view_size)
3798 {
3799   gold_assert(sh_type == elfcpp::SHT_REL);
3800
3801   gold::relocate_relocs<32, false, Classify_reloc>(
3802     relinfo,
3803     prelocs,
3804     reloc_count,
3805     output_section,
3806     offset_in_output_section,
3807     view,
3808     view_address,
3809     view_size,
3810     reloc_view,
3811     reloc_view_size);
3812 }
3813
3814 // Return the value to use for a dynamic which requires special
3815 // treatment.  This is how we support equality comparisons of function
3816 // pointers across shared library boundaries, as described in the
3817 // processor specific ABI supplement.
3818
3819 uint64_t
3820 Target_i386::do_dynsym_value(const Symbol* gsym) const
3821 {
3822   gold_assert(gsym->is_from_dynobj() && gsym->has_plt_offset());
3823   return this->plt_address_for_global(gsym);
3824 }
3825
3826 // Return a string used to fill a code section with nops to take up
3827 // the specified length.
3828
3829 std::string
3830 Target_i386::do_code_fill(section_size_type length) const
3831 {
3832   if (length >= 16)
3833     {
3834       // Build a jmp instruction to skip over the bytes.
3835       unsigned char jmp[5];
3836       jmp[0] = 0xe9;
3837       elfcpp::Swap_unaligned<32, false>::writeval(jmp + 1, length - 5);
3838       return (std::string(reinterpret_cast<char*>(&jmp[0]), 5)
3839               + std::string(length - 5, static_cast<char>(0x90)));
3840     }
3841
3842   // Nop sequences of various lengths.
3843   const char nop1[1] = { '\x90' };                   // nop
3844   const char nop2[2] = { '\x66', '\x90' };           // xchg %ax %ax
3845   const char nop3[3] = { '\x8d', '\x76', '\x00' };   // leal 0(%esi),%esi
3846   const char nop4[4] = { '\x8d', '\x74', '\x26',     // leal 0(%esi,1),%esi
3847                          '\x00'};
3848   const char nop5[5] = { '\x90', '\x8d', '\x74',     // nop
3849                          '\x26', '\x00' };           // leal 0(%esi,1),%esi
3850   const char nop6[6] = { '\x8d', '\xb6', '\x00',     // leal 0L(%esi),%esi
3851                          '\x00', '\x00', '\x00' };
3852   const char nop7[7] = { '\x8d', '\xb4', '\x26',     // leal 0L(%esi,1),%esi
3853                          '\x00', '\x00', '\x00',
3854                          '\x00' };
3855   const char nop8[8] = { '\x90', '\x8d', '\xb4',     // nop
3856                          '\x26', '\x00', '\x00',     // leal 0L(%esi,1),%esi
3857                          '\x00', '\x00' };
3858   const char nop9[9] = { '\x89', '\xf6', '\x8d',     // movl %esi,%esi
3859                          '\xbc', '\x27', '\x00',     // leal 0L(%edi,1),%edi
3860                          '\x00', '\x00', '\x00' };
3861   const char nop10[10] = { '\x8d', '\x76', '\x00',   // leal 0(%esi),%esi
3862                            '\x8d', '\xbc', '\x27',   // leal 0L(%edi,1),%edi
3863                            '\x00', '\x00', '\x00',
3864                            '\x00' };
3865   const char nop11[11] = { '\x8d', '\x74', '\x26',   // leal 0(%esi,1),%esi
3866                            '\x00', '\x8d', '\xbc',   // leal 0L(%edi,1),%edi
3867                            '\x27', '\x00', '\x00',
3868                            '\x00', '\x00' };
3869   const char nop12[12] = { '\x8d', '\xb6', '\x00',   // leal 0L(%esi),%esi
3870                            '\x00', '\x00', '\x00',   // leal 0L(%edi),%edi
3871                            '\x8d', '\xbf', '\x00',
3872                            '\x00', '\x00', '\x00' };
3873   const char nop13[13] = { '\x8d', '\xb6', '\x00',   // leal 0L(%esi),%esi
3874                            '\x00', '\x00', '\x00',   // leal 0L(%edi,1),%edi
3875                            '\x8d', '\xbc', '\x27',
3876                            '\x00', '\x00', '\x00',
3877                            '\x00' };
3878   const char nop14[14] = { '\x8d', '\xb4', '\x26',   // leal 0L(%esi,1),%esi
3879                            '\x00', '\x00', '\x00',   // leal 0L(%edi,1),%edi
3880                            '\x00', '\x8d', '\xbc',
3881                            '\x27', '\x00', '\x00',
3882                            '\x00', '\x00' };
3883   const char nop15[15] = { '\xeb', '\x0d', '\x90',   // jmp .+15
3884                            '\x90', '\x90', '\x90',   // nop,nop,nop,...
3885                            '\x90', '\x90', '\x90',
3886                            '\x90', '\x90', '\x90',
3887                            '\x90', '\x90', '\x90' };
3888
3889   const char* nops[16] = {
3890     NULL,
3891     nop1, nop2, nop3, nop4, nop5, nop6, nop7,
3892     nop8, nop9, nop10, nop11, nop12, nop13, nop14, nop15
3893   };
3894
3895   return std::string(nops[length], length);
3896 }
3897
3898 // Return the value to use for the base of a DW_EH_PE_datarel offset
3899 // in an FDE.  Solaris and SVR4 use DW_EH_PE_datarel because their
3900 // assembler can not write out the difference between two labels in
3901 // different sections, so instead of using a pc-relative value they
3902 // use an offset from the GOT.
3903
3904 uint64_t
3905 Target_i386::do_ehframe_datarel_base() const
3906 {
3907   gold_assert(this->global_offset_table_ != NULL);
3908   Symbol* sym = this->global_offset_table_;
3909   Sized_symbol<32>* ssym = static_cast<Sized_symbol<32>*>(sym);
3910   return ssym->value();
3911 }
3912
3913 // Return whether SYM should be treated as a call to a non-split
3914 // function.  We don't want that to be true of a call to a
3915 // get_pc_thunk function.
3916
3917 bool
3918 Target_i386::do_is_call_to_non_split(const Symbol* sym,
3919                                      const unsigned char*) const
3920 {
3921   return (sym->type() == elfcpp::STT_FUNC
3922           && !is_prefix_of("__i686.get_pc_thunk.", sym->name()));
3923 }
3924
3925 // FNOFFSET in section SHNDX in OBJECT is the start of a function
3926 // compiled with -fsplit-stack.  The function calls non-split-stack
3927 // code.  We have to change the function so that it always ensures
3928 // that it has enough stack space to run some random function.
3929
3930 void
3931 Target_i386::do_calls_non_split(Relobj* object, unsigned int shndx,
3932                                        section_offset_type fnoffset,
3933                                        section_size_type fnsize,
3934                                        const unsigned char*,
3935                                        size_t,
3936                                        unsigned char* view,
3937                                        section_size_type view_size,
3938                                        std::string* from,
3939                                        std::string* to) const
3940 {
3941   // The function starts with a comparison of the stack pointer and a
3942   // field in the TCB.  This is followed by a jump.
3943
3944   // cmp %gs:NN,%esp
3945   if (this->match_view(view, view_size, fnoffset, "\x65\x3b\x25", 3)
3946       && fnsize > 7)
3947     {
3948       // We will call __morestack if the carry flag is set after this
3949       // comparison.  We turn the comparison into an stc instruction
3950       // and some nops.
3951       view[fnoffset] = '\xf9';
3952       this->set_view_to_nop(view, view_size, fnoffset + 1, 6);
3953     }
3954   // lea NN(%esp),%ecx
3955   // lea NN(%esp),%edx
3956   else if ((this->match_view(view, view_size, fnoffset, "\x8d\x8c\x24", 3)
3957             || this->match_view(view, view_size, fnoffset, "\x8d\x94\x24", 3))
3958            && fnsize > 7)
3959     {
3960       // This is loading an offset from the stack pointer for a
3961       // comparison.  The offset is negative, so we decrease the
3962       // offset by the amount of space we need for the stack.  This
3963       // means we will avoid calling __morestack if there happens to
3964       // be plenty of space on the stack already.
3965       unsigned char* pval = view + fnoffset + 3;
3966       uint32_t val = elfcpp::Swap_unaligned<32, false>::readval(pval);
3967       val -= parameters->options().split_stack_adjust_size();
3968       elfcpp::Swap_unaligned<32, false>::writeval(pval, val);
3969     }
3970   else
3971     {
3972       if (!object->has_no_split_stack())
3973         object->error(_("failed to match split-stack sequence at "
3974                         "section %u offset %0zx"),
3975                       shndx, static_cast<size_t>(fnoffset));
3976       return;
3977     }
3978
3979   // We have to change the function so that it calls
3980   // __morestack_non_split instead of __morestack.  The former will
3981   // allocate additional stack space.
3982   *from = "__morestack";
3983   *to = "__morestack_non_split";
3984 }
3985
3986 // The selector for i386 object files.  Note this is never instantiated
3987 // directly.  It's only used in Target_selector_i386_nacl, below.
3988
3989 class Target_selector_i386 : public Target_selector_freebsd
3990 {
3991 public:
3992   Target_selector_i386()
3993     : Target_selector_freebsd(elfcpp::EM_386, 32, false,
3994                               "elf32-i386", "elf32-i386-freebsd",
3995                               "elf_i386")
3996   { }
3997
3998   Target*
3999   do_instantiate_target()
4000   { return new Target_i386(); }
4001 };
4002
4003 // NaCl variant.  It uses different PLT contents.
4004
4005 class Output_data_plt_i386_nacl : public Output_data_plt_i386
4006 {
4007  public:
4008   Output_data_plt_i386_nacl(Layout* layout,
4009                             Output_data_got_plt_i386* got_plt,
4010                             Output_data_space* got_irelative)
4011     : Output_data_plt_i386(layout, plt_entry_size, got_plt, got_irelative)
4012   { }
4013
4014  protected:
4015   virtual unsigned int
4016   do_get_plt_entry_size() const
4017   { return plt_entry_size; }
4018
4019   virtual void
4020   do_add_eh_frame(Layout* layout)
4021   {
4022     layout->add_eh_frame_for_plt(this, plt_eh_frame_cie, plt_eh_frame_cie_size,
4023                                  plt_eh_frame_fde, plt_eh_frame_fde_size);
4024   }
4025
4026   // The size of an entry in the PLT.
4027   static const int plt_entry_size = 64;
4028
4029   // The .eh_frame unwind information for the PLT.
4030   static const int plt_eh_frame_fde_size = 32;
4031   static const unsigned char plt_eh_frame_fde[plt_eh_frame_fde_size];
4032 };
4033
4034 class Output_data_plt_i386_nacl_exec : public Output_data_plt_i386_nacl
4035 {
4036 public:
4037   Output_data_plt_i386_nacl_exec(Layout* layout,
4038                                  Output_data_got_plt_i386* got_plt,
4039                                  Output_data_space* got_irelative)
4040     : Output_data_plt_i386_nacl(layout, got_plt, got_irelative)
4041   { }
4042
4043  protected:
4044   virtual void
4045   do_fill_first_plt_entry(unsigned char* pov,
4046                           elfcpp::Elf_types<32>::Elf_Addr got_address);
4047
4048   virtual unsigned int
4049   do_fill_plt_entry(unsigned char* pov,
4050                     elfcpp::Elf_types<32>::Elf_Addr got_address,
4051                     unsigned int got_offset,
4052                     unsigned int plt_offset,
4053                     unsigned int plt_rel_offset);
4054
4055  private:
4056   // The first entry in the PLT for an executable.
4057   static const unsigned char first_plt_entry[plt_entry_size];
4058
4059   // Other entries in the PLT for an executable.
4060   static const unsigned char plt_entry[plt_entry_size];
4061 };
4062
4063 class Output_data_plt_i386_nacl_dyn : public Output_data_plt_i386_nacl
4064 {
4065  public:
4066   Output_data_plt_i386_nacl_dyn(Layout* layout,
4067                                 Output_data_got_plt_i386* got_plt,
4068                                 Output_data_space* got_irelative)
4069     : Output_data_plt_i386_nacl(layout, got_plt, got_irelative)
4070   { }
4071
4072  protected:
4073   virtual void
4074   do_fill_first_plt_entry(unsigned char* pov, elfcpp::Elf_types<32>::Elf_Addr);
4075
4076   virtual unsigned int
4077   do_fill_plt_entry(unsigned char* pov,
4078                     elfcpp::Elf_types<32>::Elf_Addr,
4079                     unsigned int got_offset,
4080                     unsigned int plt_offset,
4081                     unsigned int plt_rel_offset);
4082
4083  private:
4084   // The first entry in the PLT for a shared object.
4085   static const unsigned char first_plt_entry[plt_entry_size];
4086
4087   // Other entries in the PLT for a shared object.
4088   static const unsigned char plt_entry[plt_entry_size];
4089 };
4090
4091 class Target_i386_nacl : public Target_i386
4092 {
4093  public:
4094   Target_i386_nacl()
4095     : Target_i386(&i386_nacl_info)
4096   { }
4097
4098  protected:
4099   virtual Output_data_plt_i386*
4100   do_make_data_plt(Layout* layout,
4101                    Output_data_got_plt_i386* got_plt,
4102                    Output_data_space* got_irelative,
4103                    bool dyn)
4104   {
4105     if (dyn)
4106       return new Output_data_plt_i386_nacl_dyn(layout, got_plt, got_irelative);
4107     else
4108       return new Output_data_plt_i386_nacl_exec(layout, got_plt, got_irelative);
4109   }
4110
4111   virtual std::string
4112   do_code_fill(section_size_type length) const;
4113
4114  private:
4115   static const Target::Target_info i386_nacl_info;
4116 };
4117
4118 const Target::Target_info Target_i386_nacl::i386_nacl_info =
4119 {
4120   32,                   // size
4121   false,                // is_big_endian
4122   elfcpp::EM_386,       // machine_code
4123   false,                // has_make_symbol
4124   false,                // has_resolve
4125   true,                 // has_code_fill
4126   true,                 // is_default_stack_executable
4127   true,                 // can_icf_inline_merge_sections
4128   '\0',                 // wrap_char
4129   "/lib/ld-nacl-x86-32.so.1", // dynamic_linker
4130   0x20000,              // default_text_segment_address
4131   0x10000,              // abi_pagesize (overridable by -z max-page-size)
4132   0x10000,              // common_pagesize (overridable by -z common-page-size)
4133   true,                 // isolate_execinstr
4134   0x10000000,           // rosegment_gap
4135   elfcpp::SHN_UNDEF,    // small_common_shndx
4136   elfcpp::SHN_UNDEF,    // large_common_shndx
4137   0,                    // small_common_section_flags
4138   0,                    // large_common_section_flags
4139   NULL,                 // attributes_section
4140   NULL,                 // attributes_vendor
4141   "_start",             // entry_symbol_name
4142   32,                   // hash_entry_size
4143 };
4144
4145 #define NACLMASK        0xe0            // 32-byte alignment mask
4146
4147 const unsigned char
4148 Output_data_plt_i386_nacl_exec::first_plt_entry[plt_entry_size] =
4149 {
4150   0xff, 0x35,                          // pushl contents of memory address
4151   0, 0, 0, 0,                          // replaced with address of .got + 4
4152   0x8b, 0x0d,                          // movl contents of address, %ecx
4153   0, 0, 0, 0,                          // replaced with address of .got + 8
4154   0x83, 0xe1, NACLMASK,                // andl $NACLMASK, %ecx
4155   0xff, 0xe1,                          // jmp *%ecx
4156   0x90, 0x90, 0x90, 0x90, 0x90, 0x90,  // nops
4157   0x90, 0x90, 0x90, 0x90, 0x90, 0x90,  // nops
4158   0x90, 0x90, 0x90, 0x90, 0x90, 0x90,  // nops
4159   0x90, 0x90, 0x90, 0x90, 0x90, 0x90,  // nops
4160   0x90, 0x90, 0x90, 0x90, 0x90, 0x90,  // nops
4161   0x90, 0x90, 0x90, 0x90, 0x90, 0x90,  // nops
4162   0x90, 0x90, 0x90, 0x90, 0x90, 0x90,  // nops
4163   0x90, 0x90, 0x90, 0x90, 0x90
4164 };
4165
4166 void
4167 Output_data_plt_i386_nacl_exec::do_fill_first_plt_entry(
4168     unsigned char* pov,
4169     elfcpp::Elf_types<32>::Elf_Addr got_address)
4170 {
4171   memcpy(pov, first_plt_entry, plt_entry_size);
4172   elfcpp::Swap_unaligned<32, false>::writeval(pov + 2, got_address + 4);
4173   elfcpp::Swap<32, false>::writeval(pov + 8, got_address + 8);
4174 }
4175
4176 // The first entry in the PLT for a shared object.
4177
4178 const unsigned char
4179 Output_data_plt_i386_nacl_dyn::first_plt_entry[plt_entry_size] =
4180 {
4181   0xff, 0xb3, 4, 0, 0, 0,       // pushl 4(%ebx)
4182   0x8b, 0x4b, 0x08,             // mov 0x8(%ebx), %ecx
4183   0x83, 0xe1, NACLMASK,         // andl $NACLMASK, %ecx
4184   0xff, 0xe1,                   // jmp *%ecx
4185   0x90, 0x90, 0x90, 0x90, 0x90,  // nops
4186   0x90, 0x90, 0x90, 0x90, 0x90,  // nops
4187   0x90, 0x90, 0x90, 0x90, 0x90,  // nops
4188   0x90, 0x90, 0x90, 0x90, 0x90,  // nops
4189   0x90, 0x90, 0x90, 0x90, 0x90,  // nops
4190   0x90, 0x90, 0x90, 0x90, 0x90,  // nops
4191   0x90, 0x90, 0x90, 0x90, 0x90,  // nops
4192   0x90, 0x90, 0x90, 0x90, 0x90,  // nops
4193   0x90, 0x90, 0x90, 0x90, 0x90,  // nops
4194   0x90, 0x90, 0x90, 0x90, 0x90   // nops
4195 };
4196
4197 void
4198 Output_data_plt_i386_nacl_dyn::do_fill_first_plt_entry(
4199     unsigned char* pov,
4200     elfcpp::Elf_types<32>::Elf_Addr)
4201 {
4202   memcpy(pov, first_plt_entry, plt_entry_size);
4203 }
4204
4205 // Subsequent entries in the PLT for an executable.
4206
4207 const unsigned char
4208 Output_data_plt_i386_nacl_exec::plt_entry[plt_entry_size] =
4209 {
4210   0x8b, 0x0d,                    // movl contents of address, %ecx */
4211   0, 0, 0, 0,                    // replaced with address of symbol in .got
4212   0x83, 0xe1, NACLMASK,          // andl $NACLMASK, %ecx
4213   0xff, 0xe1,                    // jmp *%ecx
4214
4215   // Pad to the next 32-byte boundary with nop instructions.
4216   0x90,
4217   0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
4218   0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
4219
4220   // Lazy GOT entries point here (32-byte aligned).
4221   0x68,                       // pushl immediate
4222   0, 0, 0, 0,                 // replaced with offset into relocation table
4223   0xe9,                       // jmp relative
4224   0, 0, 0, 0,                 // replaced with offset to start of .plt
4225
4226   // Pad to the next 32-byte boundary with nop instructions.
4227   0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
4228   0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
4229   0x90, 0x90
4230 };
4231
4232 unsigned int
4233 Output_data_plt_i386_nacl_exec::do_fill_plt_entry(
4234     unsigned char* pov,
4235     elfcpp::Elf_types<32>::Elf_Addr got_address,
4236     unsigned int got_offset,
4237     unsigned int plt_offset,
4238     unsigned int plt_rel_offset)
4239 {
4240   memcpy(pov, plt_entry, plt_entry_size);
4241   elfcpp::Swap_unaligned<32, false>::writeval(pov + 2,
4242                                               got_address + got_offset);
4243   elfcpp::Swap_unaligned<32, false>::writeval(pov + 33, plt_rel_offset);
4244   elfcpp::Swap<32, false>::writeval(pov + 38, - (plt_offset + 38 + 4));
4245   return 32;
4246 }
4247
4248 // Subsequent entries in the PLT for a shared object.
4249
4250 const unsigned char
4251 Output_data_plt_i386_nacl_dyn::plt_entry[plt_entry_size] =
4252 {
4253   0x8b, 0x8b,          // movl offset(%ebx), %ecx
4254   0, 0, 0, 0,          // replaced with offset of symbol in .got
4255   0x83, 0xe1, 0xe0,    // andl $NACLMASK, %ecx
4256   0xff, 0xe1,          // jmp *%ecx
4257
4258   // Pad to the next 32-byte boundary with nop instructions.
4259   0x90,
4260   0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
4261   0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
4262
4263   // Lazy GOT entries point here (32-byte aligned).
4264   0x68,                // pushl immediate
4265   0, 0, 0, 0,          // replaced with offset into relocation table.
4266   0xe9,                // jmp relative
4267   0, 0, 0, 0,          // replaced with offset to start of .plt.
4268
4269   // Pad to the next 32-byte boundary with nop instructions.
4270   0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
4271   0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
4272   0x90, 0x90
4273 };
4274
4275 unsigned int
4276 Output_data_plt_i386_nacl_dyn::do_fill_plt_entry(
4277     unsigned char* pov,
4278     elfcpp::Elf_types<32>::Elf_Addr,
4279     unsigned int got_offset,
4280     unsigned int plt_offset,
4281     unsigned int plt_rel_offset)
4282 {
4283   memcpy(pov, plt_entry, plt_entry_size);
4284   elfcpp::Swap_unaligned<32, false>::writeval(pov + 2, got_offset);
4285   elfcpp::Swap_unaligned<32, false>::writeval(pov + 33, plt_rel_offset);
4286   elfcpp::Swap<32, false>::writeval(pov + 38, - (plt_offset + 38 + 4));
4287   return 32;
4288 }
4289
4290 const unsigned char
4291 Output_data_plt_i386_nacl::plt_eh_frame_fde[plt_eh_frame_fde_size] =
4292 {
4293   0, 0, 0, 0,                           // Replaced with offset to .plt.
4294   0, 0, 0, 0,                           // Replaced with size of .plt.
4295   0,                                    // Augmentation size.
4296   elfcpp::DW_CFA_def_cfa_offset, 8,     // DW_CFA_def_cfa_offset: 8.
4297   elfcpp::DW_CFA_advance_loc + 6,       // Advance 6 to __PLT__ + 6.
4298   elfcpp::DW_CFA_def_cfa_offset, 12,    // DW_CFA_def_cfa_offset: 12.
4299   elfcpp::DW_CFA_advance_loc + 58,      // Advance 58 to __PLT__ + 64.
4300   elfcpp::DW_CFA_def_cfa_expression,    // DW_CFA_def_cfa_expression.
4301   13,                                   // Block length.
4302   elfcpp::DW_OP_breg4, 4,               // Push %esp + 4.
4303   elfcpp::DW_OP_breg8, 0,               // Push %eip.
4304   elfcpp::DW_OP_const1u, 63,            // Push 0x3f.
4305   elfcpp::DW_OP_and,                    // & (%eip & 0x3f).
4306   elfcpp::DW_OP_const1u, 37,            // Push 0x25.
4307   elfcpp::DW_OP_ge,                     // >= ((%eip & 0x3f) >= 0x25)
4308   elfcpp::DW_OP_lit2,                   // Push 2.
4309   elfcpp::DW_OP_shl,                    // << (((%eip & 0x3f) >= 0x25) << 2)
4310   elfcpp::DW_OP_plus,                   // + ((((%eip&0x3f)>=0x25)<<2)+%esp+4
4311   elfcpp::DW_CFA_nop,                   // Align to 32 bytes.
4312   elfcpp::DW_CFA_nop
4313 };
4314
4315 // Return a string used to fill a code section with nops.
4316 // For NaCl, long NOPs are only valid if they do not cross
4317 // bundle alignment boundaries, so keep it simple with one-byte NOPs.
4318 std::string
4319 Target_i386_nacl::do_code_fill(section_size_type length) const
4320 {
4321   return std::string(length, static_cast<char>(0x90));
4322 }
4323
4324 // The selector for i386-nacl object files.
4325
4326 class Target_selector_i386_nacl
4327   : public Target_selector_nacl<Target_selector_i386, Target_i386_nacl>
4328 {
4329  public:
4330   Target_selector_i386_nacl()
4331     : Target_selector_nacl<Target_selector_i386,
4332                            Target_i386_nacl>("x86-32",
4333                                              "elf32-i386-nacl",
4334                                              "elf_i386_nacl")
4335   { }
4336 };
4337
4338 Target_selector_i386_nacl target_selector_i386;
4339
4340 // IAMCU variant.  It uses EM_IAMCU, not EM_386.
4341
4342 class Target_iamcu : public Target_i386
4343 {
4344  public:
4345   Target_iamcu()
4346     : Target_i386(&iamcu_info)
4347   { }
4348
4349  private:
4350   // Information about this specific target which we pass to the
4351   // general Target structure.
4352   static const Target::Target_info iamcu_info;
4353 };
4354
4355 const Target::Target_info Target_iamcu::iamcu_info =
4356 {
4357   32,                   // size
4358   false,                // is_big_endian
4359   elfcpp::EM_IAMCU,     // machine_code
4360   false,                // has_make_symbol
4361   false,                // has_resolve
4362   true,                 // has_code_fill
4363   true,                 // is_default_stack_executable
4364   true,                 // can_icf_inline_merge_sections
4365   '\0',                 // wrap_char
4366   "/usr/lib/libc.so.1", // dynamic_linker
4367   0x08048000,           // default_text_segment_address
4368   0x1000,               // abi_pagesize (overridable by -z max-page-size)
4369   0x1000,               // common_pagesize (overridable by -z common-page-size)
4370   false,                // isolate_execinstr
4371   0,                    // rosegment_gap
4372   elfcpp::SHN_UNDEF,    // small_common_shndx
4373   elfcpp::SHN_UNDEF,    // large_common_shndx
4374   0,                    // small_common_section_flags
4375   0,                    // large_common_section_flags
4376   NULL,                 // attributes_section
4377   NULL,                 // attributes_vendor
4378   "_start",             // entry_symbol_name
4379   32,                   // hash_entry_size
4380 };
4381
4382 class Target_selector_iamcu : public Target_selector
4383 {
4384 public:
4385   Target_selector_iamcu()
4386     : Target_selector(elfcpp::EM_IAMCU, 32, false, "elf32-iamcu",
4387                       "elf_iamcu")
4388   { }
4389
4390   Target*
4391   do_instantiate_target()
4392   { return new Target_iamcu(); }
4393 };
4394
4395 Target_selector_iamcu target_selector_iamcu;
4396
4397 } // End anonymous namespace.