Gold: Don't fail on R_386_GOT32X relocation
[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   switch (r_type)
2794     {
2795     case elfcpp::R_386_NONE:
2796     case elfcpp::R_386_GNU_VTINHERIT:
2797     case elfcpp::R_386_GNU_VTENTRY:
2798       break;
2799
2800     case elfcpp::R_386_32:
2801       if (should_apply_static_reloc(gsym, r_type, true, output_section))
2802         Relocate_functions<32, false>::rel32(view, object, psymval);
2803       break;
2804
2805     case elfcpp::R_386_PC32:
2806       if (should_apply_static_reloc(gsym, r_type, true, output_section))
2807         Relocate_functions<32, false>::pcrel32(view, object, psymval, address);
2808       break;
2809
2810     case elfcpp::R_386_16:
2811       if (should_apply_static_reloc(gsym, r_type, false, output_section))
2812         Relocate_functions<32, false>::rel16(view, object, psymval);
2813       break;
2814
2815     case elfcpp::R_386_PC16:
2816       if (should_apply_static_reloc(gsym, r_type, false, output_section))
2817         Relocate_functions<32, false>::pcrel16(view, object, psymval, address);
2818       break;
2819
2820     case elfcpp::R_386_8:
2821       if (should_apply_static_reloc(gsym, r_type, false, output_section))
2822         Relocate_functions<32, false>::rel8(view, object, psymval);
2823       break;
2824
2825     case elfcpp::R_386_PC8:
2826       if (should_apply_static_reloc(gsym, r_type, false, output_section))
2827         Relocate_functions<32, false>::pcrel8(view, object, psymval, address);
2828       break;
2829
2830     case elfcpp::R_386_PLT32:
2831       gold_assert(gsym == NULL
2832                   || gsym->has_plt_offset()
2833                   || gsym->final_value_is_known()
2834                   || (gsym->is_defined()
2835                       && !gsym->is_from_dynobj()
2836                       && !gsym->is_preemptible()));
2837       Relocate_functions<32, false>::pcrel32(view, object, psymval, address);
2838       break;
2839
2840     case elfcpp::R_386_GOT32:
2841     case elfcpp::R_386_GOT32X:
2842       // Convert
2843       // mov foo@GOT(%reg), %reg
2844       // to
2845       // lea foo@GOTOFF(%reg), %reg
2846       // if possible.
2847       if (rel.get_r_offset() >= 2
2848           && view[-2] == 0x8b
2849           && ((gsym == NULL && !psymval->is_ifunc_symbol())
2850               || (gsym != NULL
2851                   && Target_i386::can_convert_mov_to_lea(gsym))))
2852         {
2853           view[-2] = 0x8d;
2854           elfcpp::Elf_types<32>::Elf_Addr value;
2855           value = (psymval->value(object, 0)
2856                    - target->got_plt_section()->address());
2857           Relocate_functions<32, false>::rel32(view, value);
2858         }
2859       else
2860         {
2861           // The GOT pointer points to the end of the GOT section.
2862           // We need to subtract the size of the GOT section to get
2863           // the actual offset to use in the relocation.
2864           unsigned int got_offset = 0;
2865           if (gsym != NULL)
2866             {
2867               gold_assert(gsym->has_got_offset(GOT_TYPE_STANDARD));
2868               got_offset = (gsym->got_offset(GOT_TYPE_STANDARD)
2869                             - target->got_size());
2870             }
2871           else
2872             {
2873               unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
2874               gold_assert(object->local_has_got_offset(r_sym, GOT_TYPE_STANDARD));
2875               got_offset = (object->local_got_offset(r_sym, GOT_TYPE_STANDARD)
2876                             - target->got_size());
2877             }
2878           Relocate_functions<32, false>::rel32(view, got_offset);
2879         }
2880       break;
2881
2882     case elfcpp::R_386_GOTOFF:
2883       {
2884         elfcpp::Elf_types<32>::Elf_Addr value;
2885         value = (psymval->value(object, 0)
2886                  - target->got_plt_section()->address());
2887         Relocate_functions<32, false>::rel32(view, value);
2888       }
2889       break;
2890
2891     case elfcpp::R_386_GOTPC:
2892       {
2893         elfcpp::Elf_types<32>::Elf_Addr value;
2894         value = target->got_plt_section()->address();
2895         Relocate_functions<32, false>::pcrel32(view, value, address);
2896       }
2897       break;
2898
2899     case elfcpp::R_386_COPY:
2900     case elfcpp::R_386_GLOB_DAT:
2901     case elfcpp::R_386_JUMP_SLOT:
2902     case elfcpp::R_386_RELATIVE:
2903     case elfcpp::R_386_IRELATIVE:
2904       // These are outstanding tls relocs, which are unexpected when
2905       // linking.
2906     case elfcpp::R_386_TLS_TPOFF:
2907     case elfcpp::R_386_TLS_DTPMOD32:
2908     case elfcpp::R_386_TLS_DTPOFF32:
2909     case elfcpp::R_386_TLS_TPOFF32:
2910     case elfcpp::R_386_TLS_DESC:
2911       gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
2912                              _("unexpected reloc %u in object file"),
2913                              r_type);
2914       break;
2915
2916       // These are initial tls relocs, which are expected when
2917       // linking.
2918     case elfcpp::R_386_TLS_GD:             // Global-dynamic
2919     case elfcpp::R_386_TLS_GOTDESC:        // Global-dynamic (from ~oliva url)
2920     case elfcpp::R_386_TLS_DESC_CALL:
2921     case elfcpp::R_386_TLS_LDM:            // Local-dynamic
2922     case elfcpp::R_386_TLS_LDO_32:         // Alternate local-dynamic
2923     case elfcpp::R_386_TLS_IE:             // Initial-exec
2924     case elfcpp::R_386_TLS_IE_32:
2925     case elfcpp::R_386_TLS_GOTIE:
2926     case elfcpp::R_386_TLS_LE:             // Local-exec
2927     case elfcpp::R_386_TLS_LE_32:
2928       this->relocate_tls(relinfo, target, relnum, rel, r_type, gsym, psymval,
2929                          view, address, view_size);
2930       break;
2931
2932     case elfcpp::R_386_32PLT:
2933     case elfcpp::R_386_TLS_GD_32:
2934     case elfcpp::R_386_TLS_GD_PUSH:
2935     case elfcpp::R_386_TLS_GD_CALL:
2936     case elfcpp::R_386_TLS_GD_POP:
2937     case elfcpp::R_386_TLS_LDM_32:
2938     case elfcpp::R_386_TLS_LDM_PUSH:
2939     case elfcpp::R_386_TLS_LDM_CALL:
2940     case elfcpp::R_386_TLS_LDM_POP:
2941     case elfcpp::R_386_USED_BY_INTEL_200:
2942     default:
2943       gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
2944                              _("unsupported reloc %u"),
2945                              r_type);
2946       break;
2947     }
2948
2949   return true;
2950 }
2951
2952 // Perform a TLS relocation.
2953
2954 inline void
2955 Target_i386::Relocate::relocate_tls(const Relocate_info<32, false>* relinfo,
2956                                     Target_i386* target,
2957                                     size_t relnum,
2958                                     const elfcpp::Rel<32, false>& rel,
2959                                     unsigned int r_type,
2960                                     const Sized_symbol<32>* gsym,
2961                                     const Symbol_value<32>* psymval,
2962                                     unsigned char* view,
2963                                     elfcpp::Elf_types<32>::Elf_Addr,
2964                                     section_size_type view_size)
2965 {
2966   Output_segment* tls_segment = relinfo->layout->tls_segment();
2967
2968   const Sized_relobj_file<32, false>* object = relinfo->object;
2969
2970   elfcpp::Elf_types<32>::Elf_Addr value = psymval->value(object, 0);
2971
2972   const bool is_final = (gsym == NULL
2973                          ? !parameters->options().shared()
2974                          : gsym->final_value_is_known());
2975   const tls::Tls_optimization optimized_type
2976       = Target_i386::optimize_tls_reloc(is_final, r_type);
2977   switch (r_type)
2978     {
2979     case elfcpp::R_386_TLS_GD:           // Global-dynamic
2980       if (optimized_type == tls::TLSOPT_TO_LE)
2981         {
2982           if (tls_segment == NULL)
2983             {
2984               gold_assert(parameters->errors()->error_count() > 0
2985                           || issue_undefined_symbol_error(gsym));
2986               return;
2987             }
2988           this->tls_gd_to_le(relinfo, relnum, tls_segment,
2989                              rel, r_type, value, view,
2990                              view_size);
2991           break;
2992         }
2993       else
2994         {
2995           unsigned int got_type = (optimized_type == tls::TLSOPT_TO_IE
2996                                    ? GOT_TYPE_TLS_NOFFSET
2997                                    : GOT_TYPE_TLS_PAIR);
2998           unsigned int got_offset;
2999           if (gsym != NULL)
3000             {
3001               gold_assert(gsym->has_got_offset(got_type));
3002               got_offset = gsym->got_offset(got_type) - target->got_size();
3003             }
3004           else
3005             {
3006               unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
3007               gold_assert(object->local_has_got_offset(r_sym, got_type));
3008               got_offset = (object->local_got_offset(r_sym, got_type)
3009                             - target->got_size());
3010             }
3011           if (optimized_type == tls::TLSOPT_TO_IE)
3012             {
3013               this->tls_gd_to_ie(relinfo, relnum, tls_segment, rel, r_type,
3014                                  got_offset, view, view_size);
3015               break;
3016             }
3017           else if (optimized_type == tls::TLSOPT_NONE)
3018             {
3019               // Relocate the field with the offset of the pair of GOT
3020               // entries.
3021               Relocate_functions<32, false>::rel32(view, got_offset);
3022               break;
3023             }
3024         }
3025       gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
3026                              _("unsupported reloc %u"),
3027                              r_type);
3028       break;
3029
3030     case elfcpp::R_386_TLS_GOTDESC:      // Global-dynamic (from ~oliva url)
3031     case elfcpp::R_386_TLS_DESC_CALL:
3032       this->local_dynamic_type_ = LOCAL_DYNAMIC_GNU;
3033       if (optimized_type == tls::TLSOPT_TO_LE)
3034         {
3035           if (tls_segment == NULL)
3036             {
3037               gold_assert(parameters->errors()->error_count() > 0
3038                           || issue_undefined_symbol_error(gsym));
3039               return;
3040             }
3041           this->tls_desc_gd_to_le(relinfo, relnum, tls_segment,
3042                                   rel, r_type, value, view,
3043                                   view_size);
3044           break;
3045         }
3046       else
3047         {
3048           unsigned int got_type = (optimized_type == tls::TLSOPT_TO_IE
3049                                    ? GOT_TYPE_TLS_NOFFSET
3050                                    : GOT_TYPE_TLS_DESC);
3051           unsigned int got_offset = 0;
3052           if (r_type == elfcpp::R_386_TLS_GOTDESC
3053               && optimized_type == tls::TLSOPT_NONE)
3054             {
3055               // We created GOT entries in the .got.tlsdesc portion of
3056               // the .got.plt section, but the offset stored in the
3057               // symbol is the offset within .got.tlsdesc.
3058               got_offset = (target->got_size()
3059                             + target->got_plt_section()->data_size());
3060             }
3061           if (gsym != NULL)
3062             {
3063               gold_assert(gsym->has_got_offset(got_type));
3064               got_offset += gsym->got_offset(got_type) - target->got_size();
3065             }
3066           else
3067             {
3068               unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
3069               gold_assert(object->local_has_got_offset(r_sym, got_type));
3070               got_offset += (object->local_got_offset(r_sym, got_type)
3071                              - target->got_size());
3072             }
3073           if (optimized_type == tls::TLSOPT_TO_IE)
3074             {
3075               if (tls_segment == NULL)
3076                 {
3077                   gold_assert(parameters->errors()->error_count() > 0
3078                               || issue_undefined_symbol_error(gsym));
3079                   return;
3080                 }
3081               this->tls_desc_gd_to_ie(relinfo, relnum, tls_segment, rel, r_type,
3082                                       got_offset, view, view_size);
3083               break;
3084             }
3085           else if (optimized_type == tls::TLSOPT_NONE)
3086             {
3087               if (r_type == elfcpp::R_386_TLS_GOTDESC)
3088                 {
3089                   // Relocate the field with the offset of the pair of GOT
3090                   // entries.
3091                   Relocate_functions<32, false>::rel32(view, got_offset);
3092                 }
3093               break;
3094             }
3095         }
3096       gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
3097                              _("unsupported reloc %u"),
3098                              r_type);
3099       break;
3100
3101     case elfcpp::R_386_TLS_LDM:          // Local-dynamic
3102       if (this->local_dynamic_type_ == LOCAL_DYNAMIC_SUN)
3103         {
3104           gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
3105                                  _("both SUN and GNU model "
3106                                    "TLS relocations"));
3107           break;
3108         }
3109       this->local_dynamic_type_ = LOCAL_DYNAMIC_GNU;
3110       if (optimized_type == tls::TLSOPT_TO_LE)
3111         {
3112           if (tls_segment == NULL)
3113             {
3114               gold_assert(parameters->errors()->error_count() > 0
3115                           || issue_undefined_symbol_error(gsym));
3116               return;
3117             }
3118           this->tls_ld_to_le(relinfo, relnum, tls_segment, rel, r_type,
3119                              value, view, view_size);
3120           break;
3121         }
3122       else if (optimized_type == tls::TLSOPT_NONE)
3123         {
3124           // Relocate the field with the offset of the GOT entry for
3125           // the module index.
3126           unsigned int got_offset;
3127           got_offset = (target->got_mod_index_entry(NULL, NULL, NULL)
3128                         - target->got_size());
3129           Relocate_functions<32, false>::rel32(view, got_offset);
3130           break;
3131         }
3132       gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
3133                              _("unsupported reloc %u"),
3134                              r_type);
3135       break;
3136
3137     case elfcpp::R_386_TLS_LDO_32:       // Alternate local-dynamic
3138       if (optimized_type == tls::TLSOPT_TO_LE)
3139         {
3140           // This reloc can appear in debugging sections, in which
3141           // case we must not convert to local-exec.  We decide what
3142           // to do based on whether the section is marked as
3143           // containing executable code.  That is what the GNU linker
3144           // does as well.
3145           elfcpp::Shdr<32, false> shdr(relinfo->data_shdr);
3146           if ((shdr.get_sh_flags() & elfcpp::SHF_EXECINSTR) != 0)
3147             {
3148               if (tls_segment == NULL)
3149                 {
3150                   gold_assert(parameters->errors()->error_count() > 0
3151                               || issue_undefined_symbol_error(gsym));
3152                   return;
3153                 }
3154               value -= tls_segment->memsz();
3155             }
3156         }
3157       Relocate_functions<32, false>::rel32(view, value);
3158       break;
3159
3160     case elfcpp::R_386_TLS_IE:           // Initial-exec
3161     case elfcpp::R_386_TLS_GOTIE:
3162     case elfcpp::R_386_TLS_IE_32:
3163       if (optimized_type == tls::TLSOPT_TO_LE)
3164         {
3165           if (tls_segment == NULL)
3166             {
3167               gold_assert(parameters->errors()->error_count() > 0
3168                           || issue_undefined_symbol_error(gsym));
3169               return;
3170             }
3171           Target_i386::Relocate::tls_ie_to_le(relinfo, relnum, tls_segment,
3172                                               rel, r_type, value, view,
3173                                               view_size);
3174           break;
3175         }
3176       else if (optimized_type == tls::TLSOPT_NONE)
3177         {
3178           // Relocate the field with the offset of the GOT entry for
3179           // the tp-relative offset of the symbol.
3180           unsigned int got_type = (r_type == elfcpp::R_386_TLS_IE_32
3181                                    ? GOT_TYPE_TLS_OFFSET
3182                                    : GOT_TYPE_TLS_NOFFSET);
3183           unsigned int got_offset;
3184           if (gsym != NULL)
3185             {
3186               gold_assert(gsym->has_got_offset(got_type));
3187               got_offset = gsym->got_offset(got_type);
3188             }
3189           else
3190             {
3191               unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info());
3192               gold_assert(object->local_has_got_offset(r_sym, got_type));
3193               got_offset = object->local_got_offset(r_sym, got_type);
3194             }
3195           // For the R_386_TLS_IE relocation, we need to apply the
3196           // absolute address of the GOT entry.
3197           if (r_type == elfcpp::R_386_TLS_IE)
3198             got_offset += target->got_plt_section()->address();
3199           // All GOT offsets are relative to the end of the GOT.
3200           got_offset -= target->got_size();
3201           Relocate_functions<32, false>::rel32(view, got_offset);
3202           break;
3203         }
3204       gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
3205                              _("unsupported reloc %u"),
3206                              r_type);
3207       break;
3208
3209     case elfcpp::R_386_TLS_LE:           // Local-exec
3210       // If we're creating a shared library, a dynamic relocation will
3211       // have been created for this location, so do not apply it now.
3212       if (!parameters->options().shared())
3213         {
3214           if (tls_segment == NULL)
3215             {
3216               gold_assert(parameters->errors()->error_count() > 0
3217                           || issue_undefined_symbol_error(gsym));
3218               return;
3219             }
3220           value -= tls_segment->memsz();
3221           Relocate_functions<32, false>::rel32(view, value);
3222         }
3223       break;
3224
3225     case elfcpp::R_386_TLS_LE_32:
3226       // If we're creating a shared library, a dynamic relocation will
3227       // have been created for this location, so do not apply it now.
3228       if (!parameters->options().shared())
3229         {
3230           if (tls_segment == NULL)
3231             {
3232               gold_assert(parameters->errors()->error_count() > 0
3233                           || issue_undefined_symbol_error(gsym));
3234               return;
3235             }
3236           value = tls_segment->memsz() - value;
3237           Relocate_functions<32, false>::rel32(view, value);
3238         }
3239       break;
3240     }
3241 }
3242
3243 // Do a relocation in which we convert a TLS General-Dynamic to a
3244 // Local-Exec.
3245
3246 inline void
3247 Target_i386::Relocate::tls_gd_to_le(const Relocate_info<32, false>* relinfo,
3248                                     size_t relnum,
3249                                     Output_segment* tls_segment,
3250                                     const elfcpp::Rel<32, false>& rel,
3251                                     unsigned int,
3252                                     elfcpp::Elf_types<32>::Elf_Addr value,
3253                                     unsigned char* view,
3254                                     section_size_type view_size)
3255 {
3256   // leal foo(,%reg,1),%eax; call ___tls_get_addr
3257   //  ==> movl %gs:0,%eax; subl $foo@tpoff,%eax
3258   // leal foo(%reg),%eax; call ___tls_get_addr
3259   //  ==> movl %gs:0,%eax; subl $foo@tpoff,%eax
3260
3261   tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, -2);
3262   tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, 9);
3263
3264   unsigned char op1 = view[-1];
3265   unsigned char op2 = view[-2];
3266
3267   tls::check_tls(relinfo, relnum, rel.get_r_offset(),
3268                  op2 == 0x8d || op2 == 0x04);
3269   tls::check_tls(relinfo, relnum, rel.get_r_offset(), view[4] == 0xe8);
3270
3271   int roff = 5;
3272
3273   if (op2 == 0x04)
3274     {
3275       tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, -3);
3276       tls::check_tls(relinfo, relnum, rel.get_r_offset(), view[-3] == 0x8d);
3277       tls::check_tls(relinfo, relnum, rel.get_r_offset(),
3278                      ((op1 & 0xc7) == 0x05 && op1 != (4 << 3)));
3279       memcpy(view - 3, "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12);
3280     }
3281   else
3282     {
3283       tls::check_tls(relinfo, relnum, rel.get_r_offset(),
3284                      (op1 & 0xf8) == 0x80 && (op1 & 7) != 4);
3285       if (rel.get_r_offset() + 9 < view_size
3286           && view[9] == 0x90)
3287         {
3288           // There is a trailing nop.  Use the size byte subl.
3289           memcpy(view - 2, "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12);
3290           roff = 6;
3291         }
3292       else
3293         {
3294           // Use the five byte subl.
3295           memcpy(view - 2, "\x65\xa1\0\0\0\0\x2d\0\0\0", 11);
3296         }
3297     }
3298
3299   value = tls_segment->memsz() - value;
3300   Relocate_functions<32, false>::rel32(view + roff, value);
3301
3302   // The next reloc should be a PLT32 reloc against __tls_get_addr.
3303   // We can skip it.
3304   this->skip_call_tls_get_addr_ = true;
3305 }
3306
3307 // Do a relocation in which we convert a TLS General-Dynamic to an
3308 // Initial-Exec.
3309
3310 inline void
3311 Target_i386::Relocate::tls_gd_to_ie(const Relocate_info<32, false>* relinfo,
3312                                     size_t relnum,
3313                                     Output_segment*,
3314                                     const elfcpp::Rel<32, false>& rel,
3315                                     unsigned int,
3316                                     elfcpp::Elf_types<32>::Elf_Addr value,
3317                                     unsigned char* view,
3318                                     section_size_type view_size)
3319 {
3320   // leal foo(,%ebx,1),%eax; call ___tls_get_addr
3321   //  ==> movl %gs:0,%eax; addl foo@gotntpoff(%ebx),%eax
3322   // leal foo(%ebx),%eax; call ___tls_get_addr; nop
3323   //  ==> movl %gs:0,%eax; addl foo@gotntpoff(%ebx),%eax
3324
3325   tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, -2);
3326   tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, 9);
3327
3328   unsigned char op1 = view[-1];
3329   unsigned char op2 = view[-2];
3330
3331   tls::check_tls(relinfo, relnum, rel.get_r_offset(),
3332                  op2 == 0x8d || op2 == 0x04);
3333   tls::check_tls(relinfo, relnum, rel.get_r_offset(), view[4] == 0xe8);
3334
3335   int roff;
3336
3337   if (op2 == 0x04)
3338     {
3339       tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, -3);
3340       tls::check_tls(relinfo, relnum, rel.get_r_offset(), view[-3] == 0x8d);
3341       tls::check_tls(relinfo, relnum, rel.get_r_offset(),
3342                      ((op1 & 0xc7) == 0x05 && op1 != (4 << 3)));
3343       roff = 5;
3344     }
3345   else
3346     {
3347       tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, 10);
3348       tls::check_tls(relinfo, relnum, rel.get_r_offset(),
3349                      (op1 & 0xf8) == 0x80 && (op1 & 7) != 4);
3350       tls::check_tls(relinfo, relnum, rel.get_r_offset(), view[9] == 0x90);
3351       roff = 6;
3352     }
3353
3354   memcpy(view + roff - 8, "\x65\xa1\0\0\0\0\x03\x83\0\0\0", 12);
3355   Relocate_functions<32, false>::rel32(view + roff, value);
3356
3357   // The next reloc should be a PLT32 reloc against __tls_get_addr.
3358   // We can skip it.
3359   this->skip_call_tls_get_addr_ = true;
3360 }
3361
3362 // Do a relocation in which we convert a TLS_GOTDESC or TLS_DESC_CALL
3363 // General-Dynamic to a Local-Exec.
3364
3365 inline void
3366 Target_i386::Relocate::tls_desc_gd_to_le(
3367     const Relocate_info<32, false>* relinfo,
3368     size_t relnum,
3369     Output_segment* tls_segment,
3370     const elfcpp::Rel<32, false>& rel,
3371     unsigned int r_type,
3372     elfcpp::Elf_types<32>::Elf_Addr value,
3373     unsigned char* view,
3374     section_size_type view_size)
3375 {
3376   if (r_type == elfcpp::R_386_TLS_GOTDESC)
3377     {
3378       // leal foo@TLSDESC(%ebx), %eax
3379       // ==> leal foo@NTPOFF, %eax
3380       tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, -2);
3381       tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, 4);
3382       tls::check_tls(relinfo, relnum, rel.get_r_offset(),
3383                      view[-2] == 0x8d && view[-1] == 0x83);
3384       view[-1] = 0x05;
3385       value -= tls_segment->memsz();
3386       Relocate_functions<32, false>::rel32(view, value);
3387     }
3388   else
3389     {
3390       // call *foo@TLSCALL(%eax)
3391       // ==> nop; nop
3392       gold_assert(r_type == elfcpp::R_386_TLS_DESC_CALL);
3393       tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, 2);
3394       tls::check_tls(relinfo, relnum, rel.get_r_offset(),
3395                      view[0] == 0xff && view[1] == 0x10);
3396       view[0] = 0x66;
3397       view[1] = 0x90;
3398     }
3399 }
3400
3401 // Do a relocation in which we convert a TLS_GOTDESC or TLS_DESC_CALL
3402 // General-Dynamic to an Initial-Exec.
3403
3404 inline void
3405 Target_i386::Relocate::tls_desc_gd_to_ie(
3406     const Relocate_info<32, false>* relinfo,
3407     size_t relnum,
3408     Output_segment*,
3409     const elfcpp::Rel<32, false>& rel,
3410     unsigned int r_type,
3411     elfcpp::Elf_types<32>::Elf_Addr value,
3412     unsigned char* view,
3413     section_size_type view_size)
3414 {
3415   if (r_type == elfcpp::R_386_TLS_GOTDESC)
3416     {
3417       // leal foo@TLSDESC(%ebx), %eax
3418       // ==> movl foo@GOTNTPOFF(%ebx), %eax
3419       tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, -2);
3420       tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, 4);
3421       tls::check_tls(relinfo, relnum, rel.get_r_offset(),
3422                      view[-2] == 0x8d && view[-1] == 0x83);
3423       view[-2] = 0x8b;
3424       Relocate_functions<32, false>::rel32(view, value);
3425     }
3426   else
3427     {
3428       // call *foo@TLSCALL(%eax)
3429       // ==> nop; nop
3430       gold_assert(r_type == elfcpp::R_386_TLS_DESC_CALL);
3431       tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, 2);
3432       tls::check_tls(relinfo, relnum, rel.get_r_offset(),
3433                      view[0] == 0xff && view[1] == 0x10);
3434       view[0] = 0x66;
3435       view[1] = 0x90;
3436     }
3437 }
3438
3439 // Do a relocation in which we convert a TLS Local-Dynamic to a
3440 // Local-Exec.
3441
3442 inline void
3443 Target_i386::Relocate::tls_ld_to_le(const Relocate_info<32, false>* relinfo,
3444                                     size_t relnum,
3445                                     Output_segment*,
3446                                     const elfcpp::Rel<32, false>& rel,
3447                                     unsigned int,
3448                                     elfcpp::Elf_types<32>::Elf_Addr,
3449                                     unsigned char* view,
3450                                     section_size_type view_size)
3451 {
3452   // leal foo(%reg), %eax; call ___tls_get_addr
3453   // ==> movl %gs:0,%eax; nop; leal 0(%esi,1),%esi
3454
3455   tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, -2);
3456   tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, 9);
3457
3458   // FIXME: Does this test really always pass?
3459   tls::check_tls(relinfo, relnum, rel.get_r_offset(),
3460                  view[-2] == 0x8d && view[-1] == 0x83);
3461
3462   tls::check_tls(relinfo, relnum, rel.get_r_offset(), view[4] == 0xe8);
3463
3464   memcpy(view - 2, "\x65\xa1\0\0\0\0\x90\x8d\x74\x26\0", 11);
3465
3466   // The next reloc should be a PLT32 reloc against __tls_get_addr.
3467   // We can skip it.
3468   this->skip_call_tls_get_addr_ = true;
3469 }
3470
3471 // Do a relocation in which we convert a TLS Initial-Exec to a
3472 // Local-Exec.
3473
3474 inline void
3475 Target_i386::Relocate::tls_ie_to_le(const Relocate_info<32, false>* relinfo,
3476                                     size_t relnum,
3477                                     Output_segment* tls_segment,
3478                                     const elfcpp::Rel<32, false>& rel,
3479                                     unsigned int r_type,
3480                                     elfcpp::Elf_types<32>::Elf_Addr value,
3481                                     unsigned char* view,
3482                                     section_size_type view_size)
3483 {
3484   // We have to actually change the instructions, which means that we
3485   // need to examine the opcodes to figure out which instruction we
3486   // are looking at.
3487   if (r_type == elfcpp::R_386_TLS_IE)
3488     {
3489       // movl %gs:XX,%eax  ==>  movl $YY,%eax
3490       // movl %gs:XX,%reg  ==>  movl $YY,%reg
3491       // addl %gs:XX,%reg  ==>  addl $YY,%reg
3492       tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, -1);
3493       tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, 4);
3494
3495       unsigned char op1 = view[-1];
3496       if (op1 == 0xa1)
3497         {
3498           // movl XX,%eax  ==>  movl $YY,%eax
3499           view[-1] = 0xb8;
3500         }
3501       else
3502         {
3503           tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, -2);
3504
3505           unsigned char op2 = view[-2];
3506           if (op2 == 0x8b)
3507             {
3508               // movl XX,%reg  ==>  movl $YY,%reg
3509               tls::check_tls(relinfo, relnum, rel.get_r_offset(),
3510                              (op1 & 0xc7) == 0x05);
3511               view[-2] = 0xc7;
3512               view[-1] = 0xc0 | ((op1 >> 3) & 7);
3513             }
3514           else if (op2 == 0x03)
3515             {
3516               // addl XX,%reg  ==>  addl $YY,%reg
3517               tls::check_tls(relinfo, relnum, rel.get_r_offset(),
3518                              (op1 & 0xc7) == 0x05);
3519               view[-2] = 0x81;
3520               view[-1] = 0xc0 | ((op1 >> 3) & 7);
3521             }
3522           else
3523             tls::check_tls(relinfo, relnum, rel.get_r_offset(), 0);
3524         }
3525     }
3526   else
3527     {
3528       // subl %gs:XX(%reg1),%reg2  ==>  subl $YY,%reg2
3529       // movl %gs:XX(%reg1),%reg2  ==>  movl $YY,%reg2
3530       // addl %gs:XX(%reg1),%reg2  ==>  addl $YY,$reg2
3531       tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, -2);
3532       tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, 4);
3533
3534       unsigned char op1 = view[-1];
3535       unsigned char op2 = view[-2];
3536       tls::check_tls(relinfo, relnum, rel.get_r_offset(),
3537                      (op1 & 0xc0) == 0x80 && (op1 & 7) != 4);
3538       if (op2 == 0x8b)
3539         {
3540           // movl %gs:XX(%reg1),%reg2  ==>  movl $YY,%reg2
3541           view[-2] = 0xc7;
3542           view[-1] = 0xc0 | ((op1 >> 3) & 7);
3543         }
3544       else if (op2 == 0x2b)
3545         {
3546           // subl %gs:XX(%reg1),%reg2  ==>  subl $YY,%reg2
3547           view[-2] = 0x81;
3548           view[-1] = 0xe8 | ((op1 >> 3) & 7);
3549         }
3550       else if (op2 == 0x03)
3551         {
3552           // addl %gs:XX(%reg1),%reg2  ==>  addl $YY,$reg2
3553           view[-2] = 0x81;
3554           view[-1] = 0xc0 | ((op1 >> 3) & 7);
3555         }
3556       else
3557         tls::check_tls(relinfo, relnum, rel.get_r_offset(), 0);
3558     }
3559
3560   value = tls_segment->memsz() - value;
3561   if (r_type == elfcpp::R_386_TLS_IE || r_type == elfcpp::R_386_TLS_GOTIE)
3562     value = - value;
3563
3564   Relocate_functions<32, false>::rel32(view, value);
3565 }
3566
3567 // Relocate section data.
3568
3569 void
3570 Target_i386::relocate_section(const Relocate_info<32, false>* relinfo,
3571                               unsigned int sh_type,
3572                               const unsigned char* prelocs,
3573                               size_t reloc_count,
3574                               Output_section* output_section,
3575                               bool needs_special_offset_handling,
3576                               unsigned char* view,
3577                               elfcpp::Elf_types<32>::Elf_Addr address,
3578                               section_size_type view_size,
3579                               const Reloc_symbol_changes* reloc_symbol_changes)
3580 {
3581   gold_assert(sh_type == elfcpp::SHT_REL);
3582
3583   gold::relocate_section<32, false, Target_i386, elfcpp::SHT_REL,
3584                          Target_i386::Relocate, gold::Default_comdat_behavior>(
3585     relinfo,
3586     this,
3587     prelocs,
3588     reloc_count,
3589     output_section,
3590     needs_special_offset_handling,
3591     view,
3592     address,
3593     view_size,
3594     reloc_symbol_changes);
3595 }
3596
3597 // Return the size of a relocation while scanning during a relocatable
3598 // link.
3599
3600 unsigned int
3601 Target_i386::Relocatable_size_for_reloc::get_size_for_reloc(
3602     unsigned int r_type,
3603     Relobj* object)
3604 {
3605   switch (r_type)
3606     {
3607     case elfcpp::R_386_NONE:
3608     case elfcpp::R_386_GNU_VTINHERIT:
3609     case elfcpp::R_386_GNU_VTENTRY:
3610     case elfcpp::R_386_TLS_GD:            // Global-dynamic
3611     case elfcpp::R_386_TLS_GOTDESC:       // Global-dynamic (from ~oliva url)
3612     case elfcpp::R_386_TLS_DESC_CALL:
3613     case elfcpp::R_386_TLS_LDM:           // Local-dynamic
3614     case elfcpp::R_386_TLS_LDO_32:        // Alternate local-dynamic
3615     case elfcpp::R_386_TLS_IE:            // Initial-exec
3616     case elfcpp::R_386_TLS_IE_32:
3617     case elfcpp::R_386_TLS_GOTIE:
3618     case elfcpp::R_386_TLS_LE:            // Local-exec
3619     case elfcpp::R_386_TLS_LE_32:
3620       return 0;
3621
3622     case elfcpp::R_386_32:
3623     case elfcpp::R_386_PC32:
3624     case elfcpp::R_386_GOT32:
3625     case elfcpp::R_386_GOT32X:
3626     case elfcpp::R_386_PLT32:
3627     case elfcpp::R_386_GOTOFF:
3628     case elfcpp::R_386_GOTPC:
3629      return 4;
3630
3631     case elfcpp::R_386_16:
3632     case elfcpp::R_386_PC16:
3633       return 2;
3634
3635     case elfcpp::R_386_8:
3636     case elfcpp::R_386_PC8:
3637       return 1;
3638
3639       // These are relocations which should only be seen by the
3640       // dynamic linker, and should never be seen here.
3641     case elfcpp::R_386_COPY:
3642     case elfcpp::R_386_GLOB_DAT:
3643     case elfcpp::R_386_JUMP_SLOT:
3644     case elfcpp::R_386_RELATIVE:
3645     case elfcpp::R_386_IRELATIVE:
3646     case elfcpp::R_386_TLS_TPOFF:
3647     case elfcpp::R_386_TLS_DTPMOD32:
3648     case elfcpp::R_386_TLS_DTPOFF32:
3649     case elfcpp::R_386_TLS_TPOFF32:
3650     case elfcpp::R_386_TLS_DESC:
3651       object->error(_("unexpected reloc %u in object file"), r_type);
3652       return 0;
3653
3654     case elfcpp::R_386_32PLT:
3655     case elfcpp::R_386_TLS_GD_32:
3656     case elfcpp::R_386_TLS_GD_PUSH:
3657     case elfcpp::R_386_TLS_GD_CALL:
3658     case elfcpp::R_386_TLS_GD_POP:
3659     case elfcpp::R_386_TLS_LDM_32:
3660     case elfcpp::R_386_TLS_LDM_PUSH:
3661     case elfcpp::R_386_TLS_LDM_CALL:
3662     case elfcpp::R_386_TLS_LDM_POP:
3663     case elfcpp::R_386_USED_BY_INTEL_200:
3664     default:
3665       object->error(_("unsupported reloc %u in object file"), r_type);
3666       return 0;
3667     }
3668 }
3669
3670 // Scan the relocs during a relocatable link.
3671
3672 void
3673 Target_i386::scan_relocatable_relocs(Symbol_table* symtab,
3674                                      Layout* layout,
3675                                      Sized_relobj_file<32, false>* object,
3676                                      unsigned int data_shndx,
3677                                      unsigned int sh_type,
3678                                      const unsigned char* prelocs,
3679                                      size_t reloc_count,
3680                                      Output_section* output_section,
3681                                      bool needs_special_offset_handling,
3682                                      size_t local_symbol_count,
3683                                      const unsigned char* plocal_symbols,
3684                                      Relocatable_relocs* rr)
3685 {
3686   gold_assert(sh_type == elfcpp::SHT_REL);
3687
3688   typedef gold::Default_scan_relocatable_relocs<elfcpp::SHT_REL,
3689     Relocatable_size_for_reloc> Scan_relocatable_relocs;
3690
3691   gold::scan_relocatable_relocs<32, false, elfcpp::SHT_REL,
3692       Scan_relocatable_relocs>(
3693     symtab,
3694     layout,
3695     object,
3696     data_shndx,
3697     prelocs,
3698     reloc_count,
3699     output_section,
3700     needs_special_offset_handling,
3701     local_symbol_count,
3702     plocal_symbols,
3703     rr);
3704 }
3705
3706 // Emit relocations for a section.
3707
3708 void
3709 Target_i386::relocate_relocs(
3710     const Relocate_info<32, false>* relinfo,
3711     unsigned int sh_type,
3712     const unsigned char* prelocs,
3713     size_t reloc_count,
3714     Output_section* output_section,
3715     elfcpp::Elf_types<32>::Elf_Off offset_in_output_section,
3716     const Relocatable_relocs* rr,
3717     unsigned char* view,
3718     elfcpp::Elf_types<32>::Elf_Addr view_address,
3719     section_size_type view_size,
3720     unsigned char* reloc_view,
3721     section_size_type reloc_view_size)
3722 {
3723   gold_assert(sh_type == elfcpp::SHT_REL);
3724
3725   gold::relocate_relocs<32, false, elfcpp::SHT_REL>(
3726     relinfo,
3727     prelocs,
3728     reloc_count,
3729     output_section,
3730     offset_in_output_section,
3731     rr,
3732     view,
3733     view_address,
3734     view_size,
3735     reloc_view,
3736     reloc_view_size);
3737 }
3738
3739 // Return the value to use for a dynamic which requires special
3740 // treatment.  This is how we support equality comparisons of function
3741 // pointers across shared library boundaries, as described in the
3742 // processor specific ABI supplement.
3743
3744 uint64_t
3745 Target_i386::do_dynsym_value(const Symbol* gsym) const
3746 {
3747   gold_assert(gsym->is_from_dynobj() && gsym->has_plt_offset());
3748   return this->plt_address_for_global(gsym);
3749 }
3750
3751 // Return a string used to fill a code section with nops to take up
3752 // the specified length.
3753
3754 std::string
3755 Target_i386::do_code_fill(section_size_type length) const
3756 {
3757   if (length >= 16)
3758     {
3759       // Build a jmp instruction to skip over the bytes.
3760       unsigned char jmp[5];
3761       jmp[0] = 0xe9;
3762       elfcpp::Swap_unaligned<32, false>::writeval(jmp + 1, length - 5);
3763       return (std::string(reinterpret_cast<char*>(&jmp[0]), 5)
3764               + std::string(length - 5, static_cast<char>(0x90)));
3765     }
3766
3767   // Nop sequences of various lengths.
3768   const char nop1[1] = { '\x90' };                   // nop
3769   const char nop2[2] = { '\x66', '\x90' };           // xchg %ax %ax
3770   const char nop3[3] = { '\x8d', '\x76', '\x00' };   // leal 0(%esi),%esi
3771   const char nop4[4] = { '\x8d', '\x74', '\x26',     // leal 0(%esi,1),%esi
3772                          '\x00'};
3773   const char nop5[5] = { '\x90', '\x8d', '\x74',     // nop
3774                          '\x26', '\x00' };           // leal 0(%esi,1),%esi
3775   const char nop6[6] = { '\x8d', '\xb6', '\x00',     // leal 0L(%esi),%esi
3776                          '\x00', '\x00', '\x00' };
3777   const char nop7[7] = { '\x8d', '\xb4', '\x26',     // leal 0L(%esi,1),%esi
3778                          '\x00', '\x00', '\x00',
3779                          '\x00' };
3780   const char nop8[8] = { '\x90', '\x8d', '\xb4',     // nop
3781                          '\x26', '\x00', '\x00',     // leal 0L(%esi,1),%esi
3782                          '\x00', '\x00' };
3783   const char nop9[9] = { '\x89', '\xf6', '\x8d',     // movl %esi,%esi
3784                          '\xbc', '\x27', '\x00',     // leal 0L(%edi,1),%edi
3785                          '\x00', '\x00', '\x00' };
3786   const char nop10[10] = { '\x8d', '\x76', '\x00',   // leal 0(%esi),%esi
3787                            '\x8d', '\xbc', '\x27',   // leal 0L(%edi,1),%edi
3788                            '\x00', '\x00', '\x00',
3789                            '\x00' };
3790   const char nop11[11] = { '\x8d', '\x74', '\x26',   // leal 0(%esi,1),%esi
3791                            '\x00', '\x8d', '\xbc',   // leal 0L(%edi,1),%edi
3792                            '\x27', '\x00', '\x00',
3793                            '\x00', '\x00' };
3794   const char nop12[12] = { '\x8d', '\xb6', '\x00',   // leal 0L(%esi),%esi
3795                            '\x00', '\x00', '\x00',   // leal 0L(%edi),%edi
3796                            '\x8d', '\xbf', '\x00',
3797                            '\x00', '\x00', '\x00' };
3798   const char nop13[13] = { '\x8d', '\xb6', '\x00',   // leal 0L(%esi),%esi
3799                            '\x00', '\x00', '\x00',   // leal 0L(%edi,1),%edi
3800                            '\x8d', '\xbc', '\x27',
3801                            '\x00', '\x00', '\x00',
3802                            '\x00' };
3803   const char nop14[14] = { '\x8d', '\xb4', '\x26',   // leal 0L(%esi,1),%esi
3804                            '\x00', '\x00', '\x00',   // leal 0L(%edi,1),%edi
3805                            '\x00', '\x8d', '\xbc',
3806                            '\x27', '\x00', '\x00',
3807                            '\x00', '\x00' };
3808   const char nop15[15] = { '\xeb', '\x0d', '\x90',   // jmp .+15
3809                            '\x90', '\x90', '\x90',   // nop,nop,nop,...
3810                            '\x90', '\x90', '\x90',
3811                            '\x90', '\x90', '\x90',
3812                            '\x90', '\x90', '\x90' };
3813
3814   const char* nops[16] = {
3815     NULL,
3816     nop1, nop2, nop3, nop4, nop5, nop6, nop7,
3817     nop8, nop9, nop10, nop11, nop12, nop13, nop14, nop15
3818   };
3819
3820   return std::string(nops[length], length);
3821 }
3822
3823 // Return the value to use for the base of a DW_EH_PE_datarel offset
3824 // in an FDE.  Solaris and SVR4 use DW_EH_PE_datarel because their
3825 // assembler can not write out the difference between two labels in
3826 // different sections, so instead of using a pc-relative value they
3827 // use an offset from the GOT.
3828
3829 uint64_t
3830 Target_i386::do_ehframe_datarel_base() const
3831 {
3832   gold_assert(this->global_offset_table_ != NULL);
3833   Symbol* sym = this->global_offset_table_;
3834   Sized_symbol<32>* ssym = static_cast<Sized_symbol<32>*>(sym);
3835   return ssym->value();
3836 }
3837
3838 // Return whether SYM should be treated as a call to a non-split
3839 // function.  We don't want that to be true of a call to a
3840 // get_pc_thunk function.
3841
3842 bool
3843 Target_i386::do_is_call_to_non_split(const Symbol* sym, unsigned int) const
3844 {
3845   return (sym->type() == elfcpp::STT_FUNC
3846           && !is_prefix_of("__i686.get_pc_thunk.", sym->name()));
3847 }
3848
3849 // FNOFFSET in section SHNDX in OBJECT is the start of a function
3850 // compiled with -fsplit-stack.  The function calls non-split-stack
3851 // code.  We have to change the function so that it always ensures
3852 // that it has enough stack space to run some random function.
3853
3854 void
3855 Target_i386::do_calls_non_split(Relobj* object, unsigned int shndx,
3856                                        section_offset_type fnoffset,
3857                                        section_size_type fnsize,
3858                                        unsigned char* view,
3859                                        section_size_type view_size,
3860                                        std::string* from,
3861                                        std::string* to) const
3862 {
3863   // The function starts with a comparison of the stack pointer and a
3864   // field in the TCB.  This is followed by a jump.
3865
3866   // cmp %gs:NN,%esp
3867   if (this->match_view(view, view_size, fnoffset, "\x65\x3b\x25", 3)
3868       && fnsize > 7)
3869     {
3870       // We will call __morestack if the carry flag is set after this
3871       // comparison.  We turn the comparison into an stc instruction
3872       // and some nops.
3873       view[fnoffset] = '\xf9';
3874       this->set_view_to_nop(view, view_size, fnoffset + 1, 6);
3875     }
3876   // lea NN(%esp),%ecx
3877   // lea NN(%esp),%edx
3878   else if ((this->match_view(view, view_size, fnoffset, "\x8d\x8c\x24", 3)
3879             || this->match_view(view, view_size, fnoffset, "\x8d\x94\x24", 3))
3880            && fnsize > 7)
3881     {
3882       // This is loading an offset from the stack pointer for a
3883       // comparison.  The offset is negative, so we decrease the
3884       // offset by the amount of space we need for the stack.  This
3885       // means we will avoid calling __morestack if there happens to
3886       // be plenty of space on the stack already.
3887       unsigned char* pval = view + fnoffset + 3;
3888       uint32_t val = elfcpp::Swap_unaligned<32, false>::readval(pval);
3889       val -= parameters->options().split_stack_adjust_size();
3890       elfcpp::Swap_unaligned<32, false>::writeval(pval, val);
3891     }
3892   else
3893     {
3894       if (!object->has_no_split_stack())
3895         object->error(_("failed to match split-stack sequence at "
3896                         "section %u offset %0zx"),
3897                       shndx, static_cast<size_t>(fnoffset));
3898       return;
3899     }
3900
3901   // We have to change the function so that it calls
3902   // __morestack_non_split instead of __morestack.  The former will
3903   // allocate additional stack space.
3904   *from = "__morestack";
3905   *to = "__morestack_non_split";
3906 }
3907
3908 // The selector for i386 object files.  Note this is never instantiated
3909 // directly.  It's only used in Target_selector_i386_nacl, below.
3910
3911 class Target_selector_i386 : public Target_selector_freebsd
3912 {
3913 public:
3914   Target_selector_i386()
3915     : Target_selector_freebsd(elfcpp::EM_386, 32, false,
3916                               "elf32-i386", "elf32-i386-freebsd",
3917                               "elf_i386")
3918   { }
3919
3920   Target*
3921   do_instantiate_target()
3922   { return new Target_i386(); }
3923 };
3924
3925 // NaCl variant.  It uses different PLT contents.
3926
3927 class Output_data_plt_i386_nacl : public Output_data_plt_i386
3928 {
3929  public:
3930   Output_data_plt_i386_nacl(Layout* layout,
3931                             Output_data_got_plt_i386* got_plt,
3932                             Output_data_space* got_irelative)
3933     : Output_data_plt_i386(layout, plt_entry_size, got_plt, got_irelative)
3934   { }
3935
3936  protected:
3937   virtual unsigned int
3938   do_get_plt_entry_size() const
3939   { return plt_entry_size; }
3940
3941   virtual void
3942   do_add_eh_frame(Layout* layout)
3943   {
3944     layout->add_eh_frame_for_plt(this, plt_eh_frame_cie, plt_eh_frame_cie_size,
3945                                  plt_eh_frame_fde, plt_eh_frame_fde_size);
3946   }
3947
3948   // The size of an entry in the PLT.
3949   static const int plt_entry_size = 64;
3950
3951   // The .eh_frame unwind information for the PLT.
3952   static const int plt_eh_frame_fde_size = 32;
3953   static const unsigned char plt_eh_frame_fde[plt_eh_frame_fde_size];
3954 };
3955
3956 class Output_data_plt_i386_nacl_exec : public Output_data_plt_i386_nacl
3957 {
3958 public:
3959   Output_data_plt_i386_nacl_exec(Layout* layout,
3960                                  Output_data_got_plt_i386* got_plt,
3961                                  Output_data_space* got_irelative)
3962     : Output_data_plt_i386_nacl(layout, got_plt, got_irelative)
3963   { }
3964
3965  protected:
3966   virtual void
3967   do_fill_first_plt_entry(unsigned char* pov,
3968                           elfcpp::Elf_types<32>::Elf_Addr got_address);
3969
3970   virtual unsigned int
3971   do_fill_plt_entry(unsigned char* pov,
3972                     elfcpp::Elf_types<32>::Elf_Addr got_address,
3973                     unsigned int got_offset,
3974                     unsigned int plt_offset,
3975                     unsigned int plt_rel_offset);
3976
3977  private:
3978   // The first entry in the PLT for an executable.
3979   static const unsigned char first_plt_entry[plt_entry_size];
3980
3981   // Other entries in the PLT for an executable.
3982   static const unsigned char plt_entry[plt_entry_size];
3983 };
3984
3985 class Output_data_plt_i386_nacl_dyn : public Output_data_plt_i386_nacl
3986 {
3987  public:
3988   Output_data_plt_i386_nacl_dyn(Layout* layout,
3989                                 Output_data_got_plt_i386* got_plt,
3990                                 Output_data_space* got_irelative)
3991     : Output_data_plt_i386_nacl(layout, got_plt, got_irelative)
3992   { }
3993
3994  protected:
3995   virtual void
3996   do_fill_first_plt_entry(unsigned char* pov, elfcpp::Elf_types<32>::Elf_Addr);
3997
3998   virtual unsigned int
3999   do_fill_plt_entry(unsigned char* pov,
4000                     elfcpp::Elf_types<32>::Elf_Addr,
4001                     unsigned int got_offset,
4002                     unsigned int plt_offset,
4003                     unsigned int plt_rel_offset);
4004
4005  private:
4006   // The first entry in the PLT for a shared object.
4007   static const unsigned char first_plt_entry[plt_entry_size];
4008
4009   // Other entries in the PLT for a shared object.
4010   static const unsigned char plt_entry[plt_entry_size];
4011 };
4012
4013 class Target_i386_nacl : public Target_i386
4014 {
4015  public:
4016   Target_i386_nacl()
4017     : Target_i386(&i386_nacl_info)
4018   { }
4019
4020  protected:
4021   virtual Output_data_plt_i386*
4022   do_make_data_plt(Layout* layout,
4023                    Output_data_got_plt_i386* got_plt,
4024                    Output_data_space* got_irelative,
4025                    bool dyn)
4026   {
4027     if (dyn)
4028       return new Output_data_plt_i386_nacl_dyn(layout, got_plt, got_irelative);
4029     else
4030       return new Output_data_plt_i386_nacl_exec(layout, got_plt, got_irelative);
4031   }
4032
4033   virtual std::string
4034   do_code_fill(section_size_type length) const;
4035
4036  private:
4037   static const Target::Target_info i386_nacl_info;
4038 };
4039
4040 const Target::Target_info Target_i386_nacl::i386_nacl_info =
4041 {
4042   32,                   // size
4043   false,                // is_big_endian
4044   elfcpp::EM_386,       // machine_code
4045   false,                // has_make_symbol
4046   false,                // has_resolve
4047   true,                 // has_code_fill
4048   true,                 // is_default_stack_executable
4049   true,                 // can_icf_inline_merge_sections
4050   '\0',                 // wrap_char
4051   "/lib/ld-nacl-x86-32.so.1", // dynamic_linker
4052   0x20000,              // default_text_segment_address
4053   0x10000,              // abi_pagesize (overridable by -z max-page-size)
4054   0x10000,              // common_pagesize (overridable by -z common-page-size)
4055   true,                 // isolate_execinstr
4056   0x10000000,           // rosegment_gap
4057   elfcpp::SHN_UNDEF,    // small_common_shndx
4058   elfcpp::SHN_UNDEF,    // large_common_shndx
4059   0,                    // small_common_section_flags
4060   0,                    // large_common_section_flags
4061   NULL,                 // attributes_section
4062   NULL,                 // attributes_vendor
4063   "_start"              // entry_symbol_name
4064 };
4065
4066 #define NACLMASK        0xe0            // 32-byte alignment mask
4067
4068 const unsigned char
4069 Output_data_plt_i386_nacl_exec::first_plt_entry[plt_entry_size] =
4070 {
4071   0xff, 0x35,                          // pushl contents of memory address
4072   0, 0, 0, 0,                          // replaced with address of .got + 4
4073   0x8b, 0x0d,                          // movl contents of address, %ecx
4074   0, 0, 0, 0,                          // replaced with address of .got + 8
4075   0x83, 0xe1, NACLMASK,                // andl $NACLMASK, %ecx
4076   0xff, 0xe1,                          // jmp *%ecx
4077   0x90, 0x90, 0x90, 0x90, 0x90, 0x90,  // nops
4078   0x90, 0x90, 0x90, 0x90, 0x90, 0x90,  // nops
4079   0x90, 0x90, 0x90, 0x90, 0x90, 0x90,  // nops
4080   0x90, 0x90, 0x90, 0x90, 0x90, 0x90,  // nops
4081   0x90, 0x90, 0x90, 0x90, 0x90, 0x90,  // nops
4082   0x90, 0x90, 0x90, 0x90, 0x90, 0x90,  // nops
4083   0x90, 0x90, 0x90, 0x90, 0x90, 0x90,  // nops
4084   0x90, 0x90, 0x90, 0x90, 0x90
4085 };
4086
4087 void
4088 Output_data_plt_i386_nacl_exec::do_fill_first_plt_entry(
4089     unsigned char* pov,
4090     elfcpp::Elf_types<32>::Elf_Addr got_address)
4091 {
4092   memcpy(pov, first_plt_entry, plt_entry_size);
4093   elfcpp::Swap_unaligned<32, false>::writeval(pov + 2, got_address + 4);
4094   elfcpp::Swap<32, false>::writeval(pov + 8, got_address + 8);
4095 }
4096
4097 // The first entry in the PLT for a shared object.
4098
4099 const unsigned char
4100 Output_data_plt_i386_nacl_dyn::first_plt_entry[plt_entry_size] =
4101 {
4102   0xff, 0xb3, 4, 0, 0, 0,       // pushl 4(%ebx)
4103   0x8b, 0x4b, 0x08,             // mov 0x8(%ebx), %ecx
4104   0x83, 0xe1, NACLMASK,         // andl $NACLMASK, %ecx
4105   0xff, 0xe1,                   // jmp *%ecx
4106   0x90, 0x90, 0x90, 0x90, 0x90,  // nops
4107   0x90, 0x90, 0x90, 0x90, 0x90,  // nops
4108   0x90, 0x90, 0x90, 0x90, 0x90,  // nops
4109   0x90, 0x90, 0x90, 0x90, 0x90,  // nops
4110   0x90, 0x90, 0x90, 0x90, 0x90,  // nops
4111   0x90, 0x90, 0x90, 0x90, 0x90,  // nops
4112   0x90, 0x90, 0x90, 0x90, 0x90,  // nops
4113   0x90, 0x90, 0x90, 0x90, 0x90,  // nops
4114   0x90, 0x90, 0x90, 0x90, 0x90,  // nops
4115   0x90, 0x90, 0x90, 0x90, 0x90   // nops
4116 };
4117
4118 void
4119 Output_data_plt_i386_nacl_dyn::do_fill_first_plt_entry(
4120     unsigned char* pov,
4121     elfcpp::Elf_types<32>::Elf_Addr)
4122 {
4123   memcpy(pov, first_plt_entry, plt_entry_size);
4124 }
4125
4126 // Subsequent entries in the PLT for an executable.
4127
4128 const unsigned char
4129 Output_data_plt_i386_nacl_exec::plt_entry[plt_entry_size] =
4130 {
4131   0x8b, 0x0d,                    // movl contents of address, %ecx */
4132   0, 0, 0, 0,                    // replaced with address of symbol in .got
4133   0x83, 0xe1, NACLMASK,          // andl $NACLMASK, %ecx
4134   0xff, 0xe1,                    // jmp *%ecx
4135
4136   // Pad to the next 32-byte boundary with nop instructions.
4137   0x90,
4138   0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
4139   0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
4140
4141   // Lazy GOT entries point here (32-byte aligned).
4142   0x68,                       // pushl immediate
4143   0, 0, 0, 0,                 // replaced with offset into relocation table
4144   0xe9,                       // jmp relative
4145   0, 0, 0, 0,                 // replaced with offset to start of .plt
4146
4147   // Pad to the next 32-byte boundary with nop instructions.
4148   0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
4149   0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
4150   0x90, 0x90
4151 };
4152
4153 unsigned int
4154 Output_data_plt_i386_nacl_exec::do_fill_plt_entry(
4155     unsigned char* pov,
4156     elfcpp::Elf_types<32>::Elf_Addr got_address,
4157     unsigned int got_offset,
4158     unsigned int plt_offset,
4159     unsigned int plt_rel_offset)
4160 {
4161   memcpy(pov, plt_entry, plt_entry_size);
4162   elfcpp::Swap_unaligned<32, false>::writeval(pov + 2,
4163                                               got_address + got_offset);
4164   elfcpp::Swap_unaligned<32, false>::writeval(pov + 33, plt_rel_offset);
4165   elfcpp::Swap<32, false>::writeval(pov + 38, - (plt_offset + 38 + 4));
4166   return 32;
4167 }
4168
4169 // Subsequent entries in the PLT for a shared object.
4170
4171 const unsigned char
4172 Output_data_plt_i386_nacl_dyn::plt_entry[plt_entry_size] =
4173 {
4174   0x8b, 0x8b,          // movl offset(%ebx), %ecx
4175   0, 0, 0, 0,          // replaced with offset of symbol in .got
4176   0x83, 0xe1, 0xe0,    // andl $NACLMASK, %ecx
4177   0xff, 0xe1,          // jmp *%ecx
4178
4179   // Pad to the next 32-byte boundary with nop instructions.
4180   0x90,
4181   0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
4182   0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
4183
4184   // Lazy GOT entries point here (32-byte aligned).
4185   0x68,                // pushl immediate
4186   0, 0, 0, 0,          // replaced with offset into relocation table.
4187   0xe9,                // jmp relative
4188   0, 0, 0, 0,          // replaced with offset to start of .plt.
4189
4190   // Pad to the next 32-byte boundary with nop instructions.
4191   0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
4192   0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
4193   0x90, 0x90
4194 };
4195
4196 unsigned int
4197 Output_data_plt_i386_nacl_dyn::do_fill_plt_entry(
4198     unsigned char* pov,
4199     elfcpp::Elf_types<32>::Elf_Addr,
4200     unsigned int got_offset,
4201     unsigned int plt_offset,
4202     unsigned int plt_rel_offset)
4203 {
4204   memcpy(pov, plt_entry, plt_entry_size);
4205   elfcpp::Swap_unaligned<32, false>::writeval(pov + 2, got_offset);
4206   elfcpp::Swap_unaligned<32, false>::writeval(pov + 33, plt_rel_offset);
4207   elfcpp::Swap<32, false>::writeval(pov + 38, - (plt_offset + 38 + 4));
4208   return 32;
4209 }
4210
4211 const unsigned char
4212 Output_data_plt_i386_nacl::plt_eh_frame_fde[plt_eh_frame_fde_size] =
4213 {
4214   0, 0, 0, 0,                           // Replaced with offset to .plt.
4215   0, 0, 0, 0,                           // Replaced with size of .plt.
4216   0,                                    // Augmentation size.
4217   elfcpp::DW_CFA_def_cfa_offset, 8,     // DW_CFA_def_cfa_offset: 8.
4218   elfcpp::DW_CFA_advance_loc + 6,       // Advance 6 to __PLT__ + 6.
4219   elfcpp::DW_CFA_def_cfa_offset, 12,    // DW_CFA_def_cfa_offset: 12.
4220   elfcpp::DW_CFA_advance_loc + 58,      // Advance 58 to __PLT__ + 64.
4221   elfcpp::DW_CFA_def_cfa_expression,    // DW_CFA_def_cfa_expression.
4222   13,                                   // Block length.
4223   elfcpp::DW_OP_breg4, 4,               // Push %esp + 4.
4224   elfcpp::DW_OP_breg8, 0,               // Push %eip.
4225   elfcpp::DW_OP_const1u, 63,            // Push 0x3f.
4226   elfcpp::DW_OP_and,                    // & (%eip & 0x3f).
4227   elfcpp::DW_OP_const1u, 37,            // Push 0x25.
4228   elfcpp::DW_OP_ge,                     // >= ((%eip & 0x3f) >= 0x25)
4229   elfcpp::DW_OP_lit2,                   // Push 2.
4230   elfcpp::DW_OP_shl,                    // << (((%eip & 0x3f) >= 0x25) << 2)
4231   elfcpp::DW_OP_plus,                   // + ((((%eip&0x3f)>=0x25)<<2)+%esp+4
4232   elfcpp::DW_CFA_nop,                   // Align to 32 bytes.
4233   elfcpp::DW_CFA_nop
4234 };
4235
4236 // Return a string used to fill a code section with nops.
4237 // For NaCl, long NOPs are only valid if they do not cross
4238 // bundle alignment boundaries, so keep it simple with one-byte NOPs.
4239 std::string
4240 Target_i386_nacl::do_code_fill(section_size_type length) const
4241 {
4242   return std::string(length, static_cast<char>(0x90));
4243 }
4244
4245 // The selector for i386-nacl object files.
4246
4247 class Target_selector_i386_nacl
4248   : public Target_selector_nacl<Target_selector_i386, Target_i386_nacl>
4249 {
4250  public:
4251   Target_selector_i386_nacl()
4252     : Target_selector_nacl<Target_selector_i386,
4253                            Target_i386_nacl>("x86-32",
4254                                              "elf32-i386-nacl",
4255                                              "elf_i386_nacl")
4256   { }
4257 };
4258
4259 Target_selector_i386_nacl target_selector_i386;
4260
4261 // IAMCU variant.  It uses EM_IAMCU, not EM_386.
4262
4263 class Target_iamcu : public Target_i386
4264 {
4265  public:
4266   Target_iamcu()
4267     : Target_i386(&iamcu_info)
4268   { }
4269
4270  private:
4271   // Information about this specific target which we pass to the
4272   // general Target structure.
4273   static const Target::Target_info iamcu_info;
4274 };
4275
4276 const Target::Target_info Target_iamcu::iamcu_info =
4277 {
4278   32,                   // size
4279   false,                // is_big_endian
4280   elfcpp::EM_IAMCU,     // machine_code
4281   false,                // has_make_symbol
4282   false,                // has_resolve
4283   true,                 // has_code_fill
4284   true,                 // is_default_stack_executable
4285   true,                 // can_icf_inline_merge_sections
4286   '\0',                 // wrap_char
4287   "/usr/lib/libc.so.1", // dynamic_linker
4288   0x08048000,           // default_text_segment_address
4289   0x1000,               // abi_pagesize (overridable by -z max-page-size)
4290   0x1000,               // common_pagesize (overridable by -z common-page-size)
4291   false,                // isolate_execinstr
4292   0,                    // rosegment_gap
4293   elfcpp::SHN_UNDEF,    // small_common_shndx
4294   elfcpp::SHN_UNDEF,    // large_common_shndx
4295   0,                    // small_common_section_flags
4296   0,                    // large_common_section_flags
4297   NULL,                 // attributes_section
4298   NULL,                 // attributes_vendor
4299   "_start"              // entry_symbol_name
4300 };
4301
4302 class Target_selector_iamcu : public Target_selector
4303 {
4304 public:
4305   Target_selector_iamcu()
4306     : Target_selector(elfcpp::EM_IAMCU, 32, false, "elf32-iamcu",
4307                       "elf_iamcu")
4308   { }
4309
4310   Target*
4311   do_instantiate_target()
4312   { return new Target_iamcu(); }
4313 };
4314
4315 Target_selector_iamcu target_selector_iamcu;
4316
4317 } // End anonymous namespace.