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