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