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