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