gas/testsuite/
[deliverable/binutils-gdb.git] / gold / output.cc
CommitLineData
a2fb1b05
ILT
1// output.cc -- manage the output file for gold
2
3#include "gold.h"
4
5#include <cstdlib>
61ba1cf9
ILT
6#include <cerrno>
7#include <fcntl.h>
8#include <unistd.h>
9#include <sys/mman.h>
75f65a3e 10#include <algorithm>
a2fb1b05
ILT
11
12#include "object.h"
ead1e424
ILT
13#include "symtab.h"
14#include "reloc.h"
a2fb1b05
ILT
15#include "output.h"
16
17namespace gold
18{
19
a3ad94ed
ILT
20// Output_data variables.
21
22bool Output_data::sizes_are_fixed;
23
a2fb1b05
ILT
24// Output_data methods.
25
26Output_data::~Output_data()
27{
28}
29
75f65a3e
ILT
30// Set the address and offset.
31
32void
33Output_data::set_address(uint64_t addr, off_t off)
34{
35 this->address_ = addr;
36 this->offset_ = off;
37
38 // Let the child class know.
39 this->do_set_address(addr, off);
40}
41
42// Return the default alignment for a size--32 or 64.
43
44uint64_t
45Output_data::default_alignment(int size)
46{
47 if (size == 32)
48 return 4;
49 else if (size == 64)
50 return 8;
51 else
a3ad94ed 52 gold_unreachable();
75f65a3e
ILT
53}
54
75f65a3e
ILT
55// Output_section_header methods. This currently assumes that the
56// segment and section lists are complete at construction time.
57
58Output_section_headers::Output_section_headers(
59 int size,
61ba1cf9 60 bool big_endian,
75f65a3e 61 const Layout::Segment_list& segment_list,
a3ad94ed 62 const Layout::Section_list& unattached_section_list,
61ba1cf9 63 const Stringpool* secnamepool)
75f65a3e 64 : size_(size),
61ba1cf9 65 big_endian_(big_endian),
75f65a3e 66 segment_list_(segment_list),
a3ad94ed 67 unattached_section_list_(unattached_section_list),
61ba1cf9 68 secnamepool_(secnamepool)
75f65a3e 69{
61ba1cf9
ILT
70 // Count all the sections. Start with 1 for the null section.
71 off_t count = 1;
75f65a3e
ILT
72 for (Layout::Segment_list::const_iterator p = segment_list.begin();
73 p != segment_list.end();
74 ++p)
ead1e424
ILT
75 if ((*p)->type() == elfcpp::PT_LOAD)
76 count += (*p)->output_section_count();
a3ad94ed 77 count += unattached_section_list.size();
75f65a3e
ILT
78
79 int shdr_size;
80 if (size == 32)
81 shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
82 else if (size == 64)
83 shdr_size = elfcpp::Elf_sizes<64>::shdr_size;
84 else
a3ad94ed 85 gold_unreachable();
75f65a3e
ILT
86
87 this->set_data_size(count * shdr_size);
88}
89
61ba1cf9
ILT
90// Write out the section headers.
91
75f65a3e 92void
61ba1cf9 93Output_section_headers::do_write(Output_file* of)
a2fb1b05 94{
61ba1cf9
ILT
95 if (this->size_ == 32)
96 {
97 if (this->big_endian_)
98 this->do_sized_write<32, true>(of);
99 else
100 this->do_sized_write<32, false>(of);
101 }
102 else if (this->size_ == 64)
103 {
104 if (this->big_endian_)
105 this->do_sized_write<64, true>(of);
106 else
107 this->do_sized_write<64, false>(of);
108 }
109 else
a3ad94ed 110 gold_unreachable();
61ba1cf9
ILT
111}
112
113template<int size, bool big_endian>
114void
115Output_section_headers::do_sized_write(Output_file* of)
116{
117 off_t all_shdrs_size = this->data_size();
118 unsigned char* view = of->get_output_view(this->offset(), all_shdrs_size);
119
120 const int shdr_size = elfcpp::Elf_sizes<size>::shdr_size;
121 unsigned char* v = view;
122
123 {
124 typename elfcpp::Shdr_write<size, big_endian> oshdr(v);
125 oshdr.put_sh_name(0);
126 oshdr.put_sh_type(elfcpp::SHT_NULL);
127 oshdr.put_sh_flags(0);
128 oshdr.put_sh_addr(0);
129 oshdr.put_sh_offset(0);
130 oshdr.put_sh_size(0);
131 oshdr.put_sh_link(0);
132 oshdr.put_sh_info(0);
133 oshdr.put_sh_addralign(0);
134 oshdr.put_sh_entsize(0);
135 }
136
137 v += shdr_size;
138
ead1e424 139 unsigned shndx = 1;
61ba1cf9
ILT
140 for (Layout::Segment_list::const_iterator p = this->segment_list_.begin();
141 p != this->segment_list_.end();
142 ++p)
593f47df 143 v = (*p)->write_section_headers SELECT_SIZE_ENDIAN_NAME(size, big_endian) (
ead1e424
ILT
144 this->secnamepool_, v, &shndx
145 SELECT_SIZE_ENDIAN(size, big_endian));
a3ad94ed
ILT
146 for (Layout::Section_list::const_iterator p =
147 this->unattached_section_list_.begin();
148 p != this->unattached_section_list_.end();
61ba1cf9
ILT
149 ++p)
150 {
a3ad94ed 151 gold_assert(shndx == (*p)->out_shndx());
61ba1cf9
ILT
152 elfcpp::Shdr_write<size, big_endian> oshdr(v);
153 (*p)->write_header(this->secnamepool_, &oshdr);
154 v += shdr_size;
ead1e424 155 ++shndx;
61ba1cf9
ILT
156 }
157
158 of->write_output_view(this->offset(), all_shdrs_size, view);
a2fb1b05
ILT
159}
160
54dc6425
ILT
161// Output_segment_header methods.
162
61ba1cf9
ILT
163Output_segment_headers::Output_segment_headers(
164 int size,
165 bool big_endian,
166 const Layout::Segment_list& segment_list)
167 : size_(size), big_endian_(big_endian), segment_list_(segment_list)
168{
169 int phdr_size;
170 if (size == 32)
171 phdr_size = elfcpp::Elf_sizes<32>::phdr_size;
172 else if (size == 64)
173 phdr_size = elfcpp::Elf_sizes<64>::phdr_size;
174 else
a3ad94ed 175 gold_unreachable();
61ba1cf9
ILT
176
177 this->set_data_size(segment_list.size() * phdr_size);
178}
179
54dc6425 180void
61ba1cf9 181Output_segment_headers::do_write(Output_file* of)
75f65a3e 182{
61ba1cf9
ILT
183 if (this->size_ == 32)
184 {
185 if (this->big_endian_)
186 this->do_sized_write<32, true>(of);
187 else
188 this->do_sized_write<32, false>(of);
189 }
190 else if (this->size_ == 64)
191 {
192 if (this->big_endian_)
193 this->do_sized_write<64, true>(of);
194 else
195 this->do_sized_write<64, false>(of);
196 }
197 else
a3ad94ed 198 gold_unreachable();
61ba1cf9
ILT
199}
200
201template<int size, bool big_endian>
202void
203Output_segment_headers::do_sized_write(Output_file* of)
204{
205 const int phdr_size = elfcpp::Elf_sizes<size>::phdr_size;
206 off_t all_phdrs_size = this->segment_list_.size() * phdr_size;
207 unsigned char* view = of->get_output_view(this->offset(),
208 all_phdrs_size);
209 unsigned char* v = view;
210 for (Layout::Segment_list::const_iterator p = this->segment_list_.begin();
211 p != this->segment_list_.end();
212 ++p)
213 {
214 elfcpp::Phdr_write<size, big_endian> ophdr(v);
215 (*p)->write_header(&ophdr);
216 v += phdr_size;
217 }
218
219 of->write_output_view(this->offset(), all_phdrs_size, view);
75f65a3e
ILT
220}
221
222// Output_file_header methods.
223
224Output_file_header::Output_file_header(int size,
61ba1cf9 225 bool big_endian,
75f65a3e
ILT
226 const General_options& options,
227 const Target* target,
228 const Symbol_table* symtab,
229 const Output_segment_headers* osh)
230 : size_(size),
61ba1cf9 231 big_endian_(big_endian),
75f65a3e
ILT
232 options_(options),
233 target_(target),
234 symtab_(symtab),
61ba1cf9 235 segment_header_(osh),
75f65a3e
ILT
236 section_header_(NULL),
237 shstrtab_(NULL)
238{
61ba1cf9
ILT
239 int ehdr_size;
240 if (size == 32)
241 ehdr_size = elfcpp::Elf_sizes<32>::ehdr_size;
242 else if (size == 64)
243 ehdr_size = elfcpp::Elf_sizes<64>::ehdr_size;
244 else
a3ad94ed 245 gold_unreachable();
61ba1cf9
ILT
246
247 this->set_data_size(ehdr_size);
75f65a3e
ILT
248}
249
250// Set the section table information for a file header.
251
252void
253Output_file_header::set_section_info(const Output_section_headers* shdrs,
254 const Output_section* shstrtab)
255{
256 this->section_header_ = shdrs;
257 this->shstrtab_ = shstrtab;
258}
259
260// Write out the file header.
261
262void
61ba1cf9 263Output_file_header::do_write(Output_file* of)
54dc6425 264{
61ba1cf9
ILT
265 if (this->size_ == 32)
266 {
267 if (this->big_endian_)
268 this->do_sized_write<32, true>(of);
269 else
270 this->do_sized_write<32, false>(of);
271 }
272 else if (this->size_ == 64)
273 {
274 if (this->big_endian_)
275 this->do_sized_write<64, true>(of);
276 else
277 this->do_sized_write<64, false>(of);
278 }
279 else
a3ad94ed 280 gold_unreachable();
61ba1cf9
ILT
281}
282
283// Write out the file header with appropriate size and endianess.
284
285template<int size, bool big_endian>
286void
287Output_file_header::do_sized_write(Output_file* of)
288{
a3ad94ed 289 gold_assert(this->offset() == 0);
61ba1cf9
ILT
290
291 int ehdr_size = elfcpp::Elf_sizes<size>::ehdr_size;
292 unsigned char* view = of->get_output_view(0, ehdr_size);
293 elfcpp::Ehdr_write<size, big_endian> oehdr(view);
294
295 unsigned char e_ident[elfcpp::EI_NIDENT];
296 memset(e_ident, 0, elfcpp::EI_NIDENT);
297 e_ident[elfcpp::EI_MAG0] = elfcpp::ELFMAG0;
298 e_ident[elfcpp::EI_MAG1] = elfcpp::ELFMAG1;
299 e_ident[elfcpp::EI_MAG2] = elfcpp::ELFMAG2;
300 e_ident[elfcpp::EI_MAG3] = elfcpp::ELFMAG3;
301 if (size == 32)
302 e_ident[elfcpp::EI_CLASS] = elfcpp::ELFCLASS32;
303 else if (size == 64)
304 e_ident[elfcpp::EI_CLASS] = elfcpp::ELFCLASS64;
305 else
a3ad94ed 306 gold_unreachable();
61ba1cf9
ILT
307 e_ident[elfcpp::EI_DATA] = (big_endian
308 ? elfcpp::ELFDATA2MSB
309 : elfcpp::ELFDATA2LSB);
310 e_ident[elfcpp::EI_VERSION] = elfcpp::EV_CURRENT;
311 // FIXME: Some targets may need to set EI_OSABI and EI_ABIVERSION.
312 oehdr.put_e_ident(e_ident);
313
314 elfcpp::ET e_type;
315 // FIXME: ET_DYN.
316 if (this->options_.is_relocatable())
317 e_type = elfcpp::ET_REL;
318 else
319 e_type = elfcpp::ET_EXEC;
320 oehdr.put_e_type(e_type);
321
322 oehdr.put_e_machine(this->target_->machine_code());
323 oehdr.put_e_version(elfcpp::EV_CURRENT);
324
ead1e424 325 // FIXME: Need to support -e, and target specific entry symbol.
61ba1cf9
ILT
326 Symbol* sym = this->symtab_->lookup("_start");
327 typename Sized_symbol<size>::Value_type v;
328 if (sym == NULL)
329 v = 0;
330 else
331 {
332 Sized_symbol<size>* ssym;
593f47df 333 ssym = this->symtab_->get_sized_symbol SELECT_SIZE_NAME(size) (
5482377d 334 sym SELECT_SIZE(size));
61ba1cf9
ILT
335 v = ssym->value();
336 }
337 oehdr.put_e_entry(v);
338
339 oehdr.put_e_phoff(this->segment_header_->offset());
340 oehdr.put_e_shoff(this->section_header_->offset());
341
342 // FIXME: The target needs to set the flags.
343 oehdr.put_e_flags(0);
344
345 oehdr.put_e_ehsize(elfcpp::Elf_sizes<size>::ehdr_size);
346 oehdr.put_e_phentsize(elfcpp::Elf_sizes<size>::phdr_size);
347 oehdr.put_e_phnum(this->segment_header_->data_size()
348 / elfcpp::Elf_sizes<size>::phdr_size);
349 oehdr.put_e_shentsize(elfcpp::Elf_sizes<size>::shdr_size);
350 oehdr.put_e_shnum(this->section_header_->data_size()
351 / elfcpp::Elf_sizes<size>::shdr_size);
ead1e424 352 oehdr.put_e_shstrndx(this->shstrtab_->out_shndx());
61ba1cf9
ILT
353
354 of->write_output_view(0, ehdr_size, view);
54dc6425
ILT
355}
356
dbe717ef
ILT
357// Output_data_const methods.
358
359void
a3ad94ed 360Output_data_const::do_write(Output_file* of)
dbe717ef 361{
a3ad94ed
ILT
362 of->write(this->offset(), this->data_.data(), this->data_.size());
363}
364
365// Output_data_const_buffer methods.
366
367void
368Output_data_const_buffer::do_write(Output_file* of)
369{
370 of->write(this->offset(), this->p_, this->data_size());
dbe717ef
ILT
371}
372
373// Output_section_data methods.
374
375unsigned int
376Output_section_data::do_out_shndx() const
377{
a3ad94ed 378 gold_assert(this->output_section_ != NULL);
dbe717ef
ILT
379 return this->output_section_->out_shndx();
380}
381
a3ad94ed
ILT
382// Output_data_strtab methods.
383
384// Set the address. We don't actually care about the address, but we
385// do set our final size.
386
387void
388Output_data_strtab::do_set_address(uint64_t, off_t)
389{
390 this->strtab_->set_string_offsets();
391 this->set_data_size(this->strtab_->get_strtab_size());
392}
393
394// Write out a string table.
395
396void
397Output_data_strtab::do_write(Output_file* of)
398{
399 this->strtab_->write(of, this->offset());
400}
401
c06b7b0b
ILT
402// Output_reloc methods.
403
404// Get the symbol index of a relocation.
405
406template<bool dynamic, int size, bool big_endian>
407unsigned int
408Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::get_symbol_index()
409 const
410{
411 unsigned int index;
412 switch (this->local_sym_index_)
413 {
414 case INVALID_CODE:
a3ad94ed 415 gold_unreachable();
c06b7b0b
ILT
416
417 case GSYM_CODE:
5a6f7e2d 418 if (this->u1_.gsym == NULL)
c06b7b0b
ILT
419 index = 0;
420 else if (dynamic)
5a6f7e2d 421 index = this->u1_.gsym->dynsym_index();
c06b7b0b 422 else
5a6f7e2d 423 index = this->u1_.gsym->symtab_index();
c06b7b0b
ILT
424 break;
425
426 case SECTION_CODE:
427 if (dynamic)
5a6f7e2d 428 index = this->u1_.os->dynsym_index();
c06b7b0b 429 else
5a6f7e2d 430 index = this->u1_.os->symtab_index();
c06b7b0b
ILT
431 break;
432
433 default:
434 if (dynamic)
435 {
436 // FIXME: It seems that some targets may need to generate
437 // dynamic relocations against local symbols for some
438 // reasons. This will have to be addressed at some point.
a3ad94ed 439 gold_unreachable();
c06b7b0b
ILT
440 }
441 else
5a6f7e2d 442 index = this->u1_.relobj->symtab_index(this->local_sym_index_);
c06b7b0b
ILT
443 break;
444 }
a3ad94ed 445 gold_assert(index != -1U);
c06b7b0b
ILT
446 return index;
447}
448
449// Write out the offset and info fields of a Rel or Rela relocation
450// entry.
451
452template<bool dynamic, int size, bool big_endian>
453template<typename Write_rel>
454void
455Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::write_rel(
456 Write_rel* wr) const
457{
a3ad94ed 458 Address address = this->address_;
5a6f7e2d
ILT
459 if (this->shndx_ != INVALID_CODE)
460 {
461 off_t off;
462 Output_section* os = this->u2_.relobj->output_section(this->shndx_,
463 &off);
464 gold_assert(os != NULL);
465 address += os->address() + off;
466 }
467 else if (this->u2_.od != NULL)
468 address += this->u2_.od->address();
a3ad94ed 469 wr->put_r_offset(address);
c06b7b0b
ILT
470 wr->put_r_info(elfcpp::elf_r_info<size>(this->get_symbol_index(),
471 this->type_));
472}
473
474// Write out a Rel relocation.
475
476template<bool dynamic, int size, bool big_endian>
477void
478Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::write(
479 unsigned char* pov) const
480{
481 elfcpp::Rel_write<size, big_endian> orel(pov);
482 this->write_rel(&orel);
483}
484
485// Write out a Rela relocation.
486
487template<bool dynamic, int size, bool big_endian>
488void
489Output_reloc<elfcpp::SHT_RELA, dynamic, size, big_endian>::write(
490 unsigned char* pov) const
491{
492 elfcpp::Rela_write<size, big_endian> orel(pov);
493 this->rel_.write_rel(&orel);
494 orel.put_r_addend(this->addend_);
495}
496
497// Output_data_reloc_base methods.
498
499// Write out relocation data.
500
501template<int sh_type, bool dynamic, int size, bool big_endian>
502void
503Output_data_reloc_base<sh_type, dynamic, size, big_endian>::do_write(
504 Output_file* of)
505{
506 const off_t off = this->offset();
507 const off_t oview_size = this->data_size();
508 unsigned char* const oview = of->get_output_view(off, oview_size);
509
510 unsigned char* pov = oview;
511 for (typename Relocs::const_iterator p = this->relocs_.begin();
512 p != this->relocs_.end();
513 ++p)
514 {
515 p->write(pov);
516 pov += reloc_size;
517 }
518
a3ad94ed 519 gold_assert(pov - oview == oview_size);
c06b7b0b
ILT
520
521 of->write_output_view(off, oview_size, oview);
522
523 // We no longer need the relocation entries.
524 this->relocs_.clear();
525}
526
dbe717ef 527// Output_data_got::Got_entry methods.
ead1e424
ILT
528
529// Write out the entry.
530
531template<int size, bool big_endian>
532void
a3ad94ed
ILT
533Output_data_got<size, big_endian>::Got_entry::write(
534 const General_options* options,
535 unsigned char* pov) const
ead1e424
ILT
536{
537 Valtype val = 0;
538
539 switch (this->local_sym_index_)
540 {
541 case GSYM_CODE:
542 {
543 Symbol* gsym = this->u_.gsym;
544
545 // If the symbol is resolved locally, we need to write out its
546 // value. Otherwise we just write zero. The target code is
547 // responsible for creating a relocation entry to fill in the
548 // value at runtime.
a3ad94ed 549 if (gsym->final_value_is_known(options))
ead1e424
ILT
550 {
551 Sized_symbol<size>* sgsym;
552 // This cast is a bit ugly. We don't want to put a
553 // virtual method in Symbol, because we want Symbol to be
554 // as small as possible.
555 sgsym = static_cast<Sized_symbol<size>*>(gsym);
556 val = sgsym->value();
557 }
558 }
559 break;
560
561 case CONSTANT_CODE:
562 val = this->u_.constant;
563 break;
564
565 default:
a3ad94ed 566 gold_unreachable();
ead1e424
ILT
567 }
568
a3ad94ed 569 elfcpp::Swap<size, big_endian>::writeval(pov, val);
ead1e424
ILT
570}
571
dbe717ef 572// Output_data_got methods.
ead1e424 573
dbe717ef
ILT
574// Add an entry for a global symbol to the GOT. This returns true if
575// this is a new GOT entry, false if the symbol already had a GOT
576// entry.
577
578template<int size, bool big_endian>
579bool
580Output_data_got<size, big_endian>::add_global(Symbol* gsym)
ead1e424 581{
dbe717ef
ILT
582 if (gsym->has_got_offset())
583 return false;
ead1e424 584
dbe717ef
ILT
585 this->entries_.push_back(Got_entry(gsym));
586 this->set_got_size();
587 gsym->set_got_offset(this->last_got_offset());
588 return true;
589}
ead1e424
ILT
590
591// Write out the GOT.
592
593template<int size, bool big_endian>
594void
dbe717ef 595Output_data_got<size, big_endian>::do_write(Output_file* of)
ead1e424
ILT
596{
597 const int add = size / 8;
598
599 const off_t off = this->offset();
c06b7b0b 600 const off_t oview_size = this->data_size();
ead1e424
ILT
601 unsigned char* const oview = of->get_output_view(off, oview_size);
602
603 unsigned char* pov = oview;
604 for (typename Got_entries::const_iterator p = this->entries_.begin();
605 p != this->entries_.end();
606 ++p)
607 {
a3ad94ed 608 p->write(this->options_, pov);
ead1e424
ILT
609 pov += add;
610 }
611
a3ad94ed 612 gold_assert(pov - oview == oview_size);
c06b7b0b 613
ead1e424
ILT
614 of->write_output_view(off, oview_size, oview);
615
616 // We no longer need the GOT entries.
617 this->entries_.clear();
618}
619
a3ad94ed
ILT
620// Output_data_dynamic::Dynamic_entry methods.
621
622// Write out the entry.
623
624template<int size, bool big_endian>
625void
626Output_data_dynamic::Dynamic_entry::write(
627 unsigned char* pov,
1ddbd1e6
ILT
628 const Stringpool* pool
629 ACCEPT_SIZE_ENDIAN) const
a3ad94ed
ILT
630{
631 typename elfcpp::Elf_types<size>::Elf_WXword val;
632 switch (this->classification_)
633 {
634 case DYNAMIC_NUMBER:
635 val = this->u_.val;
636 break;
637
638 case DYNAMIC_SECTION_ADDRESS:
639 val = this->u_.os->address();
640 break;
641
642 case DYNAMIC_SECTION_SIZE:
643 val = this->u_.os->data_size();
644 break;
645
646 case DYNAMIC_SYMBOL:
647 {
648 Sized_symbol<size>* s = static_cast<Sized_symbol<size>*>(this->u_.sym);
649 val = s->value();
650 }
651 break;
652
653 case DYNAMIC_STRING:
654 val = pool->get_offset(this->u_.str);
655 break;
656
657 default:
658 gold_unreachable();
659 }
660
661 elfcpp::Dyn_write<size, big_endian> dw(pov);
662 dw.put_d_tag(this->tag_);
663 dw.put_d_val(val);
664}
665
666// Output_data_dynamic methods.
667
668// Set the final data size.
669
670void
671Output_data_dynamic::do_set_address(uint64_t, off_t)
672{
673 // Add the terminating entry.
674 this->add_constant(elfcpp::DT_NULL, 0);
675
676 int dyn_size;
677 if (this->target_->get_size() == 32)
678 dyn_size = elfcpp::Elf_sizes<32>::dyn_size;
679 else if (this->target_->get_size() == 64)
680 dyn_size = elfcpp::Elf_sizes<64>::dyn_size;
681 else
682 gold_unreachable();
683 this->set_data_size(this->entries_.size() * dyn_size);
684}
685
686// Write out the dynamic entries.
687
688void
689Output_data_dynamic::do_write(Output_file* of)
690{
691 if (this->target_->get_size() == 32)
692 {
693 if (this->target_->is_big_endian())
694 this->sized_write<32, true>(of);
695 else
696 this->sized_write<32, false>(of);
697 }
698 else if (this->target_->get_size() == 64)
699 {
700 if (this->target_->is_big_endian())
701 this->sized_write<64, true>(of);
702 else
703 this->sized_write<64, false>(of);
704 }
705 else
706 gold_unreachable();
707}
708
709template<int size, bool big_endian>
710void
711Output_data_dynamic::sized_write(Output_file* of)
712{
713 const int dyn_size = elfcpp::Elf_sizes<size>::dyn_size;
714
715 const off_t offset = this->offset();
716 const off_t oview_size = this->data_size();
717 unsigned char* const oview = of->get_output_view(offset, oview_size);
718
719 unsigned char* pov = oview;
720 for (typename Dynamic_entries::const_iterator p = this->entries_.begin();
721 p != this->entries_.end();
722 ++p)
723 {
1ddbd1e6
ILT
724 p->write SELECT_SIZE_ENDIAN_NAME(size, big_endian)(
725 pov, this->pool_ SELECT_SIZE_ENDIAN(size, big_endian));
a3ad94ed
ILT
726 pov += dyn_size;
727 }
728
729 gold_assert(pov - oview == oview_size);
730
731 of->write_output_view(offset, oview_size, oview);
732
733 // We no longer need the dynamic entries.
734 this->entries_.clear();
735}
736
ead1e424
ILT
737// Output_section::Input_section methods.
738
739// Return the data size. For an input section we store the size here.
740// For an Output_section_data, we have to ask it for the size.
741
742off_t
743Output_section::Input_section::data_size() const
744{
745 if (this->is_input_section())
746 return this->data_size_;
747 else
748 return this->u_.posd->data_size();
749}
750
751// Set the address and file offset.
752
753void
754Output_section::Input_section::set_address(uint64_t addr, off_t off,
755 off_t secoff)
756{
757 if (this->is_input_section())
758 this->u_.object->set_section_offset(this->shndx_, off - secoff);
759 else
760 this->u_.posd->set_address(addr, off);
761}
762
763// Write out the data. We don't have to do anything for an input
764// section--they are handled via Object::relocate--but this is where
765// we write out the data for an Output_section_data.
766
767void
768Output_section::Input_section::write(Output_file* of)
769{
770 if (!this->is_input_section())
771 this->u_.posd->write(of);
772}
773
a2fb1b05
ILT
774// Output_section methods.
775
776// Construct an Output_section. NAME will point into a Stringpool.
777
778Output_section::Output_section(const char* name, elfcpp::Elf_Word type,
ead1e424 779 elfcpp::Elf_Xword flags, bool may_add_data)
a2fb1b05 780 : name_(name),
a2fb1b05
ILT
781 addralign_(0),
782 entsize_(0),
a2fb1b05
ILT
783 link_(0),
784 info_(0),
785 type_(type),
61ba1cf9 786 flags_(flags),
ead1e424 787 out_shndx_(0),
c06b7b0b
ILT
788 symtab_index_(0),
789 dynsym_index_(0),
ead1e424
ILT
790 input_sections_(),
791 first_input_offset_(0),
a3ad94ed
ILT
792 may_add_data_(may_add_data),
793 needs_symtab_index_(false),
794 needs_dynsym_index_(false)
a2fb1b05
ILT
795{
796}
797
54dc6425
ILT
798Output_section::~Output_section()
799{
800}
801
ead1e424
ILT
802// Add the input section SHNDX, with header SHDR, named SECNAME, in
803// OBJECT, to the Output_section. Return the offset of the input
804// section within the output section. We don't always keep track of
a2fb1b05
ILT
805// input sections for an Output_section. Instead, each Object keeps
806// track of the Output_section for each of its input sections.
807
808template<int size, bool big_endian>
809off_t
f6ce93d6 810Output_section::add_input_section(Relobj* object, unsigned int shndx,
ead1e424 811 const char* secname,
a2fb1b05
ILT
812 const elfcpp::Shdr<size, big_endian>& shdr)
813{
a3ad94ed 814 gold_assert(this->may_add_data_);
ead1e424 815
a2fb1b05
ILT
816 elfcpp::Elf_Xword addralign = shdr.get_sh_addralign();
817 if ((addralign & (addralign - 1)) != 0)
818 {
819 fprintf(stderr, _("%s: %s: invalid alignment %lu for section \"%s\"\n"),
820 program_name, object->name().c_str(),
821 static_cast<unsigned long>(addralign), secname);
822 gold_exit(false);
823 }
a2fb1b05
ILT
824
825 if (addralign > this->addralign_)
826 this->addralign_ = addralign;
827
75f65a3e 828 off_t ssize = this->data_size();
ead1e424
ILT
829 ssize = align_address(ssize, addralign);
830 this->set_data_size(ssize + shdr.get_sh_size());
a2fb1b05 831
ead1e424
ILT
832 // We need to keep track of this section if we are already keeping
833 // track of sections, or if we are relaxing. FIXME: Add test for
834 // relaxing.
835 if (! this->input_sections_.empty())
836 this->input_sections_.push_back(Input_section(object, shndx,
837 shdr.get_sh_size(),
838 addralign));
54dc6425 839
61ba1cf9
ILT
840 return ssize;
841}
842
ead1e424
ILT
843// Add arbitrary data to an output section.
844
845void
846Output_section::add_output_section_data(Output_section_data* posd)
847{
a3ad94ed 848 gold_assert(this->may_add_data_);
c06b7b0b 849
ead1e424
ILT
850 if (this->input_sections_.empty())
851 this->first_input_offset_ = this->data_size();
c06b7b0b 852
ead1e424 853 this->input_sections_.push_back(Input_section(posd));
c06b7b0b 854
ead1e424
ILT
855 uint64_t addralign = posd->addralign();
856 if (addralign > this->addralign_)
857 this->addralign_ = addralign;
c06b7b0b 858
ead1e424
ILT
859 posd->set_output_section(this);
860}
861
862// Set the address of an Output_section. This is where we handle
863// setting the addresses of any Output_section_data objects.
864
865void
866Output_section::do_set_address(uint64_t address, off_t startoff)
867{
868 if (this->input_sections_.empty())
869 return;
870
871 off_t off = startoff + this->first_input_offset_;
872 for (Input_section_list::iterator p = this->input_sections_.begin();
873 p != this->input_sections_.end();
874 ++p)
875 {
876 off = align_address(off, p->addralign());
877 p->set_address(address + (off - startoff), off, startoff);
878 off += p->data_size();
879 }
880
881 this->set_data_size(off - startoff);
882}
883
61ba1cf9
ILT
884// Write the section header to *OSHDR.
885
886template<int size, bool big_endian>
887void
888Output_section::write_header(const Stringpool* secnamepool,
889 elfcpp::Shdr_write<size, big_endian>* oshdr) const
890{
891 oshdr->put_sh_name(secnamepool->get_offset(this->name_));
892 oshdr->put_sh_type(this->type_);
893 oshdr->put_sh_flags(this->flags_);
894 oshdr->put_sh_addr(this->address());
895 oshdr->put_sh_offset(this->offset());
896 oshdr->put_sh_size(this->data_size());
897 oshdr->put_sh_link(this->link_);
898 oshdr->put_sh_info(this->info_);
899 oshdr->put_sh_addralign(this->addralign_);
900 oshdr->put_sh_entsize(this->entsize_);
a2fb1b05
ILT
901}
902
ead1e424
ILT
903// Write out the data. For input sections the data is written out by
904// Object::relocate, but we have to handle Output_section_data objects
905// here.
906
907void
908Output_section::do_write(Output_file* of)
909{
910 for (Input_section_list::iterator p = this->input_sections_.begin();
911 p != this->input_sections_.end();
912 ++p)
913 p->write(of);
914}
915
a2fb1b05
ILT
916// Output segment methods.
917
918Output_segment::Output_segment(elfcpp::Elf_Word type, elfcpp::Elf_Word flags)
54dc6425 919 : output_data_(),
75f65a3e 920 output_bss_(),
a2fb1b05
ILT
921 vaddr_(0),
922 paddr_(0),
923 memsz_(0),
924 align_(0),
925 offset_(0),
926 filesz_(0),
927 type_(type),
ead1e424
ILT
928 flags_(flags),
929 is_align_known_(false)
a2fb1b05
ILT
930{
931}
932
933// Add an Output_section to an Output_segment.
934
935void
75f65a3e 936Output_segment::add_output_section(Output_section* os,
dbe717ef
ILT
937 elfcpp::Elf_Word seg_flags,
938 bool front)
a2fb1b05 939{
a3ad94ed
ILT
940 gold_assert((os->flags() & elfcpp::SHF_ALLOC) != 0);
941 gold_assert(!this->is_align_known_);
75f65a3e 942
ead1e424 943 // Update the segment flags.
75f65a3e 944 this->flags_ |= seg_flags;
75f65a3e
ILT
945
946 Output_segment::Output_data_list* pdl;
947 if (os->type() == elfcpp::SHT_NOBITS)
948 pdl = &this->output_bss_;
949 else
950 pdl = &this->output_data_;
54dc6425 951
a2fb1b05
ILT
952 // So that PT_NOTE segments will work correctly, we need to ensure
953 // that all SHT_NOTE sections are adjacent. This will normally
954 // happen automatically, because all the SHT_NOTE input sections
955 // will wind up in the same output section. However, it is possible
956 // for multiple SHT_NOTE input sections to have different section
957 // flags, and thus be in different output sections, but for the
958 // different section flags to map into the same segment flags and
959 // thus the same output segment.
54dc6425
ILT
960
961 // Note that while there may be many input sections in an output
962 // section, there are normally only a few output sections in an
963 // output segment. This loop is expected to be fast.
964
61ba1cf9 965 if (os->type() == elfcpp::SHT_NOTE && !pdl->empty())
a2fb1b05 966 {
a3ad94ed 967 Output_segment::Output_data_list::iterator p = pdl->end();
75f65a3e 968 do
54dc6425 969 {
75f65a3e 970 --p;
54dc6425
ILT
971 if ((*p)->is_section_type(elfcpp::SHT_NOTE))
972 {
dbe717ef 973 // We don't worry about the FRONT parameter.
54dc6425 974 ++p;
75f65a3e 975 pdl->insert(p, os);
54dc6425
ILT
976 return;
977 }
978 }
75f65a3e 979 while (p != pdl->begin());
54dc6425
ILT
980 }
981
982 // Similarly, so that PT_TLS segments will work, we need to group
75f65a3e
ILT
983 // SHF_TLS sections. An SHF_TLS/SHT_NOBITS section is a special
984 // case: we group the SHF_TLS/SHT_NOBITS sections right after the
985 // SHF_TLS/SHT_PROGBITS sections. This lets us set up PT_TLS
986 // correctly.
61ba1cf9 987 if ((os->flags() & elfcpp::SHF_TLS) != 0 && !this->output_data_.empty())
54dc6425 988 {
75f65a3e
ILT
989 pdl = &this->output_data_;
990 bool nobits = os->type() == elfcpp::SHT_NOBITS;
ead1e424 991 bool sawtls = false;
a3ad94ed 992 Output_segment::Output_data_list::iterator p = pdl->end();
75f65a3e 993 do
a2fb1b05 994 {
75f65a3e 995 --p;
ead1e424
ILT
996 bool insert;
997 if ((*p)->is_section_flag_set(elfcpp::SHF_TLS))
998 {
999 sawtls = true;
1000 // Put a NOBITS section after the first TLS section.
1001 // But a PROGBITS section after the first TLS/PROGBITS
1002 // section.
1003 insert = nobits || !(*p)->is_section_type(elfcpp::SHT_NOBITS);
1004 }
1005 else
1006 {
1007 // If we've gone past the TLS sections, but we've seen a
1008 // TLS section, then we need to insert this section now.
1009 insert = sawtls;
1010 }
1011
1012 if (insert)
a2fb1b05 1013 {
dbe717ef 1014 // We don't worry about the FRONT parameter.
a2fb1b05 1015 ++p;
75f65a3e 1016 pdl->insert(p, os);
a2fb1b05
ILT
1017 return;
1018 }
1019 }
75f65a3e 1020 while (p != pdl->begin());
ead1e424 1021
dbe717ef
ILT
1022 // There are no TLS sections yet; put this one at the requested
1023 // location in the section list.
a2fb1b05
ILT
1024 }
1025
dbe717ef
ILT
1026 if (front)
1027 pdl->push_front(os);
1028 else
1029 pdl->push_back(os);
75f65a3e
ILT
1030}
1031
1032// Add an Output_data (which is not an Output_section) to the start of
1033// a segment.
1034
1035void
1036Output_segment::add_initial_output_data(Output_data* od)
1037{
a3ad94ed 1038 gold_assert(!this->is_align_known_);
75f65a3e
ILT
1039 this->output_data_.push_front(od);
1040}
1041
1042// Return the maximum alignment of the Output_data in Output_segment.
ead1e424 1043// Once we compute this, we prohibit new sections from being added.
75f65a3e
ILT
1044
1045uint64_t
ead1e424 1046Output_segment::addralign()
75f65a3e 1047{
ead1e424
ILT
1048 if (!this->is_align_known_)
1049 {
1050 uint64_t addralign;
1051
1052 addralign = Output_segment::maximum_alignment(&this->output_data_);
1053 if (addralign > this->align_)
1054 this->align_ = addralign;
1055
1056 addralign = Output_segment::maximum_alignment(&this->output_bss_);
1057 if (addralign > this->align_)
1058 this->align_ = addralign;
1059
1060 this->is_align_known_ = true;
1061 }
1062
75f65a3e
ILT
1063 return this->align_;
1064}
1065
ead1e424
ILT
1066// Return the maximum alignment of a list of Output_data.
1067
1068uint64_t
1069Output_segment::maximum_alignment(const Output_data_list* pdl)
1070{
1071 uint64_t ret = 0;
1072 for (Output_data_list::const_iterator p = pdl->begin();
1073 p != pdl->end();
1074 ++p)
1075 {
1076 uint64_t addralign = (*p)->addralign();
1077 if (addralign > ret)
1078 ret = addralign;
1079 }
1080 return ret;
1081}
1082
75f65a3e 1083// Set the section addresses for an Output_segment. ADDR is the
ead1e424
ILT
1084// address and *POFF is the file offset. Set the section indexes
1085// starting with *PSHNDX. Return the address of the immediately
1086// following segment. Update *POFF and *PSHNDX.
75f65a3e
ILT
1087
1088uint64_t
ead1e424
ILT
1089Output_segment::set_section_addresses(uint64_t addr, off_t* poff,
1090 unsigned int* pshndx)
75f65a3e 1091{
a3ad94ed 1092 gold_assert(this->type_ == elfcpp::PT_LOAD);
75f65a3e
ILT
1093
1094 this->vaddr_ = addr;
1095 this->paddr_ = addr;
1096
1097 off_t orig_off = *poff;
1098 this->offset_ = orig_off;
1099
ead1e424
ILT
1100 *poff = align_address(*poff, this->addralign());
1101
1102 addr = this->set_section_list_addresses(&this->output_data_, addr, poff,
1103 pshndx);
75f65a3e
ILT
1104 this->filesz_ = *poff - orig_off;
1105
1106 off_t off = *poff;
1107
61ba1cf9 1108 uint64_t ret = this->set_section_list_addresses(&this->output_bss_, addr,
ead1e424 1109 poff, pshndx);
75f65a3e
ILT
1110 this->memsz_ = *poff - orig_off;
1111
1112 // Ignore the file offset adjustments made by the BSS Output_data
1113 // objects.
1114 *poff = off;
61ba1cf9
ILT
1115
1116 return ret;
75f65a3e
ILT
1117}
1118
1119// Set the addresses in a list of Output_data structures.
1120
1121uint64_t
1122Output_segment::set_section_list_addresses(Output_data_list* pdl,
ead1e424
ILT
1123 uint64_t addr, off_t* poff,
1124 unsigned int* pshndx)
75f65a3e 1125{
ead1e424 1126 off_t startoff = *poff;
75f65a3e 1127
ead1e424 1128 off_t off = startoff;
75f65a3e
ILT
1129 for (Output_data_list::iterator p = pdl->begin();
1130 p != pdl->end();
1131 ++p)
1132 {
ead1e424
ILT
1133 off = align_address(off, (*p)->addralign());
1134 (*p)->set_address(addr + (off - startoff), off);
1135
1136 // Unless this is a PT_TLS segment, we want to ignore the size
1137 // of a SHF_TLS/SHT_NOBITS section. Such a section does not
1138 // affect the size of a PT_LOAD segment.
1139 if (this->type_ == elfcpp::PT_TLS
1140 || !(*p)->is_section_flag_set(elfcpp::SHF_TLS)
1141 || !(*p)->is_section_type(elfcpp::SHT_NOBITS))
1142 off += (*p)->data_size();
75f65a3e 1143
ead1e424
ILT
1144 if ((*p)->is_section())
1145 {
1146 (*p)->set_out_shndx(*pshndx);
1147 ++*pshndx;
1148 }
75f65a3e
ILT
1149 }
1150
1151 *poff = off;
ead1e424 1152 return addr + (off - startoff);
75f65a3e
ILT
1153}
1154
1155// For a non-PT_LOAD segment, set the offset from the sections, if
1156// any.
1157
1158void
1159Output_segment::set_offset()
1160{
a3ad94ed 1161 gold_assert(this->type_ != elfcpp::PT_LOAD);
75f65a3e
ILT
1162
1163 if (this->output_data_.empty() && this->output_bss_.empty())
1164 {
1165 this->vaddr_ = 0;
1166 this->paddr_ = 0;
1167 this->memsz_ = 0;
1168 this->align_ = 0;
1169 this->offset_ = 0;
1170 this->filesz_ = 0;
1171 return;
1172 }
1173
1174 const Output_data* first;
1175 if (this->output_data_.empty())
1176 first = this->output_bss_.front();
1177 else
1178 first = this->output_data_.front();
1179 this->vaddr_ = first->address();
1180 this->paddr_ = this->vaddr_;
1181 this->offset_ = first->offset();
1182
1183 if (this->output_data_.empty())
1184 this->filesz_ = 0;
1185 else
1186 {
1187 const Output_data* last_data = this->output_data_.back();
1188 this->filesz_ = (last_data->address()
1189 + last_data->data_size()
1190 - this->vaddr_);
1191 }
1192
1193 const Output_data* last;
1194 if (this->output_bss_.empty())
1195 last = this->output_data_.back();
1196 else
1197 last = this->output_bss_.back();
1198 this->memsz_ = (last->address()
1199 + last->data_size()
1200 - this->vaddr_);
75f65a3e
ILT
1201}
1202
1203// Return the number of Output_sections in an Output_segment.
1204
1205unsigned int
1206Output_segment::output_section_count() const
1207{
1208 return (this->output_section_count_list(&this->output_data_)
1209 + this->output_section_count_list(&this->output_bss_));
1210}
1211
1212// Return the number of Output_sections in an Output_data_list.
1213
1214unsigned int
1215Output_segment::output_section_count_list(const Output_data_list* pdl) const
1216{
1217 unsigned int count = 0;
1218 for (Output_data_list::const_iterator p = pdl->begin();
1219 p != pdl->end();
1220 ++p)
1221 {
1222 if ((*p)->is_section())
1223 ++count;
1224 }
1225 return count;
a2fb1b05
ILT
1226}
1227
61ba1cf9
ILT
1228// Write the segment data into *OPHDR.
1229
1230template<int size, bool big_endian>
1231void
ead1e424 1232Output_segment::write_header(elfcpp::Phdr_write<size, big_endian>* ophdr)
61ba1cf9
ILT
1233{
1234 ophdr->put_p_type(this->type_);
1235 ophdr->put_p_offset(this->offset_);
1236 ophdr->put_p_vaddr(this->vaddr_);
1237 ophdr->put_p_paddr(this->paddr_);
1238 ophdr->put_p_filesz(this->filesz_);
1239 ophdr->put_p_memsz(this->memsz_);
1240 ophdr->put_p_flags(this->flags_);
ead1e424 1241 ophdr->put_p_align(this->addralign());
61ba1cf9
ILT
1242}
1243
1244// Write the section headers into V.
1245
1246template<int size, bool big_endian>
1247unsigned char*
1248Output_segment::write_section_headers(const Stringpool* secnamepool,
ead1e424
ILT
1249 unsigned char* v,
1250 unsigned int *pshndx
5482377d
ILT
1251 ACCEPT_SIZE_ENDIAN) const
1252{
ead1e424
ILT
1253 // Every section that is attached to a segment must be attached to a
1254 // PT_LOAD segment, so we only write out section headers for PT_LOAD
1255 // segments.
1256 if (this->type_ != elfcpp::PT_LOAD)
1257 return v;
1258
593f47df
ILT
1259 v = this->write_section_headers_list
1260 SELECT_SIZE_ENDIAN_NAME(size, big_endian) (
1261 secnamepool, &this->output_data_, v, pshndx
1262 SELECT_SIZE_ENDIAN(size, big_endian));
1263 v = this->write_section_headers_list
1264 SELECT_SIZE_ENDIAN_NAME(size, big_endian) (
1265 secnamepool, &this->output_bss_, v, pshndx
1266 SELECT_SIZE_ENDIAN(size, big_endian));
61ba1cf9
ILT
1267 return v;
1268}
1269
1270template<int size, bool big_endian>
1271unsigned char*
1272Output_segment::write_section_headers_list(const Stringpool* secnamepool,
1273 const Output_data_list* pdl,
ead1e424
ILT
1274 unsigned char* v,
1275 unsigned int* pshndx
5482377d 1276 ACCEPT_SIZE_ENDIAN) const
61ba1cf9
ILT
1277{
1278 const int shdr_size = elfcpp::Elf_sizes<size>::shdr_size;
1279 for (Output_data_list::const_iterator p = pdl->begin();
1280 p != pdl->end();
1281 ++p)
1282 {
1283 if ((*p)->is_section())
1284 {
5482377d 1285 const Output_section* ps = static_cast<const Output_section*>(*p);
a3ad94ed 1286 gold_assert(*pshndx == ps->out_shndx());
61ba1cf9
ILT
1287 elfcpp::Shdr_write<size, big_endian> oshdr(v);
1288 ps->write_header(secnamepool, &oshdr);
1289 v += shdr_size;
ead1e424 1290 ++*pshndx;
61ba1cf9
ILT
1291 }
1292 }
1293 return v;
1294}
1295
a2fb1b05
ILT
1296// Output_file methods.
1297
61ba1cf9
ILT
1298Output_file::Output_file(const General_options& options)
1299 : options_(options),
1300 name_(options.output_file_name()),
1301 o_(-1),
1302 file_size_(0),
1303 base_(NULL)
1304{
1305}
1306
1307// Open the output file.
1308
a2fb1b05 1309void
61ba1cf9 1310Output_file::open(off_t file_size)
a2fb1b05 1311{
61ba1cf9
ILT
1312 this->file_size_ = file_size;
1313
1314 int mode = this->options_.is_relocatable() ? 0666 : 0777;
1315 int o = ::open(this->name_, O_RDWR | O_CREAT | O_TRUNC, mode);
1316 if (o < 0)
1317 {
1318 fprintf(stderr, _("%s: %s: open: %s\n"),
1319 program_name, this->name_, strerror(errno));
1320 gold_exit(false);
1321 }
1322 this->o_ = o;
1323
1324 // Write out one byte to make the file the right size.
1325 if (::lseek(o, file_size - 1, SEEK_SET) < 0)
1326 {
1327 fprintf(stderr, _("%s: %s: lseek: %s\n"),
1328 program_name, this->name_, strerror(errno));
1329 gold_exit(false);
1330 }
1331 char b = 0;
1332 if (::write(o, &b, 1) != 1)
1333 {
1334 fprintf(stderr, _("%s: %s: write: %s\n"),
1335 program_name, this->name_, strerror(errno));
1336 gold_exit(false);
1337 }
1338
1339 // Map the file into memory.
1340 void* base = ::mmap(NULL, file_size, PROT_READ | PROT_WRITE,
1341 MAP_SHARED, o, 0);
1342 if (base == MAP_FAILED)
1343 {
1344 fprintf(stderr, _("%s: %s: mmap: %s\n"),
1345 program_name, this->name_, strerror(errno));
1346 gold_exit(false);
1347 }
1348 this->base_ = static_cast<unsigned char*>(base);
1349}
1350
1351// Close the output file.
1352
1353void
1354Output_file::close()
1355{
1356 if (::munmap(this->base_, this->file_size_) < 0)
1357 {
1358 fprintf(stderr, _("%s: %s: munmap: %s\n"),
1359 program_name, this->name_, strerror(errno));
1360 gold_exit(false);
1361 }
1362 this->base_ = NULL;
1363
1364 if (::close(this->o_) < 0)
1365 {
1366 fprintf(stderr, _("%s: %s: close: %s\n"),
1367 program_name, this->name_, strerror(errno));
1368 gold_exit(false);
1369 }
1370 this->o_ = -1;
a2fb1b05
ILT
1371}
1372
1373// Instantiate the templates we need. We could use the configure
1374// script to restrict this to only the ones for implemented targets.
1375
1376template
1377off_t
1378Output_section::add_input_section<32, false>(
f6ce93d6 1379 Relobj* object,
ead1e424 1380 unsigned int shndx,
a2fb1b05
ILT
1381 const char* secname,
1382 const elfcpp::Shdr<32, false>& shdr);
1383
1384template
1385off_t
1386Output_section::add_input_section<32, true>(
f6ce93d6 1387 Relobj* object,
ead1e424 1388 unsigned int shndx,
a2fb1b05
ILT
1389 const char* secname,
1390 const elfcpp::Shdr<32, true>& shdr);
1391
1392template
1393off_t
1394Output_section::add_input_section<64, false>(
f6ce93d6 1395 Relobj* object,
ead1e424 1396 unsigned int shndx,
a2fb1b05
ILT
1397 const char* secname,
1398 const elfcpp::Shdr<64, false>& shdr);
1399
1400template
1401off_t
1402Output_section::add_input_section<64, true>(
f6ce93d6 1403 Relobj* object,
ead1e424 1404 unsigned int shndx,
a2fb1b05
ILT
1405 const char* secname,
1406 const elfcpp::Shdr<64, true>& shdr);
1407
c06b7b0b
ILT
1408template
1409class Output_data_reloc<elfcpp::SHT_REL, false, 32, false>;
1410
1411template
1412class Output_data_reloc<elfcpp::SHT_REL, false, 32, true>;
1413
1414template
1415class Output_data_reloc<elfcpp::SHT_REL, false, 64, false>;
1416
1417template
1418class Output_data_reloc<elfcpp::SHT_REL, false, 64, true>;
1419
1420template
1421class Output_data_reloc<elfcpp::SHT_REL, true, 32, false>;
1422
1423template
1424class Output_data_reloc<elfcpp::SHT_REL, true, 32, true>;
1425
1426template
1427class Output_data_reloc<elfcpp::SHT_REL, true, 64, false>;
1428
1429template
1430class Output_data_reloc<elfcpp::SHT_REL, true, 64, true>;
1431
1432template
1433class Output_data_reloc<elfcpp::SHT_RELA, false, 32, false>;
1434
1435template
1436class Output_data_reloc<elfcpp::SHT_RELA, false, 32, true>;
1437
1438template
1439class Output_data_reloc<elfcpp::SHT_RELA, false, 64, false>;
1440
1441template
1442class Output_data_reloc<elfcpp::SHT_RELA, false, 64, true>;
1443
1444template
1445class Output_data_reloc<elfcpp::SHT_RELA, true, 32, false>;
1446
1447template
1448class Output_data_reloc<elfcpp::SHT_RELA, true, 32, true>;
1449
1450template
1451class Output_data_reloc<elfcpp::SHT_RELA, true, 64, false>;
1452
1453template
1454class Output_data_reloc<elfcpp::SHT_RELA, true, 64, true>;
1455
ead1e424 1456template
dbe717ef 1457class Output_data_got<32, false>;
ead1e424
ILT
1458
1459template
dbe717ef 1460class Output_data_got<32, true>;
ead1e424
ILT
1461
1462template
dbe717ef 1463class Output_data_got<64, false>;
ead1e424
ILT
1464
1465template
dbe717ef 1466class Output_data_got<64, true>;
ead1e424 1467
a2fb1b05 1468} // End namespace gold.
This page took 0.094927 seconds and 4 git commands to generate.