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