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