* object.h (class Relobj): Drop options parameter from
[external/binutils.git] / gold / x86_64.cc
1 // x86_64.cc -- x86_64 target support for gold.
2
3 // Copyright 2006, 2007, 2008, 2009 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 "parameters.h"
29 #include "reloc.h"
30 #include "x86_64.h"
31 #include "object.h"
32 #include "symtab.h"
33 #include "layout.h"
34 #include "output.h"
35 #include "copy-relocs.h"
36 #include "target.h"
37 #include "target-reloc.h"
38 #include "target-select.h"
39 #include "tls.h"
40 #include "freebsd.h"
41 #include "gc.h"
42
43 namespace
44 {
45
46 using namespace gold;
47
48 class Output_data_plt_x86_64;
49
50 // The x86_64 target class.
51 // See the ABI at
52 //   http://www.x86-64.org/documentation/abi.pdf
53 // TLS info comes from
54 //   http://people.redhat.com/drepper/tls.pdf
55 //   http://www.lsd.ic.unicamp.br/~oliva/writeups/TLS/RFC-TLSDESC-x86.txt
56
57 class Target_x86_64 : public Target_freebsd<64, false>
58 {
59  public:
60   // In the x86_64 ABI (p 68), it says "The AMD64 ABI architectures
61   // uses only Elf64_Rela relocation entries with explicit addends."
62   typedef Output_data_reloc<elfcpp::SHT_RELA, true, 64, false> Reloc_section;
63
64   Target_x86_64()
65     : Target_freebsd<64, false>(&x86_64_info),
66       got_(NULL), plt_(NULL), got_plt_(NULL), rela_dyn_(NULL),
67       copy_relocs_(elfcpp::R_X86_64_COPY), dynbss_(NULL),
68       got_mod_index_offset_(-1U), tls_base_symbol_defined_(false)
69   { }
70
71   // Hook for a new output section.
72   void
73   do_new_output_section(Output_section*) const;
74
75   // Scan the relocations to look for symbol adjustments.
76   void
77   gc_process_relocs(Symbol_table* symtab,
78                     Layout* layout,
79                     Sized_relobj<64, false>* object,
80                     unsigned int data_shndx,
81                     unsigned int sh_type,
82                     const unsigned char* prelocs,
83                     size_t reloc_count,
84                     Output_section* output_section,
85                     bool needs_special_offset_handling,
86                     size_t local_symbol_count,
87                     const unsigned char* plocal_symbols);
88
89   // Scan the relocations to look for symbol adjustments.
90   void
91   scan_relocs(Symbol_table* symtab,
92               Layout* layout,
93               Sized_relobj<64, false>* object,
94               unsigned int data_shndx,
95               unsigned int sh_type,
96               const unsigned char* prelocs,
97               size_t reloc_count,
98               Output_section* output_section,
99               bool needs_special_offset_handling,
100               size_t local_symbol_count,
101               const unsigned char* plocal_symbols);
102
103   // Finalize the sections.
104   void
105   do_finalize_sections(Layout*);
106
107   // Return the value to use for a dynamic which requires special
108   // treatment.
109   uint64_t
110   do_dynsym_value(const Symbol*) const;
111
112   // Relocate a section.
113   void
114   relocate_section(const Relocate_info<64, false>*,
115                    unsigned int sh_type,
116                    const unsigned char* prelocs,
117                    size_t reloc_count,
118                    Output_section* output_section,
119                    bool needs_special_offset_handling,
120                    unsigned char* view,
121                    elfcpp::Elf_types<64>::Elf_Addr view_address,
122                    section_size_type view_size,
123                    const Reloc_symbol_changes*);
124
125   // Scan the relocs during a relocatable link.
126   void
127   scan_relocatable_relocs(Symbol_table* symtab,
128                           Layout* layout,
129                           Sized_relobj<64, false>* object,
130                           unsigned int data_shndx,
131                           unsigned int sh_type,
132                           const unsigned char* prelocs,
133                           size_t reloc_count,
134                           Output_section* output_section,
135                           bool needs_special_offset_handling,
136                           size_t local_symbol_count,
137                           const unsigned char* plocal_symbols,
138                           Relocatable_relocs*);
139
140   // Relocate a section during a relocatable link.
141   void
142   relocate_for_relocatable(const Relocate_info<64, false>*,
143                            unsigned int sh_type,
144                            const unsigned char* prelocs,
145                            size_t reloc_count,
146                            Output_section* output_section,
147                            off_t offset_in_output_section,
148                            const Relocatable_relocs*,
149                            unsigned char* view,
150                            elfcpp::Elf_types<64>::Elf_Addr view_address,
151                            section_size_type view_size,
152                            unsigned char* reloc_view,
153                            section_size_type reloc_view_size);
154
155   // Return a string used to fill a code section with nops.
156   std::string
157   do_code_fill(section_size_type length) const;
158
159   // Return whether SYM is defined by the ABI.
160   bool
161   do_is_defined_by_abi(const Symbol* sym) const
162   { return strcmp(sym->name(), "__tls_get_addr") == 0; }
163
164   // Adjust -fstack-split code which calls non-stack-split code.
165   void
166   do_calls_non_split(Relobj* object, unsigned int shndx,
167                      section_offset_type fnoffset, section_size_type fnsize,
168                      unsigned char* view, section_size_type view_size,
169                      std::string* from, std::string* to) const;
170
171   // Return the size of the GOT section.
172   section_size_type
173   got_size()
174   {
175     gold_assert(this->got_ != NULL);
176     return this->got_->data_size();
177   }
178
179  private:
180   // The class which scans relocations.
181   class Scan
182   {
183   public:
184     Scan()
185       : issued_non_pic_error_(false)
186     { }
187
188     inline void
189     local(Symbol_table* symtab, Layout* layout, Target_x86_64* target,
190           Sized_relobj<64, false>* object,
191           unsigned int data_shndx,
192           Output_section* output_section,
193           const elfcpp::Rela<64, false>& reloc, unsigned int r_type,
194           const elfcpp::Sym<64, false>& lsym);
195
196     inline void
197     global(Symbol_table* symtab, Layout* layout, Target_x86_64* target,
198            Sized_relobj<64, false>* object,
199            unsigned int data_shndx,
200            Output_section* output_section,
201            const elfcpp::Rela<64, false>& reloc, unsigned int r_type,
202            Symbol* gsym);
203
204   private:
205     static void
206     unsupported_reloc_local(Sized_relobj<64, false>*, unsigned int r_type);
207
208     static void
209     unsupported_reloc_global(Sized_relobj<64, false>*, unsigned int r_type,
210                              Symbol*);
211
212     void
213     check_non_pic(Relobj*, unsigned int r_type);
214
215     // Whether we have issued an error about a non-PIC compilation.
216     bool issued_non_pic_error_;
217   };
218
219   // The class which implements relocation.
220   class Relocate
221   {
222    public:
223     Relocate()
224       : skip_call_tls_get_addr_(false), saw_tls_block_reloc_(false)
225     { }
226
227     ~Relocate()
228     {
229       if (this->skip_call_tls_get_addr_)
230         {
231           // FIXME: This needs to specify the location somehow.
232           gold_error(_("missing expected TLS relocation"));
233         }
234     }
235
236     // Do a relocation.  Return false if the caller should not issue
237     // any warnings about this relocation.
238     inline bool
239     relocate(const Relocate_info<64, false>*, Target_x86_64*, Output_section*,
240              size_t relnum, const elfcpp::Rela<64, false>&,
241              unsigned int r_type, const Sized_symbol<64>*,
242              const Symbol_value<64>*,
243              unsigned char*, elfcpp::Elf_types<64>::Elf_Addr,
244              section_size_type);
245
246    private:
247     // Do a TLS relocation.
248     inline void
249     relocate_tls(const Relocate_info<64, false>*, Target_x86_64*,
250                  size_t relnum, const elfcpp::Rela<64, false>&,
251                  unsigned int r_type, const Sized_symbol<64>*,
252                  const Symbol_value<64>*,
253                  unsigned char*, elfcpp::Elf_types<64>::Elf_Addr,
254                  section_size_type);
255
256     // Do a TLS General-Dynamic to Initial-Exec transition.
257     inline void
258     tls_gd_to_ie(const Relocate_info<64, false>*, size_t relnum,
259                  Output_segment* tls_segment,
260                  const elfcpp::Rela<64, false>&, unsigned int r_type,
261                  elfcpp::Elf_types<64>::Elf_Addr value,
262                  unsigned char* view,
263                  elfcpp::Elf_types<64>::Elf_Addr,
264                  section_size_type view_size);
265
266     // Do a TLS General-Dynamic to Local-Exec transition.
267     inline void
268     tls_gd_to_le(const Relocate_info<64, false>*, size_t relnum,
269                  Output_segment* tls_segment,
270                  const elfcpp::Rela<64, false>&, unsigned int r_type,
271                  elfcpp::Elf_types<64>::Elf_Addr value,
272                  unsigned char* view,
273                  section_size_type view_size);
274
275     // Do a TLSDESC-style General-Dynamic to Initial-Exec transition.
276     inline void
277     tls_desc_gd_to_ie(const Relocate_info<64, false>*, size_t relnum,
278                       Output_segment* tls_segment,
279                       const elfcpp::Rela<64, false>&, unsigned int r_type,
280                       elfcpp::Elf_types<64>::Elf_Addr value,
281                       unsigned char* view,
282                       elfcpp::Elf_types<64>::Elf_Addr,
283                       section_size_type view_size);
284
285     // Do a TLSDESC-style General-Dynamic to Local-Exec transition.
286     inline void
287     tls_desc_gd_to_le(const Relocate_info<64, false>*, size_t relnum,
288                       Output_segment* tls_segment,
289                       const elfcpp::Rela<64, false>&, unsigned int r_type,
290                       elfcpp::Elf_types<64>::Elf_Addr value,
291                       unsigned char* view,
292                       section_size_type view_size);
293
294     // Do a TLS Local-Dynamic to Local-Exec transition.
295     inline void
296     tls_ld_to_le(const Relocate_info<64, false>*, size_t relnum,
297                  Output_segment* tls_segment,
298                  const elfcpp::Rela<64, false>&, unsigned int r_type,
299                  elfcpp::Elf_types<64>::Elf_Addr value,
300                  unsigned char* view,
301                  section_size_type view_size);
302
303     // Do a TLS Initial-Exec to Local-Exec transition.
304     static inline void
305     tls_ie_to_le(const Relocate_info<64, false>*, size_t relnum,
306                  Output_segment* tls_segment,
307                  const elfcpp::Rela<64, false>&, unsigned int r_type,
308                  elfcpp::Elf_types<64>::Elf_Addr value,
309                  unsigned char* view,
310                  section_size_type view_size);
311
312     // This is set if we should skip the next reloc, which should be a
313     // PLT32 reloc against ___tls_get_addr.
314     bool skip_call_tls_get_addr_;
315
316     // This is set if we see a relocation which could load the address
317     // of the TLS block.  Whether we see such a relocation determines
318     // how we handle the R_X86_64_DTPOFF32 relocation, which is used
319     // in debugging sections.
320     bool saw_tls_block_reloc_;
321   };
322
323   // A class which returns the size required for a relocation type,
324   // used while scanning relocs during a relocatable link.
325   class Relocatable_size_for_reloc
326   {
327    public:
328     unsigned int
329     get_size_for_reloc(unsigned int, Relobj*);
330   };
331
332   // Adjust TLS relocation type based on the options and whether this
333   // is a local symbol.
334   static tls::Tls_optimization
335   optimize_tls_reloc(bool is_final, int r_type);
336
337   // Get the GOT section, creating it if necessary.
338   Output_data_got<64, false>*
339   got_section(Symbol_table*, Layout*);
340
341   // Get the GOT PLT section.
342   Output_data_space*
343   got_plt_section() const
344   {
345     gold_assert(this->got_plt_ != NULL);
346     return this->got_plt_;
347   }
348
349   // Create the PLT section.
350   void
351   make_plt_section(Symbol_table* symtab, Layout* layout);
352
353   // Create a PLT entry for a global symbol.
354   void
355   make_plt_entry(Symbol_table*, Layout*, Symbol*);
356
357   // Define the _TLS_MODULE_BASE_ symbol in the TLS segment.
358   void
359   define_tls_base_symbol(Symbol_table*, Layout*);
360
361   // Create the reserved PLT and GOT entries for the TLS descriptor resolver.
362   void
363   reserve_tlsdesc_entries(Symbol_table* symtab, Layout* layout);
364
365   // Create a GOT entry for the TLS module index.
366   unsigned int
367   got_mod_index_entry(Symbol_table* symtab, Layout* layout,
368                       Sized_relobj<64, false>* object);
369
370   // Get the PLT section.
371   Output_data_plt_x86_64*
372   plt_section() const
373   {
374     gold_assert(this->plt_ != NULL);
375     return this->plt_;
376   }
377
378   // Get the dynamic reloc section, creating it if necessary.
379   Reloc_section*
380   rela_dyn_section(Layout*);
381
382   // Add a potential copy relocation.
383   void
384   copy_reloc(Symbol_table* symtab, Layout* layout,
385              Sized_relobj<64, false>* object,
386              unsigned int shndx, Output_section* output_section,
387              Symbol* sym, const elfcpp::Rela<64, false>& reloc)
388   {
389     this->copy_relocs_.copy_reloc(symtab, layout,
390                                   symtab->get_sized_symbol<64>(sym),
391                                   object, shndx, output_section,
392                                   reloc, this->rela_dyn_section(layout));
393   }
394
395   // Information about this specific target which we pass to the
396   // general Target structure.
397   static const Target::Target_info x86_64_info;
398
399   enum Got_type
400   {
401     GOT_TYPE_STANDARD = 0,      // GOT entry for a regular symbol
402     GOT_TYPE_TLS_OFFSET = 1,    // GOT entry for TLS offset
403     GOT_TYPE_TLS_PAIR = 2,      // GOT entry for TLS module/offset pair
404     GOT_TYPE_TLS_DESC = 3       // GOT entry for TLS_DESC pair
405   };
406
407   // The GOT section.
408   Output_data_got<64, false>* got_;
409   // The PLT section.
410   Output_data_plt_x86_64* plt_;
411   // The GOT PLT section.
412   Output_data_space* got_plt_;
413   // The dynamic reloc section.
414   Reloc_section* rela_dyn_;
415   // Relocs saved to avoid a COPY reloc.
416   Copy_relocs<elfcpp::SHT_RELA, 64, false> copy_relocs_;
417   // Space for variables copied with a COPY reloc.
418   Output_data_space* dynbss_;
419   // Offset of the GOT entry for the TLS module index.
420   unsigned int got_mod_index_offset_;
421   // True if the _TLS_MODULE_BASE_ symbol has been defined.
422   bool tls_base_symbol_defined_;
423 };
424
425 const Target::Target_info Target_x86_64::x86_64_info =
426 {
427   64,                   // size
428   false,                // is_big_endian
429   elfcpp::EM_X86_64,    // machine_code
430   false,                // has_make_symbol
431   false,                // has_resolve
432   true,                 // has_code_fill
433   true,                 // is_default_stack_executable
434   '\0',                 // wrap_char
435   "/lib/ld64.so.1",     // program interpreter
436   0x400000,             // default_text_segment_address
437   0x1000,               // abi_pagesize (overridable by -z max-page-size)
438   0x1000,               // common_pagesize (overridable by -z common-page-size)
439   elfcpp::SHN_UNDEF,    // small_common_shndx
440   elfcpp::SHN_X86_64_LCOMMON,   // large_common_shndx
441   0,                    // small_common_section_flags
442   elfcpp::SHF_X86_64_LARGE      // large_common_section_flags
443 };
444
445 // This is called when a new output section is created.  This is where
446 // we handle the SHF_X86_64_LARGE.
447
448 void
449 Target_x86_64::do_new_output_section(Output_section *os) const
450 {
451   if ((os->flags() & elfcpp::SHF_X86_64_LARGE) != 0)
452     os->set_is_large_section();
453 }
454
455 // Get the GOT section, creating it if necessary.
456
457 Output_data_got<64, false>*
458 Target_x86_64::got_section(Symbol_table* symtab, Layout* layout)
459 {
460   if (this->got_ == NULL)
461     {
462       gold_assert(symtab != NULL && layout != NULL);
463
464       this->got_ = new Output_data_got<64, false>();
465
466       Output_section* os;
467       os = layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS,
468                                            (elfcpp::SHF_ALLOC
469                                             | elfcpp::SHF_WRITE),
470                                            this->got_);
471       os->set_is_relro();
472
473       // The old GNU linker creates a .got.plt section.  We just
474       // create another set of data in the .got section.  Note that we
475       // always create a PLT if we create a GOT, although the PLT
476       // might be empty.
477       this->got_plt_ = new Output_data_space(8, "** GOT PLT");
478       os = layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS,
479                                            (elfcpp::SHF_ALLOC
480                                             | elfcpp::SHF_WRITE),
481                                            this->got_plt_);
482       os->set_is_relro();
483
484       // The first three entries are reserved.
485       this->got_plt_->set_current_data_size(3 * 8);
486
487       // Define _GLOBAL_OFFSET_TABLE_ at the start of the PLT.
488       symtab->define_in_output_data("_GLOBAL_OFFSET_TABLE_", NULL,
489                                     this->got_plt_,
490                                     0, 0, elfcpp::STT_OBJECT,
491                                     elfcpp::STB_LOCAL,
492                                     elfcpp::STV_HIDDEN, 0,
493                                     false, false);
494     }
495
496   return this->got_;
497 }
498
499 // Get the dynamic reloc section, creating it if necessary.
500
501 Target_x86_64::Reloc_section*
502 Target_x86_64::rela_dyn_section(Layout* layout)
503 {
504   if (this->rela_dyn_ == NULL)
505     {
506       gold_assert(layout != NULL);
507       this->rela_dyn_ = new Reloc_section(parameters->options().combreloc());
508       layout->add_output_section_data(".rela.dyn", elfcpp::SHT_RELA,
509                                       elfcpp::SHF_ALLOC, this->rela_dyn_);
510     }
511   return this->rela_dyn_;
512 }
513
514 // A class to handle the PLT data.
515
516 class Output_data_plt_x86_64 : public Output_section_data
517 {
518  public:
519   typedef Output_data_reloc<elfcpp::SHT_RELA, true, 64, false> Reloc_section;
520
521   Output_data_plt_x86_64(Layout*, Output_data_got<64, false>*,
522                          Output_data_space*);
523
524   // Add an entry to the PLT.
525   void
526   add_entry(Symbol* gsym);
527
528   // Add the reserved TLSDESC_PLT entry to the PLT.
529   void
530   reserve_tlsdesc_entry(unsigned int got_offset)
531   { this->tlsdesc_got_offset_ = got_offset; }
532
533   // Return true if a TLSDESC_PLT entry has been reserved.
534   bool
535   has_tlsdesc_entry() const
536   { return this->tlsdesc_got_offset_ != -1U; }
537
538   // Return the GOT offset for the reserved TLSDESC_PLT entry.
539   unsigned int
540   get_tlsdesc_got_offset() const
541   { return this->tlsdesc_got_offset_; }
542
543   // Return the offset of the reserved TLSDESC_PLT entry.
544   unsigned int
545   get_tlsdesc_plt_offset() const
546   { return (this->count_ + 1) * plt_entry_size; }
547
548   // Return the .rel.plt section data.
549   const Reloc_section*
550   rel_plt() const
551   { return this->rel_; }
552
553  protected:
554   void
555   do_adjust_output_section(Output_section* os);
556
557   // Write to a map file.
558   void
559   do_print_to_mapfile(Mapfile* mapfile) const
560   { mapfile->print_output_data(this, _("** PLT")); }
561
562  private:
563   // The size of an entry in the PLT.
564   static const int plt_entry_size = 16;
565
566   // The first entry in the PLT.
567   // From the AMD64 ABI: "Unlike Intel386 ABI, this ABI uses the same
568   // procedure linkage table for both programs and shared objects."
569   static unsigned char first_plt_entry[plt_entry_size];
570
571   // Other entries in the PLT for an executable.
572   static unsigned char plt_entry[plt_entry_size];
573
574   // The reserved TLSDESC entry in the PLT for an executable.
575   static unsigned char tlsdesc_plt_entry[plt_entry_size];
576
577   // Set the final size.
578   void
579   set_final_data_size();
580
581   // Write out the PLT data.
582   void
583   do_write(Output_file*);
584
585   // The reloc section.
586   Reloc_section* rel_;
587   // The .got section.
588   Output_data_got<64, false>* got_;
589   // The .got.plt section.
590   Output_data_space* got_plt_;
591   // The number of PLT entries.
592   unsigned int count_;
593   // Offset of the reserved TLSDESC_GOT entry when needed.
594   unsigned int tlsdesc_got_offset_;
595 };
596
597 // Create the PLT section.  The ordinary .got section is an argument,
598 // since we need to refer to the start.  We also create our own .got
599 // section just for PLT entries.
600
601 Output_data_plt_x86_64::Output_data_plt_x86_64(Layout* layout,
602                                                Output_data_got<64, false>* got,
603                                                Output_data_space* got_plt)
604   : Output_section_data(8), got_(got), got_plt_(got_plt), count_(0),
605     tlsdesc_got_offset_(-1U)
606 {
607   this->rel_ = new Reloc_section(false);
608   layout->add_output_section_data(".rela.plt", elfcpp::SHT_RELA,
609                                   elfcpp::SHF_ALLOC, this->rel_);
610 }
611
612 void
613 Output_data_plt_x86_64::do_adjust_output_section(Output_section* os)
614 {
615   os->set_entsize(plt_entry_size);
616 }
617
618 // Add an entry to the PLT.
619
620 void
621 Output_data_plt_x86_64::add_entry(Symbol* gsym)
622 {
623   gold_assert(!gsym->has_plt_offset());
624
625   // Note that when setting the PLT offset we skip the initial
626   // reserved PLT entry.
627   gsym->set_plt_offset((this->count_ + 1) * plt_entry_size);
628
629   ++this->count_;
630
631   section_offset_type got_offset = this->got_plt_->current_data_size();
632
633   // Every PLT entry needs a GOT entry which points back to the PLT
634   // entry (this will be changed by the dynamic linker, normally
635   // lazily when the function is called).
636   this->got_plt_->set_current_data_size(got_offset + 8);
637
638   // Every PLT entry needs a reloc.
639   gsym->set_needs_dynsym_entry();
640   this->rel_->add_global(gsym, elfcpp::R_X86_64_JUMP_SLOT, this->got_plt_,
641                          got_offset, 0);
642
643   // Note that we don't need to save the symbol.  The contents of the
644   // PLT are independent of which symbols are used.  The symbols only
645   // appear in the relocations.
646 }
647
648 // Set the final size.
649 void
650 Output_data_plt_x86_64::set_final_data_size()
651 {
652   unsigned int count = this->count_;
653   if (this->has_tlsdesc_entry())
654     ++count;
655   this->set_data_size((count + 1) * plt_entry_size);
656 }
657
658 // The first entry in the PLT for an executable.
659
660 unsigned char Output_data_plt_x86_64::first_plt_entry[plt_entry_size] =
661 {
662   // From AMD64 ABI Draft 0.98, page 76
663   0xff, 0x35,   // pushq contents of memory address
664   0, 0, 0, 0,   // replaced with address of .got + 8
665   0xff, 0x25,   // jmp indirect
666   0, 0, 0, 0,   // replaced with address of .got + 16
667   0x90, 0x90, 0x90, 0x90   // noop (x4)
668 };
669
670 // Subsequent entries in the PLT for an executable.
671
672 unsigned char Output_data_plt_x86_64::plt_entry[plt_entry_size] =
673 {
674   // From AMD64 ABI Draft 0.98, page 76
675   0xff, 0x25,   // jmpq indirect
676   0, 0, 0, 0,   // replaced with address of symbol in .got
677   0x68,         // pushq immediate
678   0, 0, 0, 0,   // replaced with offset into relocation table
679   0xe9,         // jmpq relative
680   0, 0, 0, 0    // replaced with offset to start of .plt
681 };
682
683 // The reserved TLSDESC entry in the PLT for an executable.
684
685 unsigned char Output_data_plt_x86_64::tlsdesc_plt_entry[plt_entry_size] =
686 {
687   // From Alexandre Oliva, "Thread-Local Storage Descriptors for IA32
688   // and AMD64/EM64T", Version 0.9.4 (2005-10-10).
689   0xff, 0x35,   // pushq x(%rip)
690   0, 0, 0, 0,   // replaced with address of linkmap GOT entry (at PLTGOT + 8)
691   0xff, 0x25,   // jmpq *y(%rip)
692   0, 0, 0, 0,   // replaced with offset of reserved TLSDESC_GOT entry
693   0x0f, 0x1f,   // nop
694   0x40, 0
695 };
696
697 // Write out the PLT.  This uses the hand-coded instructions above,
698 // and adjusts them as needed.  This is specified by the AMD64 ABI.
699
700 void
701 Output_data_plt_x86_64::do_write(Output_file* of)
702 {
703   const off_t offset = this->offset();
704   const section_size_type oview_size =
705     convert_to_section_size_type(this->data_size());
706   unsigned char* const oview = of->get_output_view(offset, oview_size);
707
708   const off_t got_file_offset = this->got_plt_->offset();
709   const section_size_type got_size =
710     convert_to_section_size_type(this->got_plt_->data_size());
711   unsigned char* const got_view = of->get_output_view(got_file_offset,
712                                                       got_size);
713
714   unsigned char* pov = oview;
715
716   // The base address of the .plt section.
717   elfcpp::Elf_types<64>::Elf_Addr plt_address = this->address();
718   // The base address of the .got section.
719   elfcpp::Elf_types<64>::Elf_Addr got_base = this->got_->address();
720   // The base address of the PLT portion of the .got section,
721   // which is where the GOT pointer will point, and where the
722   // three reserved GOT entries are located.
723   elfcpp::Elf_types<64>::Elf_Addr got_address = this->got_plt_->address();
724
725   memcpy(pov, first_plt_entry, plt_entry_size);
726   // We do a jmp relative to the PC at the end of this instruction.
727   elfcpp::Swap_unaligned<32, false>::writeval(pov + 2,
728                                               (got_address + 8
729                                                - (plt_address + 6)));
730   elfcpp::Swap<32, false>::writeval(pov + 8,
731                                     (got_address + 16
732                                      - (plt_address + 12)));
733   pov += plt_entry_size;
734
735   unsigned char* got_pov = got_view;
736
737   memset(got_pov, 0, 24);
738   got_pov += 24;
739
740   unsigned int plt_offset = plt_entry_size;
741   unsigned int got_offset = 24;
742   const unsigned int count = this->count_;
743   for (unsigned int plt_index = 0;
744        plt_index < count;
745        ++plt_index,
746          pov += plt_entry_size,
747          got_pov += 8,
748          plt_offset += plt_entry_size,
749          got_offset += 8)
750     {
751       // Set and adjust the PLT entry itself.
752       memcpy(pov, plt_entry, plt_entry_size);
753       elfcpp::Swap_unaligned<32, false>::writeval(pov + 2,
754                                                   (got_address + got_offset
755                                                    - (plt_address + plt_offset
756                                                       + 6)));
757
758       elfcpp::Swap_unaligned<32, false>::writeval(pov + 7, plt_index);
759       elfcpp::Swap<32, false>::writeval(pov + 12,
760                                         - (plt_offset + plt_entry_size));
761
762       // Set the entry in the GOT.
763       elfcpp::Swap<64, false>::writeval(got_pov, plt_address + plt_offset + 6);
764     }
765
766   if (this->has_tlsdesc_entry())
767     {
768       // Set and adjust the reserved TLSDESC PLT entry.
769       unsigned int tlsdesc_got_offset = this->get_tlsdesc_got_offset();
770       memcpy(pov, tlsdesc_plt_entry, plt_entry_size);
771       elfcpp::Swap_unaligned<32, false>::writeval(pov + 2,
772                                                   (got_address + 8
773                                                    - (plt_address + plt_offset
774                                                       + 6)));
775       elfcpp::Swap_unaligned<32, false>::writeval(pov + 8,
776                                                   (got_base
777                                                    + tlsdesc_got_offset
778                                                    - (plt_address + plt_offset
779                                                       + 12)));
780       pov += plt_entry_size;
781     }
782
783   gold_assert(static_cast<section_size_type>(pov - oview) == oview_size);
784   gold_assert(static_cast<section_size_type>(got_pov - got_view) == got_size);
785
786   of->write_output_view(offset, oview_size, oview);
787   of->write_output_view(got_file_offset, got_size, got_view);
788 }
789
790 // Create the PLT section.
791
792 void
793 Target_x86_64::make_plt_section(Symbol_table* symtab, Layout* layout)
794 {
795   if (this->plt_ == NULL)
796     {
797       // Create the GOT sections first.
798       this->got_section(symtab, layout);
799
800       this->plt_ = new Output_data_plt_x86_64(layout, this->got_,
801                                               this->got_plt_);
802       layout->add_output_section_data(".plt", elfcpp::SHT_PROGBITS,
803                                       (elfcpp::SHF_ALLOC
804                                        | elfcpp::SHF_EXECINSTR),
805                                       this->plt_);
806     }
807 }
808
809 // Create a PLT entry for a global symbol.
810
811 void
812 Target_x86_64::make_plt_entry(Symbol_table* symtab, Layout* layout,
813                               Symbol* gsym)
814 {
815   if (gsym->has_plt_offset())
816     return;
817
818   if (this->plt_ == NULL)
819     this->make_plt_section(symtab, layout);
820
821   this->plt_->add_entry(gsym);
822 }
823
824 // Define the _TLS_MODULE_BASE_ symbol in the TLS segment.
825
826 void
827 Target_x86_64::define_tls_base_symbol(Symbol_table* symtab, Layout* layout)
828 {
829   if (this->tls_base_symbol_defined_)
830     return;
831
832   Output_segment* tls_segment = layout->tls_segment();
833   if (tls_segment != NULL)
834     {
835       bool is_exec = parameters->options().output_is_executable();
836       symtab->define_in_output_segment("_TLS_MODULE_BASE_", NULL,
837                                        tls_segment, 0, 0,
838                                        elfcpp::STT_TLS,
839                                        elfcpp::STB_LOCAL,
840                                        elfcpp::STV_HIDDEN, 0,
841                                        (is_exec
842                                         ? Symbol::SEGMENT_END
843                                         : Symbol::SEGMENT_START),
844                                        true);
845     }
846   this->tls_base_symbol_defined_ = true;
847 }
848
849 // Create the reserved PLT and GOT entries for the TLS descriptor resolver.
850
851 void
852 Target_x86_64::reserve_tlsdesc_entries(Symbol_table* symtab,
853                                              Layout* layout)
854 {
855   if (this->plt_ == NULL)
856     this->make_plt_section(symtab, layout);
857
858   if (!this->plt_->has_tlsdesc_entry())
859     {
860       // Allocate the TLSDESC_GOT entry.
861       Output_data_got<64, false>* got = this->got_section(symtab, layout);
862       unsigned int got_offset = got->add_constant(0);
863
864       // Allocate the TLSDESC_PLT entry.
865       this->plt_->reserve_tlsdesc_entry(got_offset);
866     }
867 }
868
869 // Create a GOT entry for the TLS module index.
870
871 unsigned int
872 Target_x86_64::got_mod_index_entry(Symbol_table* symtab, Layout* layout,
873                                    Sized_relobj<64, false>* object)
874 {
875   if (this->got_mod_index_offset_ == -1U)
876     {
877       gold_assert(symtab != NULL && layout != NULL && object != NULL);
878       Reloc_section* rela_dyn = this->rela_dyn_section(layout);
879       Output_data_got<64, false>* got = this->got_section(symtab, layout);
880       unsigned int got_offset = got->add_constant(0);
881       rela_dyn->add_local(object, 0, elfcpp::R_X86_64_DTPMOD64, got,
882                           got_offset, 0);
883       got->add_constant(0);
884       this->got_mod_index_offset_ = got_offset;
885     }
886   return this->got_mod_index_offset_;
887 }
888
889 // Optimize the TLS relocation type based on what we know about the
890 // symbol.  IS_FINAL is true if the final address of this symbol is
891 // known at link time.
892
893 tls::Tls_optimization
894 Target_x86_64::optimize_tls_reloc(bool is_final, int r_type)
895 {
896   // If we are generating a shared library, then we can't do anything
897   // in the linker.
898   if (parameters->options().shared())
899     return tls::TLSOPT_NONE;
900
901   switch (r_type)
902     {
903     case elfcpp::R_X86_64_TLSGD:
904     case elfcpp::R_X86_64_GOTPC32_TLSDESC:
905     case elfcpp::R_X86_64_TLSDESC_CALL:
906       // These are General-Dynamic which permits fully general TLS
907       // access.  Since we know that we are generating an executable,
908       // we can convert this to Initial-Exec.  If we also know that
909       // this is a local symbol, we can further switch to Local-Exec.
910       if (is_final)
911         return tls::TLSOPT_TO_LE;
912       return tls::TLSOPT_TO_IE;
913
914     case elfcpp::R_X86_64_TLSLD:
915       // This is Local-Dynamic, which refers to a local symbol in the
916       // dynamic TLS block.  Since we know that we generating an
917       // executable, we can switch to Local-Exec.
918       return tls::TLSOPT_TO_LE;
919
920     case elfcpp::R_X86_64_DTPOFF32:
921     case elfcpp::R_X86_64_DTPOFF64:
922       // Another Local-Dynamic reloc.
923       return tls::TLSOPT_TO_LE;
924
925     case elfcpp::R_X86_64_GOTTPOFF:
926       // These are Initial-Exec relocs which get the thread offset
927       // from the GOT.  If we know that we are linking against the
928       // local symbol, we can switch to Local-Exec, which links the
929       // thread offset into the instruction.
930       if (is_final)
931         return tls::TLSOPT_TO_LE;
932       return tls::TLSOPT_NONE;
933
934     case elfcpp::R_X86_64_TPOFF32:
935       // When we already have Local-Exec, there is nothing further we
936       // can do.
937       return tls::TLSOPT_NONE;
938
939     default:
940       gold_unreachable();
941     }
942 }
943
944 // Report an unsupported relocation against a local symbol.
945
946 void
947 Target_x86_64::Scan::unsupported_reloc_local(Sized_relobj<64, false>* object,
948                                              unsigned int r_type)
949 {
950   gold_error(_("%s: unsupported reloc %u against local symbol"),
951              object->name().c_str(), r_type);
952 }
953
954 // We are about to emit a dynamic relocation of type R_TYPE.  If the
955 // dynamic linker does not support it, issue an error.  The GNU linker
956 // only issues a non-PIC error for an allocated read-only section.
957 // Here we know the section is allocated, but we don't know that it is
958 // read-only.  But we check for all the relocation types which the
959 // glibc dynamic linker supports, so it seems appropriate to issue an
960 // error even if the section is not read-only.
961
962 void
963 Target_x86_64::Scan::check_non_pic(Relobj* object, unsigned int r_type)
964 {
965   switch (r_type)
966     {
967       // These are the relocation types supported by glibc for x86_64.
968     case elfcpp::R_X86_64_RELATIVE:
969     case elfcpp::R_X86_64_GLOB_DAT:
970     case elfcpp::R_X86_64_JUMP_SLOT:
971     case elfcpp::R_X86_64_DTPMOD64:
972     case elfcpp::R_X86_64_DTPOFF64:
973     case elfcpp::R_X86_64_TPOFF64:
974     case elfcpp::R_X86_64_64:
975     case elfcpp::R_X86_64_32:
976     case elfcpp::R_X86_64_PC32:
977     case elfcpp::R_X86_64_COPY:
978       return;
979
980     default:
981       // This prevents us from issuing more than one error per reloc
982       // section.  But we can still wind up issuing more than one
983       // error per object file.
984       if (this->issued_non_pic_error_)
985         return;
986       gold_assert(parameters->options().output_is_position_independent());
987       object->error(_("requires unsupported dynamic reloc; "
988                       "recompile with -fPIC"));
989       this->issued_non_pic_error_ = true;
990       return;
991
992     case elfcpp::R_X86_64_NONE:
993       gold_unreachable();
994     }
995 }
996
997 // Scan a relocation for a local symbol.
998
999 inline void
1000 Target_x86_64::Scan::local(Symbol_table* symtab,
1001                            Layout* layout,
1002                            Target_x86_64* target,
1003                            Sized_relobj<64, false>* object,
1004                            unsigned int data_shndx,
1005                            Output_section* output_section,
1006                            const elfcpp::Rela<64, false>& reloc,
1007                            unsigned int r_type,
1008                            const elfcpp::Sym<64, false>& lsym)
1009 {
1010   switch (r_type)
1011     {
1012     case elfcpp::R_X86_64_NONE:
1013     case elfcpp::R_386_GNU_VTINHERIT:
1014     case elfcpp::R_386_GNU_VTENTRY:
1015       break;
1016
1017     case elfcpp::R_X86_64_64:
1018       // If building a shared library (or a position-independent
1019       // executable), we need to create a dynamic relocation for this
1020       // location.  The relocation applied at link time will apply the
1021       // link-time value, so we flag the location with an
1022       // R_X86_64_RELATIVE relocation so the dynamic loader can
1023       // relocate it easily.
1024       if (parameters->options().output_is_position_independent())
1025         {
1026           unsigned int r_sym = elfcpp::elf_r_sym<64>(reloc.get_r_info());
1027           Reloc_section* rela_dyn = target->rela_dyn_section(layout);
1028           rela_dyn->add_local_relative(object, r_sym,
1029                                        elfcpp::R_X86_64_RELATIVE,
1030                                        output_section, data_shndx,
1031                                        reloc.get_r_offset(),
1032                                        reloc.get_r_addend());
1033         }
1034       break;
1035
1036     case elfcpp::R_X86_64_32:
1037     case elfcpp::R_X86_64_32S:
1038     case elfcpp::R_X86_64_16:
1039     case elfcpp::R_X86_64_8:
1040       // If building a shared library (or a position-independent
1041       // executable), we need to create a dynamic relocation for this
1042       // location.  We can't use an R_X86_64_RELATIVE relocation
1043       // because that is always a 64-bit relocation.
1044       if (parameters->options().output_is_position_independent())
1045         {
1046           this->check_non_pic(object, r_type);
1047
1048           Reloc_section* rela_dyn = target->rela_dyn_section(layout);
1049           unsigned int r_sym = elfcpp::elf_r_sym<64>(reloc.get_r_info());
1050           if (lsym.get_st_type() != elfcpp::STT_SECTION)
1051             rela_dyn->add_local(object, r_sym, r_type, output_section,
1052                                 data_shndx, reloc.get_r_offset(),
1053                                 reloc.get_r_addend());
1054           else
1055             {
1056               gold_assert(lsym.get_st_value() == 0);
1057               unsigned int shndx = lsym.get_st_shndx();
1058               bool is_ordinary;
1059               shndx = object->adjust_sym_shndx(r_sym, shndx,
1060                                                &is_ordinary);
1061               if (!is_ordinary)
1062                 object->error(_("section symbol %u has bad shndx %u"),
1063                               r_sym, shndx);
1064               else
1065                 rela_dyn->add_local_section(object, shndx,
1066                                             r_type, output_section,
1067                                             data_shndx, reloc.get_r_offset(),
1068                                             reloc.get_r_addend());
1069             }
1070         }
1071       break;
1072
1073     case elfcpp::R_X86_64_PC64:
1074     case elfcpp::R_X86_64_PC32:
1075     case elfcpp::R_X86_64_PC16:
1076     case elfcpp::R_X86_64_PC8:
1077       break;
1078
1079     case elfcpp::R_X86_64_PLT32:
1080       // Since we know this is a local symbol, we can handle this as a
1081       // PC32 reloc.
1082       break;
1083
1084     case elfcpp::R_X86_64_GOTPC32:
1085     case elfcpp::R_X86_64_GOTOFF64:
1086     case elfcpp::R_X86_64_GOTPC64:
1087     case elfcpp::R_X86_64_PLTOFF64:
1088       // We need a GOT section.
1089       target->got_section(symtab, layout);
1090       // For PLTOFF64, we'd normally want a PLT section, but since we
1091       // know this is a local symbol, no PLT is needed.
1092       break;
1093
1094     case elfcpp::R_X86_64_GOT64:
1095     case elfcpp::R_X86_64_GOT32:
1096     case elfcpp::R_X86_64_GOTPCREL64:
1097     case elfcpp::R_X86_64_GOTPCREL:
1098     case elfcpp::R_X86_64_GOTPLT64:
1099       {
1100         // The symbol requires a GOT entry.
1101         Output_data_got<64, false>* got = target->got_section(symtab, layout);
1102         unsigned int r_sym = elfcpp::elf_r_sym<64>(reloc.get_r_info());
1103         if (got->add_local(object, r_sym, GOT_TYPE_STANDARD))
1104           {
1105             // If we are generating a shared object, we need to add a
1106             // dynamic relocation for this symbol's GOT entry.
1107             if (parameters->options().output_is_position_independent())
1108               {
1109                 Reloc_section* rela_dyn = target->rela_dyn_section(layout);
1110                 // R_X86_64_RELATIVE assumes a 64-bit relocation.
1111                 if (r_type != elfcpp::R_X86_64_GOT32)
1112                   rela_dyn->add_local_relative(
1113                       object, r_sym, elfcpp::R_X86_64_RELATIVE, got,
1114                       object->local_got_offset(r_sym, GOT_TYPE_STANDARD), 0);
1115                 else
1116                   {
1117                     this->check_non_pic(object, r_type);
1118
1119                     gold_assert(lsym.get_st_type() != elfcpp::STT_SECTION);
1120                     rela_dyn->add_local(
1121                         object, r_sym, r_type, got,
1122                         object->local_got_offset(r_sym, GOT_TYPE_STANDARD), 0);
1123                   }
1124               }
1125           }
1126         // For GOTPLT64, we'd normally want a PLT section, but since
1127         // we know this is a local symbol, no PLT is needed.
1128       }
1129       break;
1130
1131     case elfcpp::R_X86_64_COPY:
1132     case elfcpp::R_X86_64_GLOB_DAT:
1133     case elfcpp::R_X86_64_JUMP_SLOT:
1134     case elfcpp::R_X86_64_RELATIVE:
1135       // These are outstanding tls relocs, which are unexpected when linking
1136     case elfcpp::R_X86_64_TPOFF64:
1137     case elfcpp::R_X86_64_DTPMOD64:
1138     case elfcpp::R_X86_64_TLSDESC:
1139       gold_error(_("%s: unexpected reloc %u in object file"),
1140                  object->name().c_str(), r_type);
1141       break;
1142
1143       // These are initial tls relocs, which are expected when linking
1144     case elfcpp::R_X86_64_TLSGD:            // Global-dynamic
1145     case elfcpp::R_X86_64_GOTPC32_TLSDESC:  // Global-dynamic (from ~oliva url)
1146     case elfcpp::R_X86_64_TLSDESC_CALL:
1147     case elfcpp::R_X86_64_TLSLD:            // Local-dynamic
1148     case elfcpp::R_X86_64_DTPOFF32:
1149     case elfcpp::R_X86_64_DTPOFF64:
1150     case elfcpp::R_X86_64_GOTTPOFF:         // Initial-exec
1151     case elfcpp::R_X86_64_TPOFF32:          // Local-exec
1152       {
1153         bool output_is_shared = parameters->options().shared();
1154         const tls::Tls_optimization optimized_type
1155             = Target_x86_64::optimize_tls_reloc(!output_is_shared, r_type);
1156         switch (r_type)
1157           {
1158           case elfcpp::R_X86_64_TLSGD:       // General-dynamic
1159             if (optimized_type == tls::TLSOPT_NONE)
1160               {
1161                 // Create a pair of GOT entries for the module index and
1162                 // dtv-relative offset.
1163                 Output_data_got<64, false>* got
1164                     = target->got_section(symtab, layout);
1165                 unsigned int r_sym = elfcpp::elf_r_sym<64>(reloc.get_r_info());
1166                 unsigned int shndx = lsym.get_st_shndx();
1167                 bool is_ordinary;
1168                 shndx = object->adjust_sym_shndx(r_sym, shndx, &is_ordinary);
1169                 if (!is_ordinary)
1170                   object->error(_("local symbol %u has bad shndx %u"),
1171                               r_sym, shndx);
1172                 else
1173                   got->add_local_pair_with_rela(object, r_sym,
1174                                                 shndx,
1175                                                 GOT_TYPE_TLS_PAIR,
1176                                                 target->rela_dyn_section(layout),
1177                                                 elfcpp::R_X86_64_DTPMOD64, 0);
1178               }
1179             else if (optimized_type != tls::TLSOPT_TO_LE)
1180               unsupported_reloc_local(object, r_type);
1181             break;
1182
1183           case elfcpp::R_X86_64_GOTPC32_TLSDESC:
1184             target->define_tls_base_symbol(symtab, layout);
1185             if (optimized_type == tls::TLSOPT_NONE)
1186               {
1187                 // Create reserved PLT and GOT entries for the resolver.
1188                 target->reserve_tlsdesc_entries(symtab, layout);
1189
1190                 // Generate a double GOT entry with an R_X86_64_TLSDESC reloc.
1191                 Output_data_got<64, false>* got
1192                     = target->got_section(symtab, layout);
1193                 unsigned int r_sym = elfcpp::elf_r_sym<64>(reloc.get_r_info());
1194                 unsigned int shndx = lsym.get_st_shndx();
1195                 bool is_ordinary;
1196                 shndx = object->adjust_sym_shndx(r_sym, shndx, &is_ordinary);
1197                 if (!is_ordinary)
1198                   object->error(_("local symbol %u has bad shndx %u"),
1199                               r_sym, shndx);
1200                 else
1201                   got->add_local_pair_with_rela(object, r_sym,
1202                                                 shndx,
1203                                                 GOT_TYPE_TLS_DESC,
1204                                                 target->rela_dyn_section(layout),
1205                                                 elfcpp::R_X86_64_TLSDESC, 0);
1206               }
1207             else if (optimized_type != tls::TLSOPT_TO_LE)
1208               unsupported_reloc_local(object, r_type);
1209             break;
1210
1211           case elfcpp::R_X86_64_TLSDESC_CALL:
1212             break;
1213
1214           case elfcpp::R_X86_64_TLSLD:       // Local-dynamic
1215             if (optimized_type == tls::TLSOPT_NONE)
1216               {
1217                 // Create a GOT entry for the module index.
1218                 target->got_mod_index_entry(symtab, layout, object);
1219               }
1220             else if (optimized_type != tls::TLSOPT_TO_LE)
1221               unsupported_reloc_local(object, r_type);
1222             break;
1223
1224           case elfcpp::R_X86_64_DTPOFF32:
1225           case elfcpp::R_X86_64_DTPOFF64:
1226             break;
1227
1228           case elfcpp::R_X86_64_GOTTPOFF:    // Initial-exec
1229             layout->set_has_static_tls();
1230             if (optimized_type == tls::TLSOPT_NONE)
1231               {
1232                 // Create a GOT entry for the tp-relative offset.
1233                 Output_data_got<64, false>* got
1234                     = target->got_section(symtab, layout);
1235                 unsigned int r_sym = elfcpp::elf_r_sym<64>(reloc.get_r_info());
1236                 got->add_local_with_rela(object, r_sym, GOT_TYPE_TLS_OFFSET,
1237                                          target->rela_dyn_section(layout),
1238                                          elfcpp::R_X86_64_TPOFF64);
1239               }
1240             else if (optimized_type != tls::TLSOPT_TO_LE)
1241               unsupported_reloc_local(object, r_type);
1242             break;
1243
1244           case elfcpp::R_X86_64_TPOFF32:     // Local-exec
1245             layout->set_has_static_tls();
1246             if (output_is_shared)
1247               unsupported_reloc_local(object, r_type);
1248             break;
1249
1250           default:
1251             gold_unreachable();
1252           }
1253       }
1254       break;
1255
1256     case elfcpp::R_X86_64_SIZE32:
1257     case elfcpp::R_X86_64_SIZE64:
1258     default:
1259       gold_error(_("%s: unsupported reloc %u against local symbol"),
1260                  object->name().c_str(), r_type);
1261       break;
1262     }
1263 }
1264
1265
1266 // Report an unsupported relocation against a global symbol.
1267
1268 void
1269 Target_x86_64::Scan::unsupported_reloc_global(Sized_relobj<64, false>* object,
1270                                               unsigned int r_type,
1271                                               Symbol* gsym)
1272 {
1273   gold_error(_("%s: unsupported reloc %u against global symbol %s"),
1274              object->name().c_str(), r_type, gsym->demangled_name().c_str());
1275 }
1276
1277 // Scan a relocation for a global symbol.
1278
1279 inline void
1280 Target_x86_64::Scan::global(Symbol_table* symtab,
1281                             Layout* layout,
1282                             Target_x86_64* target,
1283                             Sized_relobj<64, false>* object,
1284                             unsigned int data_shndx,
1285                             Output_section* output_section,
1286                             const elfcpp::Rela<64, false>& reloc,
1287                             unsigned int r_type,
1288                             Symbol* gsym)
1289 {
1290   switch (r_type)
1291     {
1292     case elfcpp::R_X86_64_NONE:
1293     case elfcpp::R_386_GNU_VTINHERIT:
1294     case elfcpp::R_386_GNU_VTENTRY:
1295       break;
1296
1297     case elfcpp::R_X86_64_64:
1298     case elfcpp::R_X86_64_32:
1299     case elfcpp::R_X86_64_32S:
1300     case elfcpp::R_X86_64_16:
1301     case elfcpp::R_X86_64_8:
1302       {
1303         // Make a PLT entry if necessary.
1304         if (gsym->needs_plt_entry())
1305           {
1306             target->make_plt_entry(symtab, layout, gsym);
1307             // Since this is not a PC-relative relocation, we may be
1308             // taking the address of a function. In that case we need to
1309             // set the entry in the dynamic symbol table to the address of
1310             // the PLT entry.
1311             if (gsym->is_from_dynobj() && !parameters->options().shared())
1312               gsym->set_needs_dynsym_value();
1313           }
1314         // Make a dynamic relocation if necessary.
1315         if (gsym->needs_dynamic_reloc(Symbol::ABSOLUTE_REF))
1316           {
1317             if (gsym->may_need_copy_reloc())
1318               {
1319                 target->copy_reloc(symtab, layout, object,
1320                                    data_shndx, output_section, gsym, reloc);
1321               }
1322             else if (r_type == elfcpp::R_X86_64_64
1323                      && gsym->can_use_relative_reloc(false))
1324               {
1325                 Reloc_section* rela_dyn = target->rela_dyn_section(layout);
1326                 rela_dyn->add_global_relative(gsym, elfcpp::R_X86_64_RELATIVE,
1327                                               output_section, object,
1328                                               data_shndx, reloc.get_r_offset(),
1329                                               reloc.get_r_addend());
1330               }
1331             else
1332               {
1333                 this->check_non_pic(object, r_type);
1334                 Reloc_section* rela_dyn = target->rela_dyn_section(layout);
1335                 rela_dyn->add_global(gsym, r_type, output_section, object,
1336                                      data_shndx, reloc.get_r_offset(),
1337                                      reloc.get_r_addend());
1338               }
1339           }
1340       }
1341       break;
1342
1343     case elfcpp::R_X86_64_PC64:
1344     case elfcpp::R_X86_64_PC32:
1345     case elfcpp::R_X86_64_PC16:
1346     case elfcpp::R_X86_64_PC8:
1347       {
1348         // Make a PLT entry if necessary.
1349         if (gsym->needs_plt_entry())
1350           target->make_plt_entry(symtab, layout, gsym);
1351         // Make a dynamic relocation if necessary.
1352         int flags = Symbol::NON_PIC_REF;
1353         if (gsym->type() == elfcpp::STT_FUNC)
1354           flags |= Symbol::FUNCTION_CALL;
1355         if (gsym->needs_dynamic_reloc(flags))
1356           {
1357             if (gsym->may_need_copy_reloc())
1358               {
1359                 target->copy_reloc(symtab, layout, object,
1360                                    data_shndx, output_section, gsym, reloc);
1361               }
1362             else
1363               {
1364                 this->check_non_pic(object, r_type);
1365                 Reloc_section* rela_dyn = target->rela_dyn_section(layout);
1366                 rela_dyn->add_global(gsym, r_type, output_section, object,
1367                                      data_shndx, reloc.get_r_offset(),
1368                                      reloc.get_r_addend());
1369               }
1370           }
1371       }
1372       break;
1373
1374     case elfcpp::R_X86_64_GOT64:
1375     case elfcpp::R_X86_64_GOT32:
1376     case elfcpp::R_X86_64_GOTPCREL64:
1377     case elfcpp::R_X86_64_GOTPCREL:
1378     case elfcpp::R_X86_64_GOTPLT64:
1379       {
1380         // The symbol requires a GOT entry.
1381         Output_data_got<64, false>* got = target->got_section(symtab, layout);
1382         if (gsym->final_value_is_known())
1383           got->add_global(gsym, GOT_TYPE_STANDARD);
1384         else
1385           {
1386             // If this symbol is not fully resolved, we need to add a
1387             // dynamic relocation for it.
1388             Reloc_section* rela_dyn = target->rela_dyn_section(layout);
1389             if (gsym->is_from_dynobj()
1390                 || gsym->is_undefined()
1391                 || gsym->is_preemptible())
1392               got->add_global_with_rela(gsym, GOT_TYPE_STANDARD, rela_dyn,
1393                                         elfcpp::R_X86_64_GLOB_DAT);
1394             else
1395               {
1396                 if (got->add_global(gsym, GOT_TYPE_STANDARD))
1397                   rela_dyn->add_global_relative(
1398                       gsym, elfcpp::R_X86_64_RELATIVE, got,
1399                       gsym->got_offset(GOT_TYPE_STANDARD), 0);
1400               }
1401           }
1402         // For GOTPLT64, we also need a PLT entry (but only if the
1403         // symbol is not fully resolved).
1404         if (r_type == elfcpp::R_X86_64_GOTPLT64
1405             && !gsym->final_value_is_known())
1406           target->make_plt_entry(symtab, layout, gsym);
1407       }
1408       break;
1409
1410     case elfcpp::R_X86_64_PLT32:
1411       // If the symbol is fully resolved, this is just a PC32 reloc.
1412       // Otherwise we need a PLT entry.
1413       if (gsym->final_value_is_known())
1414         break;
1415       // If building a shared library, we can also skip the PLT entry
1416       // if the symbol is defined in the output file and is protected
1417       // or hidden.
1418       if (gsym->is_defined()
1419           && !gsym->is_from_dynobj()
1420           && !gsym->is_preemptible())
1421         break;
1422       target->make_plt_entry(symtab, layout, gsym);
1423       break;
1424
1425     case elfcpp::R_X86_64_GOTPC32:
1426     case elfcpp::R_X86_64_GOTOFF64:
1427     case elfcpp::R_X86_64_GOTPC64:
1428     case elfcpp::R_X86_64_PLTOFF64:
1429       // We need a GOT section.
1430       target->got_section(symtab, layout);
1431       // For PLTOFF64, we also need a PLT entry (but only if the
1432       // symbol is not fully resolved).
1433       if (r_type == elfcpp::R_X86_64_PLTOFF64
1434           && !gsym->final_value_is_known())
1435         target->make_plt_entry(symtab, layout, gsym);
1436       break;
1437
1438     case elfcpp::R_X86_64_COPY:
1439     case elfcpp::R_X86_64_GLOB_DAT:
1440     case elfcpp::R_X86_64_JUMP_SLOT:
1441     case elfcpp::R_X86_64_RELATIVE:
1442       // These are outstanding tls relocs, which are unexpected when linking
1443     case elfcpp::R_X86_64_TPOFF64:
1444     case elfcpp::R_X86_64_DTPMOD64:
1445     case elfcpp::R_X86_64_TLSDESC:
1446       gold_error(_("%s: unexpected reloc %u in object file"),
1447                  object->name().c_str(), r_type);
1448       break;
1449
1450       // These are initial tls relocs, which are expected for global()
1451     case elfcpp::R_X86_64_TLSGD:            // Global-dynamic
1452     case elfcpp::R_X86_64_GOTPC32_TLSDESC:  // Global-dynamic (from ~oliva url)
1453     case elfcpp::R_X86_64_TLSDESC_CALL:
1454     case elfcpp::R_X86_64_TLSLD:            // Local-dynamic
1455     case elfcpp::R_X86_64_DTPOFF32:
1456     case elfcpp::R_X86_64_DTPOFF64:
1457     case elfcpp::R_X86_64_GOTTPOFF:         // Initial-exec
1458     case elfcpp::R_X86_64_TPOFF32:          // Local-exec
1459       {
1460         const bool is_final = gsym->final_value_is_known();
1461         const tls::Tls_optimization optimized_type
1462             = Target_x86_64::optimize_tls_reloc(is_final, r_type);
1463         switch (r_type)
1464           {
1465           case elfcpp::R_X86_64_TLSGD:       // General-dynamic
1466             if (optimized_type == tls::TLSOPT_NONE)
1467               {
1468                 // Create a pair of GOT entries for the module index and
1469                 // dtv-relative offset.
1470                 Output_data_got<64, false>* got
1471                     = target->got_section(symtab, layout);
1472                 got->add_global_pair_with_rela(gsym, GOT_TYPE_TLS_PAIR,
1473                                                target->rela_dyn_section(layout),
1474                                                elfcpp::R_X86_64_DTPMOD64,
1475                                                elfcpp::R_X86_64_DTPOFF64);
1476               }
1477             else if (optimized_type == tls::TLSOPT_TO_IE)
1478               {
1479                 // Create a GOT entry for the tp-relative offset.
1480                 Output_data_got<64, false>* got
1481                     = target->got_section(symtab, layout);
1482                 got->add_global_with_rela(gsym, GOT_TYPE_TLS_OFFSET,
1483                                           target->rela_dyn_section(layout),
1484                                           elfcpp::R_X86_64_TPOFF64);
1485               }
1486             else if (optimized_type != tls::TLSOPT_TO_LE)
1487               unsupported_reloc_global(object, r_type, gsym);
1488             break;
1489
1490           case elfcpp::R_X86_64_GOTPC32_TLSDESC:
1491             target->define_tls_base_symbol(symtab, layout);
1492             if (optimized_type == tls::TLSOPT_NONE)
1493               {
1494                 // Create reserved PLT and GOT entries for the resolver.
1495                 target->reserve_tlsdesc_entries(symtab, layout);
1496
1497                 // Create a double GOT entry with an R_X86_64_TLSDESC reloc.
1498                 Output_data_got<64, false>* got
1499                     = target->got_section(symtab, layout);
1500                 got->add_global_pair_with_rela(gsym, GOT_TYPE_TLS_DESC,
1501                                                target->rela_dyn_section(layout),
1502                                                elfcpp::R_X86_64_TLSDESC, 0);
1503               }
1504             else if (optimized_type == tls::TLSOPT_TO_IE)
1505               {
1506                 // Create a GOT entry for the tp-relative offset.
1507                 Output_data_got<64, false>* got
1508                     = target->got_section(symtab, layout);
1509                 got->add_global_with_rela(gsym, GOT_TYPE_TLS_OFFSET,
1510                                           target->rela_dyn_section(layout),
1511                                           elfcpp::R_X86_64_TPOFF64);
1512               }
1513             else if (optimized_type != tls::TLSOPT_TO_LE)
1514               unsupported_reloc_global(object, r_type, gsym);
1515             break;
1516
1517           case elfcpp::R_X86_64_TLSDESC_CALL:
1518             break;
1519
1520           case elfcpp::R_X86_64_TLSLD:       // Local-dynamic
1521             if (optimized_type == tls::TLSOPT_NONE)
1522               {
1523                 // Create a GOT entry for the module index.
1524                 target->got_mod_index_entry(symtab, layout, object);
1525               }
1526             else if (optimized_type != tls::TLSOPT_TO_LE)
1527               unsupported_reloc_global(object, r_type, gsym);
1528             break;
1529
1530           case elfcpp::R_X86_64_DTPOFF32:
1531           case elfcpp::R_X86_64_DTPOFF64:
1532             break;
1533
1534           case elfcpp::R_X86_64_GOTTPOFF:    // Initial-exec
1535             layout->set_has_static_tls();
1536             if (optimized_type == tls::TLSOPT_NONE)
1537               {
1538                 // Create a GOT entry for the tp-relative offset.
1539                 Output_data_got<64, false>* got
1540                     = target->got_section(symtab, layout);
1541                 got->add_global_with_rela(gsym, GOT_TYPE_TLS_OFFSET,
1542                                           target->rela_dyn_section(layout),
1543                                           elfcpp::R_X86_64_TPOFF64);
1544               }
1545             else if (optimized_type != tls::TLSOPT_TO_LE)
1546               unsupported_reloc_global(object, r_type, gsym);
1547             break;
1548
1549           case elfcpp::R_X86_64_TPOFF32:     // Local-exec
1550             layout->set_has_static_tls();
1551             if (parameters->options().shared())
1552               unsupported_reloc_local(object, r_type);
1553             break;
1554
1555           default:
1556             gold_unreachable();
1557           }
1558       }
1559       break;
1560
1561     case elfcpp::R_X86_64_SIZE32:
1562     case elfcpp::R_X86_64_SIZE64:
1563     default:
1564       gold_error(_("%s: unsupported reloc %u against global symbol %s"),
1565                  object->name().c_str(), r_type,
1566                  gsym->demangled_name().c_str());
1567       break;
1568     }
1569 }
1570
1571 void
1572 Target_x86_64::gc_process_relocs(Symbol_table* symtab,
1573                                  Layout* layout,
1574                                  Sized_relobj<64, false>* object,
1575                                  unsigned int data_shndx,
1576                                  unsigned int sh_type,
1577                                  const unsigned char* prelocs,
1578                                  size_t reloc_count,
1579                                  Output_section* output_section,
1580                                  bool needs_special_offset_handling,
1581                                  size_t local_symbol_count,
1582                                  const unsigned char* plocal_symbols)
1583 {
1584
1585   if (sh_type == elfcpp::SHT_REL)
1586     {
1587       return;
1588     }
1589
1590    gold::gc_process_relocs<64, false, Target_x86_64, elfcpp::SHT_RELA,
1591                            Target_x86_64::Scan>(
1592     symtab,
1593     layout,
1594     this,
1595     object,
1596     data_shndx,
1597     prelocs,
1598     reloc_count,
1599     output_section,
1600     needs_special_offset_handling,
1601     local_symbol_count,
1602     plocal_symbols);
1603  
1604 }
1605 // Scan relocations for a section.
1606
1607 void
1608 Target_x86_64::scan_relocs(Symbol_table* symtab,
1609                            Layout* layout,
1610                            Sized_relobj<64, false>* object,
1611                            unsigned int data_shndx,
1612                            unsigned int sh_type,
1613                            const unsigned char* prelocs,
1614                            size_t reloc_count,
1615                            Output_section* output_section,
1616                            bool needs_special_offset_handling,
1617                            size_t local_symbol_count,
1618                            const unsigned char* plocal_symbols)
1619 {
1620   if (sh_type == elfcpp::SHT_REL)
1621     {
1622       gold_error(_("%s: unsupported REL reloc section"),
1623                  object->name().c_str());
1624       return;
1625     }
1626
1627   gold::scan_relocs<64, false, Target_x86_64, elfcpp::SHT_RELA,
1628       Target_x86_64::Scan>(
1629     symtab,
1630     layout,
1631     this,
1632     object,
1633     data_shndx,
1634     prelocs,
1635     reloc_count,
1636     output_section,
1637     needs_special_offset_handling,
1638     local_symbol_count,
1639     plocal_symbols);
1640 }
1641
1642 // Finalize the sections.
1643
1644 void
1645 Target_x86_64::do_finalize_sections(Layout* layout)
1646 {
1647   // Fill in some more dynamic tags.
1648   Output_data_dynamic* const odyn = layout->dynamic_data();
1649   if (odyn != NULL)
1650     {
1651       if (this->got_plt_ != NULL)
1652         odyn->add_section_address(elfcpp::DT_PLTGOT, this->got_plt_);
1653
1654       if (this->plt_ != NULL)
1655         {
1656           const Output_data* od = this->plt_->rel_plt();
1657           odyn->add_section_size(elfcpp::DT_PLTRELSZ, od);
1658           odyn->add_section_address(elfcpp::DT_JMPREL, od);
1659           odyn->add_constant(elfcpp::DT_PLTREL, elfcpp::DT_RELA);
1660           if (this->plt_->has_tlsdesc_entry())
1661             {
1662               unsigned int plt_offset = this->plt_->get_tlsdesc_plt_offset();
1663               unsigned int got_offset = this->plt_->get_tlsdesc_got_offset();
1664               this->got_->finalize_data_size();
1665               odyn->add_section_plus_offset(elfcpp::DT_TLSDESC_PLT,
1666                                             this->plt_, plt_offset);
1667               odyn->add_section_plus_offset(elfcpp::DT_TLSDESC_GOT,
1668                                             this->got_, got_offset);
1669             }
1670         }
1671
1672       if (this->rela_dyn_ != NULL)
1673         {
1674           const Output_data* od = this->rela_dyn_;
1675           odyn->add_section_address(elfcpp::DT_RELA, od);
1676           odyn->add_section_size(elfcpp::DT_RELASZ, od);
1677           odyn->add_constant(elfcpp::DT_RELAENT,
1678                              elfcpp::Elf_sizes<64>::rela_size);
1679         }
1680
1681       if (!parameters->options().shared())
1682         {
1683           // The value of the DT_DEBUG tag is filled in by the dynamic
1684           // linker at run time, and used by the debugger.
1685           odyn->add_constant(elfcpp::DT_DEBUG, 0);
1686         }
1687     }
1688
1689   // Emit any relocs we saved in an attempt to avoid generating COPY
1690   // relocs.
1691   if (this->copy_relocs_.any_saved_relocs())
1692     this->copy_relocs_.emit(this->rela_dyn_section(layout));
1693 }
1694
1695 // Perform a relocation.
1696
1697 inline bool
1698 Target_x86_64::Relocate::relocate(const Relocate_info<64, false>* relinfo,
1699                                   Target_x86_64* target,
1700                                   Output_section*,
1701                                   size_t relnum,
1702                                   const elfcpp::Rela<64, false>& rela,
1703                                   unsigned int r_type,
1704                                   const Sized_symbol<64>* gsym,
1705                                   const Symbol_value<64>* psymval,
1706                                   unsigned char* view,
1707                                   elfcpp::Elf_types<64>::Elf_Addr address,
1708                                   section_size_type view_size)
1709 {
1710   if (this->skip_call_tls_get_addr_)
1711     {
1712       if ((r_type != elfcpp::R_X86_64_PLT32
1713            && r_type != elfcpp::R_X86_64_PC32)
1714           || gsym == NULL
1715           || strcmp(gsym->name(), "__tls_get_addr") != 0)
1716         {
1717           gold_error_at_location(relinfo, relnum, rela.get_r_offset(),
1718                                  _("missing expected TLS relocation"));
1719         }
1720       else
1721         {
1722           this->skip_call_tls_get_addr_ = false;
1723           return false;
1724         }
1725     }
1726
1727   // Pick the value to use for symbols defined in shared objects.
1728   Symbol_value<64> symval;
1729   if (gsym != NULL
1730       && gsym->use_plt_offset(r_type == elfcpp::R_X86_64_PC64
1731                               || r_type == elfcpp::R_X86_64_PC32
1732                               || r_type == elfcpp::R_X86_64_PC16
1733                               || r_type == elfcpp::R_X86_64_PC8))
1734     {
1735       symval.set_output_value(target->plt_section()->address()
1736                               + gsym->plt_offset());
1737       psymval = &symval;
1738     }
1739
1740   const Sized_relobj<64, false>* object = relinfo->object;
1741   const elfcpp::Elf_Xword addend = rela.get_r_addend();
1742
1743   // Get the GOT offset if needed.
1744   // The GOT pointer points to the end of the GOT section.
1745   // We need to subtract the size of the GOT section to get
1746   // the actual offset to use in the relocation.
1747   bool have_got_offset = false;
1748   unsigned int got_offset = 0;
1749   switch (r_type)
1750     {
1751     case elfcpp::R_X86_64_GOT32:
1752     case elfcpp::R_X86_64_GOT64:
1753     case elfcpp::R_X86_64_GOTPLT64:
1754     case elfcpp::R_X86_64_GOTPCREL:
1755     case elfcpp::R_X86_64_GOTPCREL64:
1756       if (gsym != NULL)
1757         {
1758           gold_assert(gsym->has_got_offset(GOT_TYPE_STANDARD));
1759           got_offset = gsym->got_offset(GOT_TYPE_STANDARD) - target->got_size();
1760         }
1761       else
1762         {
1763           unsigned int r_sym = elfcpp::elf_r_sym<64>(rela.get_r_info());
1764           gold_assert(object->local_has_got_offset(r_sym, GOT_TYPE_STANDARD));
1765           got_offset = (object->local_got_offset(r_sym, GOT_TYPE_STANDARD)
1766                         - target->got_size());
1767         }
1768       have_got_offset = true;
1769       break;
1770
1771     default:
1772       break;
1773     }
1774
1775   switch (r_type)
1776     {
1777     case elfcpp::R_X86_64_NONE:
1778     case elfcpp::R_386_GNU_VTINHERIT:
1779     case elfcpp::R_386_GNU_VTENTRY:
1780       break;
1781
1782     case elfcpp::R_X86_64_64:
1783       Relocate_functions<64, false>::rela64(view, object, psymval, addend);
1784       break;
1785
1786     case elfcpp::R_X86_64_PC64:
1787       Relocate_functions<64, false>::pcrela64(view, object, psymval, addend,
1788                                               address);
1789       break;
1790
1791     case elfcpp::R_X86_64_32:
1792       // FIXME: we need to verify that value + addend fits into 32 bits:
1793       //    uint64_t x = value + addend;
1794       //    x == static_cast<uint64_t>(static_cast<uint32_t>(x))
1795       // Likewise for other <=32-bit relocations (but see R_X86_64_32S).
1796       Relocate_functions<64, false>::rela32(view, object, psymval, addend);
1797       break;
1798
1799     case elfcpp::R_X86_64_32S:
1800       // FIXME: we need to verify that value + addend fits into 32 bits:
1801       //    int64_t x = value + addend;   // note this quantity is signed!
1802       //    x == static_cast<int64_t>(static_cast<int32_t>(x))
1803       Relocate_functions<64, false>::rela32(view, object, psymval, addend);
1804       break;
1805
1806     case elfcpp::R_X86_64_PC32:
1807       Relocate_functions<64, false>::pcrela32(view, object, psymval, addend,
1808                                               address);
1809       break;
1810
1811     case elfcpp::R_X86_64_16:
1812       Relocate_functions<64, false>::rela16(view, object, psymval, addend);
1813       break;
1814
1815     case elfcpp::R_X86_64_PC16:
1816       Relocate_functions<64, false>::pcrela16(view, object, psymval, addend,
1817                                               address);
1818       break;
1819
1820     case elfcpp::R_X86_64_8:
1821       Relocate_functions<64, false>::rela8(view, object, psymval, addend);
1822       break;
1823
1824     case elfcpp::R_X86_64_PC8:
1825       Relocate_functions<64, false>::pcrela8(view, object, psymval, addend,
1826                                              address);
1827       break;
1828
1829     case elfcpp::R_X86_64_PLT32:
1830       gold_assert(gsym == NULL
1831                   || gsym->has_plt_offset()
1832                   || gsym->final_value_is_known()
1833                   || (gsym->is_defined()
1834                       && !gsym->is_from_dynobj()
1835                       && !gsym->is_preemptible()));
1836       // Note: while this code looks the same as for R_X86_64_PC32, it
1837       // behaves differently because psymval was set to point to
1838       // the PLT entry, rather than the symbol, in Scan::global().
1839       Relocate_functions<64, false>::pcrela32(view, object, psymval, addend,
1840                                               address);
1841       break;
1842
1843     case elfcpp::R_X86_64_PLTOFF64:
1844       {
1845         gold_assert(gsym);
1846         gold_assert(gsym->has_plt_offset()
1847                     || gsym->final_value_is_known());
1848         elfcpp::Elf_types<64>::Elf_Addr got_address;
1849         got_address = target->got_section(NULL, NULL)->address();
1850         Relocate_functions<64, false>::rela64(view, object, psymval,
1851                                               addend - got_address);
1852       }
1853
1854     case elfcpp::R_X86_64_GOT32:
1855       gold_assert(have_got_offset);
1856       Relocate_functions<64, false>::rela32(view, got_offset, addend);
1857       break;
1858
1859     case elfcpp::R_X86_64_GOTPC32:
1860       {
1861         gold_assert(gsym);
1862         elfcpp::Elf_types<64>::Elf_Addr value;
1863         value = target->got_plt_section()->address();
1864         Relocate_functions<64, false>::pcrela32(view, value, addend, address);
1865       }
1866       break;
1867
1868     case elfcpp::R_X86_64_GOT64:
1869       // The ABI doc says "Like GOT64, but indicates a PLT entry is needed."
1870       // Since we always add a PLT entry, this is equivalent.
1871     case elfcpp::R_X86_64_GOTPLT64:
1872       gold_assert(have_got_offset);
1873       Relocate_functions<64, false>::rela64(view, got_offset, addend);
1874       break;
1875
1876     case elfcpp::R_X86_64_GOTPC64:
1877       {
1878         gold_assert(gsym);
1879         elfcpp::Elf_types<64>::Elf_Addr value;
1880         value = target->got_plt_section()->address();
1881         Relocate_functions<64, false>::pcrela64(view, value, addend, address);
1882       }
1883       break;
1884
1885     case elfcpp::R_X86_64_GOTOFF64:
1886       {
1887         elfcpp::Elf_types<64>::Elf_Addr value;
1888         value = (psymval->value(object, 0)
1889                  - target->got_plt_section()->address());
1890         Relocate_functions<64, false>::rela64(view, value, addend);
1891       }
1892       break;
1893
1894     case elfcpp::R_X86_64_GOTPCREL:
1895       {
1896         gold_assert(have_got_offset);
1897         elfcpp::Elf_types<64>::Elf_Addr value;
1898         value = target->got_plt_section()->address() + got_offset;
1899         Relocate_functions<64, false>::pcrela32(view, value, addend, address);
1900       }
1901       break;
1902
1903     case elfcpp::R_X86_64_GOTPCREL64:
1904       {
1905         gold_assert(have_got_offset);
1906         elfcpp::Elf_types<64>::Elf_Addr value;
1907         value = target->got_plt_section()->address() + got_offset;
1908         Relocate_functions<64, false>::pcrela64(view, value, addend, address);
1909       }
1910       break;
1911
1912     case elfcpp::R_X86_64_COPY:
1913     case elfcpp::R_X86_64_GLOB_DAT:
1914     case elfcpp::R_X86_64_JUMP_SLOT:
1915     case elfcpp::R_X86_64_RELATIVE:
1916       // These are outstanding tls relocs, which are unexpected when linking
1917     case elfcpp::R_X86_64_TPOFF64:
1918     case elfcpp::R_X86_64_DTPMOD64:
1919     case elfcpp::R_X86_64_TLSDESC:
1920       gold_error_at_location(relinfo, relnum, rela.get_r_offset(),
1921                              _("unexpected reloc %u in object file"),
1922                              r_type);
1923       break;
1924
1925       // These are initial tls relocs, which are expected when linking
1926     case elfcpp::R_X86_64_TLSGD:            // Global-dynamic
1927     case elfcpp::R_X86_64_GOTPC32_TLSDESC:  // Global-dynamic (from ~oliva url)
1928     case elfcpp::R_X86_64_TLSDESC_CALL:
1929     case elfcpp::R_X86_64_TLSLD:            // Local-dynamic
1930     case elfcpp::R_X86_64_DTPOFF32:
1931     case elfcpp::R_X86_64_DTPOFF64:
1932     case elfcpp::R_X86_64_GOTTPOFF:         // Initial-exec
1933     case elfcpp::R_X86_64_TPOFF32:          // Local-exec
1934       this->relocate_tls(relinfo, target, relnum, rela, r_type, gsym, psymval,
1935                          view, address, view_size);
1936       break;
1937
1938     case elfcpp::R_X86_64_SIZE32:
1939     case elfcpp::R_X86_64_SIZE64:
1940     default:
1941       gold_error_at_location(relinfo, relnum, rela.get_r_offset(),
1942                              _("unsupported reloc %u"),
1943                              r_type);
1944       break;
1945     }
1946
1947   return true;
1948 }
1949
1950 // Perform a TLS relocation.
1951
1952 inline void
1953 Target_x86_64::Relocate::relocate_tls(const Relocate_info<64, false>* relinfo,
1954                                       Target_x86_64* target,
1955                                       size_t relnum,
1956                                       const elfcpp::Rela<64, false>& rela,
1957                                       unsigned int r_type,
1958                                       const Sized_symbol<64>* gsym,
1959                                       const Symbol_value<64>* psymval,
1960                                       unsigned char* view,
1961                                       elfcpp::Elf_types<64>::Elf_Addr address,
1962                                       section_size_type view_size)
1963 {
1964   Output_segment* tls_segment = relinfo->layout->tls_segment();
1965
1966   const Sized_relobj<64, false>* object = relinfo->object;
1967   const elfcpp::Elf_Xword addend = rela.get_r_addend();
1968
1969   elfcpp::Elf_types<64>::Elf_Addr value = psymval->value(relinfo->object, 0);
1970
1971   const bool is_final = (gsym == NULL
1972                          ? !parameters->options().output_is_position_independent()
1973                          : gsym->final_value_is_known());
1974   const tls::Tls_optimization optimized_type
1975       = Target_x86_64::optimize_tls_reloc(is_final, r_type);
1976   switch (r_type)
1977     {
1978     case elfcpp::R_X86_64_TLSGD:            // Global-dynamic
1979       this->saw_tls_block_reloc_ = true;
1980       if (optimized_type == tls::TLSOPT_TO_LE)
1981         {
1982           gold_assert(tls_segment != NULL);
1983           this->tls_gd_to_le(relinfo, relnum, tls_segment,
1984                              rela, r_type, value, view,
1985                              view_size);
1986           break;
1987         }
1988       else
1989         {
1990           unsigned int got_type = (optimized_type == tls::TLSOPT_TO_IE
1991                                    ? GOT_TYPE_TLS_OFFSET
1992                                    : GOT_TYPE_TLS_PAIR);
1993           unsigned int got_offset;
1994           if (gsym != NULL)
1995             {
1996               gold_assert(gsym->has_got_offset(got_type));
1997               got_offset = gsym->got_offset(got_type) - target->got_size();
1998             }
1999           else
2000             {
2001               unsigned int r_sym = elfcpp::elf_r_sym<64>(rela.get_r_info());
2002               gold_assert(object->local_has_got_offset(r_sym, got_type));
2003               got_offset = (object->local_got_offset(r_sym, got_type)
2004                             - target->got_size());
2005             }
2006           if (optimized_type == tls::TLSOPT_TO_IE)
2007             {
2008               gold_assert(tls_segment != NULL);
2009               value = target->got_plt_section()->address() + got_offset;
2010               this->tls_gd_to_ie(relinfo, relnum, tls_segment, rela, r_type,
2011                                  value, view, address, view_size);
2012               break;
2013             }
2014           else if (optimized_type == tls::TLSOPT_NONE)
2015             {
2016               // Relocate the field with the offset of the pair of GOT
2017               // entries.
2018               value = target->got_plt_section()->address() + got_offset;
2019               Relocate_functions<64, false>::pcrela32(view, value, addend,
2020                                                       address);
2021               break;
2022             }
2023         }
2024       gold_error_at_location(relinfo, relnum, rela.get_r_offset(),
2025                              _("unsupported reloc %u"), r_type);
2026       break;
2027
2028     case elfcpp::R_X86_64_GOTPC32_TLSDESC:  // Global-dynamic (from ~oliva url)
2029     case elfcpp::R_X86_64_TLSDESC_CALL:
2030       this->saw_tls_block_reloc_ = true;
2031       if (optimized_type == tls::TLSOPT_TO_LE)
2032         {
2033           gold_assert(tls_segment != NULL);
2034           this->tls_desc_gd_to_le(relinfo, relnum, tls_segment,
2035                                   rela, r_type, value, view,
2036                                   view_size);
2037           break;
2038         }
2039       else
2040         {
2041           unsigned int got_type = (optimized_type == tls::TLSOPT_TO_IE
2042                                    ? GOT_TYPE_TLS_OFFSET
2043                                    : GOT_TYPE_TLS_DESC);
2044           unsigned int got_offset;
2045           if (gsym != NULL)
2046             {
2047               gold_assert(gsym->has_got_offset(got_type));
2048               got_offset = gsym->got_offset(got_type) - target->got_size();
2049             }
2050           else
2051             {
2052               unsigned int r_sym = elfcpp::elf_r_sym<64>(rela.get_r_info());
2053               gold_assert(object->local_has_got_offset(r_sym, got_type));
2054               got_offset = (object->local_got_offset(r_sym, got_type)
2055                             - target->got_size());
2056             }
2057           if (optimized_type == tls::TLSOPT_TO_IE)
2058             {
2059               gold_assert(tls_segment != NULL);
2060               value = target->got_plt_section()->address() + got_offset;
2061               this->tls_desc_gd_to_ie(relinfo, relnum, tls_segment,
2062                                       rela, r_type, value, view, address,
2063                                       view_size);
2064               break;
2065             }
2066           else if (optimized_type == tls::TLSOPT_NONE)
2067             {
2068               if (r_type == elfcpp::R_X86_64_GOTPC32_TLSDESC)
2069                 {
2070                   // Relocate the field with the offset of the pair of GOT
2071                   // entries.
2072                   value = target->got_plt_section()->address() + got_offset;
2073                   Relocate_functions<64, false>::pcrela32(view, value, addend,
2074                                                           address);
2075                 }
2076               break;
2077             }
2078         }
2079       gold_error_at_location(relinfo, relnum, rela.get_r_offset(),
2080                              _("unsupported reloc %u"), r_type);
2081       break;
2082
2083     case elfcpp::R_X86_64_TLSLD:            // Local-dynamic
2084       this->saw_tls_block_reloc_ = true;
2085       if (optimized_type == tls::TLSOPT_TO_LE)
2086         {
2087           gold_assert(tls_segment != NULL);
2088           this->tls_ld_to_le(relinfo, relnum, tls_segment, rela, r_type,
2089                              value, view, view_size);
2090           break;
2091         }
2092       else if (optimized_type == tls::TLSOPT_NONE)
2093         {
2094           // Relocate the field with the offset of the GOT entry for
2095           // the module index.
2096           unsigned int got_offset;
2097           got_offset = (target->got_mod_index_entry(NULL, NULL, NULL)
2098                         - target->got_size());
2099           value = target->got_plt_section()->address() + got_offset;
2100           Relocate_functions<64, false>::pcrela32(view, value, addend,
2101                                                   address);
2102           break;
2103         }
2104       gold_error_at_location(relinfo, relnum, rela.get_r_offset(),
2105                              _("unsupported reloc %u"), r_type);
2106       break;
2107
2108     case elfcpp::R_X86_64_DTPOFF32:
2109       if (optimized_type == tls::TLSOPT_TO_LE)
2110         {
2111           // This relocation type is used in debugging information.
2112           // In that case we need to not optimize the value.  If we
2113           // haven't seen a TLSLD reloc, then we assume we should not
2114           // optimize this reloc.
2115           if (this->saw_tls_block_reloc_)
2116             {
2117               gold_assert(tls_segment != NULL);
2118               value -= tls_segment->memsz();
2119             }
2120         }
2121       Relocate_functions<64, false>::rela32(view, value, addend);
2122       break;
2123
2124     case elfcpp::R_X86_64_DTPOFF64:
2125       if (optimized_type == tls::TLSOPT_TO_LE)
2126         {
2127           // See R_X86_64_DTPOFF32, just above, for why we test this.
2128           if (this->saw_tls_block_reloc_)
2129             {
2130               gold_assert(tls_segment != NULL);
2131               value -= tls_segment->memsz();
2132             }
2133         }
2134       Relocate_functions<64, false>::rela64(view, value, addend);
2135       break;
2136
2137     case elfcpp::R_X86_64_GOTTPOFF:         // Initial-exec
2138       if (optimized_type == tls::TLSOPT_TO_LE)
2139         {
2140           gold_assert(tls_segment != NULL);
2141           Target_x86_64::Relocate::tls_ie_to_le(relinfo, relnum, tls_segment,
2142                                                 rela, r_type, value, view,
2143                                                 view_size);
2144           break;
2145         }
2146       else if (optimized_type == tls::TLSOPT_NONE)
2147         {
2148           // Relocate the field with the offset of the GOT entry for
2149           // the tp-relative offset of the symbol.
2150           unsigned int got_offset;
2151           if (gsym != NULL)
2152             {
2153               gold_assert(gsym->has_got_offset(GOT_TYPE_TLS_OFFSET));
2154               got_offset = (gsym->got_offset(GOT_TYPE_TLS_OFFSET)
2155                             - target->got_size());
2156             }
2157           else
2158             {
2159               unsigned int r_sym = elfcpp::elf_r_sym<64>(rela.get_r_info());
2160               gold_assert(object->local_has_got_offset(r_sym,
2161                                                        GOT_TYPE_TLS_OFFSET));
2162               got_offset = (object->local_got_offset(r_sym, GOT_TYPE_TLS_OFFSET)
2163                             - target->got_size());
2164             }
2165           value = target->got_plt_section()->address() + got_offset;
2166           Relocate_functions<64, false>::pcrela32(view, value, addend, address);
2167           break;
2168         }
2169       gold_error_at_location(relinfo, relnum, rela.get_r_offset(),
2170                              _("unsupported reloc type %u"),
2171                              r_type);
2172       break;
2173
2174     case elfcpp::R_X86_64_TPOFF32:          // Local-exec
2175       value -= tls_segment->memsz();
2176       Relocate_functions<64, false>::rela32(view, value, addend);
2177       break;
2178     }
2179 }
2180
2181 // Do a relocation in which we convert a TLS General-Dynamic to an
2182 // Initial-Exec.
2183
2184 inline void
2185 Target_x86_64::Relocate::tls_gd_to_ie(const Relocate_info<64, false>* relinfo,
2186                                       size_t relnum,
2187                                       Output_segment*,
2188                                       const elfcpp::Rela<64, false>& rela,
2189                                       unsigned int,
2190                                       elfcpp::Elf_types<64>::Elf_Addr value,
2191                                       unsigned char* view,
2192                                       elfcpp::Elf_types<64>::Elf_Addr address,
2193                                       section_size_type view_size)
2194 {
2195   // .byte 0x66; leaq foo@tlsgd(%rip),%rdi;
2196   // .word 0x6666; rex64; call __tls_get_addr
2197   // ==> movq %fs:0,%rax; addq x@gottpoff(%rip),%rax
2198
2199   tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, -4);
2200   tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, 12);
2201
2202   tls::check_tls(relinfo, relnum, rela.get_r_offset(),
2203                  (memcmp(view - 4, "\x66\x48\x8d\x3d", 4) == 0));
2204   tls::check_tls(relinfo, relnum, rela.get_r_offset(),
2205                  (memcmp(view + 4, "\x66\x66\x48\xe8", 4) == 0));
2206
2207   memcpy(view - 4, "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0\0", 16);
2208
2209   const elfcpp::Elf_Xword addend = rela.get_r_addend();
2210   Relocate_functions<64, false>::pcrela32(view + 8, value, addend - 8, address);
2211
2212   // The next reloc should be a PLT32 reloc against __tls_get_addr.
2213   // We can skip it.
2214   this->skip_call_tls_get_addr_ = true;
2215 }
2216
2217 // Do a relocation in which we convert a TLS General-Dynamic to a
2218 // Local-Exec.
2219
2220 inline void
2221 Target_x86_64::Relocate::tls_gd_to_le(const Relocate_info<64, false>* relinfo,
2222                                       size_t relnum,
2223                                       Output_segment* tls_segment,
2224                                       const elfcpp::Rela<64, false>& rela,
2225                                       unsigned int,
2226                                       elfcpp::Elf_types<64>::Elf_Addr value,
2227                                       unsigned char* view,
2228                                       section_size_type view_size)
2229 {
2230   // .byte 0x66; leaq foo@tlsgd(%rip),%rdi;
2231   // .word 0x6666; rex64; call __tls_get_addr
2232   // ==> movq %fs:0,%rax; leaq x@tpoff(%rax),%rax
2233
2234   tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, -4);
2235   tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, 12);
2236
2237   tls::check_tls(relinfo, relnum, rela.get_r_offset(),
2238                  (memcmp(view - 4, "\x66\x48\x8d\x3d", 4) == 0));
2239   tls::check_tls(relinfo, relnum, rela.get_r_offset(),
2240                  (memcmp(view + 4, "\x66\x66\x48\xe8", 4) == 0));
2241
2242   memcpy(view - 4, "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0\0", 16);
2243
2244   value -= tls_segment->memsz();
2245   Relocate_functions<64, false>::rela32(view + 8, value, 0);
2246
2247   // The next reloc should be a PLT32 reloc against __tls_get_addr.
2248   // We can skip it.
2249   this->skip_call_tls_get_addr_ = true;
2250 }
2251
2252 // Do a TLSDESC-style General-Dynamic to Initial-Exec transition.
2253
2254 inline void
2255 Target_x86_64::Relocate::tls_desc_gd_to_ie(
2256     const Relocate_info<64, false>* relinfo,
2257     size_t relnum,
2258     Output_segment*,
2259     const elfcpp::Rela<64, false>& rela,
2260     unsigned int r_type,
2261     elfcpp::Elf_types<64>::Elf_Addr value,
2262     unsigned char* view,
2263     elfcpp::Elf_types<64>::Elf_Addr address,
2264     section_size_type view_size)
2265 {
2266   if (r_type == elfcpp::R_X86_64_GOTPC32_TLSDESC)
2267     {
2268       // leaq foo@tlsdesc(%rip), %rax
2269       // ==> movq foo@gottpoff(%rip), %rax
2270       tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, -3);
2271       tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, 4);
2272       tls::check_tls(relinfo, relnum, rela.get_r_offset(),
2273                      view[-3] == 0x48 && view[-2] == 0x8d && view[-1] == 0x05);
2274       view[-2] = 0x8b;
2275       const elfcpp::Elf_Xword addend = rela.get_r_addend();
2276       Relocate_functions<64, false>::pcrela32(view, value, addend, address);
2277     }
2278   else
2279     {
2280       // call *foo@tlscall(%rax)
2281       // ==> nop; nop
2282       gold_assert(r_type == elfcpp::R_X86_64_TLSDESC_CALL);
2283       tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, 2);
2284       tls::check_tls(relinfo, relnum, rela.get_r_offset(),
2285                      view[0] == 0xff && view[1] == 0x10);
2286       view[0] = 0x66;
2287       view[1] = 0x90;
2288     }
2289 }
2290
2291 // Do a TLSDESC-style General-Dynamic to Local-Exec transition.
2292
2293 inline void
2294 Target_x86_64::Relocate::tls_desc_gd_to_le(
2295     const Relocate_info<64, false>* relinfo,
2296     size_t relnum,
2297     Output_segment* tls_segment,
2298     const elfcpp::Rela<64, false>& rela,
2299     unsigned int r_type,
2300     elfcpp::Elf_types<64>::Elf_Addr value,
2301     unsigned char* view,
2302     section_size_type view_size)
2303 {
2304   if (r_type == elfcpp::R_X86_64_GOTPC32_TLSDESC)
2305     {
2306       // leaq foo@tlsdesc(%rip), %rax
2307       // ==> movq foo@tpoff, %rax
2308       tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, -3);
2309       tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, 4);
2310       tls::check_tls(relinfo, relnum, rela.get_r_offset(),
2311                      view[-3] == 0x48 && view[-2] == 0x8d && view[-1] == 0x05);
2312       view[-2] = 0xc7;
2313       view[-1] = 0xc0;
2314       value -= tls_segment->memsz();
2315       Relocate_functions<64, false>::rela32(view, value, 0);
2316     }
2317   else
2318     {
2319       // call *foo@tlscall(%rax)
2320       // ==> nop; nop
2321       gold_assert(r_type == elfcpp::R_X86_64_TLSDESC_CALL);
2322       tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, 2);
2323       tls::check_tls(relinfo, relnum, rela.get_r_offset(),
2324                      view[0] == 0xff && view[1] == 0x10);
2325       view[0] = 0x66;
2326       view[1] = 0x90;
2327     }
2328 }
2329
2330 inline void
2331 Target_x86_64::Relocate::tls_ld_to_le(const Relocate_info<64, false>* relinfo,
2332                                       size_t relnum,
2333                                       Output_segment*,
2334                                       const elfcpp::Rela<64, false>& rela,
2335                                       unsigned int,
2336                                       elfcpp::Elf_types<64>::Elf_Addr,
2337                                       unsigned char* view,
2338                                       section_size_type view_size)
2339 {
2340   // leaq foo@tlsld(%rip),%rdi; call __tls_get_addr@plt;
2341   // ... leq foo@dtpoff(%rax),%reg
2342   // ==> .word 0x6666; .byte 0x66; movq %fs:0,%rax ... leaq x@tpoff(%rax),%rdx
2343
2344   tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, -3);
2345   tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, 9);
2346
2347   tls::check_tls(relinfo, relnum, rela.get_r_offset(),
2348                  view[-3] == 0x48 && view[-2] == 0x8d && view[-1] == 0x3d);
2349
2350   tls::check_tls(relinfo, relnum, rela.get_r_offset(), view[4] == 0xe8);
2351
2352   memcpy(view - 3, "\x66\x66\x66\x64\x48\x8b\x04\x25\0\0\0\0", 12);
2353
2354   // The next reloc should be a PLT32 reloc against __tls_get_addr.
2355   // We can skip it.
2356   this->skip_call_tls_get_addr_ = true;
2357 }
2358
2359 // Do a relocation in which we convert a TLS Initial-Exec to a
2360 // Local-Exec.
2361
2362 inline void
2363 Target_x86_64::Relocate::tls_ie_to_le(const Relocate_info<64, false>* relinfo,
2364                                       size_t relnum,
2365                                       Output_segment* tls_segment,
2366                                       const elfcpp::Rela<64, false>& rela,
2367                                       unsigned int,
2368                                       elfcpp::Elf_types<64>::Elf_Addr value,
2369                                       unsigned char* view,
2370                                       section_size_type view_size)
2371 {
2372   // We need to examine the opcodes to figure out which instruction we
2373   // are looking at.
2374
2375   // movq foo@gottpoff(%rip),%reg  ==>  movq $YY,%reg
2376   // addq foo@gottpoff(%rip),%reg  ==>  addq $YY,%reg
2377
2378   tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, -3);
2379   tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, 4);
2380
2381   unsigned char op1 = view[-3];
2382   unsigned char op2 = view[-2];
2383   unsigned char op3 = view[-1];
2384   unsigned char reg = op3 >> 3;
2385
2386   if (op2 == 0x8b)
2387     {
2388       // movq
2389       if (op1 == 0x4c)
2390         view[-3] = 0x49;
2391       view[-2] = 0xc7;
2392       view[-1] = 0xc0 | reg;
2393     }
2394   else if (reg == 4)
2395     {
2396       // Special handling for %rsp.
2397       if (op1 == 0x4c)
2398         view[-3] = 0x49;
2399       view[-2] = 0x81;
2400       view[-1] = 0xc0 | reg;
2401     }
2402   else
2403     {
2404       // addq
2405       if (op1 == 0x4c)
2406         view[-3] = 0x4d;
2407       view[-2] = 0x8d;
2408       view[-1] = 0x80 | reg | (reg << 3);
2409     }
2410
2411   value -= tls_segment->memsz();
2412   Relocate_functions<64, false>::rela32(view, value, 0);
2413 }
2414
2415 // Relocate section data.
2416
2417 void
2418 Target_x86_64::relocate_section(
2419     const Relocate_info<64, false>* relinfo,
2420     unsigned int sh_type,
2421     const unsigned char* prelocs,
2422     size_t reloc_count,
2423     Output_section* output_section,
2424     bool needs_special_offset_handling,
2425     unsigned char* view,
2426     elfcpp::Elf_types<64>::Elf_Addr address,
2427     section_size_type view_size,
2428     const Reloc_symbol_changes* reloc_symbol_changes)
2429 {
2430   gold_assert(sh_type == elfcpp::SHT_RELA);
2431
2432   gold::relocate_section<64, false, Target_x86_64, elfcpp::SHT_RELA,
2433                          Target_x86_64::Relocate>(
2434     relinfo,
2435     this,
2436     prelocs,
2437     reloc_count,
2438     output_section,
2439     needs_special_offset_handling,
2440     view,
2441     address,
2442     view_size,
2443     reloc_symbol_changes);
2444 }
2445
2446 // Return the size of a relocation while scanning during a relocatable
2447 // link.
2448
2449 unsigned int
2450 Target_x86_64::Relocatable_size_for_reloc::get_size_for_reloc(
2451     unsigned int r_type,
2452     Relobj* object)
2453 {
2454   switch (r_type)
2455     {
2456     case elfcpp::R_X86_64_NONE:
2457     case elfcpp::R_386_GNU_VTINHERIT:
2458     case elfcpp::R_386_GNU_VTENTRY:
2459     case elfcpp::R_X86_64_TLSGD:            // Global-dynamic
2460     case elfcpp::R_X86_64_GOTPC32_TLSDESC:  // Global-dynamic (from ~oliva url)
2461     case elfcpp::R_X86_64_TLSDESC_CALL:
2462     case elfcpp::R_X86_64_TLSLD:            // Local-dynamic
2463     case elfcpp::R_X86_64_DTPOFF32:
2464     case elfcpp::R_X86_64_DTPOFF64:
2465     case elfcpp::R_X86_64_GOTTPOFF:         // Initial-exec
2466     case elfcpp::R_X86_64_TPOFF32:          // Local-exec
2467       return 0;
2468
2469     case elfcpp::R_X86_64_64:
2470     case elfcpp::R_X86_64_PC64:
2471     case elfcpp::R_X86_64_GOTOFF64:
2472     case elfcpp::R_X86_64_GOTPC64:
2473     case elfcpp::R_X86_64_PLTOFF64:
2474     case elfcpp::R_X86_64_GOT64:
2475     case elfcpp::R_X86_64_GOTPCREL64:
2476     case elfcpp::R_X86_64_GOTPCREL:
2477     case elfcpp::R_X86_64_GOTPLT64:
2478       return 8;
2479
2480     case elfcpp::R_X86_64_32:
2481     case elfcpp::R_X86_64_32S:
2482     case elfcpp::R_X86_64_PC32:
2483     case elfcpp::R_X86_64_PLT32:
2484     case elfcpp::R_X86_64_GOTPC32:
2485     case elfcpp::R_X86_64_GOT32:
2486       return 4;
2487
2488     case elfcpp::R_X86_64_16:
2489     case elfcpp::R_X86_64_PC16:
2490       return 2;
2491
2492     case elfcpp::R_X86_64_8:
2493     case elfcpp::R_X86_64_PC8:
2494       return 1;
2495
2496     case elfcpp::R_X86_64_COPY:
2497     case elfcpp::R_X86_64_GLOB_DAT:
2498     case elfcpp::R_X86_64_JUMP_SLOT:
2499     case elfcpp::R_X86_64_RELATIVE:
2500       // These are outstanding tls relocs, which are unexpected when linking
2501     case elfcpp::R_X86_64_TPOFF64:
2502     case elfcpp::R_X86_64_DTPMOD64:
2503     case elfcpp::R_X86_64_TLSDESC:
2504       object->error(_("unexpected reloc %u in object file"), r_type);
2505       return 0;
2506
2507     case elfcpp::R_X86_64_SIZE32:
2508     case elfcpp::R_X86_64_SIZE64:
2509     default:
2510       object->error(_("unsupported reloc %u against local symbol"), r_type);
2511       return 0;
2512     }
2513 }
2514
2515 // Scan the relocs during a relocatable link.
2516
2517 void
2518 Target_x86_64::scan_relocatable_relocs(Symbol_table* symtab,
2519                                        Layout* layout,
2520                                        Sized_relobj<64, false>* object,
2521                                        unsigned int data_shndx,
2522                                        unsigned int sh_type,
2523                                        const unsigned char* prelocs,
2524                                        size_t reloc_count,
2525                                        Output_section* output_section,
2526                                        bool needs_special_offset_handling,
2527                                        size_t local_symbol_count,
2528                                        const unsigned char* plocal_symbols,
2529                                        Relocatable_relocs* rr)
2530 {
2531   gold_assert(sh_type == elfcpp::SHT_RELA);
2532
2533   typedef gold::Default_scan_relocatable_relocs<elfcpp::SHT_RELA,
2534     Relocatable_size_for_reloc> Scan_relocatable_relocs;
2535
2536   gold::scan_relocatable_relocs<64, false, elfcpp::SHT_RELA,
2537       Scan_relocatable_relocs>(
2538     symtab,
2539     layout,
2540     object,
2541     data_shndx,
2542     prelocs,
2543     reloc_count,
2544     output_section,
2545     needs_special_offset_handling,
2546     local_symbol_count,
2547     plocal_symbols,
2548     rr);
2549 }
2550
2551 // Relocate a section during a relocatable link.
2552
2553 void
2554 Target_x86_64::relocate_for_relocatable(
2555     const Relocate_info<64, false>* relinfo,
2556     unsigned int sh_type,
2557     const unsigned char* prelocs,
2558     size_t reloc_count,
2559     Output_section* output_section,
2560     off_t offset_in_output_section,
2561     const Relocatable_relocs* rr,
2562     unsigned char* view,
2563     elfcpp::Elf_types<64>::Elf_Addr view_address,
2564     section_size_type view_size,
2565     unsigned char* reloc_view,
2566     section_size_type reloc_view_size)
2567 {
2568   gold_assert(sh_type == elfcpp::SHT_RELA);
2569
2570   gold::relocate_for_relocatable<64, false, elfcpp::SHT_RELA>(
2571     relinfo,
2572     prelocs,
2573     reloc_count,
2574     output_section,
2575     offset_in_output_section,
2576     rr,
2577     view,
2578     view_address,
2579     view_size,
2580     reloc_view,
2581     reloc_view_size);
2582 }
2583
2584 // Return the value to use for a dynamic which requires special
2585 // treatment.  This is how we support equality comparisons of function
2586 // pointers across shared library boundaries, as described in the
2587 // processor specific ABI supplement.
2588
2589 uint64_t
2590 Target_x86_64::do_dynsym_value(const Symbol* gsym) const
2591 {
2592   gold_assert(gsym->is_from_dynobj() && gsym->has_plt_offset());
2593   return this->plt_section()->address() + gsym->plt_offset();
2594 }
2595
2596 // Return a string used to fill a code section with nops to take up
2597 // the specified length.
2598
2599 std::string
2600 Target_x86_64::do_code_fill(section_size_type length) const
2601 {
2602   if (length >= 16)
2603     {
2604       // Build a jmpq instruction to skip over the bytes.
2605       unsigned char jmp[5];
2606       jmp[0] = 0xe9;
2607       elfcpp::Swap_unaligned<32, false>::writeval(jmp + 1, length - 5);
2608       return (std::string(reinterpret_cast<char*>(&jmp[0]), 5)
2609               + std::string(length - 5, '\0'));
2610     }
2611
2612   // Nop sequences of various lengths.
2613   const char nop1[1] = { 0x90 };                   // nop
2614   const char nop2[2] = { 0x66, 0x90 };             // xchg %ax %ax
2615   const char nop3[3] = { 0x0f, 0x1f, 0x00 };       // nop (%rax)
2616   const char nop4[4] = { 0x0f, 0x1f, 0x40, 0x00};  // nop 0(%rax)
2617   const char nop5[5] = { 0x0f, 0x1f, 0x44, 0x00,   // nop 0(%rax,%rax,1)
2618                          0x00 };
2619   const char nop6[6] = { 0x66, 0x0f, 0x1f, 0x44,   // nopw 0(%rax,%rax,1)
2620                          0x00, 0x00 };
2621   const char nop7[7] = { 0x0f, 0x1f, 0x80, 0x00,   // nopl 0L(%rax)
2622                          0x00, 0x00, 0x00 };
2623   const char nop8[8] = { 0x0f, 0x1f, 0x84, 0x00,   // nopl 0L(%rax,%rax,1)
2624                          0x00, 0x00, 0x00, 0x00 };
2625   const char nop9[9] = { 0x66, 0x0f, 0x1f, 0x84,   // nopw 0L(%rax,%rax,1)
2626                          0x00, 0x00, 0x00, 0x00,
2627                          0x00 };
2628   const char nop10[10] = { 0x66, 0x2e, 0x0f, 0x1f, // nopw %cs:0L(%rax,%rax,1)
2629                            0x84, 0x00, 0x00, 0x00,
2630                            0x00, 0x00 };
2631   const char nop11[11] = { 0x66, 0x66, 0x2e, 0x0f, // data16
2632                            0x1f, 0x84, 0x00, 0x00, // nopw %cs:0L(%rax,%rax,1)
2633                            0x00, 0x00, 0x00 };
2634   const char nop12[12] = { 0x66, 0x66, 0x66, 0x2e, // data16; data16
2635                            0x0f, 0x1f, 0x84, 0x00, // nopw %cs:0L(%rax,%rax,1)
2636                            0x00, 0x00, 0x00, 0x00 };
2637   const char nop13[13] = { 0x66, 0x66, 0x66, 0x66, // data16; data16; data16
2638                            0x2e, 0x0f, 0x1f, 0x84, // nopw %cs:0L(%rax,%rax,1)
2639                            0x00, 0x00, 0x00, 0x00,
2640                            0x00 };
2641   const char nop14[14] = { 0x66, 0x66, 0x66, 0x66, // data16; data16; data16
2642                            0x66, 0x2e, 0x0f, 0x1f, // data16
2643                            0x84, 0x00, 0x00, 0x00, // nopw %cs:0L(%rax,%rax,1)
2644                            0x00, 0x00 };
2645   const char nop15[15] = { 0x66, 0x66, 0x66, 0x66, // data16; data16; data16
2646                            0x66, 0x66, 0x2e, 0x0f, // data16; data16
2647                            0x1f, 0x84, 0x00, 0x00, // nopw %cs:0L(%rax,%rax,1)
2648                            0x00, 0x00, 0x00 };
2649
2650   const char* nops[16] = {
2651     NULL,
2652     nop1, nop2, nop3, nop4, nop5, nop6, nop7,
2653     nop8, nop9, nop10, nop11, nop12, nop13, nop14, nop15
2654   };
2655
2656   return std::string(nops[length], length);
2657 }
2658
2659 // FNOFFSET in section SHNDX in OBJECT is the start of a function
2660 // compiled with -fstack-split.  The function calls non-stack-split
2661 // code.  We have to change the function so that it always ensures
2662 // that it has enough stack space to run some random function.
2663
2664 void
2665 Target_x86_64::do_calls_non_split(Relobj* object, unsigned int shndx,
2666                                   section_offset_type fnoffset,
2667                                   section_size_type fnsize,
2668                                   unsigned char* view,
2669                                   section_size_type view_size,
2670                                   std::string* from,
2671                                   std::string* to) const
2672 {
2673   // The function starts with a comparison of the stack pointer and a
2674   // field in the TCB.  This is followed by a jump.
2675
2676   // cmp %fs:NN,%rsp
2677   if (this->match_view(view, view_size, fnoffset, "\x64\x48\x3b\x24\x25", 5)
2678       && fnsize > 9)
2679     {
2680       // We will call __morestack if the carry flag is set after this
2681       // comparison.  We turn the comparison into an stc instruction
2682       // and some nops.
2683       view[fnoffset] = '\xf9';
2684       this->set_view_to_nop(view, view_size, fnoffset + 1, 8);
2685     }
2686   // lea NN(%rsp),%r10
2687   else if (this->match_view(view, view_size, fnoffset, "\x4c\x8d\x94\x24", 4)
2688            && fnsize > 8)
2689     {
2690       // This is loading an offset from the stack pointer for a
2691       // comparison.  The offset is negative, so we decrease the
2692       // offset by the amount of space we need for the stack.  This
2693       // means we will avoid calling __morestack if there happens to
2694       // be plenty of space on the stack already.
2695       unsigned char* pval = view + fnoffset + 4;
2696       uint32_t val = elfcpp::Swap_unaligned<32, false>::readval(pval);
2697       val -= parameters->options().split_stack_adjust_size();
2698       elfcpp::Swap_unaligned<32, false>::writeval(pval, val);
2699     }
2700   else
2701     {
2702       if (!object->has_no_split_stack())
2703         object->error(_("failed to match split-stack sequence at "
2704                         "section %u offset %0zx"),
2705                       shndx, fnoffset);
2706       return;
2707     }
2708
2709   // We have to change the function so that it calls
2710   // __morestack_non_split instead of __morestack.  The former will
2711   // allocate additional stack space.
2712   *from = "__morestack";
2713   *to = "__morestack_non_split";
2714 }
2715
2716 // The selector for x86_64 object files.
2717
2718 class Target_selector_x86_64 : public Target_selector_freebsd
2719 {
2720 public:
2721   Target_selector_x86_64()
2722     : Target_selector_freebsd(elfcpp::EM_X86_64, 64, false, "elf64-x86-64",
2723                               "elf64-x86-64-freebsd")
2724   { }
2725
2726   Target*
2727   do_instantiate_target()
2728   { return new Target_x86_64(); }
2729
2730 };
2731
2732 Target_selector_x86_64 target_selector_x86_64;
2733
2734 } // End anonymous namespace.