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