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