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