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