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