Update copyright years
[deliverable/binutils-gdb.git] / gold / i386.cc
1 // i386.cc -- i386 target support for gold.
2
3 // Copyright (C) 2006-2014 Free Software Foundation, Inc.
4 // Written by Ian Lance Taylor <iant@google.com>.
5
6 // This file is part of gold.
7
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 3 of the License, or
11 // (at your option) any later version.
12
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 // GNU General Public License for more details.
17
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the Free Software
20 // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 // MA 02110-1301, USA.
22
23 #include "gold.h"
24
25 #include <cstring>
26
27 #include "elfcpp.h"
28 #include "dwarf.h"
29 #include "parameters.h"
30 #include "reloc.h"
31 #include "i386.h"
32 #include "object.h"
33 #include "symtab.h"
34 #include "layout.h"
35 #include "output.h"
36 #include "copy-relocs.h"
37 #include "target.h"
38 #include "target-reloc.h"
39 #include "target-select.h"
40 #include "tls.h"
41 #include "freebsd.h"
42 #include "nacl.h"
43 #include "gc.h"
44
45 namespace
46 {
47
48 using namespace gold;
49
50 // A class to handle the PLT data.
51 // This is an abstract base class that handles most of the linker details
52 // but does not know the actual contents of PLT entries. The derived
53 // classes below fill in those details.
54
55 class Output_data_plt_i386 : public Output_section_data
56 {
57 public:
58 typedef Output_data_reloc<elfcpp::SHT_REL, true, 32, false> Reloc_section;
59
60 Output_data_plt_i386(Layout*, uint64_t addralign,
61 Output_data_space*, Output_data_space*);
62
63 // Add an entry to the PLT.
64 void
65 add_entry(Symbol_table*, Layout*, Symbol* gsym);
66
67 // Add an entry to the PLT for a local STT_GNU_IFUNC symbol.
68 unsigned int
69 add_local_ifunc_entry(Symbol_table*, Layout*,
70 Sized_relobj_file<32, false>* relobj,
71 unsigned int local_sym_index);
72
73 // Return the .rel.plt section data.
74 Reloc_section*
75 rel_plt() const
76 { return this->rel_; }
77
78 // Return where the TLS_DESC relocations should go.
79 Reloc_section*
80 rel_tls_desc(Layout*);
81
82 // Return where the IRELATIVE relocations should go.
83 Reloc_section*
84 rel_irelative(Symbol_table*, Layout*);
85
86 // Return whether we created a section for IRELATIVE relocations.
87 bool
88 has_irelative_section() const
89 { return this->irelative_rel_ != NULL; }
90
91 // Return the number of PLT entries.
92 unsigned int
93 entry_count() const
94 { return this->count_ + this->irelative_count_; }
95
96 // Return the offset of the first non-reserved PLT entry.
97 unsigned int
98 first_plt_entry_offset()
99 { return this->get_plt_entry_size(); }
100
101 // Return the size of a PLT entry.
102 unsigned int
103 get_plt_entry_size() const
104 { return this->do_get_plt_entry_size(); }
105
106 // Return the PLT address to use for a global symbol.
107 uint64_t
108 address_for_global(const Symbol*);
109
110 // Return the PLT address to use for a local symbol.
111 uint64_t
112 address_for_local(const Relobj*, unsigned int symndx);
113
114 // Add .eh_frame information for the PLT.
115 void
116 add_eh_frame(Layout* layout)
117 { this->do_add_eh_frame(layout); }
118
119 protected:
120 // Fill the first PLT entry, given the pointer to the PLT section data
121 // and the runtime address of the GOT.
122 void
123 fill_first_plt_entry(unsigned char* pov,
124 elfcpp::Elf_types<32>::Elf_Addr got_address)
125 { this->do_fill_first_plt_entry(pov, got_address); }
126
127 // Fill a normal PLT entry, given the pointer to the entry's data in the
128 // section, the runtime address of the GOT, the offset into the GOT of
129 // the corresponding slot, the offset into the relocation section of the
130 // corresponding reloc, and the offset of this entry within the whole
131 // PLT. Return the offset from this PLT entry's runtime address that
132 // should be used to compute the initial value of the GOT slot.
133 unsigned int
134 fill_plt_entry(unsigned char* pov,
135 elfcpp::Elf_types<32>::Elf_Addr got_address,
136 unsigned int got_offset,
137 unsigned int plt_offset,
138 unsigned int plt_rel_offset)
139 {
140 return this->do_fill_plt_entry(pov, got_address, got_offset,
141 plt_offset, plt_rel_offset);
142 }
143
144 virtual unsigned int
145 do_get_plt_entry_size() const = 0;
146
147 virtual void
148 do_fill_first_plt_entry(unsigned char* pov,
149 elfcpp::Elf_types<32>::Elf_Addr got_address) = 0;
150
151 virtual unsigned int
152 do_fill_plt_entry(unsigned char* pov,
153 elfcpp::Elf_types<32>::Elf_Addr got_address,
154 unsigned int got_offset,
155 unsigned int plt_offset,
156 unsigned int plt_rel_offset) = 0;
157
158 virtual void
159 do_add_eh_frame(Layout*) = 0;
160
161 void
162 do_adjust_output_section(Output_section* os);
163
164 // Write to a map file.
165 void
166 do_print_to_mapfile(Mapfile* mapfile) const
167 { mapfile->print_output_data(this, _("** PLT")); }
168
169 // The .eh_frame unwind information for the PLT.
170 // The CIE is common across variants of the PLT format.
171 static const int plt_eh_frame_cie_size = 16;
172 static const unsigned char plt_eh_frame_cie[plt_eh_frame_cie_size];
173
174 private:
175 // Set the final size.
176 void
177 set_final_data_size()
178 {
179 this->set_data_size((this->count_ + this->irelative_count_ + 1)
180 * this->get_plt_entry_size());
181 }
182
183 // Write out the PLT data.
184 void
185 do_write(Output_file*);
186
187 // We keep a list of global STT_GNU_IFUNC symbols, each with its
188 // offset in the GOT.
189 struct Global_ifunc
190 {
191 Symbol* sym;
192 unsigned int got_offset;
193 };
194
195 // We keep a list of local STT_GNU_IFUNC symbols, each with its
196 // offset in the GOT.
197 struct Local_ifunc
198 {
199 Sized_relobj_file<32, false>* object;
200 unsigned int local_sym_index;
201 unsigned int got_offset;
202 };
203
204 // A pointer to the Layout class, so that we can find the .dynamic
205 // section when we write out the GOT PLT section.
206 Layout* layout_;
207 // The reloc section.
208 Reloc_section* rel_;
209 // The TLS_DESC relocations, if necessary. These must follow the
210 // regular PLT relocs.
211 Reloc_section* tls_desc_rel_;
212 // The IRELATIVE relocations, if necessary. These must follow the
213 // regular relocatoins and the TLS_DESC relocations.
214 Reloc_section* irelative_rel_;
215 // The .got.plt section.
216 Output_data_space* got_plt_;
217 // The part of the .got.plt section used for IRELATIVE relocs.
218 Output_data_space* got_irelative_;
219 // The number of PLT entries.
220 unsigned int count_;
221 // Number of PLT entries with R_386_IRELATIVE relocs. These follow
222 // the regular PLT entries.
223 unsigned int irelative_count_;
224 // Global STT_GNU_IFUNC symbols.
225 std::vector<Global_ifunc> global_ifuncs_;
226 // Local STT_GNU_IFUNC symbols.
227 std::vector<Local_ifunc> local_ifuncs_;
228 };
229
230 // This is an abstract class for the standard PLT layout.
231 // The derived classes below handle the actual PLT contents
232 // for the executable (non-PIC) and shared-library (PIC) cases.
233 // The unwind information is uniform across those two, so it's here.
234
235 class Output_data_plt_i386_standard : public Output_data_plt_i386
236 {
237 public:
238 Output_data_plt_i386_standard(Layout* layout,
239 Output_data_space* got_plt,
240 Output_data_space* got_irelative)
241 : Output_data_plt_i386(layout, plt_entry_size, got_plt, got_irelative)
242 { }
243
244 protected:
245 virtual unsigned int
246 do_get_plt_entry_size() const
247 { return plt_entry_size; }
248
249 virtual void
250 do_add_eh_frame(Layout* layout)
251 {
252 layout->add_eh_frame_for_plt(this, plt_eh_frame_cie, plt_eh_frame_cie_size,
253 plt_eh_frame_fde, plt_eh_frame_fde_size);
254 }
255
256 // The size of an entry in the PLT.
257 static const int plt_entry_size = 16;
258
259 // The .eh_frame unwind information for the PLT.
260 static const int plt_eh_frame_fde_size = 32;
261 static const unsigned char plt_eh_frame_fde[plt_eh_frame_fde_size];
262 };
263
264 // Actually fill the PLT contents for an executable (non-PIC).
265
266 class Output_data_plt_i386_exec : public Output_data_plt_i386_standard
267 {
268 public:
269 Output_data_plt_i386_exec(Layout* layout,
270 Output_data_space* got_plt,
271 Output_data_space* got_irelative)
272 : Output_data_plt_i386_standard(layout, got_plt, got_irelative)
273 { }
274
275 protected:
276 virtual void
277 do_fill_first_plt_entry(unsigned char* pov,
278 elfcpp::Elf_types<32>::Elf_Addr got_address);
279
280 virtual unsigned int
281 do_fill_plt_entry(unsigned char* pov,
282 elfcpp::Elf_types<32>::Elf_Addr got_address,
283 unsigned int got_offset,
284 unsigned int plt_offset,
285 unsigned int plt_rel_offset);
286
287 private:
288 // The first entry in the PLT for an executable.
289 static const unsigned char first_plt_entry[plt_entry_size];
290
291 // Other entries in the PLT for an executable.
292 static const unsigned char plt_entry[plt_entry_size];
293 };
294
295 // Actually fill the PLT contents for a shared library (PIC).
296
297 class Output_data_plt_i386_dyn : public Output_data_plt_i386_standard
298 {
299 public:
300 Output_data_plt_i386_dyn(Layout* layout,
301 Output_data_space* got_plt,
302 Output_data_space* got_irelative)
303 : Output_data_plt_i386_standard(layout, got_plt, got_irelative)
304 { }
305
306 protected:
307 virtual void
308 do_fill_first_plt_entry(unsigned char* pov, elfcpp::Elf_types<32>::Elf_Addr);
309
310 virtual unsigned int
311 do_fill_plt_entry(unsigned char* pov,
312 elfcpp::Elf_types<32>::Elf_Addr,
313 unsigned int got_offset,
314 unsigned int plt_offset,
315 unsigned int plt_rel_offset);
316
317 private:
318 // The first entry in the PLT for a shared object.
319 static const unsigned char first_plt_entry[plt_entry_size];
320
321 // Other entries in the PLT for a shared object.
322 static const unsigned char plt_entry[plt_entry_size];
323 };
324
325 // The i386 target class.
326 // TLS info comes from
327 // http://people.redhat.com/drepper/tls.pdf
328 // http://www.lsd.ic.unicamp.br/~oliva/writeups/TLS/RFC-TLSDESC-x86.txt
329
330 class Target_i386 : public Sized_target<32, false>
331 {
332 public:
333 typedef Output_data_reloc<elfcpp::SHT_REL, true, 32, false> Reloc_section;
334
335 Target_i386(const Target::Target_info* info = &i386_info)
336 : Sized_target<32, false>(info),
337 got_(NULL), plt_(NULL), got_plt_(NULL), got_irelative_(NULL),
338 got_tlsdesc_(NULL), global_offset_table_(NULL), rel_dyn_(NULL),
339 rel_irelative_(NULL), copy_relocs_(elfcpp::R_386_COPY),
340 got_mod_index_offset_(-1U), tls_base_symbol_defined_(false)
341 { }
342
343 // Process the relocations to determine unreferenced sections for
344 // garbage collection.
345 void
346 gc_process_relocs(Symbol_table* symtab,
347 Layout* layout,
348 Sized_relobj_file<32, false>* object,
349 unsigned int data_shndx,
350 unsigned int sh_type,
351 const unsigned char* prelocs,
352 size_t reloc_count,
353 Output_section* output_section,
354 bool needs_special_offset_handling,
355 size_t local_symbol_count,
356 const unsigned char* plocal_symbols);
357
358 // Scan the relocations to look for symbol adjustments.
359 void
360 scan_relocs(Symbol_table* symtab,
361 Layout* layout,
362 Sized_relobj_file<32, false>* object,
363 unsigned int data_shndx,
364 unsigned int sh_type,
365 const unsigned char* prelocs,
366 size_t reloc_count,
367 Output_section* output_section,
368 bool needs_special_offset_handling,
369 size_t local_symbol_count,
370 const unsigned char* plocal_symbols);
371
372 // Finalize the sections.
373 void
374 do_finalize_sections(Layout*, const Input_objects*, Symbol_table*);
375
376 // Return the value to use for a dynamic which requires special
377 // treatment.
378 uint64_t
379 do_dynsym_value(const Symbol*) const;
380
381 // Relocate a section.
382 void
383 relocate_section(const Relocate_info<32, false>*,
384 unsigned int sh_type,
385 const unsigned char* prelocs,
386 size_t reloc_count,
387 Output_section* output_section,
388 bool needs_special_offset_handling,
389 unsigned char* view,
390 elfcpp::Elf_types<32>::Elf_Addr view_address,
391 section_size_type view_size,
392 const Reloc_symbol_changes*);
393
394 // Scan the relocs during a relocatable link.
395 void
396 scan_relocatable_relocs(Symbol_table* symtab,
397 Layout* layout,
398 Sized_relobj_file<32, false>* object,
399 unsigned int data_shndx,
400 unsigned int sh_type,
401 const unsigned char* prelocs,
402 size_t reloc_count,
403 Output_section* output_section,
404 bool needs_special_offset_handling,
405 size_t local_symbol_count,
406 const unsigned char* plocal_symbols,
407 Relocatable_relocs*);
408
409 // Emit relocations for a section.
410 void
411 relocate_relocs(const Relocate_info<32, false>*,
412 unsigned int sh_type,
413 const unsigned char* prelocs,
414 size_t reloc_count,
415 Output_section* output_section,
416 elfcpp::Elf_types<32>::Elf_Off offset_in_output_section,
417 const Relocatable_relocs*,
418 unsigned char* view,
419 elfcpp::Elf_types<32>::Elf_Addr view_address,
420 section_size_type view_size,
421 unsigned char* reloc_view,
422 section_size_type reloc_view_size);
423
424 // Return a string used to fill a code section with nops.
425 std::string
426 do_code_fill(section_size_type length) const;
427
428 // Return whether SYM is defined by the ABI.
429 bool
430 do_is_defined_by_abi(const Symbol* sym) const
431 { return strcmp(sym->name(), "___tls_get_addr") == 0; }
432
433 // Return whether a symbol name implies a local label. The UnixWare
434 // 2.1 cc generates temporary symbols that start with .X, so we
435 // recognize them here. FIXME: do other SVR4 compilers also use .X?.
436 // If so, we should move the .X recognition into
437 // Target::do_is_local_label_name.
438 bool
439 do_is_local_label_name(const char* name) const
440 {
441 if (name[0] == '.' && name[1] == 'X')
442 return true;
443 return Target::do_is_local_label_name(name);
444 }
445
446 // Return the PLT address to use for a global symbol.
447 uint64_t
448 do_plt_address_for_global(const Symbol* gsym) const
449 { return this->plt_section()->address_for_global(gsym); }
450
451 uint64_t
452 do_plt_address_for_local(const Relobj* relobj, unsigned int symndx) const
453 { return this->plt_section()->address_for_local(relobj, symndx); }
454
455 // We can tell whether we take the address of a function.
456 inline bool
457 do_can_check_for_function_pointers() const
458 { return true; }
459
460 // Return the base for a DW_EH_PE_datarel encoding.
461 uint64_t
462 do_ehframe_datarel_base() const;
463
464 // Return whether SYM is call to a non-split function.
465 bool
466 do_is_call_to_non_split(const Symbol* sym, unsigned int) const;
467
468 // Adjust -fsplit-stack code which calls non-split-stack code.
469 void
470 do_calls_non_split(Relobj* object, unsigned int shndx,
471 section_offset_type fnoffset, section_size_type fnsize,
472 unsigned char* view, section_size_type view_size,
473 std::string* from, std::string* to) const;
474
475 // Return the size of the GOT section.
476 section_size_type
477 got_size() const
478 {
479 gold_assert(this->got_ != NULL);
480 return this->got_->data_size();
481 }
482
483 // Return the number of entries in the GOT.
484 unsigned int
485 got_entry_count() const
486 {
487 if (this->got_ == NULL)
488 return 0;
489 return this->got_size() / 4;
490 }
491
492 // Return the number of entries in the PLT.
493 unsigned int
494 plt_entry_count() const;
495
496 // Return the offset of the first non-reserved PLT entry.
497 unsigned int
498 first_plt_entry_offset() const;
499
500 // Return the size of each PLT entry.
501 unsigned int
502 plt_entry_size() const;
503
504 protected:
505 // Instantiate the plt_ member.
506 // This chooses the right PLT flavor for an executable or a shared object.
507 Output_data_plt_i386*
508 make_data_plt(Layout* layout,
509 Output_data_space* got_plt,
510 Output_data_space* got_irelative,
511 bool dyn)
512 { return this->do_make_data_plt(layout, got_plt, got_irelative, dyn); }
513
514 virtual Output_data_plt_i386*
515 do_make_data_plt(Layout* layout,
516 Output_data_space* got_plt,
517 Output_data_space* got_irelative,
518 bool dyn)
519 {
520 if (dyn)
521 return new Output_data_plt_i386_dyn(layout, got_plt, got_irelative);
522 else
523 return new Output_data_plt_i386_exec(layout, got_plt, got_irelative);
524 }
525
526 private:
527 // The class which scans relocations.
528 struct Scan
529 {
530 static inline int
531
532 get_reference_flags(unsigned int r_type);
533
534 inline void
535 local(Symbol_table* symtab, Layout* layout, Target_i386* target,
536 Sized_relobj_file<32, false>* object,
537 unsigned int data_shndx,
538 Output_section* output_section,
539 const elfcpp::Rel<32, false>& reloc, unsigned int r_type,
540 const elfcpp::Sym<32, false>& lsym,
541 bool is_discarded);
542
543 inline void
544 global(Symbol_table* symtab, Layout* layout, Target_i386* target,
545 Sized_relobj_file<32, false>* object,
546 unsigned int data_shndx,
547 Output_section* output_section,
548 const elfcpp::Rel<32, false>& reloc, unsigned int r_type,
549 Symbol* gsym);
550
551 inline bool
552 local_reloc_may_be_function_pointer(Symbol_table* symtab, Layout* layout,
553 Target_i386* target,
554 Sized_relobj_file<32, false>* object,
555 unsigned int data_shndx,
556 Output_section* output_section,
557 const elfcpp::Rel<32, false>& reloc,
558 unsigned int r_type,
559 const elfcpp::Sym<32, false>& lsym);
560
561 inline bool
562 global_reloc_may_be_function_pointer(Symbol_table* symtab, Layout* layout,
563 Target_i386* target,
564 Sized_relobj_file<32, false>* object,
565 unsigned int data_shndx,
566 Output_section* output_section,
567 const elfcpp::Rel<32, false>& reloc,
568 unsigned int r_type,
569 Symbol* gsym);
570
571 inline bool
572 possible_function_pointer_reloc(unsigned int r_type);
573
574 bool
575 reloc_needs_plt_for_ifunc(Sized_relobj_file<32, false>*,
576 unsigned int r_type);
577
578 static void
579 unsupported_reloc_local(Sized_relobj_file<32, false>*, unsigned int r_type);
580
581 static void
582 unsupported_reloc_global(Sized_relobj_file<32, false>*, unsigned int r_type,
583 Symbol*);
584 };
585
586 // The class which implements relocation.
587 class Relocate
588 {
589 public:
590 Relocate()
591 : skip_call_tls_get_addr_(false),
592 local_dynamic_type_(LOCAL_DYNAMIC_NONE)
593 { }
594
595 ~Relocate()
596 {
597 if (this->skip_call_tls_get_addr_)
598 {
599 // FIXME: This needs to specify the location somehow.
600 gold_error(_("missing expected TLS relocation"));
601 }
602 }
603
604 // Return whether the static relocation needs to be applied.
605 inline bool
606 should_apply_static_reloc(const Sized_symbol<32>* gsym,
607 unsigned int r_type,
608 bool is_32bit,
609 Output_section* output_section);
610
611 // Do a relocation. Return false if the caller should not issue
612 // any warnings about this relocation.
613 inline bool
614 relocate(const Relocate_info<32, false>*, Target_i386*, Output_section*,
615 size_t relnum, const elfcpp::Rel<32, false>&,
616 unsigned int r_type, const Sized_symbol<32>*,
617 const Symbol_value<32>*,
618 unsigned char*, elfcpp::Elf_types<32>::Elf_Addr,
619 section_size_type);
620
621 private:
622 // Do a TLS relocation.
623 inline void
624 relocate_tls(const Relocate_info<32, false>*, Target_i386* target,
625 size_t relnum, const elfcpp::Rel<32, false>&,
626 unsigned int r_type, const Sized_symbol<32>*,
627 const Symbol_value<32>*,
628 unsigned char*, elfcpp::Elf_types<32>::Elf_Addr,
629 section_size_type);
630
631 // Do a TLS General-Dynamic to Initial-Exec transition.
632 inline void
633 tls_gd_to_ie(const Relocate_info<32, false>*, size_t relnum,
634 Output_segment* tls_segment,
635 const elfcpp::Rel<32, false>&, unsigned int r_type,
636 elfcpp::Elf_types<32>::Elf_Addr value,
637 unsigned char* view,
638 section_size_type view_size);
639
640 // Do a TLS General-Dynamic to Local-Exec transition.
641 inline void
642 tls_gd_to_le(const Relocate_info<32, false>*, size_t relnum,
643 Output_segment* tls_segment,
644 const elfcpp::Rel<32, false>&, unsigned int r_type,
645 elfcpp::Elf_types<32>::Elf_Addr value,
646 unsigned char* view,
647 section_size_type view_size);
648
649 // Do a TLS_GOTDESC or TLS_DESC_CALL General-Dynamic to Initial-Exec
650 // transition.
651 inline void
652 tls_desc_gd_to_ie(const Relocate_info<32, false>*, size_t relnum,
653 Output_segment* tls_segment,
654 const elfcpp::Rel<32, false>&, unsigned int r_type,
655 elfcpp::Elf_types<32>::Elf_Addr value,
656 unsigned char* view,
657 section_size_type view_size);
658
659 // Do a TLS_GOTDESC or TLS_DESC_CALL General-Dynamic to Local-Exec
660 // transition.
661 inline void
662 tls_desc_gd_to_le(const Relocate_info<32, false>*, size_t relnum,
663 Output_segment* tls_segment,
664 const elfcpp::Rel<32, false>&, unsigned int r_type,
665 elfcpp::Elf_types<32>::Elf_Addr value,
666 unsigned char* view,
667 section_size_type view_size);
668
669 // Do a TLS Local-Dynamic to Local-Exec transition.
670 inline void
671 tls_ld_to_le(const Relocate_info<32, false>*, size_t relnum,
672 Output_segment* tls_segment,
673 const elfcpp::Rel<32, false>&, unsigned int r_type,
674 elfcpp::Elf_types<32>::Elf_Addr value,
675 unsigned char* view,
676 section_size_type view_size);
677
678 // Do a TLS Initial-Exec to Local-Exec transition.
679 static inline void
680 tls_ie_to_le(const Relocate_info<32, false>*, size_t relnum,
681 Output_segment* tls_segment,
682 const elfcpp::Rel<32, false>&, unsigned int r_type,
683 elfcpp::Elf_types<32>::Elf_Addr value,
684 unsigned char* view,
685 section_size_type view_size);
686
687 // We need to keep track of which type of local dynamic relocation
688 // we have seen, so that we can optimize R_386_TLS_LDO_32 correctly.
689 enum Local_dynamic_type
690 {
691 LOCAL_DYNAMIC_NONE,
692 LOCAL_DYNAMIC_SUN,
693 LOCAL_DYNAMIC_GNU
694 };
695
696 // This is set if we should skip the next reloc, which should be a
697 // PLT32 reloc against ___tls_get_addr.
698 bool skip_call_tls_get_addr_;
699 // The type of local dynamic relocation we have seen in the section
700 // being relocated, if any.
701 Local_dynamic_type local_dynamic_type_;
702 };
703
704 // A class which returns the size required for a relocation type,
705 // used while scanning relocs during a relocatable link.
706 class Relocatable_size_for_reloc
707 {
708 public:
709 unsigned int
710 get_size_for_reloc(unsigned int, Relobj*);
711 };
712
713 // Adjust TLS relocation type based on the options and whether this
714 // is a local symbol.
715 static tls::Tls_optimization
716 optimize_tls_reloc(bool is_final, int r_type);
717
718 // Get the GOT section, creating it if necessary.
719 Output_data_got<32, false>*
720 got_section(Symbol_table*, Layout*);
721
722 // Get the GOT PLT section.
723 Output_data_space*
724 got_plt_section() const
725 {
726 gold_assert(this->got_plt_ != NULL);
727 return this->got_plt_;
728 }
729
730 // Get the GOT section for TLSDESC entries.
731 Output_data_got<32, false>*
732 got_tlsdesc_section() const
733 {
734 gold_assert(this->got_tlsdesc_ != NULL);
735 return this->got_tlsdesc_;
736 }
737
738 // Create the PLT section.
739 void
740 make_plt_section(Symbol_table* symtab, Layout* layout);
741
742 // Create a PLT entry for a global symbol.
743 void
744 make_plt_entry(Symbol_table*, Layout*, Symbol*);
745
746 // Create a PLT entry for a local STT_GNU_IFUNC symbol.
747 void
748 make_local_ifunc_plt_entry(Symbol_table*, Layout*,
749 Sized_relobj_file<32, false>* relobj,
750 unsigned int local_sym_index);
751
752 // Define the _TLS_MODULE_BASE_ symbol in the TLS segment.
753 void
754 define_tls_base_symbol(Symbol_table*, Layout*);
755
756 // Create a GOT entry for the TLS module index.
757 unsigned int
758 got_mod_index_entry(Symbol_table* symtab, Layout* layout,
759 Sized_relobj_file<32, false>* object);
760
761 // Get the PLT section.
762 Output_data_plt_i386*
763 plt_section() const
764 {
765 gold_assert(this->plt_ != NULL);
766 return this->plt_;
767 }
768
769 // Get the dynamic reloc section, creating it if necessary.
770 Reloc_section*
771 rel_dyn_section(Layout*);
772
773 // Get the section to use for TLS_DESC relocations.
774 Reloc_section*
775 rel_tls_desc_section(Layout*) const;
776
777 // Get the section to use for IRELATIVE relocations.
778 Reloc_section*
779 rel_irelative_section(Layout*);
780
781 // Add a potential copy relocation.
782 void
783 copy_reloc(Symbol_table* symtab, Layout* layout,
784 Sized_relobj_file<32, false>* object,
785 unsigned int shndx, Output_section* output_section,
786 Symbol* sym, const elfcpp::Rel<32, false>& reloc)
787 {
788 this->copy_relocs_.copy_reloc(symtab, layout,
789 symtab->get_sized_symbol<32>(sym),
790 object, shndx, output_section, reloc,
791 this->rel_dyn_section(layout));
792 }
793
794 // Information about this specific target which we pass to the
795 // general Target structure.
796 static const Target::Target_info i386_info;
797
798 // The types of GOT entries needed for this platform.
799 // These values are exposed to the ABI in an incremental link.
800 // Do not renumber existing values without changing the version
801 // number of the .gnu_incremental_inputs section.
802 enum Got_type
803 {
804 GOT_TYPE_STANDARD = 0, // GOT entry for a regular symbol
805 GOT_TYPE_TLS_NOFFSET = 1, // GOT entry for negative TLS offset
806 GOT_TYPE_TLS_OFFSET = 2, // GOT entry for positive TLS offset
807 GOT_TYPE_TLS_PAIR = 3, // GOT entry for TLS module/offset pair
808 GOT_TYPE_TLS_DESC = 4 // GOT entry for TLS_DESC pair
809 };
810
811 // The GOT section.
812 Output_data_got<32, false>* got_;
813 // The PLT section.
814 Output_data_plt_i386* plt_;
815 // The GOT PLT section.
816 Output_data_space* got_plt_;
817 // The GOT section for IRELATIVE relocations.
818 Output_data_space* got_irelative_;
819 // The GOT section for TLSDESC relocations.
820 Output_data_got<32, false>* got_tlsdesc_;
821 // The _GLOBAL_OFFSET_TABLE_ symbol.
822 Symbol* global_offset_table_;
823 // The dynamic reloc section.
824 Reloc_section* rel_dyn_;
825 // The section to use for IRELATIVE relocs.
826 Reloc_section* rel_irelative_;
827 // Relocs saved to avoid a COPY reloc.
828 Copy_relocs<elfcpp::SHT_REL, 32, false> copy_relocs_;
829 // Offset of the GOT entry for the TLS module index.
830 unsigned int got_mod_index_offset_;
831 // True if the _TLS_MODULE_BASE_ symbol has been defined.
832 bool tls_base_symbol_defined_;
833 };
834
835 const Target::Target_info Target_i386::i386_info =
836 {
837 32, // size
838 false, // is_big_endian
839 elfcpp::EM_386, // machine_code
840 false, // has_make_symbol
841 false, // has_resolve
842 true, // has_code_fill
843 true, // is_default_stack_executable
844 true, // can_icf_inline_merge_sections
845 '\0', // wrap_char
846 "/usr/lib/libc.so.1", // dynamic_linker
847 0x08048000, // default_text_segment_address
848 0x1000, // abi_pagesize (overridable by -z max-page-size)
849 0x1000, // common_pagesize (overridable by -z common-page-size)
850 false, // isolate_execinstr
851 0, // rosegment_gap
852 elfcpp::SHN_UNDEF, // small_common_shndx
853 elfcpp::SHN_UNDEF, // large_common_shndx
854 0, // small_common_section_flags
855 0, // large_common_section_flags
856 NULL, // attributes_section
857 NULL, // attributes_vendor
858 "_start" // entry_symbol_name
859 };
860
861 // Get the GOT section, creating it if necessary.
862
863 Output_data_got<32, false>*
864 Target_i386::got_section(Symbol_table* symtab, Layout* layout)
865 {
866 if (this->got_ == NULL)
867 {
868 gold_assert(symtab != NULL && layout != NULL);
869
870 this->got_ = new Output_data_got<32, false>();
871
872 // When using -z now, we can treat .got.plt as a relro section.
873 // Without -z now, it is modified after program startup by lazy
874 // PLT relocations.
875 bool is_got_plt_relro = parameters->options().now();
876 Output_section_order got_order = (is_got_plt_relro
877 ? ORDER_RELRO
878 : ORDER_RELRO_LAST);
879 Output_section_order got_plt_order = (is_got_plt_relro
880 ? ORDER_RELRO
881 : ORDER_NON_RELRO_FIRST);
882
883 layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS,
884 (elfcpp::SHF_ALLOC
885 | elfcpp::SHF_WRITE),
886 this->got_, got_order, true);
887
888 this->got_plt_ = new Output_data_space(4, "** GOT PLT");
889 layout->add_output_section_data(".got.plt", elfcpp::SHT_PROGBITS,
890 (elfcpp::SHF_ALLOC
891 | elfcpp::SHF_WRITE),
892 this->got_plt_, got_plt_order,
893 is_got_plt_relro);
894
895 // The first three entries are reserved.
896 this->got_plt_->set_current_data_size(3 * 4);
897
898 if (!is_got_plt_relro)
899 {
900 // Those bytes can go into the relro segment.
901 layout->increase_relro(3 * 4);
902 }
903
904 // Define _GLOBAL_OFFSET_TABLE_ at the start of the PLT.
905 this->global_offset_table_ =
906 symtab->define_in_output_data("_GLOBAL_OFFSET_TABLE_", NULL,
907 Symbol_table::PREDEFINED,
908 this->got_plt_,
909 0, 0, elfcpp::STT_OBJECT,
910 elfcpp::STB_LOCAL,
911 elfcpp::STV_HIDDEN, 0,
912 false, false);
913
914 // If there are any IRELATIVE relocations, they get GOT entries
915 // in .got.plt after the jump slot relocations.
916 this->got_irelative_ = new Output_data_space(4, "** GOT IRELATIVE PLT");
917 layout->add_output_section_data(".got.plt", elfcpp::SHT_PROGBITS,
918 (elfcpp::SHF_ALLOC
919 | elfcpp::SHF_WRITE),
920 this->got_irelative_,
921 got_plt_order, is_got_plt_relro);
922
923 // If there are any TLSDESC relocations, they get GOT entries in
924 // .got.plt after the jump slot entries.
925 this->got_tlsdesc_ = new Output_data_got<32, false>();
926 layout->add_output_section_data(".got.plt", elfcpp::SHT_PROGBITS,
927 (elfcpp::SHF_ALLOC
928 | elfcpp::SHF_WRITE),
929 this->got_tlsdesc_,
930 got_plt_order, is_got_plt_relro);
931 }
932
933 return this->got_;
934 }
935
936 // Get the dynamic reloc section, creating it if necessary.
937
938 Target_i386::Reloc_section*
939 Target_i386::rel_dyn_section(Layout* layout)
940 {
941 if (this->rel_dyn_ == NULL)
942 {
943 gold_assert(layout != NULL);
944 this->rel_dyn_ = new Reloc_section(parameters->options().combreloc());
945 layout->add_output_section_data(".rel.dyn", elfcpp::SHT_REL,
946 elfcpp::SHF_ALLOC, this->rel_dyn_,
947 ORDER_DYNAMIC_RELOCS, false);
948 }
949 return this->rel_dyn_;
950 }
951
952 // Get the section to use for IRELATIVE relocs, creating it if
953 // necessary. These go in .rel.dyn, but only after all other dynamic
954 // relocations. They need to follow the other dynamic relocations so
955 // that they can refer to global variables initialized by those
956 // relocs.
957
958 Target_i386::Reloc_section*
959 Target_i386::rel_irelative_section(Layout* layout)
960 {
961 if (this->rel_irelative_ == NULL)
962 {
963 // Make sure we have already create the dynamic reloc section.
964 this->rel_dyn_section(layout);
965 this->rel_irelative_ = new Reloc_section(false);
966 layout->add_output_section_data(".rel.dyn", elfcpp::SHT_REL,
967 elfcpp::SHF_ALLOC, this->rel_irelative_,
968 ORDER_DYNAMIC_RELOCS, false);
969 gold_assert(this->rel_dyn_->output_section()
970 == this->rel_irelative_->output_section());
971 }
972 return this->rel_irelative_;
973 }
974
975 // Create the PLT section. The ordinary .got section is an argument,
976 // since we need to refer to the start. We also create our own .got
977 // section just for PLT entries.
978
979 Output_data_plt_i386::Output_data_plt_i386(Layout* layout,
980 uint64_t addralign,
981 Output_data_space* got_plt,
982 Output_data_space* got_irelative)
983 : Output_section_data(addralign),
984 layout_(layout), tls_desc_rel_(NULL),
985 irelative_rel_(NULL), got_plt_(got_plt), got_irelative_(got_irelative),
986 count_(0), irelative_count_(0), global_ifuncs_(), local_ifuncs_()
987 {
988 this->rel_ = new Reloc_section(false);
989 layout->add_output_section_data(".rel.plt", elfcpp::SHT_REL,
990 elfcpp::SHF_ALLOC, this->rel_,
991 ORDER_DYNAMIC_PLT_RELOCS, false);
992 }
993
994 void
995 Output_data_plt_i386::do_adjust_output_section(Output_section* os)
996 {
997 // UnixWare sets the entsize of .plt to 4, and so does the old GNU
998 // linker, and so do we.
999 os->set_entsize(4);
1000 }
1001
1002 // Add an entry to the PLT.
1003
1004 void
1005 Output_data_plt_i386::add_entry(Symbol_table* symtab, Layout* layout,
1006 Symbol* gsym)
1007 {
1008 gold_assert(!gsym->has_plt_offset());
1009
1010 // Every PLT entry needs a reloc.
1011 if (gsym->type() == elfcpp::STT_GNU_IFUNC
1012 && gsym->can_use_relative_reloc(false))
1013 {
1014 gsym->set_plt_offset(this->irelative_count_ * this->get_plt_entry_size());
1015 ++this->irelative_count_;
1016 section_offset_type got_offset =
1017 this->got_irelative_->current_data_size();
1018 this->got_irelative_->set_current_data_size(got_offset + 4);
1019 Reloc_section* rel = this->rel_irelative(symtab, layout);
1020 rel->add_symbolless_global_addend(gsym, elfcpp::R_386_IRELATIVE,
1021 this->got_irelative_, got_offset);
1022 struct Global_ifunc gi;
1023 gi.sym = gsym;
1024 gi.got_offset = got_offset;
1025 this->global_ifuncs_.push_back(gi);
1026 }
1027 else
1028 {
1029 // When setting the PLT offset we skip the initial reserved PLT
1030 // entry.
1031 gsym->set_plt_offset((this->count_ + 1) * this->get_plt_entry_size());
1032
1033 ++this->count_;
1034
1035 section_offset_type got_offset = this->got_plt_->current_data_size();
1036
1037 // Every PLT entry needs a GOT entry which points back to the
1038 // PLT entry (this will be changed by the dynamic linker,
1039 // normally lazily when the function is called).
1040 this->got_plt_->set_current_data_size(got_offset + 4);
1041
1042 gsym->set_needs_dynsym_entry();
1043 this->rel_->add_global(gsym, elfcpp::R_386_JUMP_SLOT, this->got_plt_,
1044 got_offset);
1045 }
1046
1047 // Note that we don't need to save the symbol. The contents of the
1048 // PLT are independent of which symbols are used. The symbols only
1049 // appear in the relocations.
1050 }
1051
1052 // Add an entry to the PLT for a local STT_GNU_IFUNC symbol. Return
1053 // the PLT offset.
1054
1055 unsigned int
1056 Output_data_plt_i386::add_local_ifunc_entry(
1057 Symbol_table* symtab,
1058 Layout* layout,
1059 Sized_relobj_file<32, false>* relobj,
1060 unsigned int local_sym_index)
1061 {
1062 unsigned int plt_offset = this->irelative_count_ * this->get_plt_entry_size();
1063 ++this->irelative_count_;
1064
1065 section_offset_type got_offset = this->got_irelative_->current_data_size();
1066
1067 // Every PLT entry needs a GOT entry which points back to the PLT
1068 // entry.
1069 this->got_irelative_->set_current_data_size(got_offset + 4);
1070
1071 // Every PLT entry needs a reloc.
1072 Reloc_section* rel = this->rel_irelative(symtab, layout);
1073 rel->add_symbolless_local_addend(relobj, local_sym_index,
1074 elfcpp::R_386_IRELATIVE,
1075 this->got_irelative_, got_offset);
1076
1077 struct Local_ifunc li;
1078 li.object = relobj;
1079 li.local_sym_index = local_sym_index;
1080 li.got_offset = got_offset;
1081 this->local_ifuncs_.push_back(li);
1082
1083 return plt_offset;
1084 }
1085
1086 // Return where the TLS_DESC relocations should go, creating it if
1087 // necessary. These follow the JUMP_SLOT relocations.
1088
1089 Output_data_plt_i386::Reloc_section*
1090 Output_data_plt_i386::rel_tls_desc(Layout* layout)
1091 {
1092 if (this->tls_desc_rel_ == NULL)
1093 {
1094 this->tls_desc_rel_ = new Reloc_section(false);
1095 layout->add_output_section_data(".rel.plt", elfcpp::SHT_REL,
1096 elfcpp::SHF_ALLOC, this->tls_desc_rel_,
1097 ORDER_DYNAMIC_PLT_RELOCS, false);
1098 gold_assert(this->tls_desc_rel_->output_section()
1099 == this->rel_->output_section());
1100 }
1101 return this->tls_desc_rel_;
1102 }
1103
1104 // Return where the IRELATIVE relocations should go in the PLT. These
1105 // follow the JUMP_SLOT and TLS_DESC relocations.
1106
1107 Output_data_plt_i386::Reloc_section*
1108 Output_data_plt_i386::rel_irelative(Symbol_table* symtab, Layout* layout)
1109 {
1110 if (this->irelative_rel_ == NULL)
1111 {
1112 // Make sure we have a place for the TLS_DESC relocations, in
1113 // case we see any later on.
1114 this->rel_tls_desc(layout);
1115 this->irelative_rel_ = new Reloc_section(false);
1116 layout->add_output_section_data(".rel.plt", elfcpp::SHT_REL,
1117 elfcpp::SHF_ALLOC, this->irelative_rel_,
1118 ORDER_DYNAMIC_PLT_RELOCS, false);
1119 gold_assert(this->irelative_rel_->output_section()
1120 == this->rel_->output_section());
1121
1122 if (parameters->doing_static_link())
1123 {
1124 // A statically linked executable will only have a .rel.plt
1125 // section to hold R_386_IRELATIVE relocs for STT_GNU_IFUNC
1126 // symbols. The library will use these symbols to locate
1127 // the IRELATIVE relocs at program startup time.
1128 symtab->define_in_output_data("__rel_iplt_start", NULL,
1129 Symbol_table::PREDEFINED,
1130 this->irelative_rel_, 0, 0,
1131 elfcpp::STT_NOTYPE, elfcpp::STB_GLOBAL,
1132 elfcpp::STV_HIDDEN, 0, false, true);
1133 symtab->define_in_output_data("__rel_iplt_end", NULL,
1134 Symbol_table::PREDEFINED,
1135 this->irelative_rel_, 0, 0,
1136 elfcpp::STT_NOTYPE, elfcpp::STB_GLOBAL,
1137 elfcpp::STV_HIDDEN, 0, true, true);
1138 }
1139 }
1140 return this->irelative_rel_;
1141 }
1142
1143 // Return the PLT address to use for a global symbol.
1144
1145 uint64_t
1146 Output_data_plt_i386::address_for_global(const Symbol* gsym)
1147 {
1148 uint64_t offset = 0;
1149 if (gsym->type() == elfcpp::STT_GNU_IFUNC
1150 && gsym->can_use_relative_reloc(false))
1151 offset = (this->count_ + 1) * this->get_plt_entry_size();
1152 return this->address() + offset + gsym->plt_offset();
1153 }
1154
1155 // Return the PLT address to use for a local symbol. These are always
1156 // IRELATIVE relocs.
1157
1158 uint64_t
1159 Output_data_plt_i386::address_for_local(const Relobj* object,
1160 unsigned int r_sym)
1161 {
1162 return (this->address()
1163 + (this->count_ + 1) * this->get_plt_entry_size()
1164 + object->local_plt_offset(r_sym));
1165 }
1166
1167 // The first entry in the PLT for an executable.
1168
1169 const unsigned char Output_data_plt_i386_exec::first_plt_entry[plt_entry_size] =
1170 {
1171 0xff, 0x35, // pushl contents of memory address
1172 0, 0, 0, 0, // replaced with address of .got + 4
1173 0xff, 0x25, // jmp indirect
1174 0, 0, 0, 0, // replaced with address of .got + 8
1175 0, 0, 0, 0 // unused
1176 };
1177
1178 void
1179 Output_data_plt_i386_exec::do_fill_first_plt_entry(
1180 unsigned char* pov,
1181 elfcpp::Elf_types<32>::Elf_Addr got_address)
1182 {
1183 memcpy(pov, first_plt_entry, plt_entry_size);
1184 elfcpp::Swap_unaligned<32, false>::writeval(pov + 2, got_address + 4);
1185 elfcpp::Swap<32, false>::writeval(pov + 8, got_address + 8);
1186 }
1187
1188 // The first entry in the PLT for a shared object.
1189
1190 const unsigned char Output_data_plt_i386_dyn::first_plt_entry[plt_entry_size] =
1191 {
1192 0xff, 0xb3, 4, 0, 0, 0, // pushl 4(%ebx)
1193 0xff, 0xa3, 8, 0, 0, 0, // jmp *8(%ebx)
1194 0, 0, 0, 0 // unused
1195 };
1196
1197 void
1198 Output_data_plt_i386_dyn::do_fill_first_plt_entry(
1199 unsigned char* pov,
1200 elfcpp::Elf_types<32>::Elf_Addr)
1201 {
1202 memcpy(pov, first_plt_entry, plt_entry_size);
1203 }
1204
1205 // Subsequent entries in the PLT for an executable.
1206
1207 const unsigned char Output_data_plt_i386_exec::plt_entry[plt_entry_size] =
1208 {
1209 0xff, 0x25, // jmp indirect
1210 0, 0, 0, 0, // replaced with address of symbol in .got
1211 0x68, // pushl immediate
1212 0, 0, 0, 0, // replaced with offset into relocation table
1213 0xe9, // jmp relative
1214 0, 0, 0, 0 // replaced with offset to start of .plt
1215 };
1216
1217 unsigned int
1218 Output_data_plt_i386_exec::do_fill_plt_entry(
1219 unsigned char* pov,
1220 elfcpp::Elf_types<32>::Elf_Addr got_address,
1221 unsigned int got_offset,
1222 unsigned int plt_offset,
1223 unsigned int plt_rel_offset)
1224 {
1225 memcpy(pov, plt_entry, plt_entry_size);
1226 elfcpp::Swap_unaligned<32, false>::writeval(pov + 2,
1227 got_address + got_offset);
1228 elfcpp::Swap_unaligned<32, false>::writeval(pov + 7, plt_rel_offset);
1229 elfcpp::Swap<32, false>::writeval(pov + 12, - (plt_offset + 12 + 4));
1230 return 6;
1231 }
1232
1233 // Subsequent entries in the PLT for a shared object.
1234
1235 const unsigned char Output_data_plt_i386_dyn::plt_entry[plt_entry_size] =
1236 {
1237 0xff, 0xa3, // jmp *offset(%ebx)
1238 0, 0, 0, 0, // replaced with offset of symbol in .got
1239 0x68, // pushl immediate
1240 0, 0, 0, 0, // replaced with offset into relocation table
1241 0xe9, // jmp relative
1242 0, 0, 0, 0 // replaced with offset to start of .plt
1243 };
1244
1245 unsigned int
1246 Output_data_plt_i386_dyn::do_fill_plt_entry(unsigned char* pov,
1247 elfcpp::Elf_types<32>::Elf_Addr,
1248 unsigned int got_offset,
1249 unsigned int plt_offset,
1250 unsigned int plt_rel_offset)
1251 {
1252 memcpy(pov, plt_entry, plt_entry_size);
1253 elfcpp::Swap_unaligned<32, false>::writeval(pov + 2, got_offset);
1254 elfcpp::Swap_unaligned<32, false>::writeval(pov + 7, plt_rel_offset);
1255 elfcpp::Swap<32, false>::writeval(pov + 12, - (plt_offset + 12 + 4));
1256 return 6;
1257 }
1258
1259 // The .eh_frame unwind information for the PLT.
1260
1261 const unsigned char
1262 Output_data_plt_i386::plt_eh_frame_cie[plt_eh_frame_cie_size] =
1263 {
1264 1, // CIE version.
1265 'z', // Augmentation: augmentation size included.
1266 'R', // Augmentation: FDE encoding included.
1267 '\0', // End of augmentation string.
1268 1, // Code alignment factor.
1269 0x7c, // Data alignment factor.
1270 8, // Return address column.
1271 1, // Augmentation size.
1272 (elfcpp::DW_EH_PE_pcrel // FDE encoding.
1273 | elfcpp::DW_EH_PE_sdata4),
1274 elfcpp::DW_CFA_def_cfa, 4, 4, // DW_CFA_def_cfa: r4 (esp) ofs 4.
1275 elfcpp::DW_CFA_offset + 8, 1, // DW_CFA_offset: r8 (eip) at cfa-4.
1276 elfcpp::DW_CFA_nop, // Align to 16 bytes.
1277 elfcpp::DW_CFA_nop
1278 };
1279
1280 const unsigned char
1281 Output_data_plt_i386_standard::plt_eh_frame_fde[plt_eh_frame_fde_size] =
1282 {
1283 0, 0, 0, 0, // Replaced with offset to .plt.
1284 0, 0, 0, 0, // Replaced with size of .plt.
1285 0, // Augmentation size.
1286 elfcpp::DW_CFA_def_cfa_offset, 8, // DW_CFA_def_cfa_offset: 8.
1287 elfcpp::DW_CFA_advance_loc + 6, // Advance 6 to __PLT__ + 6.
1288 elfcpp::DW_CFA_def_cfa_offset, 12, // DW_CFA_def_cfa_offset: 12.
1289 elfcpp::DW_CFA_advance_loc + 10, // Advance 10 to __PLT__ + 16.
1290 elfcpp::DW_CFA_def_cfa_expression, // DW_CFA_def_cfa_expression.
1291 11, // Block length.
1292 elfcpp::DW_OP_breg4, 4, // Push %esp + 4.
1293 elfcpp::DW_OP_breg8, 0, // Push %eip.
1294 elfcpp::DW_OP_lit15, // Push 0xf.
1295 elfcpp::DW_OP_and, // & (%eip & 0xf).
1296 elfcpp::DW_OP_lit11, // Push 0xb.
1297 elfcpp::DW_OP_ge, // >= ((%eip & 0xf) >= 0xb)
1298 elfcpp::DW_OP_lit2, // Push 2.
1299 elfcpp::DW_OP_shl, // << (((%eip & 0xf) >= 0xb) << 2)
1300 elfcpp::DW_OP_plus, // + ((((%eip&0xf)>=0xb)<<2)+%esp+4
1301 elfcpp::DW_CFA_nop, // Align to 32 bytes.
1302 elfcpp::DW_CFA_nop,
1303 elfcpp::DW_CFA_nop,
1304 elfcpp::DW_CFA_nop
1305 };
1306
1307 // Write out the PLT. This uses the hand-coded instructions above,
1308 // and adjusts them as needed. This is all specified by the i386 ELF
1309 // Processor Supplement.
1310
1311 void
1312 Output_data_plt_i386::do_write(Output_file* of)
1313 {
1314 const off_t offset = this->offset();
1315 const section_size_type oview_size =
1316 convert_to_section_size_type(this->data_size());
1317 unsigned char* const oview = of->get_output_view(offset, oview_size);
1318
1319 const off_t got_file_offset = this->got_plt_->offset();
1320 gold_assert(parameters->incremental_update()
1321 || (got_file_offset + this->got_plt_->data_size()
1322 == this->got_irelative_->offset()));
1323 const section_size_type got_size =
1324 convert_to_section_size_type(this->got_plt_->data_size()
1325 + this->got_irelative_->data_size());
1326 unsigned char* const got_view = of->get_output_view(got_file_offset,
1327 got_size);
1328
1329 unsigned char* pov = oview;
1330
1331 elfcpp::Elf_types<32>::Elf_Addr plt_address = this->address();
1332 elfcpp::Elf_types<32>::Elf_Addr got_address = this->got_plt_->address();
1333
1334 this->fill_first_plt_entry(pov, got_address);
1335 pov += this->get_plt_entry_size();
1336
1337 unsigned char* got_pov = got_view;
1338
1339 // The first entry in the GOT is the address of the .dynamic section
1340 // aka the PT_DYNAMIC segment. The next two entries are reserved.
1341 // We saved space for them when we created the section in
1342 // Target_i386::got_section.
1343 Output_section* dynamic = this->layout_->dynamic_section();
1344 uint32_t dynamic_addr = dynamic == NULL ? 0 : dynamic->address();
1345 elfcpp::Swap<32, false>::writeval(got_pov, dynamic_addr);
1346 got_pov += 4;
1347 memset(got_pov, 0, 8);
1348 got_pov += 8;
1349
1350 const int rel_size = elfcpp::Elf_sizes<32>::rel_size;
1351
1352 unsigned int plt_offset = this->get_plt_entry_size();
1353 unsigned int plt_rel_offset = 0;
1354 unsigned int got_offset = 12;
1355 const unsigned int count = this->count_ + this->irelative_count_;
1356 for (unsigned int i = 0;
1357 i < count;
1358 ++i,
1359 pov += this->get_plt_entry_size(),
1360 got_pov += 4,
1361 plt_offset += this->get_plt_entry_size(),
1362 plt_rel_offset += rel_size,
1363 got_offset += 4)
1364 {
1365 // Set and adjust the PLT entry itself.
1366 unsigned int lazy_offset = this->fill_plt_entry(pov,
1367 got_address,
1368 got_offset,
1369 plt_offset,
1370 plt_rel_offset);
1371
1372 // Set the entry in the GOT.
1373 elfcpp::Swap<32, false>::writeval(got_pov,
1374 plt_address + plt_offset + lazy_offset);
1375 }
1376
1377 // If any STT_GNU_IFUNC symbols have PLT entries, we need to change
1378 // the GOT to point to the actual symbol value, rather than point to
1379 // the PLT entry. That will let the dynamic linker call the right
1380 // function when resolving IRELATIVE relocations.
1381 unsigned char* got_irelative_view = got_view + this->got_plt_->data_size();
1382 for (std::vector<Global_ifunc>::const_iterator p =
1383 this->global_ifuncs_.begin();
1384 p != this->global_ifuncs_.end();
1385 ++p)
1386 {
1387 const Sized_symbol<32>* ssym =
1388 static_cast<const Sized_symbol<32>*>(p->sym);
1389 elfcpp::Swap<32, false>::writeval(got_irelative_view + p->got_offset,
1390 ssym->value());
1391 }
1392
1393 for (std::vector<Local_ifunc>::const_iterator p =
1394 this->local_ifuncs_.begin();
1395 p != this->local_ifuncs_.end();
1396 ++p)
1397 {
1398 const Symbol_value<32>* psymval =
1399 p->object->local_symbol(p->local_sym_index);
1400 elfcpp::Swap<32, false>::writeval(got_irelative_view + p->got_offset,
1401 psymval->value(p->object, 0));
1402 }
1403
1404 gold_assert(static_cast<section_size_type>(pov - oview) == oview_size);
1405 gold_assert(static_cast<section_size_type>(got_pov - got_view) == got_size);
1406
1407 of->write_output_view(offset, oview_size, oview);
1408 of->write_output_view(got_file_offset, got_size, got_view);
1409 }
1410
1411 // Create the PLT section.
1412
1413 void
1414 Target_i386::make_plt_section(Symbol_table* symtab, Layout* layout)
1415 {
1416 if (this->plt_ == NULL)
1417 {
1418 // Create the GOT sections first.
1419 this->got_section(symtab, layout);
1420
1421 const bool dyn = parameters->options().output_is_position_independent();
1422 this->plt_ = this->make_data_plt(layout,
1423 this->got_plt_,
1424 this->got_irelative_,
1425 dyn);
1426
1427 // Add unwind information if requested.
1428 if (parameters->options().ld_generated_unwind_info())
1429 this->plt_->add_eh_frame(layout);
1430
1431 layout->add_output_section_data(".plt", elfcpp::SHT_PROGBITS,
1432 (elfcpp::SHF_ALLOC
1433 | elfcpp::SHF_EXECINSTR),
1434 this->plt_, ORDER_PLT, false);
1435
1436 // Make the sh_info field of .rel.plt point to .plt.
1437 Output_section* rel_plt_os = this->plt_->rel_plt()->output_section();
1438 rel_plt_os->set_info_section(this->plt_->output_section());
1439 }
1440 }
1441
1442 // Create a PLT entry for a global symbol.
1443
1444 void
1445 Target_i386::make_plt_entry(Symbol_table* symtab, Layout* layout, Symbol* gsym)
1446 {
1447 if (gsym->has_plt_offset())
1448 return;
1449 if (this->plt_ == NULL)
1450 this->make_plt_section(symtab, layout);
1451 this->plt_->add_entry(symtab, layout, gsym);
1452 }
1453
1454 // Make a PLT entry for a local STT_GNU_IFUNC symbol.
1455
1456 void
1457 Target_i386::make_local_ifunc_plt_entry(Symbol_table* symtab, Layout* layout,
1458 Sized_relobj_file<32, false>* relobj,
1459 unsigned int local_sym_index)
1460 {
1461 if (relobj->local_has_plt_offset(local_sym_index))
1462 return;
1463 if (this->plt_ == NULL)
1464 this->make_plt_section(symtab, layout);
1465 unsigned int plt_offset = this->plt_->add_local_ifunc_entry(symtab, layout,
1466 relobj,
1467 local_sym_index);
1468 relobj->set_local_plt_offset(local_sym_index, plt_offset);
1469 }
1470
1471 // Return the number of entries in the PLT.
1472
1473 unsigned int
1474 Target_i386::plt_entry_count() const
1475 {
1476 if (this->plt_ == NULL)
1477 return 0;
1478 return this->plt_->entry_count();
1479 }
1480
1481 // Return the offset of the first non-reserved PLT entry.
1482
1483 unsigned int
1484 Target_i386::first_plt_entry_offset() const
1485 {
1486 return this->plt_->first_plt_entry_offset();
1487 }
1488
1489 // Return the size of each PLT entry.
1490
1491 unsigned int
1492 Target_i386::plt_entry_size() const
1493 {
1494 return this->plt_->get_plt_entry_size();
1495 }
1496
1497 // Get the section to use for TLS_DESC relocations.
1498
1499 Target_i386::Reloc_section*
1500 Target_i386::rel_tls_desc_section(Layout* layout) const
1501 {
1502 return this->plt_section()->rel_tls_desc(layout);
1503 }
1504
1505 // Define the _TLS_MODULE_BASE_ symbol in the TLS segment.
1506
1507 void
1508 Target_i386::define_tls_base_symbol(Symbol_table* symtab, Layout* layout)
1509 {
1510 if (this->tls_base_symbol_defined_)
1511 return;
1512
1513 Output_segment* tls_segment = layout->tls_segment();
1514 if (tls_segment != NULL)
1515 {
1516 bool is_exec = parameters->options().output_is_executable();
1517 symtab->define_in_output_segment("_TLS_MODULE_BASE_", NULL,
1518 Symbol_table::PREDEFINED,
1519 tls_segment, 0, 0,
1520 elfcpp::STT_TLS,
1521 elfcpp::STB_LOCAL,
1522 elfcpp::STV_HIDDEN, 0,
1523 (is_exec
1524 ? Symbol::SEGMENT_END
1525 : Symbol::SEGMENT_START),
1526 true);
1527 }
1528 this->tls_base_symbol_defined_ = true;
1529 }
1530
1531 // Create a GOT entry for the TLS module index.
1532
1533 unsigned int
1534 Target_i386::got_mod_index_entry(Symbol_table* symtab, Layout* layout,
1535 Sized_relobj_file<32, false>* object)
1536 {
1537 if (this->got_mod_index_offset_ == -1U)
1538 {
1539 gold_assert(symtab != NULL && layout != NULL && object != NULL);
1540 Reloc_section* rel_dyn = this->rel_dyn_section(layout);
1541 Output_data_got<32, false>* got = this->got_section(symtab, layout);
1542 unsigned int got_offset = got->add_constant(0);
1543 rel_dyn->add_local(object, 0, elfcpp::R_386_TLS_DTPMOD32, got,
1544 got_offset);
1545 got->add_constant(0);
1546 this->got_mod_index_offset_ = got_offset;
1547 }
1548 return this->got_mod_index_offset_;
1549 }
1550
1551 // Optimize the TLS relocation type based on what we know about the
1552 // symbol. IS_FINAL is true if the final address of this symbol is
1553 // known at link time.
1554
1555 tls::Tls_optimization
1556 Target_i386::optimize_tls_reloc(bool is_final, int r_type)
1557 {
1558 // If we are generating a shared library, then we can't do anything
1559 // in the linker.
1560 if (parameters->options().shared())
1561 return tls::TLSOPT_NONE;
1562
1563 switch (r_type)
1564 {
1565 case elfcpp::R_386_TLS_GD:
1566 case elfcpp::R_386_TLS_GOTDESC:
1567 case elfcpp::R_386_TLS_DESC_CALL:
1568 // These are General-Dynamic which permits fully general TLS
1569 // access. Since we know that we are generating an executable,
1570 // we can convert this to Initial-Exec. If we also know that
1571 // this is a local symbol, we can further switch to Local-Exec.
1572 if (is_final)
1573 return tls::TLSOPT_TO_LE;
1574 return tls::TLSOPT_TO_IE;
1575
1576 case elfcpp::R_386_TLS_LDM:
1577 // This is Local-Dynamic, which refers to a local symbol in the
1578 // dynamic TLS block. Since we know that we generating an
1579 // executable, we can switch to Local-Exec.
1580 return tls::TLSOPT_TO_LE;
1581
1582 case elfcpp::R_386_TLS_LDO_32:
1583 // Another type of Local-Dynamic relocation.
1584 return tls::TLSOPT_TO_LE;
1585
1586 case elfcpp::R_386_TLS_IE:
1587 case elfcpp::R_386_TLS_GOTIE:
1588 case elfcpp::R_386_TLS_IE_32:
1589 // These are Initial-Exec relocs which get the thread offset
1590 // from the GOT. If we know that we are linking against the
1591 // local symbol, we can switch to Local-Exec, which links the
1592 // thread offset into the instruction.
1593 if (is_final)
1594 return tls::TLSOPT_TO_LE;
1595 return tls::TLSOPT_NONE;
1596
1597 case elfcpp::R_386_TLS_LE:
1598 case elfcpp::R_386_TLS_LE_32:
1599 // When we already have Local-Exec, there is nothing further we
1600 // can do.
1601 return tls::TLSOPT_NONE;
1602
1603 default:
1604 gold_unreachable();
1605 }
1606 }
1607
1608 // Get the Reference_flags for a particular relocation.
1609
1610 int
1611 Target_i386::Scan::get_reference_flags(unsigned int r_type)
1612 {
1613 switch (r_type)
1614 {
1615 case elfcpp::R_386_NONE:
1616 case elfcpp::R_386_GNU_VTINHERIT:
1617 case elfcpp::R_386_GNU_VTENTRY:
1618 case elfcpp::R_386_GOTPC:
1619 // No symbol reference.
1620 return 0;
1621
1622 case elfcpp::R_386_32:
1623 case elfcpp::R_386_16:
1624 case elfcpp::R_386_8:
1625 return Symbol::ABSOLUTE_REF;
1626
1627 case elfcpp::R_386_PC32:
1628 case elfcpp::R_386_PC16:
1629 case elfcpp::R_386_PC8:
1630 case elfcpp::R_386_GOTOFF:
1631 return Symbol::RELATIVE_REF;
1632
1633 case elfcpp::R_386_PLT32:
1634 return Symbol::FUNCTION_CALL | Symbol::RELATIVE_REF;
1635
1636 case elfcpp::R_386_GOT32:
1637 // Absolute in GOT.
1638 return Symbol::ABSOLUTE_REF;
1639
1640 case elfcpp::R_386_TLS_GD: // Global-dynamic
1641 case elfcpp::R_386_TLS_GOTDESC: // Global-dynamic (from ~oliva url)
1642 case elfcpp::R_386_TLS_DESC_CALL:
1643 case elfcpp::R_386_TLS_LDM: // Local-dynamic
1644 case elfcpp::R_386_TLS_LDO_32: // Alternate local-dynamic
1645 case elfcpp::R_386_TLS_IE: // Initial-exec
1646 case elfcpp::R_386_TLS_IE_32:
1647 case elfcpp::R_386_TLS_GOTIE:
1648 case elfcpp::R_386_TLS_LE: // Local-exec
1649 case elfcpp::R_386_TLS_LE_32:
1650 return Symbol::TLS_REF;
1651
1652 case elfcpp::R_386_COPY:
1653 case elfcpp::R_386_GLOB_DAT:
1654 case elfcpp::R_386_JUMP_SLOT:
1655 case elfcpp::R_386_RELATIVE:
1656 case elfcpp::R_386_IRELATIVE:
1657 case elfcpp::R_386_TLS_TPOFF:
1658 case elfcpp::R_386_TLS_DTPMOD32:
1659 case elfcpp::R_386_TLS_DTPOFF32:
1660 case elfcpp::R_386_TLS_TPOFF32:
1661 case elfcpp::R_386_TLS_DESC:
1662 case elfcpp::R_386_32PLT:
1663 case elfcpp::R_386_TLS_GD_32:
1664 case elfcpp::R_386_TLS_GD_PUSH:
1665 case elfcpp::R_386_TLS_GD_CALL:
1666 case elfcpp::R_386_TLS_GD_POP:
1667 case elfcpp::R_386_TLS_LDM_32:
1668 case elfcpp::R_386_TLS_LDM_PUSH:
1669 case elfcpp::R_386_TLS_LDM_CALL:
1670 case elfcpp::R_386_TLS_LDM_POP:
1671 case elfcpp::R_386_USED_BY_INTEL_200:
1672 default:
1673 // Not expected. We will give an error later.
1674 return 0;
1675 }
1676 }
1677
1678 // Report an unsupported relocation against a local symbol.
1679
1680 void
1681 Target_i386::Scan::unsupported_reloc_local(Sized_relobj_file<32, false>* object,
1682 unsigned int r_type)
1683 {
1684 gold_error(_("%s: unsupported reloc %u against local symbol"),
1685 object->name().c_str(), r_type);
1686 }
1687
1688 // Return whether we need to make a PLT entry for a relocation of a
1689 // given type against a STT_GNU_IFUNC symbol.
1690
1691 bool
1692 Target_i386::Scan::reloc_needs_plt_for_ifunc(
1693 Sized_relobj_file<32, false>* object,
1694 unsigned int r_type)
1695 {
1696 int flags = Scan::get_reference_flags(r_type);
1697 if (flags & Symbol::TLS_REF)
1698 gold_error(_("%s: unsupported TLS reloc %u for IFUNC symbol"),
1699 object->name().c_str(), r_type);
1700 return flags != 0;
1701 }
1702
1703 // Scan a relocation for a local symbol.
1704
1705 inline void
1706 Target_i386::Scan::local(Symbol_table* symtab,
1707 Layout* layout,
1708 Target_i386* target,
1709 Sized_relobj_file<32, false>* object,
1710 unsigned int data_shndx,
1711 Output_section* output_section,
1712 const elfcpp::Rel<32, false>& reloc,
1713 unsigned int r_type,
1714 const elfcpp::Sym<32, false>& lsym,
1715 bool is_discarded)
1716 {
1717 if (is_discarded)
1718 return;
1719
1720 // A local STT_GNU_IFUNC symbol may require a PLT entry.
1721 if (lsym.get_st_type() == elfcpp::STT_GNU_IFUNC
1722 && this->reloc_needs_plt_for_ifunc(object, r_type))
1723 {
1724 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
1725 target->make_local_ifunc_plt_entry(symtab, layout, object, r_sym);
1726 }
1727
1728 switch (r_type)
1729 {
1730 case elfcpp::R_386_NONE:
1731 case elfcpp::R_386_GNU_VTINHERIT:
1732 case elfcpp::R_386_GNU_VTENTRY:
1733 break;
1734
1735 case elfcpp::R_386_32:
1736 // If building a shared library (or a position-independent
1737 // executable), we need to create a dynamic relocation for
1738 // this location. The relocation applied at link time will
1739 // apply the link-time value, so we flag the location with
1740 // an R_386_RELATIVE relocation so the dynamic loader can
1741 // relocate it easily.
1742 if (parameters->options().output_is_position_independent())
1743 {
1744 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
1745 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
1746 rel_dyn->add_local_relative(object, r_sym, elfcpp::R_386_RELATIVE,
1747 output_section, data_shndx,
1748 reloc.get_r_offset());
1749 }
1750 break;
1751
1752 case elfcpp::R_386_16:
1753 case elfcpp::R_386_8:
1754 // If building a shared library (or a position-independent
1755 // executable), we need to create a dynamic relocation for
1756 // this location. Because the addend needs to remain in the
1757 // data section, we need to be careful not to apply this
1758 // relocation statically.
1759 if (parameters->options().output_is_position_independent())
1760 {
1761 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
1762 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
1763 if (lsym.get_st_type() != elfcpp::STT_SECTION)
1764 rel_dyn->add_local(object, r_sym, r_type, output_section,
1765 data_shndx, reloc.get_r_offset());
1766 else
1767 {
1768 gold_assert(lsym.get_st_value() == 0);
1769 unsigned int shndx = lsym.get_st_shndx();
1770 bool is_ordinary;
1771 shndx = object->adjust_sym_shndx(r_sym, shndx,
1772 &is_ordinary);
1773 if (!is_ordinary)
1774 object->error(_("section symbol %u has bad shndx %u"),
1775 r_sym, shndx);
1776 else
1777 rel_dyn->add_local_section(object, shndx,
1778 r_type, output_section,
1779 data_shndx, reloc.get_r_offset());
1780 }
1781 }
1782 break;
1783
1784 case elfcpp::R_386_PC32:
1785 case elfcpp::R_386_PC16:
1786 case elfcpp::R_386_PC8:
1787 break;
1788
1789 case elfcpp::R_386_PLT32:
1790 // Since we know this is a local symbol, we can handle this as a
1791 // PC32 reloc.
1792 break;
1793
1794 case elfcpp::R_386_GOTOFF:
1795 case elfcpp::R_386_GOTPC:
1796 // We need a GOT section.
1797 target->got_section(symtab, layout);
1798 break;
1799
1800 case elfcpp::R_386_GOT32:
1801 {
1802 // The symbol requires a GOT entry.
1803 Output_data_got<32, false>* got = target->got_section(symtab, layout);
1804 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
1805
1806 // For a STT_GNU_IFUNC symbol we want the PLT offset. That
1807 // lets function pointers compare correctly with shared
1808 // libraries. Otherwise we would need an IRELATIVE reloc.
1809 bool is_new;
1810 if (lsym.get_st_type() == elfcpp::STT_GNU_IFUNC)
1811 is_new = got->add_local_plt(object, r_sym, GOT_TYPE_STANDARD);
1812 else
1813 is_new = got->add_local(object, r_sym, GOT_TYPE_STANDARD);
1814 if (is_new)
1815 {
1816 // If we are generating a shared object, we need to add a
1817 // dynamic RELATIVE relocation for this symbol's GOT entry.
1818 if (parameters->options().output_is_position_independent())
1819 {
1820 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
1821 unsigned int got_offset =
1822 object->local_got_offset(r_sym, GOT_TYPE_STANDARD);
1823 rel_dyn->add_local_relative(object, r_sym,
1824 elfcpp::R_386_RELATIVE,
1825 got, got_offset);
1826 }
1827 }
1828 }
1829 break;
1830
1831 // These are relocations which should only be seen by the
1832 // dynamic linker, and should never be seen here.
1833 case elfcpp::R_386_COPY:
1834 case elfcpp::R_386_GLOB_DAT:
1835 case elfcpp::R_386_JUMP_SLOT:
1836 case elfcpp::R_386_RELATIVE:
1837 case elfcpp::R_386_IRELATIVE:
1838 case elfcpp::R_386_TLS_TPOFF:
1839 case elfcpp::R_386_TLS_DTPMOD32:
1840 case elfcpp::R_386_TLS_DTPOFF32:
1841 case elfcpp::R_386_TLS_TPOFF32:
1842 case elfcpp::R_386_TLS_DESC:
1843 gold_error(_("%s: unexpected reloc %u in object file"),
1844 object->name().c_str(), r_type);
1845 break;
1846
1847 // These are initial TLS relocs, which are expected when
1848 // linking.
1849 case elfcpp::R_386_TLS_GD: // Global-dynamic
1850 case elfcpp::R_386_TLS_GOTDESC: // Global-dynamic (from ~oliva url)
1851 case elfcpp::R_386_TLS_DESC_CALL:
1852 case elfcpp::R_386_TLS_LDM: // Local-dynamic
1853 case elfcpp::R_386_TLS_LDO_32: // Alternate local-dynamic
1854 case elfcpp::R_386_TLS_IE: // Initial-exec
1855 case elfcpp::R_386_TLS_IE_32:
1856 case elfcpp::R_386_TLS_GOTIE:
1857 case elfcpp::R_386_TLS_LE: // Local-exec
1858 case elfcpp::R_386_TLS_LE_32:
1859 {
1860 bool output_is_shared = parameters->options().shared();
1861 const tls::Tls_optimization optimized_type
1862 = Target_i386::optimize_tls_reloc(!output_is_shared, r_type);
1863 switch (r_type)
1864 {
1865 case elfcpp::R_386_TLS_GD: // Global-dynamic
1866 if (optimized_type == tls::TLSOPT_NONE)
1867 {
1868 // Create a pair of GOT entries for the module index and
1869 // dtv-relative offset.
1870 Output_data_got<32, false>* got
1871 = target->got_section(symtab, layout);
1872 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
1873 unsigned int shndx = lsym.get_st_shndx();
1874 bool is_ordinary;
1875 shndx = object->adjust_sym_shndx(r_sym, shndx, &is_ordinary);
1876 if (!is_ordinary)
1877 object->error(_("local symbol %u has bad shndx %u"),
1878 r_sym, shndx);
1879 else
1880 got->add_local_pair_with_rel(object, r_sym, shndx,
1881 GOT_TYPE_TLS_PAIR,
1882 target->rel_dyn_section(layout),
1883 elfcpp::R_386_TLS_DTPMOD32);
1884 }
1885 else if (optimized_type != tls::TLSOPT_TO_LE)
1886 unsupported_reloc_local(object, r_type);
1887 break;
1888
1889 case elfcpp::R_386_TLS_GOTDESC: // Global-dynamic (from ~oliva)
1890 target->define_tls_base_symbol(symtab, layout);
1891 if (optimized_type == tls::TLSOPT_NONE)
1892 {
1893 // Create a double GOT entry with an R_386_TLS_DESC
1894 // reloc. The R_386_TLS_DESC reloc is resolved
1895 // lazily, so the GOT entry needs to be in an area in
1896 // .got.plt, not .got. Call got_section to make sure
1897 // the section has been created.
1898 target->got_section(symtab, layout);
1899 Output_data_got<32, false>* got = target->got_tlsdesc_section();
1900 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
1901 if (!object->local_has_got_offset(r_sym, GOT_TYPE_TLS_DESC))
1902 {
1903 unsigned int got_offset = got->add_constant(0);
1904 // The local symbol value is stored in the second
1905 // GOT entry.
1906 got->add_local(object, r_sym, GOT_TYPE_TLS_DESC);
1907 // That set the GOT offset of the local symbol to
1908 // point to the second entry, but we want it to
1909 // point to the first.
1910 object->set_local_got_offset(r_sym, GOT_TYPE_TLS_DESC,
1911 got_offset);
1912 Reloc_section* rt = target->rel_tls_desc_section(layout);
1913 rt->add_absolute(elfcpp::R_386_TLS_DESC, got, got_offset);
1914 }
1915 }
1916 else if (optimized_type != tls::TLSOPT_TO_LE)
1917 unsupported_reloc_local(object, r_type);
1918 break;
1919
1920 case elfcpp::R_386_TLS_DESC_CALL:
1921 break;
1922
1923 case elfcpp::R_386_TLS_LDM: // Local-dynamic
1924 if (optimized_type == tls::TLSOPT_NONE)
1925 {
1926 // Create a GOT entry for the module index.
1927 target->got_mod_index_entry(symtab, layout, object);
1928 }
1929 else if (optimized_type != tls::TLSOPT_TO_LE)
1930 unsupported_reloc_local(object, r_type);
1931 break;
1932
1933 case elfcpp::R_386_TLS_LDO_32: // Alternate local-dynamic
1934 break;
1935
1936 case elfcpp::R_386_TLS_IE: // Initial-exec
1937 case elfcpp::R_386_TLS_IE_32:
1938 case elfcpp::R_386_TLS_GOTIE:
1939 layout->set_has_static_tls();
1940 if (optimized_type == tls::TLSOPT_NONE)
1941 {
1942 // For the R_386_TLS_IE relocation, we need to create a
1943 // dynamic relocation when building a shared library.
1944 if (r_type == elfcpp::R_386_TLS_IE
1945 && parameters->options().shared())
1946 {
1947 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
1948 unsigned int r_sym
1949 = elfcpp::elf_r_sym<32>(reloc.get_r_info());
1950 rel_dyn->add_local_relative(object, r_sym,
1951 elfcpp::R_386_RELATIVE,
1952 output_section, data_shndx,
1953 reloc.get_r_offset());
1954 }
1955 // Create a GOT entry for the tp-relative offset.
1956 Output_data_got<32, false>* got
1957 = target->got_section(symtab, layout);
1958 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
1959 unsigned int dyn_r_type = (r_type == elfcpp::R_386_TLS_IE_32
1960 ? elfcpp::R_386_TLS_TPOFF32
1961 : elfcpp::R_386_TLS_TPOFF);
1962 unsigned int got_type = (r_type == elfcpp::R_386_TLS_IE_32
1963 ? GOT_TYPE_TLS_OFFSET
1964 : GOT_TYPE_TLS_NOFFSET);
1965 got->add_local_with_rel(object, r_sym, got_type,
1966 target->rel_dyn_section(layout),
1967 dyn_r_type);
1968 }
1969 else if (optimized_type != tls::TLSOPT_TO_LE)
1970 unsupported_reloc_local(object, r_type);
1971 break;
1972
1973 case elfcpp::R_386_TLS_LE: // Local-exec
1974 case elfcpp::R_386_TLS_LE_32:
1975 layout->set_has_static_tls();
1976 if (output_is_shared)
1977 {
1978 // We need to create a dynamic relocation.
1979 gold_assert(lsym.get_st_type() != elfcpp::STT_SECTION);
1980 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info());
1981 unsigned int dyn_r_type = (r_type == elfcpp::R_386_TLS_LE_32
1982 ? elfcpp::R_386_TLS_TPOFF32
1983 : elfcpp::R_386_TLS_TPOFF);
1984 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
1985 rel_dyn->add_local(object, r_sym, dyn_r_type, output_section,
1986 data_shndx, reloc.get_r_offset());
1987 }
1988 break;
1989
1990 default:
1991 gold_unreachable();
1992 }
1993 }
1994 break;
1995
1996 case elfcpp::R_386_32PLT:
1997 case elfcpp::R_386_TLS_GD_32:
1998 case elfcpp::R_386_TLS_GD_PUSH:
1999 case elfcpp::R_386_TLS_GD_CALL:
2000 case elfcpp::R_386_TLS_GD_POP:
2001 case elfcpp::R_386_TLS_LDM_32:
2002 case elfcpp::R_386_TLS_LDM_PUSH:
2003 case elfcpp::R_386_TLS_LDM_CALL:
2004 case elfcpp::R_386_TLS_LDM_POP:
2005 case elfcpp::R_386_USED_BY_INTEL_200:
2006 default:
2007 unsupported_reloc_local(object, r_type);
2008 break;
2009 }
2010 }
2011
2012 // Report an unsupported relocation against a global symbol.
2013
2014 void
2015 Target_i386::Scan::unsupported_reloc_global(
2016 Sized_relobj_file<32, false>* object,
2017 unsigned int r_type,
2018 Symbol* gsym)
2019 {
2020 gold_error(_("%s: unsupported reloc %u against global symbol %s"),
2021 object->name().c_str(), r_type, gsym->demangled_name().c_str());
2022 }
2023
2024 inline bool
2025 Target_i386::Scan::possible_function_pointer_reloc(unsigned int r_type)
2026 {
2027 switch (r_type)
2028 {
2029 case elfcpp::R_386_32:
2030 case elfcpp::R_386_16:
2031 case elfcpp::R_386_8:
2032 case elfcpp::R_386_GOTOFF:
2033 case elfcpp::R_386_GOT32:
2034 {
2035 return true;
2036 }
2037 default:
2038 return false;
2039 }
2040 return false;
2041 }
2042
2043 inline bool
2044 Target_i386::Scan::local_reloc_may_be_function_pointer(
2045 Symbol_table* ,
2046 Layout* ,
2047 Target_i386* ,
2048 Sized_relobj_file<32, false>* ,
2049 unsigned int ,
2050 Output_section* ,
2051 const elfcpp::Rel<32, false>& ,
2052 unsigned int r_type,
2053 const elfcpp::Sym<32, false>&)
2054 {
2055 return possible_function_pointer_reloc(r_type);
2056 }
2057
2058 inline bool
2059 Target_i386::Scan::global_reloc_may_be_function_pointer(
2060 Symbol_table* ,
2061 Layout* ,
2062 Target_i386* ,
2063 Sized_relobj_file<32, false>* ,
2064 unsigned int ,
2065 Output_section* ,
2066 const elfcpp::Rel<32, false>& ,
2067 unsigned int r_type,
2068 Symbol*)
2069 {
2070 return possible_function_pointer_reloc(r_type);
2071 }
2072
2073 // Scan a relocation for a global symbol.
2074
2075 inline void
2076 Target_i386::Scan::global(Symbol_table* symtab,
2077 Layout* layout,
2078 Target_i386* target,
2079 Sized_relobj_file<32, false>* object,
2080 unsigned int data_shndx,
2081 Output_section* output_section,
2082 const elfcpp::Rel<32, false>& reloc,
2083 unsigned int r_type,
2084 Symbol* gsym)
2085 {
2086 // A STT_GNU_IFUNC symbol may require a PLT entry.
2087 if (gsym->type() == elfcpp::STT_GNU_IFUNC
2088 && this->reloc_needs_plt_for_ifunc(object, r_type))
2089 target->make_plt_entry(symtab, layout, gsym);
2090
2091 switch (r_type)
2092 {
2093 case elfcpp::R_386_NONE:
2094 case elfcpp::R_386_GNU_VTINHERIT:
2095 case elfcpp::R_386_GNU_VTENTRY:
2096 break;
2097
2098 case elfcpp::R_386_32:
2099 case elfcpp::R_386_16:
2100 case elfcpp::R_386_8:
2101 {
2102 // Make a PLT entry if necessary.
2103 if (gsym->needs_plt_entry())
2104 {
2105 target->make_plt_entry(symtab, layout, gsym);
2106 // Since this is not a PC-relative relocation, we may be
2107 // taking the address of a function. In that case we need to
2108 // set the entry in the dynamic symbol table to the address of
2109 // the PLT entry.
2110 if (gsym->is_from_dynobj() && !parameters->options().shared())
2111 gsym->set_needs_dynsym_value();
2112 }
2113 // Make a dynamic relocation if necessary.
2114 if (gsym->needs_dynamic_reloc(Scan::get_reference_flags(r_type)))
2115 {
2116 if (gsym->may_need_copy_reloc())
2117 {
2118 target->copy_reloc(symtab, layout, object,
2119 data_shndx, output_section, gsym, reloc);
2120 }
2121 else if (r_type == elfcpp::R_386_32
2122 && gsym->type() == elfcpp::STT_GNU_IFUNC
2123 && gsym->can_use_relative_reloc(false)
2124 && !gsym->is_from_dynobj()
2125 && !gsym->is_undefined()
2126 && !gsym->is_preemptible())
2127 {
2128 // Use an IRELATIVE reloc for a locally defined
2129 // STT_GNU_IFUNC symbol. This makes a function
2130 // address in a PIE executable match the address in a
2131 // shared library that it links against.
2132 Reloc_section* rel_dyn = target->rel_irelative_section(layout);
2133 rel_dyn->add_symbolless_global_addend(gsym,
2134 elfcpp::R_386_IRELATIVE,
2135 output_section,
2136 object, data_shndx,
2137 reloc.get_r_offset());
2138 }
2139 else if (r_type == elfcpp::R_386_32
2140 && gsym->can_use_relative_reloc(false))
2141 {
2142 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
2143 rel_dyn->add_global_relative(gsym, elfcpp::R_386_RELATIVE,
2144 output_section, object,
2145 data_shndx, reloc.get_r_offset());
2146 }
2147 else
2148 {
2149 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
2150 rel_dyn->add_global(gsym, r_type, output_section, object,
2151 data_shndx, reloc.get_r_offset());
2152 }
2153 }
2154 }
2155 break;
2156
2157 case elfcpp::R_386_PC32:
2158 case elfcpp::R_386_PC16:
2159 case elfcpp::R_386_PC8:
2160 {
2161 // Make a PLT entry if necessary.
2162 if (gsym->needs_plt_entry())
2163 {
2164 // These relocations are used for function calls only in
2165 // non-PIC code. For a 32-bit relocation in a shared library,
2166 // we'll need a text relocation anyway, so we can skip the
2167 // PLT entry and let the dynamic linker bind the call directly
2168 // to the target. For smaller relocations, we should use a
2169 // PLT entry to ensure that the call can reach.
2170 if (!parameters->options().shared()
2171 || r_type != elfcpp::R_386_PC32)
2172 target->make_plt_entry(symtab, layout, gsym);
2173 }
2174 // Make a dynamic relocation if necessary.
2175 if (gsym->needs_dynamic_reloc(Scan::get_reference_flags(r_type)))
2176 {
2177 if (gsym->may_need_copy_reloc())
2178 {
2179 target->copy_reloc(symtab, layout, object,
2180 data_shndx, output_section, gsym, reloc);
2181 }
2182 else
2183 {
2184 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
2185 rel_dyn->add_global(gsym, r_type, output_section, object,
2186 data_shndx, reloc.get_r_offset());
2187 }
2188 }
2189 }
2190 break;
2191
2192 case elfcpp::R_386_GOT32:
2193 {
2194 // The symbol requires a GOT entry.
2195 Output_data_got<32, false>* got = target->got_section(symtab, layout);
2196 if (gsym->final_value_is_known())
2197 {
2198 // For a STT_GNU_IFUNC symbol we want the PLT address.
2199 if (gsym->type() == elfcpp::STT_GNU_IFUNC)
2200 got->add_global_plt(gsym, GOT_TYPE_STANDARD);
2201 else
2202 got->add_global(gsym, GOT_TYPE_STANDARD);
2203 }
2204 else
2205 {
2206 // If this symbol is not fully resolved, we need to add a
2207 // GOT entry with a dynamic relocation.
2208 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
2209
2210 // Use a GLOB_DAT rather than a RELATIVE reloc if:
2211 //
2212 // 1) The symbol may be defined in some other module.
2213 //
2214 // 2) We are building a shared library and this is a
2215 // protected symbol; using GLOB_DAT means that the dynamic
2216 // linker can use the address of the PLT in the main
2217 // executable when appropriate so that function address
2218 // comparisons work.
2219 //
2220 // 3) This is a STT_GNU_IFUNC symbol in position dependent
2221 // code, again so that function address comparisons work.
2222 if (gsym->is_from_dynobj()
2223 || gsym->is_undefined()
2224 || gsym->is_preemptible()
2225 || (gsym->visibility() == elfcpp::STV_PROTECTED
2226 && parameters->options().shared())
2227 || (gsym->type() == elfcpp::STT_GNU_IFUNC
2228 && parameters->options().output_is_position_independent()))
2229 got->add_global_with_rel(gsym, GOT_TYPE_STANDARD,
2230 rel_dyn, elfcpp::R_386_GLOB_DAT);
2231 else
2232 {
2233 // For a STT_GNU_IFUNC symbol we want to write the PLT
2234 // offset into the GOT, so that function pointer
2235 // comparisons work correctly.
2236 bool is_new;
2237 if (gsym->type() != elfcpp::STT_GNU_IFUNC)
2238 is_new = got->add_global(gsym, GOT_TYPE_STANDARD);
2239 else
2240 {
2241 is_new = got->add_global_plt(gsym, GOT_TYPE_STANDARD);
2242 // Tell the dynamic linker to use the PLT address
2243 // when resolving relocations.
2244 if (gsym->is_from_dynobj()
2245 && !parameters->options().shared())
2246 gsym->set_needs_dynsym_value();
2247 }
2248 if (is_new)
2249 {
2250 unsigned int got_off = gsym->got_offset(GOT_TYPE_STANDARD);
2251 rel_dyn->add_global_relative(gsym, elfcpp::R_386_RELATIVE,
2252 got, got_off);
2253 }
2254 }
2255 }
2256 }
2257 break;
2258
2259 case elfcpp::R_386_PLT32:
2260 // If the symbol is fully resolved, this is just a PC32 reloc.
2261 // Otherwise we need a PLT entry.
2262 if (gsym->final_value_is_known())
2263 break;
2264 // If building a shared library, we can also skip the PLT entry
2265 // if the symbol is defined in the output file and is protected
2266 // or hidden.
2267 if (gsym->is_defined()
2268 && !gsym->is_from_dynobj()
2269 && !gsym->is_preemptible())
2270 break;
2271 target->make_plt_entry(symtab, layout, gsym);
2272 break;
2273
2274 case elfcpp::R_386_GOTOFF:
2275 case elfcpp::R_386_GOTPC:
2276 // We need a GOT section.
2277 target->got_section(symtab, layout);
2278 break;
2279
2280 // These are relocations which should only be seen by the
2281 // dynamic linker, and should never be seen here.
2282 case elfcpp::R_386_COPY:
2283 case elfcpp::R_386_GLOB_DAT:
2284 case elfcpp::R_386_JUMP_SLOT:
2285 case elfcpp::R_386_RELATIVE:
2286 case elfcpp::R_386_IRELATIVE:
2287 case elfcpp::R_386_TLS_TPOFF:
2288 case elfcpp::R_386_TLS_DTPMOD32:
2289 case elfcpp::R_386_TLS_DTPOFF32:
2290 case elfcpp::R_386_TLS_TPOFF32:
2291 case elfcpp::R_386_TLS_DESC:
2292 gold_error(_("%s: unexpected reloc %u in object file"),
2293 object->name().c_str(), r_type);
2294 break;
2295
2296 // These are initial tls relocs, which are expected when
2297 // linking.
2298 case elfcpp::R_386_TLS_GD: // Global-dynamic
2299 case elfcpp::R_386_TLS_GOTDESC: // Global-dynamic (from ~oliva url)
2300 case elfcpp::R_386_TLS_DESC_CALL:
2301 case elfcpp::R_386_TLS_LDM: // Local-dynamic
2302 case elfcpp::R_386_TLS_LDO_32: // Alternate local-dynamic
2303 case elfcpp::R_386_TLS_IE: // Initial-exec
2304 case elfcpp::R_386_TLS_IE_32:
2305 case elfcpp::R_386_TLS_GOTIE:
2306 case elfcpp::R_386_TLS_LE: // Local-exec
2307 case elfcpp::R_386_TLS_LE_32:
2308 {
2309 const bool is_final = gsym->final_value_is_known();
2310 const tls::Tls_optimization optimized_type
2311 = Target_i386::optimize_tls_reloc(is_final, r_type);
2312 switch (r_type)
2313 {
2314 case elfcpp::R_386_TLS_GD: // Global-dynamic
2315 if (optimized_type == tls::TLSOPT_NONE)
2316 {
2317 // Create a pair of GOT entries for the module index and
2318 // dtv-relative offset.
2319 Output_data_got<32, false>* got
2320 = target->got_section(symtab, layout);
2321 got->add_global_pair_with_rel(gsym, GOT_TYPE_TLS_PAIR,
2322 target->rel_dyn_section(layout),
2323 elfcpp::R_386_TLS_DTPMOD32,
2324 elfcpp::R_386_TLS_DTPOFF32);
2325 }
2326 else if (optimized_type == tls::TLSOPT_TO_IE)
2327 {
2328 // Create a GOT entry for the tp-relative offset.
2329 Output_data_got<32, false>* got
2330 = target->got_section(symtab, layout);
2331 got->add_global_with_rel(gsym, GOT_TYPE_TLS_NOFFSET,
2332 target->rel_dyn_section(layout),
2333 elfcpp::R_386_TLS_TPOFF);
2334 }
2335 else if (optimized_type != tls::TLSOPT_TO_LE)
2336 unsupported_reloc_global(object, r_type, gsym);
2337 break;
2338
2339 case elfcpp::R_386_TLS_GOTDESC: // Global-dynamic (~oliva url)
2340 target->define_tls_base_symbol(symtab, layout);
2341 if (optimized_type == tls::TLSOPT_NONE)
2342 {
2343 // Create a double GOT entry with an R_386_TLS_DESC
2344 // reloc. The R_386_TLS_DESC reloc is resolved
2345 // lazily, so the GOT entry needs to be in an area in
2346 // .got.plt, not .got. Call got_section to make sure
2347 // the section has been created.
2348 target->got_section(symtab, layout);
2349 Output_data_got<32, false>* got = target->got_tlsdesc_section();
2350 Reloc_section* rt = target->rel_tls_desc_section(layout);
2351 got->add_global_pair_with_rel(gsym, GOT_TYPE_TLS_DESC, rt,
2352 elfcpp::R_386_TLS_DESC, 0);
2353 }
2354 else if (optimized_type == tls::TLSOPT_TO_IE)
2355 {
2356 // Create a GOT entry for the tp-relative offset.
2357 Output_data_got<32, false>* got
2358 = target->got_section(symtab, layout);
2359 got->add_global_with_rel(gsym, GOT_TYPE_TLS_NOFFSET,
2360 target->rel_dyn_section(layout),
2361 elfcpp::R_386_TLS_TPOFF);
2362 }
2363 else if (optimized_type != tls::TLSOPT_TO_LE)
2364 unsupported_reloc_global(object, r_type, gsym);
2365 break;
2366
2367 case elfcpp::R_386_TLS_DESC_CALL:
2368 break;
2369
2370 case elfcpp::R_386_TLS_LDM: // Local-dynamic
2371 if (optimized_type == tls::TLSOPT_NONE)
2372 {
2373 // Create a GOT entry for the module index.
2374 target->got_mod_index_entry(symtab, layout, object);
2375 }
2376 else if (optimized_type != tls::TLSOPT_TO_LE)
2377 unsupported_reloc_global(object, r_type, gsym);
2378 break;
2379
2380 case elfcpp::R_386_TLS_LDO_32: // Alternate local-dynamic
2381 break;
2382
2383 case elfcpp::R_386_TLS_IE: // Initial-exec
2384 case elfcpp::R_386_TLS_IE_32:
2385 case elfcpp::R_386_TLS_GOTIE:
2386 layout->set_has_static_tls();
2387 if (optimized_type == tls::TLSOPT_NONE)
2388 {
2389 // For the R_386_TLS_IE relocation, we need to create a
2390 // dynamic relocation when building a shared library.
2391 if (r_type == elfcpp::R_386_TLS_IE
2392 && parameters->options().shared())
2393 {
2394 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
2395 rel_dyn->add_global_relative(gsym, elfcpp::R_386_RELATIVE,
2396 output_section, object,
2397 data_shndx,
2398 reloc.get_r_offset());
2399 }
2400 // Create a GOT entry for the tp-relative offset.
2401 Output_data_got<32, false>* got
2402 = target->got_section(symtab, layout);
2403 unsigned int dyn_r_type = (r_type == elfcpp::R_386_TLS_IE_32
2404 ? elfcpp::R_386_TLS_TPOFF32
2405 : elfcpp::R_386_TLS_TPOFF);
2406 unsigned int got_type = (r_type == elfcpp::R_386_TLS_IE_32
2407 ? GOT_TYPE_TLS_OFFSET
2408 : GOT_TYPE_TLS_NOFFSET);
2409 got->add_global_with_rel(gsym, got_type,
2410 target->rel_dyn_section(layout),
2411 dyn_r_type);
2412 }
2413 else if (optimized_type != tls::TLSOPT_TO_LE)
2414 unsupported_reloc_global(object, r_type, gsym);
2415 break;
2416
2417 case elfcpp::R_386_TLS_LE: // Local-exec
2418 case elfcpp::R_386_TLS_LE_32:
2419 layout->set_has_static_tls();
2420 if (parameters->options().shared())
2421 {
2422 // We need to create a dynamic relocation.
2423 unsigned int dyn_r_type = (r_type == elfcpp::R_386_TLS_LE_32
2424 ? elfcpp::R_386_TLS_TPOFF32
2425 : elfcpp::R_386_TLS_TPOFF);
2426 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
2427 rel_dyn->add_global(gsym, dyn_r_type, output_section, object,
2428 data_shndx, reloc.get_r_offset());
2429 }
2430 break;
2431
2432 default:
2433 gold_unreachable();
2434 }
2435 }
2436 break;
2437
2438 case elfcpp::R_386_32PLT:
2439 case elfcpp::R_386_TLS_GD_32:
2440 case elfcpp::R_386_TLS_GD_PUSH:
2441 case elfcpp::R_386_TLS_GD_CALL:
2442 case elfcpp::R_386_TLS_GD_POP:
2443 case elfcpp::R_386_TLS_LDM_32:
2444 case elfcpp::R_386_TLS_LDM_PUSH:
2445 case elfcpp::R_386_TLS_LDM_CALL:
2446 case elfcpp::R_386_TLS_LDM_POP:
2447 case elfcpp::R_386_USED_BY_INTEL_200:
2448 default:
2449 unsupported_reloc_global(object, r_type, gsym);
2450 break;
2451 }
2452 }
2453
2454 // Process relocations for gc.
2455
2456 void
2457 Target_i386::gc_process_relocs(Symbol_table* symtab,
2458 Layout* layout,
2459 Sized_relobj_file<32, false>* object,
2460 unsigned int data_shndx,
2461 unsigned int,
2462 const unsigned char* prelocs,
2463 size_t reloc_count,
2464 Output_section* output_section,
2465 bool needs_special_offset_handling,
2466 size_t local_symbol_count,
2467 const unsigned char* plocal_symbols)
2468 {
2469 gold::gc_process_relocs<32, false, Target_i386, elfcpp::SHT_REL,
2470 Target_i386::Scan,
2471 Target_i386::Relocatable_size_for_reloc>(
2472 symtab,
2473 layout,
2474 this,
2475 object,
2476 data_shndx,
2477 prelocs,
2478 reloc_count,
2479 output_section,
2480 needs_special_offset_handling,
2481 local_symbol_count,
2482 plocal_symbols);
2483 }
2484
2485 // Scan relocations for a section.
2486
2487 void
2488 Target_i386::scan_relocs(Symbol_table* symtab,
2489 Layout* layout,
2490 Sized_relobj_file<32, false>* object,
2491 unsigned int data_shndx,
2492 unsigned int sh_type,
2493 const unsigned char* prelocs,
2494 size_t reloc_count,
2495 Output_section* output_section,
2496 bool needs_special_offset_handling,
2497 size_t local_symbol_count,
2498 const unsigned char* plocal_symbols)
2499 {
2500 if (sh_type == elfcpp::SHT_RELA)
2501 {
2502 gold_error(_("%s: unsupported RELA reloc section"),
2503 object->name().c_str());
2504 return;
2505 }
2506
2507 gold::scan_relocs<32, false, Target_i386, elfcpp::SHT_REL,
2508 Target_i386::Scan>(
2509 symtab,
2510 layout,
2511 this,
2512 object,
2513 data_shndx,
2514 prelocs,
2515 reloc_count,
2516 output_section,
2517 needs_special_offset_handling,
2518 local_symbol_count,
2519 plocal_symbols);
2520 }
2521
2522 // Finalize the sections.
2523
2524 void
2525 Target_i386::do_finalize_sections(
2526 Layout* layout,
2527 const Input_objects*,
2528 Symbol_table* symtab)
2529 {
2530 const Reloc_section* rel_plt = (this->plt_ == NULL
2531 ? NULL
2532 : this->plt_->rel_plt());
2533 layout->add_target_dynamic_tags(true, this->got_plt_, rel_plt,
2534 this->rel_dyn_, true, false);
2535
2536 // Emit any relocs we saved in an attempt to avoid generating COPY
2537 // relocs.
2538 if (this->copy_relocs_.any_saved_relocs())
2539 this->copy_relocs_.emit(this->rel_dyn_section(layout));
2540
2541 // Set the size of the _GLOBAL_OFFSET_TABLE_ symbol to the size of
2542 // the .got.plt section.
2543 Symbol* sym = this->global_offset_table_;
2544 if (sym != NULL)
2545 {
2546 uint32_t data_size = this->got_plt_->current_data_size();
2547 symtab->get_sized_symbol<32>(sym)->set_symsize(data_size);
2548 }
2549
2550 if (parameters->doing_static_link()
2551 && (this->plt_ == NULL || !this->plt_->has_irelative_section()))
2552 {
2553 // If linking statically, make sure that the __rel_iplt symbols
2554 // were defined if necessary, even if we didn't create a PLT.
2555 static const Define_symbol_in_segment syms[] =
2556 {
2557 {
2558 "__rel_iplt_start", // name
2559 elfcpp::PT_LOAD, // segment_type
2560 elfcpp::PF_W, // segment_flags_set
2561 elfcpp::PF(0), // segment_flags_clear
2562 0, // value
2563 0, // size
2564 elfcpp::STT_NOTYPE, // type
2565 elfcpp::STB_GLOBAL, // binding
2566 elfcpp::STV_HIDDEN, // visibility
2567 0, // nonvis
2568 Symbol::SEGMENT_START, // offset_from_base
2569 true // only_if_ref
2570 },
2571 {
2572 "__rel_iplt_end", // name
2573 elfcpp::PT_LOAD, // segment_type
2574 elfcpp::PF_W, // segment_flags_set
2575 elfcpp::PF(0), // segment_flags_clear
2576 0, // value
2577 0, // size
2578 elfcpp::STT_NOTYPE, // type
2579 elfcpp::STB_GLOBAL, // binding
2580 elfcpp::STV_HIDDEN, // visibility
2581 0, // nonvis
2582 Symbol::SEGMENT_START, // offset_from_base
2583 true // only_if_ref
2584 }
2585 };
2586
2587 symtab->define_symbols(layout, 2, syms,
2588 layout->script_options()->saw_sections_clause());
2589 }
2590 }
2591
2592 // Return whether a direct absolute static relocation needs to be applied.
2593 // In cases where Scan::local() or Scan::global() has created
2594 // a dynamic relocation other than R_386_RELATIVE, the addend
2595 // of the relocation is carried in the data, and we must not
2596 // apply the static relocation.
2597
2598 inline bool
2599 Target_i386::Relocate::should_apply_static_reloc(const Sized_symbol<32>* gsym,
2600 unsigned int r_type,
2601 bool is_32bit,
2602 Output_section* output_section)
2603 {
2604 // If the output section is not allocated, then we didn't call
2605 // scan_relocs, we didn't create a dynamic reloc, and we must apply
2606 // the reloc here.
2607 if ((output_section->flags() & elfcpp::SHF_ALLOC) == 0)
2608 return true;
2609
2610 int ref_flags = Scan::get_reference_flags(r_type);
2611
2612 // For local symbols, we will have created a non-RELATIVE dynamic
2613 // relocation only if (a) the output is position independent,
2614 // (b) the relocation is absolute (not pc- or segment-relative), and
2615 // (c) the relocation is not 32 bits wide.
2616 if (gsym == NULL)
2617 return !(parameters->options().output_is_position_independent()
2618 && (ref_flags & Symbol::ABSOLUTE_REF)
2619 && !is_32bit);
2620
2621 // For global symbols, we use the same helper routines used in the
2622 // scan pass. If we did not create a dynamic relocation, or if we
2623 // created a RELATIVE dynamic relocation, we should apply the static
2624 // relocation.
2625 bool has_dyn = gsym->needs_dynamic_reloc(ref_flags);
2626 bool is_rel = (ref_flags & Symbol::ABSOLUTE_REF)
2627 && gsym->can_use_relative_reloc(ref_flags
2628 & Symbol::FUNCTION_CALL);
2629 return !has_dyn || is_rel;
2630 }
2631
2632 // Perform a relocation.
2633
2634 inline bool
2635 Target_i386::Relocate::relocate(const Relocate_info<32, false>* relinfo,
2636 Target_i386* target,
2637 Output_section* output_section,
2638 size_t relnum,
2639 const elfcpp::Rel<32, false>& rel,
2640 unsigned int r_type,
2641 const Sized_symbol<32>* gsym,
2642 const Symbol_value<32>* psymval,
2643 unsigned char* view,
2644 elfcpp::Elf_types<32>::Elf_Addr address,
2645 section_size_type view_size)
2646 {
2647 if (this->skip_call_tls_get_addr_)
2648 {
2649 if ((r_type != elfcpp::R_386_PLT32
2650 && r_type != elfcpp::R_386_PC32)
2651 || gsym == NULL
2652 || strcmp(gsym->name(), "___tls_get_addr") != 0)
2653 gold_error_at_location(relinfo, relnum, rel.get_r_offset(),
2654 _("missing expected TLS relocation"));
2655 else
2656 {
2657 this->skip_call_tls_get_addr_ = false;
2658 return false;
2659 }
2660 }
2661
2662 if (view == NULL)
2663 return true;
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 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 virtual std::string
3940 do_code_fill(section_size_type length) const;
3941
3942 private:
3943 static const Target::Target_info i386_nacl_info;
3944 };
3945
3946 const Target::Target_info Target_i386_nacl::i386_nacl_info =
3947 {
3948 32, // size
3949 false, // is_big_endian
3950 elfcpp::EM_386, // machine_code
3951 false, // has_make_symbol
3952 false, // has_resolve
3953 true, // has_code_fill
3954 true, // is_default_stack_executable
3955 true, // can_icf_inline_merge_sections
3956 '\0', // wrap_char
3957 "/lib/ld-nacl-x86-32.so.1", // dynamic_linker
3958 0x20000, // default_text_segment_address
3959 0x10000, // abi_pagesize (overridable by -z max-page-size)
3960 0x10000, // common_pagesize (overridable by -z common-page-size)
3961 true, // isolate_execinstr
3962 0x10000000, // rosegment_gap
3963 elfcpp::SHN_UNDEF, // small_common_shndx
3964 elfcpp::SHN_UNDEF, // large_common_shndx
3965 0, // small_common_section_flags
3966 0, // large_common_section_flags
3967 NULL, // attributes_section
3968 NULL, // attributes_vendor
3969 "_start" // entry_symbol_name
3970 };
3971
3972 #define NACLMASK 0xe0 // 32-byte alignment mask
3973
3974 const unsigned char
3975 Output_data_plt_i386_nacl_exec::first_plt_entry[plt_entry_size] =
3976 {
3977 0xff, 0x35, // pushl contents of memory address
3978 0, 0, 0, 0, // replaced with address of .got + 4
3979 0x8b, 0x0d, // movl contents of address, %ecx
3980 0, 0, 0, 0, // replaced with address of .got + 8
3981 0x83, 0xe1, NACLMASK, // andl $NACLMASK, %ecx
3982 0xff, 0xe1, // jmp *%ecx
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, 0x90, // nops
3987 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, // nops
3988 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, // nops
3989 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, // nops
3990 0x90, 0x90, 0x90, 0x90, 0x90
3991 };
3992
3993 void
3994 Output_data_plt_i386_nacl_exec::do_fill_first_plt_entry(
3995 unsigned char* pov,
3996 elfcpp::Elf_types<32>::Elf_Addr got_address)
3997 {
3998 memcpy(pov, first_plt_entry, plt_entry_size);
3999 elfcpp::Swap_unaligned<32, false>::writeval(pov + 2, got_address + 4);
4000 elfcpp::Swap<32, false>::writeval(pov + 8, got_address + 8);
4001 }
4002
4003 // The first entry in the PLT for a shared object.
4004
4005 const unsigned char
4006 Output_data_plt_i386_nacl_dyn::first_plt_entry[plt_entry_size] =
4007 {
4008 0xff, 0xb3, 4, 0, 0, 0, // pushl 4(%ebx)
4009 0x8b, 0x4b, 0x08, // mov 0x8(%ebx), %ecx
4010 0x83, 0xe1, NACLMASK, // andl $NACLMASK, %ecx
4011 0xff, 0xe1, // jmp *%ecx
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 0x90, 0x90, 0x90, 0x90, 0x90, // nops
4019 0x90, 0x90, 0x90, 0x90, 0x90, // nops
4020 0x90, 0x90, 0x90, 0x90, 0x90, // nops
4021 0x90, 0x90, 0x90, 0x90, 0x90 // nops
4022 };
4023
4024 void
4025 Output_data_plt_i386_nacl_dyn::do_fill_first_plt_entry(
4026 unsigned char* pov,
4027 elfcpp::Elf_types<32>::Elf_Addr)
4028 {
4029 memcpy(pov, first_plt_entry, plt_entry_size);
4030 }
4031
4032 // Subsequent entries in the PLT for an executable.
4033
4034 const unsigned char
4035 Output_data_plt_i386_nacl_exec::plt_entry[plt_entry_size] =
4036 {
4037 0x8b, 0x0d, // movl contents of address, %ecx */
4038 0, 0, 0, 0, // replaced with address of symbol in .got
4039 0x83, 0xe1, NACLMASK, // andl $NACLMASK, %ecx
4040 0xff, 0xe1, // jmp *%ecx
4041
4042 // Pad to the next 32-byte boundary with nop instructions.
4043 0x90,
4044 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
4045 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
4046
4047 // Lazy GOT entries point here (32-byte aligned).
4048 0x68, // pushl immediate
4049 0, 0, 0, 0, // replaced with offset into relocation table
4050 0xe9, // jmp relative
4051 0, 0, 0, 0, // replaced with offset to start of .plt
4052
4053 // Pad to the next 32-byte boundary with nop instructions.
4054 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
4055 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
4056 0x90, 0x90
4057 };
4058
4059 unsigned int
4060 Output_data_plt_i386_nacl_exec::do_fill_plt_entry(
4061 unsigned char* pov,
4062 elfcpp::Elf_types<32>::Elf_Addr got_address,
4063 unsigned int got_offset,
4064 unsigned int plt_offset,
4065 unsigned int plt_rel_offset)
4066 {
4067 memcpy(pov, plt_entry, plt_entry_size);
4068 elfcpp::Swap_unaligned<32, false>::writeval(pov + 2,
4069 got_address + got_offset);
4070 elfcpp::Swap_unaligned<32, false>::writeval(pov + 33, plt_rel_offset);
4071 elfcpp::Swap<32, false>::writeval(pov + 38, - (plt_offset + 38 + 4));
4072 return 32;
4073 }
4074
4075 // Subsequent entries in the PLT for a shared object.
4076
4077 const unsigned char
4078 Output_data_plt_i386_nacl_dyn::plt_entry[plt_entry_size] =
4079 {
4080 0x8b, 0x8b, // movl offset(%ebx), %ecx
4081 0, 0, 0, 0, // replaced with offset of symbol in .got
4082 0x83, 0xe1, 0xe0, // andl $NACLMASK, %ecx
4083 0xff, 0xe1, // jmp *%ecx
4084
4085 // Pad to the next 32-byte boundary with nop instructions.
4086 0x90,
4087 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
4088 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
4089
4090 // Lazy GOT entries point here (32-byte aligned).
4091 0x68, // pushl immediate
4092 0, 0, 0, 0, // replaced with offset into relocation table.
4093 0xe9, // jmp relative
4094 0, 0, 0, 0, // replaced with offset to start of .plt.
4095
4096 // Pad to the next 32-byte boundary with nop instructions.
4097 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
4098 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
4099 0x90, 0x90
4100 };
4101
4102 unsigned int
4103 Output_data_plt_i386_nacl_dyn::do_fill_plt_entry(
4104 unsigned char* pov,
4105 elfcpp::Elf_types<32>::Elf_Addr,
4106 unsigned int got_offset,
4107 unsigned int plt_offset,
4108 unsigned int plt_rel_offset)
4109 {
4110 memcpy(pov, plt_entry, plt_entry_size);
4111 elfcpp::Swap_unaligned<32, false>::writeval(pov + 2, got_offset);
4112 elfcpp::Swap_unaligned<32, false>::writeval(pov + 33, plt_rel_offset);
4113 elfcpp::Swap<32, false>::writeval(pov + 38, - (plt_offset + 38 + 4));
4114 return 32;
4115 }
4116
4117 const unsigned char
4118 Output_data_plt_i386_nacl::plt_eh_frame_fde[plt_eh_frame_fde_size] =
4119 {
4120 0, 0, 0, 0, // Replaced with offset to .plt.
4121 0, 0, 0, 0, // Replaced with size of .plt.
4122 0, // Augmentation size.
4123 elfcpp::DW_CFA_def_cfa_offset, 8, // DW_CFA_def_cfa_offset: 8.
4124 elfcpp::DW_CFA_advance_loc + 6, // Advance 6 to __PLT__ + 6.
4125 elfcpp::DW_CFA_def_cfa_offset, 12, // DW_CFA_def_cfa_offset: 12.
4126 elfcpp::DW_CFA_advance_loc + 58, // Advance 58 to __PLT__ + 64.
4127 elfcpp::DW_CFA_def_cfa_expression, // DW_CFA_def_cfa_expression.
4128 13, // Block length.
4129 elfcpp::DW_OP_breg4, 4, // Push %esp + 4.
4130 elfcpp::DW_OP_breg8, 0, // Push %eip.
4131 elfcpp::DW_OP_const1u, 63, // Push 0x3f.
4132 elfcpp::DW_OP_and, // & (%eip & 0x3f).
4133 elfcpp::DW_OP_const1u, 37, // Push 0x25.
4134 elfcpp::DW_OP_ge, // >= ((%eip & 0x3f) >= 0x25)
4135 elfcpp::DW_OP_lit2, // Push 2.
4136 elfcpp::DW_OP_shl, // << (((%eip & 0x3f) >= 0x25) << 2)
4137 elfcpp::DW_OP_plus, // + ((((%eip&0x3f)>=0x25)<<2)+%esp+4
4138 elfcpp::DW_CFA_nop, // Align to 32 bytes.
4139 elfcpp::DW_CFA_nop
4140 };
4141
4142 // Return a string used to fill a code section with nops.
4143 // For NaCl, long NOPs are only valid if they do not cross
4144 // bundle alignment boundaries, so keep it simple with one-byte NOPs.
4145 std::string
4146 Target_i386_nacl::do_code_fill(section_size_type length) const
4147 {
4148 return std::string(length, static_cast<char>(0x90));
4149 }
4150
4151 // The selector for i386-nacl object files.
4152
4153 class Target_selector_i386_nacl
4154 : public Target_selector_nacl<Target_selector_i386, Target_i386_nacl>
4155 {
4156 public:
4157 Target_selector_i386_nacl()
4158 : Target_selector_nacl<Target_selector_i386,
4159 Target_i386_nacl>("x86-32",
4160 "elf32-i386-nacl",
4161 "elf_i386_nacl")
4162 { }
4163 };
4164
4165 Target_selector_i386_nacl target_selector_i386;
4166
4167 } // End anonymous namespace.
This page took 0.119135 seconds and 5 git commands to generate.