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