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