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