1 // output.cc -- manage the output file for gold
2 
3 // Copyright (C) 2006-2021 Free Software Foundation, Inc.
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 
23 #include "gold.h"
24 
25 #include <cstdlib>
26 #include <cstring>
27 #include <cerrno>
28 #include <fcntl.h>
29 #include <unistd.h>
30 #include <sys/stat.h>
31 #include <algorithm>
32 
33 #ifdef HAVE_SYS_MMAN_H
34 #include <sys/mman.h>
35 #endif
36 
37 #include "libiberty.h"
38 
39 #include "dwarf.h"
40 #include "parameters.h"
41 #include "object.h"
42 #include "symtab.h"
43 #include "reloc.h"
44 #include "merge.h"
45 #include "descriptors.h"
46 #include "layout.h"
47 #include "output.h"
48 
49 // For systems without mmap support.
50 #ifndef HAVE_MMAP
51 # define mmap gold_mmap
52 # define munmap gold_munmap
53 # define mremap gold_mremap
54 # ifndef MAP_FAILED
55 #  define MAP_FAILED (reinterpret_cast<void*>(-1))
56 # endif
57 # ifndef PROT_READ
58 #  define PROT_READ 0
59 # endif
60 # ifndef PROT_WRITE
61 #  define PROT_WRITE 0
62 # endif
63 # ifndef MAP_PRIVATE
64 #  define MAP_PRIVATE 0
65 # endif
66 # ifndef MAP_ANONYMOUS
67 #  define MAP_ANONYMOUS 0
68 # endif
69 # ifndef MAP_SHARED
70 #  define MAP_SHARED 0
71 # endif
72 
73 # ifndef ENOSYS
74 #  define ENOSYS EINVAL
75 # endif
76 
77 static void *
gold_mmap(void *,size_t,int,int,int,off_t)78 gold_mmap(void *, size_t, int, int, int, off_t)
79 {
80   errno = ENOSYS;
81   return MAP_FAILED;
82 }
83 
84 static int
gold_munmap(void *,size_t)85 gold_munmap(void *, size_t)
86 {
87   errno = ENOSYS;
88   return -1;
89 }
90 
91 static void *
gold_mremap(void *,size_t,size_t,int)92 gold_mremap(void *, size_t, size_t, int)
93 {
94   errno = ENOSYS;
95   return MAP_FAILED;
96 }
97 
98 #endif
99 
100 #if defined(HAVE_MMAP) && !defined(HAVE_MREMAP)
101 # define mremap gold_mremap
102 extern "C" void *gold_mremap(void *, size_t, size_t, int);
103 #endif
104 
105 // Some BSD systems still use MAP_ANON instead of MAP_ANONYMOUS
106 #ifndef MAP_ANONYMOUS
107 # define MAP_ANONYMOUS  MAP_ANON
108 #endif
109 
110 #ifndef MREMAP_MAYMOVE
111 # define MREMAP_MAYMOVE 1
112 #endif
113 
114 // Mingw does not have S_ISLNK.
115 #ifndef S_ISLNK
116 # define S_ISLNK(mode) 0
117 #endif
118 
119 namespace gold
120 {
121 
122 // A wrapper around posix_fallocate.  If we don't have posix_fallocate,
123 // or the --no-posix-fallocate option is set, we try the fallocate
124 // system call directly.  If that fails, we use ftruncate to set
125 // the file size and hope that there is enough disk space.
126 
127 static int
gold_fallocate(int o,off_t offset,off_t len)128 gold_fallocate(int o, off_t offset, off_t len)
129 {
130   if (len <= 0)
131     return 0;
132 
133 #ifdef HAVE_POSIX_FALLOCATE
134   if (parameters->options().posix_fallocate())
135     {
136       int err = ::posix_fallocate(o, offset, len);
137       if (err != EINVAL && err != ENOSYS && err != EOPNOTSUPP)
138 	return err;
139     }
140 #endif // defined(HAVE_POSIX_FALLOCATE)
141 
142 #ifdef HAVE_FALLOCATE
143   {
144     errno = 0;
145     int err = ::fallocate(o, 0, offset, len);
146     if (err < 0 && errno != EINVAL && errno != ENOSYS && errno != EOPNOTSUPP)
147       return errno;
148   }
149 #endif // defined(HAVE_FALLOCATE)
150 
151   errno = 0;
152   if (::ftruncate(o, offset + len) < 0)
153     return errno;
154   return 0;
155 }
156 
157 // Output_data variables.
158 
159 bool Output_data::allocated_sizes_are_fixed;
160 
161 // Output_data methods.
162 
~Output_data()163 Output_data::~Output_data()
164 {
165 }
166 
167 // Return the default alignment for the target size.
168 
169 uint64_t
default_alignment()170 Output_data::default_alignment()
171 {
172   return Output_data::default_alignment_for_size(
173       parameters->target().get_size());
174 }
175 
176 // Return the default alignment for a size--32 or 64.
177 
178 uint64_t
default_alignment_for_size(int size)179 Output_data::default_alignment_for_size(int size)
180 {
181   if (size == 32)
182     return 4;
183   else if (size == 64)
184     return 8;
185   else
186     gold_unreachable();
187 }
188 
189 // Output_section_header methods.  This currently assumes that the
190 // segment and section lists are complete at construction time.
191 
Output_section_headers(const Layout * layout,const Layout::Segment_list * segment_list,const Layout::Section_list * section_list,const Layout::Section_list * unattached_section_list,const Stringpool * secnamepool,const Output_section * shstrtab_section)192 Output_section_headers::Output_section_headers(
193     const Layout* layout,
194     const Layout::Segment_list* segment_list,
195     const Layout::Section_list* section_list,
196     const Layout::Section_list* unattached_section_list,
197     const Stringpool* secnamepool,
198     const Output_section* shstrtab_section)
199   : layout_(layout),
200     segment_list_(segment_list),
201     section_list_(section_list),
202     unattached_section_list_(unattached_section_list),
203     secnamepool_(secnamepool),
204     shstrtab_section_(shstrtab_section)
205 {
206 }
207 
208 // Compute the current data size.
209 
210 off_t
do_size() const211 Output_section_headers::do_size() const
212 {
213   // Count all the sections.  Start with 1 for the null section.
214   off_t count = 1;
215   if (!parameters->options().relocatable())
216     {
217       for (Layout::Segment_list::const_iterator p =
218 	     this->segment_list_->begin();
219 	   p != this->segment_list_->end();
220 	   ++p)
221 	if ((*p)->type() == elfcpp::PT_LOAD)
222 	  count += (*p)->output_section_count();
223     }
224   else
225     {
226       for (Layout::Section_list::const_iterator p =
227 	     this->section_list_->begin();
228 	   p != this->section_list_->end();
229 	   ++p)
230 	if (((*p)->flags() & elfcpp::SHF_ALLOC) != 0)
231 	  ++count;
232     }
233   count += this->unattached_section_list_->size();
234 
235   const int size = parameters->target().get_size();
236   int shdr_size;
237   if (size == 32)
238     shdr_size = elfcpp::Elf_sizes<32>::shdr_size;
239   else if (size == 64)
240     shdr_size = elfcpp::Elf_sizes<64>::shdr_size;
241   else
242     gold_unreachable();
243 
244   return count * shdr_size;
245 }
246 
247 // Write out the section headers.
248 
249 void
do_write(Output_file * of)250 Output_section_headers::do_write(Output_file* of)
251 {
252   switch (parameters->size_and_endianness())
253     {
254 #ifdef HAVE_TARGET_32_LITTLE
255     case Parameters::TARGET_32_LITTLE:
256       this->do_sized_write<32, false>(of);
257       break;
258 #endif
259 #ifdef HAVE_TARGET_32_BIG
260     case Parameters::TARGET_32_BIG:
261       this->do_sized_write<32, true>(of);
262       break;
263 #endif
264 #ifdef HAVE_TARGET_64_LITTLE
265     case Parameters::TARGET_64_LITTLE:
266       this->do_sized_write<64, false>(of);
267       break;
268 #endif
269 #ifdef HAVE_TARGET_64_BIG
270     case Parameters::TARGET_64_BIG:
271       this->do_sized_write<64, true>(of);
272       break;
273 #endif
274     default:
275       gold_unreachable();
276     }
277 }
278 
279 template<int size, bool big_endian>
280 void
do_sized_write(Output_file * of)281 Output_section_headers::do_sized_write(Output_file* of)
282 {
283   off_t all_shdrs_size = this->data_size();
284   unsigned char* view = of->get_output_view(this->offset(), all_shdrs_size);
285 
286   const int shdr_size = elfcpp::Elf_sizes<size>::shdr_size;
287   unsigned char* v = view;
288 
289   {
290     typename elfcpp::Shdr_write<size, big_endian> oshdr(v);
291     oshdr.put_sh_name(0);
292     oshdr.put_sh_type(elfcpp::SHT_NULL);
293     oshdr.put_sh_flags(0);
294     oshdr.put_sh_addr(0);
295     oshdr.put_sh_offset(0);
296 
297     size_t section_count = (this->data_size()
298 			    / elfcpp::Elf_sizes<size>::shdr_size);
299     if (section_count < elfcpp::SHN_LORESERVE)
300       oshdr.put_sh_size(0);
301     else
302       oshdr.put_sh_size(section_count);
303 
304     unsigned int shstrndx = this->shstrtab_section_->out_shndx();
305     if (shstrndx < elfcpp::SHN_LORESERVE)
306       oshdr.put_sh_link(0);
307     else
308       oshdr.put_sh_link(shstrndx);
309 
310     size_t segment_count = this->segment_list_->size();
311     oshdr.put_sh_info(segment_count >= elfcpp::PN_XNUM ? segment_count : 0);
312 
313     oshdr.put_sh_addralign(0);
314     oshdr.put_sh_entsize(0);
315   }
316 
317   v += shdr_size;
318 
319   unsigned int shndx = 1;
320   if (!parameters->options().relocatable())
321     {
322       for (Layout::Segment_list::const_iterator p =
323 	     this->segment_list_->begin();
324 	   p != this->segment_list_->end();
325 	   ++p)
326 	v = (*p)->write_section_headers<size, big_endian>(this->layout_,
327 							  this->secnamepool_,
328 							  v,
329 							  &shndx);
330     }
331   else
332     {
333       for (Layout::Section_list::const_iterator p =
334 	     this->section_list_->begin();
335 	   p != this->section_list_->end();
336 	   ++p)
337 	{
338 	  // We do unallocated sections below, except that group
339 	  // sections have to come first.
340 	  if (((*p)->flags() & elfcpp::SHF_ALLOC) == 0
341 	      && (*p)->type() != elfcpp::SHT_GROUP)
342 	    continue;
343 	  gold_assert(shndx == (*p)->out_shndx());
344 	  elfcpp::Shdr_write<size, big_endian> oshdr(v);
345 	  (*p)->write_header(this->layout_, this->secnamepool_, &oshdr);
346 	  v += shdr_size;
347 	  ++shndx;
348 	}
349     }
350 
351   for (Layout::Section_list::const_iterator p =
352 	 this->unattached_section_list_->begin();
353        p != this->unattached_section_list_->end();
354        ++p)
355     {
356       // For a relocatable link, we did unallocated group sections
357       // above, since they have to come first.
358       if ((*p)->type() == elfcpp::SHT_GROUP
359 	  && parameters->options().relocatable())
360 	continue;
361       gold_assert(shndx == (*p)->out_shndx());
362       elfcpp::Shdr_write<size, big_endian> oshdr(v);
363       (*p)->write_header(this->layout_, this->secnamepool_, &oshdr);
364       v += shdr_size;
365       ++shndx;
366     }
367 
368   of->write_output_view(this->offset(), all_shdrs_size, view);
369 }
370 
371 // Output_segment_header methods.
372 
Output_segment_headers(const Layout::Segment_list & segment_list)373 Output_segment_headers::Output_segment_headers(
374     const Layout::Segment_list& segment_list)
375   : segment_list_(segment_list)
376 {
377   this->set_current_data_size_for_child(this->do_size());
378 }
379 
380 void
do_write(Output_file * of)381 Output_segment_headers::do_write(Output_file* of)
382 {
383   switch (parameters->size_and_endianness())
384     {
385 #ifdef HAVE_TARGET_32_LITTLE
386     case Parameters::TARGET_32_LITTLE:
387       this->do_sized_write<32, false>(of);
388       break;
389 #endif
390 #ifdef HAVE_TARGET_32_BIG
391     case Parameters::TARGET_32_BIG:
392       this->do_sized_write<32, true>(of);
393       break;
394 #endif
395 #ifdef HAVE_TARGET_64_LITTLE
396     case Parameters::TARGET_64_LITTLE:
397       this->do_sized_write<64, false>(of);
398       break;
399 #endif
400 #ifdef HAVE_TARGET_64_BIG
401     case Parameters::TARGET_64_BIG:
402       this->do_sized_write<64, true>(of);
403       break;
404 #endif
405     default:
406       gold_unreachable();
407     }
408 }
409 
410 template<int size, bool big_endian>
411 void
do_sized_write(Output_file * of)412 Output_segment_headers::do_sized_write(Output_file* of)
413 {
414   const int phdr_size = elfcpp::Elf_sizes<size>::phdr_size;
415   off_t all_phdrs_size = this->segment_list_.size() * phdr_size;
416   gold_assert(all_phdrs_size == this->data_size());
417   unsigned char* view = of->get_output_view(this->offset(),
418 					    all_phdrs_size);
419   unsigned char* v = view;
420   for (Layout::Segment_list::const_iterator p = this->segment_list_.begin();
421        p != this->segment_list_.end();
422        ++p)
423     {
424       elfcpp::Phdr_write<size, big_endian> ophdr(v);
425       (*p)->write_header(&ophdr);
426       v += phdr_size;
427     }
428 
429   gold_assert(v - view == all_phdrs_size);
430 
431   of->write_output_view(this->offset(), all_phdrs_size, view);
432 }
433 
434 off_t
do_size() const435 Output_segment_headers::do_size() const
436 {
437   const int size = parameters->target().get_size();
438   int phdr_size;
439   if (size == 32)
440     phdr_size = elfcpp::Elf_sizes<32>::phdr_size;
441   else if (size == 64)
442     phdr_size = elfcpp::Elf_sizes<64>::phdr_size;
443   else
444     gold_unreachable();
445 
446   return this->segment_list_.size() * phdr_size;
447 }
448 
449 // Output_file_header methods.
450 
Output_file_header(Target * target,const Symbol_table * symtab,const Output_segment_headers * osh)451 Output_file_header::Output_file_header(Target* target,
452 				       const Symbol_table* symtab,
453 				       const Output_segment_headers* osh)
454   : target_(target),
455     symtab_(symtab),
456     segment_header_(osh),
457     section_header_(NULL),
458     shstrtab_(NULL)
459 {
460   this->set_data_size(this->do_size());
461 }
462 
463 // Set the section table information for a file header.
464 
465 void
set_section_info(const Output_section_headers * shdrs,const Output_section * shstrtab)466 Output_file_header::set_section_info(const Output_section_headers* shdrs,
467 				     const Output_section* shstrtab)
468 {
469   this->section_header_ = shdrs;
470   this->shstrtab_ = shstrtab;
471 }
472 
473 // Write out the file header.
474 
475 void
do_write(Output_file * of)476 Output_file_header::do_write(Output_file* of)
477 {
478   gold_assert(this->offset() == 0);
479 
480   switch (parameters->size_and_endianness())
481     {
482 #ifdef HAVE_TARGET_32_LITTLE
483     case Parameters::TARGET_32_LITTLE:
484       this->do_sized_write<32, false>(of);
485       break;
486 #endif
487 #ifdef HAVE_TARGET_32_BIG
488     case Parameters::TARGET_32_BIG:
489       this->do_sized_write<32, true>(of);
490       break;
491 #endif
492 #ifdef HAVE_TARGET_64_LITTLE
493     case Parameters::TARGET_64_LITTLE:
494       this->do_sized_write<64, false>(of);
495       break;
496 #endif
497 #ifdef HAVE_TARGET_64_BIG
498     case Parameters::TARGET_64_BIG:
499       this->do_sized_write<64, true>(of);
500       break;
501 #endif
502     default:
503       gold_unreachable();
504     }
505 }
506 
507 // Write out the file header with appropriate size and endianness.
508 
509 template<int size, bool big_endian>
510 void
do_sized_write(Output_file * of)511 Output_file_header::do_sized_write(Output_file* of)
512 {
513   gold_assert(this->offset() == 0);
514 
515   int ehdr_size = elfcpp::Elf_sizes<size>::ehdr_size;
516   unsigned char* view = of->get_output_view(0, ehdr_size);
517   elfcpp::Ehdr_write<size, big_endian> oehdr(view);
518 
519   unsigned char e_ident[elfcpp::EI_NIDENT];
520   memset(e_ident, 0, elfcpp::EI_NIDENT);
521   e_ident[elfcpp::EI_MAG0] = elfcpp::ELFMAG0;
522   e_ident[elfcpp::EI_MAG1] = elfcpp::ELFMAG1;
523   e_ident[elfcpp::EI_MAG2] = elfcpp::ELFMAG2;
524   e_ident[elfcpp::EI_MAG3] = elfcpp::ELFMAG3;
525   if (size == 32)
526     e_ident[elfcpp::EI_CLASS] = elfcpp::ELFCLASS32;
527   else if (size == 64)
528     e_ident[elfcpp::EI_CLASS] = elfcpp::ELFCLASS64;
529   else
530     gold_unreachable();
531   e_ident[elfcpp::EI_DATA] = (big_endian
532 			      ? elfcpp::ELFDATA2MSB
533 			      : elfcpp::ELFDATA2LSB);
534   e_ident[elfcpp::EI_VERSION] = elfcpp::EV_CURRENT;
535   oehdr.put_e_ident(e_ident);
536 
537   elfcpp::ET e_type;
538   if (parameters->options().relocatable())
539     e_type = elfcpp::ET_REL;
540   else if (parameters->options().output_is_position_independent())
541     e_type = elfcpp::ET_DYN;
542   else
543     e_type = elfcpp::ET_EXEC;
544   oehdr.put_e_type(e_type);
545 
546   oehdr.put_e_machine(this->target_->machine_code());
547   oehdr.put_e_version(elfcpp::EV_CURRENT);
548 
549   oehdr.put_e_entry(this->entry<size>());
550 
551   if (this->segment_header_ == NULL)
552     oehdr.put_e_phoff(0);
553   else
554     oehdr.put_e_phoff(this->segment_header_->offset());
555 
556   oehdr.put_e_shoff(this->section_header_->offset());
557   oehdr.put_e_flags(this->target_->processor_specific_flags());
558   oehdr.put_e_ehsize(elfcpp::Elf_sizes<size>::ehdr_size);
559 
560   if (this->segment_header_ == NULL)
561     {
562       oehdr.put_e_phentsize(0);
563       oehdr.put_e_phnum(0);
564     }
565   else
566     {
567       oehdr.put_e_phentsize(elfcpp::Elf_sizes<size>::phdr_size);
568       size_t phnum = (this->segment_header_->data_size()
569 		      / elfcpp::Elf_sizes<size>::phdr_size);
570       if (phnum > elfcpp::PN_XNUM)
571 	phnum = elfcpp::PN_XNUM;
572       oehdr.put_e_phnum(phnum);
573     }
574 
575   oehdr.put_e_shentsize(elfcpp::Elf_sizes<size>::shdr_size);
576   size_t section_count = (this->section_header_->data_size()
577 			  / elfcpp::Elf_sizes<size>::shdr_size);
578 
579   if (section_count < elfcpp::SHN_LORESERVE)
580     oehdr.put_e_shnum(this->section_header_->data_size()
581 		      / elfcpp::Elf_sizes<size>::shdr_size);
582   else
583     oehdr.put_e_shnum(0);
584 
585   unsigned int shstrndx = this->shstrtab_->out_shndx();
586   if (shstrndx < elfcpp::SHN_LORESERVE)
587     oehdr.put_e_shstrndx(this->shstrtab_->out_shndx());
588   else
589     oehdr.put_e_shstrndx(elfcpp::SHN_XINDEX);
590 
591   // Let the target adjust the ELF header, e.g., to set EI_OSABI in
592   // the e_ident field.
593   this->target_->adjust_elf_header(view, ehdr_size);
594 
595   of->write_output_view(0, ehdr_size, view);
596 }
597 
598 // Return the value to use for the entry address.
599 
600 template<int size>
601 typename elfcpp::Elf_types<size>::Elf_Addr
entry()602 Output_file_header::entry()
603 {
604   const bool should_issue_warning = (parameters->options().entry() != NULL
605 				     && !parameters->options().relocatable()
606 				     && !parameters->options().shared());
607   const char* entry = parameters->entry();
608   Symbol* sym = this->symtab_->lookup(entry);
609 
610   typename Sized_symbol<size>::Value_type v;
611   if (sym != NULL)
612     {
613       Sized_symbol<size>* ssym;
614       ssym = this->symtab_->get_sized_symbol<size>(sym);
615       if (!ssym->is_defined() && should_issue_warning)
616 	gold_warning("entry symbol '%s' exists but is not defined", entry);
617       v = ssym->value();
618     }
619   else
620     {
621       // We couldn't find the entry symbol.  See if we can parse it as
622       // a number.  This supports, e.g., -e 0x1000.
623       char* endptr;
624       v = strtoull(entry, &endptr, 0);
625       if (*endptr != '\0')
626 	{
627 	  if (should_issue_warning)
628 	    gold_warning("cannot find entry symbol '%s'", entry);
629 	  v = 0;
630 	}
631     }
632 
633   return v;
634 }
635 
636 // Compute the current data size.
637 
638 off_t
do_size() const639 Output_file_header::do_size() const
640 {
641   const int size = parameters->target().get_size();
642   if (size == 32)
643     return elfcpp::Elf_sizes<32>::ehdr_size;
644   else if (size == 64)
645     return elfcpp::Elf_sizes<64>::ehdr_size;
646   else
647     gold_unreachable();
648 }
649 
650 // Output_data_const methods.
651 
652 void
do_write(Output_file * of)653 Output_data_const::do_write(Output_file* of)
654 {
655   of->write(this->offset(), this->data_.data(), this->data_.size());
656 }
657 
658 // Output_data_const_buffer methods.
659 
660 void
do_write(Output_file * of)661 Output_data_const_buffer::do_write(Output_file* of)
662 {
663   of->write(this->offset(), this->p_, this->data_size());
664 }
665 
666 // Output_section_data methods.
667 
668 // Record the output section, and set the entry size and such.
669 
670 void
set_output_section(Output_section * os)671 Output_section_data::set_output_section(Output_section* os)
672 {
673   gold_assert(this->output_section_ == NULL);
674   this->output_section_ = os;
675   this->do_adjust_output_section(os);
676 }
677 
678 // Return the section index of the output section.
679 
680 unsigned int
do_out_shndx() const681 Output_section_data::do_out_shndx() const
682 {
683   gold_assert(this->output_section_ != NULL);
684   return this->output_section_->out_shndx();
685 }
686 
687 // Set the alignment, which means we may need to update the alignment
688 // of the output section.
689 
690 void
set_addralign(uint64_t addralign)691 Output_section_data::set_addralign(uint64_t addralign)
692 {
693   this->addralign_ = addralign;
694   if (this->output_section_ != NULL
695       && this->output_section_->addralign() < addralign)
696     this->output_section_->set_addralign(addralign);
697 }
698 
699 // Output_data_strtab methods.
700 
701 // Set the final data size.
702 
703 void
set_final_data_size()704 Output_data_strtab::set_final_data_size()
705 {
706   this->strtab_->set_string_offsets();
707   this->set_data_size(this->strtab_->get_strtab_size());
708 }
709 
710 // Write out a string table.
711 
712 void
do_write(Output_file * of)713 Output_data_strtab::do_write(Output_file* of)
714 {
715   this->strtab_->write(of, this->offset());
716 }
717 
718 // Output_reloc methods.
719 
720 // A reloc against a global symbol.
721 
722 template<bool dynamic, int size, bool big_endian>
Output_reloc(Symbol * gsym,unsigned int type,Output_data * od,Address address,bool is_relative,bool is_symbolless,bool use_plt_offset)723 Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc(
724     Symbol* gsym,
725     unsigned int type,
726     Output_data* od,
727     Address address,
728     bool is_relative,
729     bool is_symbolless,
730     bool use_plt_offset)
731   : address_(address), local_sym_index_(GSYM_CODE), type_(type),
732     is_relative_(is_relative), is_symbolless_(is_symbolless),
733     is_section_symbol_(false), use_plt_offset_(use_plt_offset), shndx_(INVALID_CODE)
734 {
735   // this->type_ is a bitfield; make sure TYPE fits.
736   gold_assert(this->type_ == type);
737   this->u1_.gsym = gsym;
738   this->u2_.od = od;
739   if (dynamic)
740     this->set_needs_dynsym_index();
741 }
742 
743 template<bool dynamic, int size, bool big_endian>
Output_reloc(Symbol * gsym,unsigned int type,Sized_relobj<size,big_endian> * relobj,unsigned int shndx,Address address,bool is_relative,bool is_symbolless,bool use_plt_offset)744 Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc(
745     Symbol* gsym,
746     unsigned int type,
747     Sized_relobj<size, big_endian>* relobj,
748     unsigned int shndx,
749     Address address,
750     bool is_relative,
751     bool is_symbolless,
752     bool use_plt_offset)
753   : address_(address), local_sym_index_(GSYM_CODE), type_(type),
754     is_relative_(is_relative), is_symbolless_(is_symbolless),
755     is_section_symbol_(false), use_plt_offset_(use_plt_offset), shndx_(shndx)
756 {
757   gold_assert(shndx != INVALID_CODE);
758   // this->type_ is a bitfield; make sure TYPE fits.
759   gold_assert(this->type_ == type);
760   this->u1_.gsym = gsym;
761   this->u2_.relobj = relobj;
762   if (dynamic)
763     this->set_needs_dynsym_index();
764 }
765 
766 // A reloc against a local symbol.
767 
768 template<bool dynamic, int size, bool big_endian>
Output_reloc(Sized_relobj<size,big_endian> * relobj,unsigned int local_sym_index,unsigned int type,Output_data * od,Address address,bool is_relative,bool is_symbolless,bool is_section_symbol,bool use_plt_offset)769 Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc(
770     Sized_relobj<size, big_endian>* relobj,
771     unsigned int local_sym_index,
772     unsigned int type,
773     Output_data* od,
774     Address address,
775     bool is_relative,
776     bool is_symbolless,
777     bool is_section_symbol,
778     bool use_plt_offset)
779   : address_(address), local_sym_index_(local_sym_index), type_(type),
780     is_relative_(is_relative), is_symbolless_(is_symbolless),
781     is_section_symbol_(is_section_symbol), use_plt_offset_(use_plt_offset),
782     shndx_(INVALID_CODE)
783 {
784   gold_assert(local_sym_index != GSYM_CODE
785 	      && local_sym_index != INVALID_CODE);
786   // this->type_ is a bitfield; make sure TYPE fits.
787   gold_assert(this->type_ == type);
788   this->u1_.relobj = relobj;
789   this->u2_.od = od;
790   if (dynamic)
791     this->set_needs_dynsym_index();
792 }
793 
794 template<bool dynamic, int size, bool big_endian>
Output_reloc(Sized_relobj<size,big_endian> * relobj,unsigned int local_sym_index,unsigned int type,unsigned int shndx,Address address,bool is_relative,bool is_symbolless,bool is_section_symbol,bool use_plt_offset)795 Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc(
796     Sized_relobj<size, big_endian>* relobj,
797     unsigned int local_sym_index,
798     unsigned int type,
799     unsigned int shndx,
800     Address address,
801     bool is_relative,
802     bool is_symbolless,
803     bool is_section_symbol,
804     bool use_plt_offset)
805   : address_(address), local_sym_index_(local_sym_index), type_(type),
806     is_relative_(is_relative), is_symbolless_(is_symbolless),
807     is_section_symbol_(is_section_symbol), use_plt_offset_(use_plt_offset),
808     shndx_(shndx)
809 {
810   gold_assert(local_sym_index != GSYM_CODE
811 	      && local_sym_index != INVALID_CODE);
812   gold_assert(shndx != INVALID_CODE);
813   // this->type_ is a bitfield; make sure TYPE fits.
814   gold_assert(this->type_ == type);
815   this->u1_.relobj = relobj;
816   this->u2_.relobj = relobj;
817   if (dynamic)
818     this->set_needs_dynsym_index();
819 }
820 
821 // A reloc against the STT_SECTION symbol of an output section.
822 
823 template<bool dynamic, int size, bool big_endian>
Output_reloc(Output_section * os,unsigned int type,Output_data * od,Address address,bool is_relative)824 Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc(
825     Output_section* os,
826     unsigned int type,
827     Output_data* od,
828     Address address,
829     bool is_relative)
830   : address_(address), local_sym_index_(SECTION_CODE), type_(type),
831     is_relative_(is_relative), is_symbolless_(is_relative),
832     is_section_symbol_(true), use_plt_offset_(false), shndx_(INVALID_CODE)
833 {
834   // this->type_ is a bitfield; make sure TYPE fits.
835   gold_assert(this->type_ == type);
836   this->u1_.os = os;
837   this->u2_.od = od;
838   if (dynamic)
839     this->set_needs_dynsym_index();
840   else
841     os->set_needs_symtab_index();
842 }
843 
844 template<bool dynamic, int size, bool big_endian>
Output_reloc(Output_section * os,unsigned int type,Sized_relobj<size,big_endian> * relobj,unsigned int shndx,Address address,bool is_relative)845 Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc(
846     Output_section* os,
847     unsigned int type,
848     Sized_relobj<size, big_endian>* relobj,
849     unsigned int shndx,
850     Address address,
851     bool is_relative)
852   : address_(address), local_sym_index_(SECTION_CODE), type_(type),
853     is_relative_(is_relative), is_symbolless_(is_relative),
854     is_section_symbol_(true), use_plt_offset_(false), shndx_(shndx)
855 {
856   gold_assert(shndx != INVALID_CODE);
857   // this->type_ is a bitfield; make sure TYPE fits.
858   gold_assert(this->type_ == type);
859   this->u1_.os = os;
860   this->u2_.relobj = relobj;
861   if (dynamic)
862     this->set_needs_dynsym_index();
863   else
864     os->set_needs_symtab_index();
865 }
866 
867 // An absolute or relative relocation.
868 
869 template<bool dynamic, int size, bool big_endian>
Output_reloc(unsigned int type,Output_data * od,Address address,bool is_relative)870 Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc(
871     unsigned int type,
872     Output_data* od,
873     Address address,
874     bool is_relative)
875   : address_(address), local_sym_index_(0), type_(type),
876     is_relative_(is_relative), is_symbolless_(false),
877     is_section_symbol_(false), use_plt_offset_(false), shndx_(INVALID_CODE)
878 {
879   // this->type_ is a bitfield; make sure TYPE fits.
880   gold_assert(this->type_ == type);
881   this->u1_.relobj = NULL;
882   this->u2_.od = od;
883 }
884 
885 template<bool dynamic, int size, bool big_endian>
Output_reloc(unsigned int type,Sized_relobj<size,big_endian> * relobj,unsigned int shndx,Address address,bool is_relative)886 Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc(
887     unsigned int type,
888     Sized_relobj<size, big_endian>* relobj,
889     unsigned int shndx,
890     Address address,
891     bool is_relative)
892   : address_(address), local_sym_index_(0), type_(type),
893     is_relative_(is_relative), is_symbolless_(false),
894     is_section_symbol_(false), use_plt_offset_(false), shndx_(shndx)
895 {
896   gold_assert(shndx != INVALID_CODE);
897   // this->type_ is a bitfield; make sure TYPE fits.
898   gold_assert(this->type_ == type);
899   this->u1_.relobj = NULL;
900   this->u2_.relobj = relobj;
901 }
902 
903 // A target specific relocation.
904 
905 template<bool dynamic, int size, bool big_endian>
Output_reloc(unsigned int type,void * arg,Output_data * od,Address address)906 Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc(
907     unsigned int type,
908     void* arg,
909     Output_data* od,
910     Address address)
911   : address_(address), local_sym_index_(TARGET_CODE), type_(type),
912     is_relative_(false), is_symbolless_(false),
913     is_section_symbol_(false), use_plt_offset_(false), shndx_(INVALID_CODE)
914 {
915   // this->type_ is a bitfield; make sure TYPE fits.
916   gold_assert(this->type_ == type);
917   this->u1_.arg = arg;
918   this->u2_.od = od;
919 }
920 
921 template<bool dynamic, int size, bool big_endian>
Output_reloc(unsigned int type,void * arg,Sized_relobj<size,big_endian> * relobj,unsigned int shndx,Address address)922 Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc(
923     unsigned int type,
924     void* arg,
925     Sized_relobj<size, big_endian>* relobj,
926     unsigned int shndx,
927     Address address)
928   : address_(address), local_sym_index_(TARGET_CODE), type_(type),
929     is_relative_(false), is_symbolless_(false),
930     is_section_symbol_(false), use_plt_offset_(false), shndx_(shndx)
931 {
932   gold_assert(shndx != INVALID_CODE);
933   // this->type_ is a bitfield; make sure TYPE fits.
934   gold_assert(this->type_ == type);
935   this->u1_.arg = arg;
936   this->u2_.relobj = relobj;
937 }
938 
939 // Record that we need a dynamic symbol index for this relocation.
940 
941 template<bool dynamic, int size, bool big_endian>
942 void
943 Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::
set_needs_dynsym_index()944 set_needs_dynsym_index()
945 {
946   if (this->is_symbolless_)
947     return;
948   switch (this->local_sym_index_)
949     {
950     case INVALID_CODE:
951       gold_unreachable();
952 
953     case GSYM_CODE:
954       this->u1_.gsym->set_needs_dynsym_entry();
955       break;
956 
957     case SECTION_CODE:
958       this->u1_.os->set_needs_dynsym_index();
959       break;
960 
961     case TARGET_CODE:
962       // The target must take care of this if necessary.
963       break;
964 
965     case 0:
966       break;
967 
968     default:
969       {
970 	const unsigned int lsi = this->local_sym_index_;
971 	Sized_relobj_file<size, big_endian>* relobj =
972 	    this->u1_.relobj->sized_relobj();
973 	gold_assert(relobj != NULL);
974 	if (!this->is_section_symbol_)
975 	  relobj->set_needs_output_dynsym_entry(lsi);
976 	else
977 	  relobj->output_section(lsi)->set_needs_dynsym_index();
978       }
979       break;
980     }
981 }
982 
983 // Get the symbol index of a relocation.
984 
985 template<bool dynamic, int size, bool big_endian>
986 unsigned int
get_symbol_index() const987 Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::get_symbol_index()
988   const
989 {
990   unsigned int index;
991   if (this->is_symbolless_)
992     return 0;
993   switch (this->local_sym_index_)
994     {
995     case INVALID_CODE:
996       gold_unreachable();
997 
998     case GSYM_CODE:
999       if (this->u1_.gsym == NULL)
1000 	index = 0;
1001       else if (dynamic)
1002 	index = this->u1_.gsym->dynsym_index();
1003       else
1004 	index = this->u1_.gsym->symtab_index();
1005       break;
1006 
1007     case SECTION_CODE:
1008       if (dynamic)
1009 	index = this->u1_.os->dynsym_index();
1010       else
1011 	index = this->u1_.os->symtab_index();
1012       break;
1013 
1014     case TARGET_CODE:
1015       index = parameters->target().reloc_symbol_index(this->u1_.arg,
1016 						      this->type_);
1017       break;
1018 
1019     case 0:
1020       // Relocations without symbols use a symbol index of 0.
1021       index = 0;
1022       break;
1023 
1024     default:
1025       {
1026 	const unsigned int lsi = this->local_sym_index_;
1027 	Sized_relobj_file<size, big_endian>* relobj =
1028 	    this->u1_.relobj->sized_relobj();
1029 	gold_assert(relobj != NULL);
1030 	if (!this->is_section_symbol_)
1031 	  {
1032 	    if (dynamic)
1033 	      index = relobj->dynsym_index(lsi);
1034 	    else
1035 	      index = relobj->symtab_index(lsi);
1036 	  }
1037 	else
1038 	  {
1039 	    Output_section* os = relobj->output_section(lsi);
1040 	    gold_assert(os != NULL);
1041 	    if (dynamic)
1042 	      index = os->dynsym_index();
1043 	    else
1044 	      index = os->symtab_index();
1045 	  }
1046       }
1047       break;
1048     }
1049   gold_assert(index != -1U);
1050   return index;
1051 }
1052 
1053 // For a local section symbol, get the address of the offset ADDEND
1054 // within the input section.
1055 
1056 template<bool dynamic, int size, bool big_endian>
1057 typename elfcpp::Elf_types<size>::Elf_Addr
1058 Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::
local_section_offset(Addend addend) const1059   local_section_offset(Addend addend) const
1060 {
1061   gold_assert(this->local_sym_index_ != GSYM_CODE
1062 	      && this->local_sym_index_ != SECTION_CODE
1063 	      && this->local_sym_index_ != TARGET_CODE
1064 	      && this->local_sym_index_ != INVALID_CODE
1065 	      && this->local_sym_index_ != 0
1066 	      && this->is_section_symbol_);
1067   const unsigned int lsi = this->local_sym_index_;
1068   Output_section* os = this->u1_.relobj->output_section(lsi);
1069   gold_assert(os != NULL);
1070   Address offset = this->u1_.relobj->get_output_section_offset(lsi);
1071   if (offset != invalid_address)
1072     return offset + addend;
1073   // This is a merge section.
1074   Sized_relobj_file<size, big_endian>* relobj =
1075       this->u1_.relobj->sized_relobj();
1076   gold_assert(relobj != NULL);
1077   offset = os->output_address(relobj, lsi, addend);
1078   gold_assert(offset != invalid_address);
1079   return offset;
1080 }
1081 
1082 // Get the output address of a relocation.
1083 
1084 template<bool dynamic, int size, bool big_endian>
1085 typename elfcpp::Elf_types<size>::Elf_Addr
get_address() const1086 Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::get_address() const
1087 {
1088   Address address = this->address_;
1089   if (this->shndx_ != INVALID_CODE)
1090     {
1091       Output_section* os = this->u2_.relobj->output_section(this->shndx_);
1092       gold_assert(os != NULL);
1093       Address off = this->u2_.relobj->get_output_section_offset(this->shndx_);
1094       if (off != invalid_address)
1095 	address += os->address() + off;
1096       else
1097 	{
1098 	  Sized_relobj_file<size, big_endian>* relobj =
1099 	      this->u2_.relobj->sized_relobj();
1100 	  gold_assert(relobj != NULL);
1101 	  address = os->output_address(relobj, this->shndx_, address);
1102 	  gold_assert(address != invalid_address);
1103 	}
1104     }
1105   else if (this->u2_.od != NULL)
1106     address += this->u2_.od->address();
1107   return address;
1108 }
1109 
1110 // Write out the offset and info fields of a Rel or Rela relocation
1111 // entry.
1112 
1113 template<bool dynamic, int size, bool big_endian>
1114 template<typename Write_rel>
1115 void
write_rel(Write_rel * wr) const1116 Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::write_rel(
1117     Write_rel* wr) const
1118 {
1119   wr->put_r_offset(this->get_address());
1120   unsigned int sym_index = this->get_symbol_index();
1121   wr->put_r_info(elfcpp::elf_r_info<size>(sym_index, this->type_));
1122 }
1123 
1124 // Write out a Rel relocation.
1125 
1126 template<bool dynamic, int size, bool big_endian>
1127 void
write(unsigned char * pov) const1128 Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::write(
1129     unsigned char* pov) const
1130 {
1131   elfcpp::Rel_write<size, big_endian> orel(pov);
1132   this->write_rel(&orel);
1133 }
1134 
1135 // Get the value of the symbol referred to by a Rel relocation.
1136 
1137 template<bool dynamic, int size, bool big_endian>
1138 typename elfcpp::Elf_types<size>::Elf_Addr
symbol_value(Addend addend) const1139 Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::symbol_value(
1140     Addend addend) const
1141 {
1142   if (this->local_sym_index_ == GSYM_CODE)
1143     {
1144       const Sized_symbol<size>* sym;
1145       sym = static_cast<const Sized_symbol<size>*>(this->u1_.gsym);
1146       if (this->use_plt_offset_ && sym->has_plt_offset())
1147 	return parameters->target().plt_address_for_global(sym);
1148       else
1149 	return sym->value() + addend;
1150     }
1151   if (this->local_sym_index_ == SECTION_CODE)
1152     {
1153       gold_assert(!this->use_plt_offset_);
1154       return this->u1_.os->address() + addend;
1155     }
1156   gold_assert(this->local_sym_index_ != TARGET_CODE
1157 	      && this->local_sym_index_ != INVALID_CODE
1158 	      && this->local_sym_index_ != 0
1159 	      && !this->is_section_symbol_);
1160   const unsigned int lsi = this->local_sym_index_;
1161   Sized_relobj_file<size, big_endian>* relobj =
1162       this->u1_.relobj->sized_relobj();
1163   gold_assert(relobj != NULL);
1164   if (this->use_plt_offset_)
1165     return parameters->target().plt_address_for_local(relobj, lsi);
1166   const Symbol_value<size>* symval = relobj->local_symbol(lsi);
1167   return symval->value(relobj, addend);
1168 }
1169 
1170 // Reloc comparison.  This function sorts the dynamic relocs for the
1171 // benefit of the dynamic linker.  First we sort all relative relocs
1172 // to the front.  Among relative relocs, we sort by output address.
1173 // Among non-relative relocs, we sort by symbol index, then by output
1174 // address.
1175 
1176 template<bool dynamic, int size, bool big_endian>
1177 int
1178 Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::
compare(const Output_reloc<elfcpp::SHT_REL,dynamic,size,big_endian> & r2) const1179   compare(const Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>& r2)
1180     const
1181 {
1182   if (this->is_relative_)
1183     {
1184       if (!r2.is_relative_)
1185 	return -1;
1186       // Otherwise sort by reloc address below.
1187     }
1188   else if (r2.is_relative_)
1189     return 1;
1190   else
1191     {
1192       unsigned int sym1 = this->get_symbol_index();
1193       unsigned int sym2 = r2.get_symbol_index();
1194       if (sym1 < sym2)
1195 	return -1;
1196       else if (sym1 > sym2)
1197 	return 1;
1198       // Otherwise sort by reloc address.
1199     }
1200 
1201   section_offset_type addr1 = this->get_address();
1202   section_offset_type addr2 = r2.get_address();
1203   if (addr1 < addr2)
1204     return -1;
1205   else if (addr1 > addr2)
1206     return 1;
1207 
1208   // Final tie breaker, in order to generate the same output on any
1209   // host: reloc type.
1210   unsigned int type1 = this->type_;
1211   unsigned int type2 = r2.type_;
1212   if (type1 < type2)
1213     return -1;
1214   else if (type1 > type2)
1215     return 1;
1216 
1217   // These relocs appear to be exactly the same.
1218   return 0;
1219 }
1220 
1221 // Write out a Rela relocation.
1222 
1223 template<bool dynamic, int size, bool big_endian>
1224 void
write(unsigned char * pov) const1225 Output_reloc<elfcpp::SHT_RELA, dynamic, size, big_endian>::write(
1226     unsigned char* pov) const
1227 {
1228   elfcpp::Rela_write<size, big_endian> orel(pov);
1229   this->rel_.write_rel(&orel);
1230   Addend addend = this->addend_;
1231   if (this->rel_.is_target_specific())
1232     addend = parameters->target().reloc_addend(this->rel_.target_arg(),
1233 					       this->rel_.type(), addend);
1234   else if (this->rel_.is_symbolless())
1235     addend = this->rel_.symbol_value(addend);
1236   else if (this->rel_.is_local_section_symbol())
1237     addend = this->rel_.local_section_offset(addend);
1238   orel.put_r_addend(addend);
1239 }
1240 
1241 // Output_data_reloc_base methods.
1242 
1243 // Adjust the output section.
1244 
1245 template<int sh_type, bool dynamic, int size, bool big_endian>
1246 void
1247 Output_data_reloc_base<sh_type, dynamic, size, big_endian>
do_adjust_output_section(Output_section * os)1248     ::do_adjust_output_section(Output_section* os)
1249 {
1250   if (sh_type == elfcpp::SHT_REL)
1251     os->set_entsize(elfcpp::Elf_sizes<size>::rel_size);
1252   else if (sh_type == elfcpp::SHT_RELA)
1253     os->set_entsize(elfcpp::Elf_sizes<size>::rela_size);
1254   else
1255     gold_unreachable();
1256 
1257   // A STT_GNU_IFUNC symbol may require a IRELATIVE reloc when doing a
1258   // static link.  The backends will generate a dynamic reloc section
1259   // to hold this.  In that case we don't want to link to the dynsym
1260   // section, because there isn't one.
1261   if (!dynamic)
1262     os->set_should_link_to_symtab();
1263   else if (parameters->doing_static_link())
1264     ;
1265   else
1266     os->set_should_link_to_dynsym();
1267 }
1268 
1269 // Standard relocation writer, which just calls Output_reloc::write().
1270 
1271 template<int sh_type, bool dynamic, int size, bool big_endian>
1272 struct Output_reloc_writer
1273 {
1274   typedef Output_reloc<sh_type, dynamic, size, big_endian> Output_reloc_type;
1275   typedef std::vector<Output_reloc_type> Relocs;
1276 
1277   static void
writegold::Output_reloc_writer1278   write(typename Relocs::const_iterator p, unsigned char* pov)
1279   { p->write(pov); }
1280 };
1281 
1282 // Write out relocation data.
1283 
1284 template<int sh_type, bool dynamic, int size, bool big_endian>
1285 void
do_write(Output_file * of)1286 Output_data_reloc_base<sh_type, dynamic, size, big_endian>::do_write(
1287     Output_file* of)
1288 {
1289   typedef Output_reloc_writer<sh_type, dynamic, size, big_endian> Writer;
1290   this->do_write_generic<Writer>(of);
1291 }
1292 
1293 // Class Output_relocatable_relocs.
1294 
1295 template<int sh_type, int size, bool big_endian>
1296 void
set_final_data_size()1297 Output_relocatable_relocs<sh_type, size, big_endian>::set_final_data_size()
1298 {
1299   this->set_data_size(this->rr_->output_reloc_count()
1300 		      * Reloc_types<sh_type, size, big_endian>::reloc_size);
1301 }
1302 
1303 // class Output_data_group.
1304 
1305 template<int size, bool big_endian>
Output_data_group(Sized_relobj_file<size,big_endian> * relobj,section_size_type entry_count,elfcpp::Elf_Word flags,std::vector<unsigned int> * input_shndxes)1306 Output_data_group<size, big_endian>::Output_data_group(
1307     Sized_relobj_file<size, big_endian>* relobj,
1308     section_size_type entry_count,
1309     elfcpp::Elf_Word flags,
1310     std::vector<unsigned int>* input_shndxes)
1311   : Output_section_data(entry_count * 4, 4, false),
1312     relobj_(relobj),
1313     flags_(flags)
1314 {
1315   this->input_shndxes_.swap(*input_shndxes);
1316 }
1317 
1318 // Write out the section group, which means translating the section
1319 // indexes to apply to the output file.
1320 
1321 template<int size, bool big_endian>
1322 void
do_write(Output_file * of)1323 Output_data_group<size, big_endian>::do_write(Output_file* of)
1324 {
1325   const off_t off = this->offset();
1326   const section_size_type oview_size =
1327     convert_to_section_size_type(this->data_size());
1328   unsigned char* const oview = of->get_output_view(off, oview_size);
1329 
1330   elfcpp::Elf_Word* contents = reinterpret_cast<elfcpp::Elf_Word*>(oview);
1331   elfcpp::Swap<32, big_endian>::writeval(contents, this->flags_);
1332   ++contents;
1333 
1334   for (std::vector<unsigned int>::const_iterator p =
1335 	 this->input_shndxes_.begin();
1336        p != this->input_shndxes_.end();
1337        ++p, ++contents)
1338     {
1339       Output_section* os = this->relobj_->output_section(*p);
1340 
1341       unsigned int output_shndx;
1342       if (os != NULL)
1343 	output_shndx = os->out_shndx();
1344       else
1345 	{
1346 	  this->relobj_->error(_("section group retained but "
1347 				 "group element discarded"));
1348 	  output_shndx = 0;
1349 	}
1350 
1351       elfcpp::Swap<32, big_endian>::writeval(contents, output_shndx);
1352     }
1353 
1354   size_t wrote = reinterpret_cast<unsigned char*>(contents) - oview;
1355   gold_assert(wrote == oview_size);
1356 
1357   of->write_output_view(off, oview_size, oview);
1358 
1359   // We no longer need this information.
1360   this->input_shndxes_.clear();
1361 }
1362 
1363 // Output_data_got::Got_entry methods.
1364 
1365 // Write out the entry.
1366 
1367 template<int got_size, bool big_endian>
1368 void
write(unsigned int got_indx,unsigned char * pov) const1369 Output_data_got<got_size, big_endian>::Got_entry::write(
1370     unsigned int got_indx,
1371     unsigned char* pov) const
1372 {
1373   Valtype val = 0;
1374 
1375   switch (this->local_sym_index_)
1376     {
1377     case GSYM_CODE:
1378       {
1379 	// If the symbol is resolved locally, we need to write out the
1380 	// link-time value, which will be relocated dynamically by a
1381 	// RELATIVE relocation.
1382 	Symbol* gsym = this->u_.gsym;
1383 	if (this->use_plt_or_tls_offset_ && gsym->has_plt_offset())
1384 	  val = parameters->target().plt_address_for_global(gsym);
1385 	else
1386 	  {
1387 	    switch (parameters->size_and_endianness())
1388 	      {
1389 #if defined(HAVE_TARGET_32_LITTLE) || defined(HAVE_TARGET_32_BIG)
1390 	      case Parameters::TARGET_32_LITTLE:
1391 	      case Parameters::TARGET_32_BIG:
1392 		{
1393 		  // This cast is ugly.  We don't want to put a
1394 		  // virtual method in Symbol, because we want Symbol
1395 		  // to be as small as possible.
1396 		  Sized_symbol<32>::Value_type v;
1397 		  v = static_cast<Sized_symbol<32>*>(gsym)->value();
1398 		  val = convert_types<Valtype, Sized_symbol<32>::Value_type>(v);
1399 		}
1400 		break;
1401 #endif
1402 #if defined(HAVE_TARGET_64_LITTLE) || defined(HAVE_TARGET_64_BIG)
1403 	      case Parameters::TARGET_64_LITTLE:
1404 	      case Parameters::TARGET_64_BIG:
1405 		{
1406 		  Sized_symbol<64>::Value_type v;
1407 		  v = static_cast<Sized_symbol<64>*>(gsym)->value();
1408 		  val = convert_types<Valtype, Sized_symbol<64>::Value_type>(v);
1409 		}
1410 		break;
1411 #endif
1412 	      default:
1413 		gold_unreachable();
1414 	      }
1415 	    if (this->use_plt_or_tls_offset_
1416 		&& gsym->type() == elfcpp::STT_TLS)
1417 	      val += parameters->target().tls_offset_for_global(gsym,
1418 								got_indx);
1419 	  }
1420       }
1421       break;
1422 
1423     case CONSTANT_CODE:
1424       val = this->u_.constant;
1425       break;
1426 
1427     case RESERVED_CODE:
1428       // If we're doing an incremental update, don't touch this GOT entry.
1429       if (parameters->incremental_update())
1430 	return;
1431       val = this->u_.constant;
1432       break;
1433 
1434     default:
1435       {
1436 	const Relobj* object = this->u_.object;
1437 	const unsigned int lsi = this->local_sym_index_;
1438 	bool is_tls = object->local_is_tls(lsi);
1439 	if (this->use_plt_or_tls_offset_ && !is_tls)
1440 	  val = parameters->target().plt_address_for_local(object, lsi);
1441 	else
1442 	  {
1443 	    uint64_t lval = object->local_symbol_value(lsi, this->addend_);
1444 	    val = convert_types<Valtype, uint64_t>(lval);
1445 	    if (this->use_plt_or_tls_offset_ && is_tls)
1446 	      val += parameters->target().tls_offset_for_local(object, lsi,
1447 							       got_indx);
1448 	  }
1449       }
1450       break;
1451     }
1452 
1453   elfcpp::Swap<got_size, big_endian>::writeval(pov, val);
1454 }
1455 
1456 // Output_data_got methods.
1457 
1458 // Add an entry for a global symbol to the GOT.  This returns true if
1459 // this is a new GOT entry, false if the symbol already had a GOT
1460 // entry.
1461 
1462 template<int got_size, bool big_endian>
1463 bool
add_global(Symbol * gsym,unsigned int got_type)1464 Output_data_got<got_size, big_endian>::add_global(
1465     Symbol* gsym,
1466     unsigned int got_type)
1467 {
1468   if (gsym->has_got_offset(got_type))
1469     return false;
1470 
1471   unsigned int got_offset = this->add_got_entry(Got_entry(gsym, false));
1472   gsym->set_got_offset(got_type, got_offset);
1473   return true;
1474 }
1475 
1476 // Like add_global, but use the PLT offset.
1477 
1478 template<int got_size, bool big_endian>
1479 bool
add_global_plt(Symbol * gsym,unsigned int got_type)1480 Output_data_got<got_size, big_endian>::add_global_plt(Symbol* gsym,
1481 						      unsigned int got_type)
1482 {
1483   if (gsym->has_got_offset(got_type))
1484     return false;
1485 
1486   unsigned int got_offset = this->add_got_entry(Got_entry(gsym, true));
1487   gsym->set_got_offset(got_type, got_offset);
1488   return true;
1489 }
1490 
1491 // Add an entry for a global symbol to the GOT, and add a dynamic
1492 // relocation of type R_TYPE for the GOT entry.
1493 
1494 template<int got_size, bool big_endian>
1495 void
add_global_with_rel(Symbol * gsym,unsigned int got_type,Output_data_reloc_generic * rel_dyn,unsigned int r_type)1496 Output_data_got<got_size, big_endian>::add_global_with_rel(
1497     Symbol* gsym,
1498     unsigned int got_type,
1499     Output_data_reloc_generic* rel_dyn,
1500     unsigned int r_type)
1501 {
1502   if (gsym->has_got_offset(got_type))
1503     return;
1504 
1505   unsigned int got_offset = this->add_got_entry(Got_entry());
1506   gsym->set_got_offset(got_type, got_offset);
1507   rel_dyn->add_global_generic(gsym, r_type, this, got_offset, 0);
1508 }
1509 
1510 // Add a pair of entries for a global symbol to the GOT, and add
1511 // dynamic relocations of type R_TYPE_1 and R_TYPE_2, respectively.
1512 // If R_TYPE_2 == 0, add the second entry with no relocation.
1513 template<int got_size, bool big_endian>
1514 void
add_global_pair_with_rel(Symbol * gsym,unsigned int got_type,Output_data_reloc_generic * rel_dyn,unsigned int r_type_1,unsigned int r_type_2)1515 Output_data_got<got_size, big_endian>::add_global_pair_with_rel(
1516     Symbol* gsym,
1517     unsigned int got_type,
1518     Output_data_reloc_generic* rel_dyn,
1519     unsigned int r_type_1,
1520     unsigned int r_type_2)
1521 {
1522   if (gsym->has_got_offset(got_type))
1523     return;
1524 
1525   unsigned int got_offset = this->add_got_entry_pair(Got_entry(), Got_entry());
1526   gsym->set_got_offset(got_type, got_offset);
1527   rel_dyn->add_global_generic(gsym, r_type_1, this, got_offset, 0);
1528 
1529   if (r_type_2 != 0)
1530     rel_dyn->add_global_generic(gsym, r_type_2, this,
1531 				got_offset + got_size / 8, 0);
1532 }
1533 
1534 // Add an entry for a local symbol to the GOT.  This returns true if
1535 // this is a new GOT entry, false if the symbol already has a GOT
1536 // entry.
1537 
1538 template<int got_size, bool big_endian>
1539 bool
add_local(Relobj * object,unsigned int symndx,unsigned int got_type)1540 Output_data_got<got_size, big_endian>::add_local(
1541     Relobj* object,
1542     unsigned int symndx,
1543     unsigned int got_type)
1544 {
1545   if (object->local_has_got_offset(symndx, got_type))
1546     return false;
1547 
1548   unsigned int got_offset = this->add_got_entry(Got_entry(object, symndx,
1549 							  false));
1550   object->set_local_got_offset(symndx, got_type, got_offset);
1551   return true;
1552 }
1553 
1554 // Add an entry for a local symbol plus ADDEND to the GOT.  This returns
1555 // true if this is a new GOT entry, false if the symbol already has a GOT
1556 // entry.
1557 
1558 template<int got_size, bool big_endian>
1559 bool
add_local(Relobj * object,unsigned int symndx,unsigned int got_type,uint64_t addend)1560 Output_data_got<got_size, big_endian>::add_local(
1561     Relobj* object,
1562     unsigned int symndx,
1563     unsigned int got_type,
1564     uint64_t addend)
1565 {
1566   if (object->local_has_got_offset(symndx, got_type, addend))
1567     return false;
1568 
1569   unsigned int got_offset = this->add_got_entry(Got_entry(object, symndx,
1570 							  false, addend));
1571   object->set_local_got_offset(symndx, got_type, got_offset, addend);
1572   return true;
1573 }
1574 
1575 // Like add_local, but use the PLT offset.
1576 
1577 template<int got_size, bool big_endian>
1578 bool
add_local_plt(Relobj * object,unsigned int symndx,unsigned int got_type)1579 Output_data_got<got_size, big_endian>::add_local_plt(
1580     Relobj* object,
1581     unsigned int symndx,
1582     unsigned int got_type)
1583 {
1584   if (object->local_has_got_offset(symndx, got_type))
1585     return false;
1586 
1587   unsigned int got_offset = this->add_got_entry(Got_entry(object, symndx,
1588 							  true));
1589   object->set_local_got_offset(symndx, got_type, got_offset);
1590   return true;
1591 }
1592 
1593 // Add an entry for a local symbol to the GOT, and add a dynamic
1594 // relocation of type R_TYPE for the GOT entry.
1595 
1596 template<int got_size, bool big_endian>
1597 void
add_local_with_rel(Relobj * object,unsigned int symndx,unsigned int got_type,Output_data_reloc_generic * rel_dyn,unsigned int r_type)1598 Output_data_got<got_size, big_endian>::add_local_with_rel(
1599     Relobj* object,
1600     unsigned int symndx,
1601     unsigned int got_type,
1602     Output_data_reloc_generic* rel_dyn,
1603     unsigned int r_type)
1604 {
1605   if (object->local_has_got_offset(symndx, got_type))
1606     return;
1607 
1608   unsigned int got_offset = this->add_got_entry(Got_entry());
1609   object->set_local_got_offset(symndx, got_type, got_offset);
1610   rel_dyn->add_local_generic(object, symndx, r_type, this, got_offset, 0);
1611 }
1612 
1613 // Add an entry for a local symbol plus ADDEND to the GOT, and add a dynamic
1614 // relocation of type R_TYPE for the GOT entry.
1615 
1616 template<int got_size, bool big_endian>
1617 void
add_local_with_rel(Relobj * object,unsigned int symndx,unsigned int got_type,Output_data_reloc_generic * rel_dyn,unsigned int r_type,uint64_t addend)1618 Output_data_got<got_size, big_endian>::add_local_with_rel(
1619     Relobj* object,
1620     unsigned int symndx,
1621     unsigned int got_type,
1622     Output_data_reloc_generic* rel_dyn,
1623     unsigned int r_type, uint64_t addend)
1624 {
1625   if (object->local_has_got_offset(symndx, got_type, addend))
1626     return;
1627 
1628   unsigned int got_offset = this->add_got_entry(Got_entry());
1629   object->set_local_got_offset(symndx, got_type, got_offset, addend);
1630   rel_dyn->add_local_generic(object, symndx, r_type, this, got_offset,
1631                              addend);
1632 }
1633 
1634 // Add a pair of entries for a local symbol to the GOT, and add
1635 // a dynamic relocation of type R_TYPE using the section symbol of
1636 // the output section to which input section SHNDX maps, on the first.
1637 // The first got entry will have a value of zero, the second the
1638 // value of the local symbol.
1639 template<int got_size, bool big_endian>
1640 void
add_local_pair_with_rel(Relobj * object,unsigned int symndx,unsigned int shndx,unsigned int got_type,Output_data_reloc_generic * rel_dyn,unsigned int r_type)1641 Output_data_got<got_size, big_endian>::add_local_pair_with_rel(
1642     Relobj* object,
1643     unsigned int symndx,
1644     unsigned int shndx,
1645     unsigned int got_type,
1646     Output_data_reloc_generic* rel_dyn,
1647     unsigned int r_type)
1648 {
1649   if (object->local_has_got_offset(symndx, got_type))
1650     return;
1651 
1652   unsigned int got_offset =
1653       this->add_got_entry_pair(Got_entry(),
1654 			       Got_entry(object, symndx, false));
1655   object->set_local_got_offset(symndx, got_type, got_offset);
1656   Output_section* os = object->output_section(shndx);
1657   rel_dyn->add_output_section_generic(os, r_type, this, got_offset, 0);
1658 }
1659 
1660 // Add a pair of entries for a local symbol plus ADDEND to the GOT, and add
1661 // a dynamic relocation of type R_TYPE using the section symbol of
1662 // the output section to which input section SHNDX maps, on the first.
1663 // The first got entry will have a value of zero, the second the
1664 // value of the local symbol.
1665 template<int got_size, bool big_endian>
1666 void
add_local_pair_with_rel(Relobj * object,unsigned int symndx,unsigned int shndx,unsigned int got_type,Output_data_reloc_generic * rel_dyn,unsigned int r_type,uint64_t addend)1667 Output_data_got<got_size, big_endian>::add_local_pair_with_rel(
1668     Relobj* object,
1669     unsigned int symndx,
1670     unsigned int shndx,
1671     unsigned int got_type,
1672     Output_data_reloc_generic* rel_dyn,
1673     unsigned int r_type, uint64_t addend)
1674 {
1675   if (object->local_has_got_offset(symndx, got_type, addend))
1676     return;
1677 
1678   unsigned int got_offset =
1679       this->add_got_entry_pair(Got_entry(),
1680 			       Got_entry(object, symndx, false, addend));
1681   object->set_local_got_offset(symndx, got_type, got_offset, addend);
1682   Output_section* os = object->output_section(shndx);
1683   rel_dyn->add_output_section_generic(os, r_type, this, got_offset, addend);
1684 }
1685 
1686 // Add a pair of entries for a local symbol to the GOT, and add
1687 // a dynamic relocation of type R_TYPE using STN_UNDEF on the first.
1688 // The first got entry will have a value of zero, the second the
1689 // value of the local symbol offset by Target::tls_offset_for_local.
1690 template<int got_size, bool big_endian>
1691 void
add_local_tls_pair(Relobj * object,unsigned int symndx,unsigned int got_type,Output_data_reloc_generic * rel_dyn,unsigned int r_type)1692 Output_data_got<got_size, big_endian>::add_local_tls_pair(
1693     Relobj* object,
1694     unsigned int symndx,
1695     unsigned int got_type,
1696     Output_data_reloc_generic* rel_dyn,
1697     unsigned int r_type)
1698 {
1699   if (object->local_has_got_offset(symndx, got_type))
1700     return;
1701 
1702   unsigned int got_offset
1703     = this->add_got_entry_pair(Got_entry(),
1704 			       Got_entry(object, symndx, true));
1705   object->set_local_got_offset(symndx, got_type, got_offset);
1706   rel_dyn->add_local_generic(object, 0, r_type, this, got_offset, 0);
1707 }
1708 
1709 // Reserve a slot in the GOT for a local symbol or the second slot of a pair.
1710 
1711 template<int got_size, bool big_endian>
1712 void
reserve_local(unsigned int i,Relobj * object,unsigned int sym_index,unsigned int got_type)1713 Output_data_got<got_size, big_endian>::reserve_local(
1714     unsigned int i,
1715     Relobj* object,
1716     unsigned int sym_index,
1717     unsigned int got_type)
1718 {
1719   this->do_reserve_slot(i);
1720   object->set_local_got_offset(sym_index, got_type, this->got_offset(i));
1721 }
1722 
1723 // Reserve a slot in the GOT for a global symbol.
1724 
1725 template<int got_size, bool big_endian>
1726 void
reserve_global(unsigned int i,Symbol * gsym,unsigned int got_type)1727 Output_data_got<got_size, big_endian>::reserve_global(
1728     unsigned int i,
1729     Symbol* gsym,
1730     unsigned int got_type)
1731 {
1732   this->do_reserve_slot(i);
1733   gsym->set_got_offset(got_type, this->got_offset(i));
1734 }
1735 
1736 // Write out the GOT.
1737 
1738 template<int got_size, bool big_endian>
1739 void
do_write(Output_file * of)1740 Output_data_got<got_size, big_endian>::do_write(Output_file* of)
1741 {
1742   const int add = got_size / 8;
1743 
1744   const off_t off = this->offset();
1745   const off_t oview_size = this->data_size();
1746   unsigned char* const oview = of->get_output_view(off, oview_size);
1747 
1748   unsigned char* pov = oview;
1749   for (unsigned int i = 0; i < this->entries_.size(); ++i)
1750     {
1751       this->entries_[i].write(i, pov);
1752       pov += add;
1753     }
1754 
1755   gold_assert(pov - oview == oview_size);
1756 
1757   of->write_output_view(off, oview_size, oview);
1758 
1759   // We no longer need the GOT entries.
1760   this->entries_.clear();
1761 }
1762 
1763 // Create a new GOT entry and return its offset.
1764 
1765 template<int got_size, bool big_endian>
1766 unsigned int
add_got_entry(Got_entry got_entry)1767 Output_data_got<got_size, big_endian>::add_got_entry(Got_entry got_entry)
1768 {
1769   if (!this->is_data_size_valid())
1770     {
1771       this->entries_.push_back(got_entry);
1772       this->set_got_size();
1773       return this->last_got_offset();
1774     }
1775   else
1776     {
1777       // For an incremental update, find an available slot.
1778       off_t got_offset = this->free_list_.allocate(got_size / 8,
1779 						   got_size / 8, 0);
1780       if (got_offset == -1)
1781 	gold_fallback(_("out of patch space (GOT);"
1782 			" relink with --incremental-full"));
1783       unsigned int got_index = got_offset / (got_size / 8);
1784       gold_assert(got_index < this->entries_.size());
1785       this->entries_[got_index] = got_entry;
1786       return static_cast<unsigned int>(got_offset);
1787     }
1788 }
1789 
1790 // Create a pair of new GOT entries and return the offset of the first.
1791 
1792 template<int got_size, bool big_endian>
1793 unsigned int
add_got_entry_pair(Got_entry got_entry_1,Got_entry got_entry_2)1794 Output_data_got<got_size, big_endian>::add_got_entry_pair(
1795     Got_entry got_entry_1,
1796     Got_entry got_entry_2)
1797 {
1798   if (!this->is_data_size_valid())
1799     {
1800       unsigned int got_offset;
1801       this->entries_.push_back(got_entry_1);
1802       got_offset = this->last_got_offset();
1803       this->entries_.push_back(got_entry_2);
1804       this->set_got_size();
1805       return got_offset;
1806     }
1807   else
1808     {
1809       // For an incremental update, find an available pair of slots.
1810       off_t got_offset = this->free_list_.allocate(2 * got_size / 8,
1811 						   got_size / 8, 0);
1812       if (got_offset == -1)
1813 	gold_fallback(_("out of patch space (GOT);"
1814 			" relink with --incremental-full"));
1815       unsigned int got_index = got_offset / (got_size / 8);
1816       gold_assert(got_index < this->entries_.size());
1817       this->entries_[got_index] = got_entry_1;
1818       this->entries_[got_index + 1] = got_entry_2;
1819       return static_cast<unsigned int>(got_offset);
1820     }
1821 }
1822 
1823 // Replace GOT entry I with a new value.
1824 
1825 template<int got_size, bool big_endian>
1826 void
replace_got_entry(unsigned int i,Got_entry got_entry)1827 Output_data_got<got_size, big_endian>::replace_got_entry(
1828     unsigned int i,
1829     Got_entry got_entry)
1830 {
1831   gold_assert(i < this->entries_.size());
1832   this->entries_[i] = got_entry;
1833 }
1834 
1835 // Output_data_dynamic::Dynamic_entry methods.
1836 
1837 // Write out the entry.
1838 
1839 template<int size, bool big_endian>
1840 void
write(unsigned char * pov,const Stringpool * pool) const1841 Output_data_dynamic::Dynamic_entry::write(
1842     unsigned char* pov,
1843     const Stringpool* pool) const
1844 {
1845   typename elfcpp::Elf_types<size>::Elf_WXword val;
1846   switch (this->offset_)
1847     {
1848     case DYNAMIC_NUMBER:
1849       val = this->u_.val;
1850       break;
1851 
1852     case DYNAMIC_SECTION_SIZE:
1853       val = this->u_.od->data_size();
1854       if (this->od2 != NULL)
1855 	val += this->od2->data_size();
1856       break;
1857 
1858     case DYNAMIC_SYMBOL:
1859       {
1860 	const Sized_symbol<size>* s =
1861 	  static_cast<const Sized_symbol<size>*>(this->u_.sym);
1862 	val = s->value();
1863       }
1864       break;
1865 
1866     case DYNAMIC_STRING:
1867       val = pool->get_offset(this->u_.str);
1868       break;
1869 
1870     case DYNAMIC_CUSTOM:
1871       val = parameters->target().dynamic_tag_custom_value(this->tag_);
1872       break;
1873 
1874     default:
1875       val = this->u_.od->address() + this->offset_;
1876       break;
1877     }
1878 
1879   elfcpp::Dyn_write<size, big_endian> dw(pov);
1880   dw.put_d_tag(this->tag_);
1881   dw.put_d_val(val);
1882 }
1883 
1884 // Output_data_dynamic methods.
1885 
1886 // Adjust the output section to set the entry size.
1887 
1888 void
do_adjust_output_section(Output_section * os)1889 Output_data_dynamic::do_adjust_output_section(Output_section* os)
1890 {
1891   if (parameters->target().get_size() == 32)
1892     os->set_entsize(elfcpp::Elf_sizes<32>::dyn_size);
1893   else if (parameters->target().get_size() == 64)
1894     os->set_entsize(elfcpp::Elf_sizes<64>::dyn_size);
1895   else
1896     gold_unreachable();
1897 }
1898 
1899 // Get a dynamic entry offset.
1900 
1901 unsigned int
get_entry_offset(elfcpp::DT tag) const1902 Output_data_dynamic::get_entry_offset(elfcpp::DT tag) const
1903 {
1904   int dyn_size;
1905 
1906   if (parameters->target().get_size() == 32)
1907     dyn_size = elfcpp::Elf_sizes<32>::dyn_size;
1908   else if (parameters->target().get_size() == 64)
1909     dyn_size = elfcpp::Elf_sizes<64>::dyn_size;
1910   else
1911     gold_unreachable();
1912 
1913   for (size_t i = 0; i < entries_.size(); ++i)
1914     if (entries_[i].tag() == tag)
1915       return i * dyn_size;
1916 
1917   return -1U;
1918 }
1919 
1920 // Set the final data size.
1921 
1922 void
set_final_data_size()1923 Output_data_dynamic::set_final_data_size()
1924 {
1925   // Add the terminating entry if it hasn't been added.
1926   // Because of relaxation, we can run this multiple times.
1927   if (this->entries_.empty() || this->entries_.back().tag() != elfcpp::DT_NULL)
1928     {
1929       int extra = parameters->options().spare_dynamic_tags();
1930       for (int i = 0; i < extra; ++i)
1931 	this->add_constant(elfcpp::DT_NULL, 0);
1932       this->add_constant(elfcpp::DT_NULL, 0);
1933     }
1934 
1935   int dyn_size;
1936   if (parameters->target().get_size() == 32)
1937     dyn_size = elfcpp::Elf_sizes<32>::dyn_size;
1938   else if (parameters->target().get_size() == 64)
1939     dyn_size = elfcpp::Elf_sizes<64>::dyn_size;
1940   else
1941     gold_unreachable();
1942   this->set_data_size(this->entries_.size() * dyn_size);
1943 }
1944 
1945 // Write out the dynamic entries.
1946 
1947 void
do_write(Output_file * of)1948 Output_data_dynamic::do_write(Output_file* of)
1949 {
1950   switch (parameters->size_and_endianness())
1951     {
1952 #ifdef HAVE_TARGET_32_LITTLE
1953     case Parameters::TARGET_32_LITTLE:
1954       this->sized_write<32, false>(of);
1955       break;
1956 #endif
1957 #ifdef HAVE_TARGET_32_BIG
1958     case Parameters::TARGET_32_BIG:
1959       this->sized_write<32, true>(of);
1960       break;
1961 #endif
1962 #ifdef HAVE_TARGET_64_LITTLE
1963     case Parameters::TARGET_64_LITTLE:
1964       this->sized_write<64, false>(of);
1965       break;
1966 #endif
1967 #ifdef HAVE_TARGET_64_BIG
1968     case Parameters::TARGET_64_BIG:
1969       this->sized_write<64, true>(of);
1970       break;
1971 #endif
1972     default:
1973       gold_unreachable();
1974     }
1975 }
1976 
1977 template<int size, bool big_endian>
1978 void
sized_write(Output_file * of)1979 Output_data_dynamic::sized_write(Output_file* of)
1980 {
1981   const int dyn_size = elfcpp::Elf_sizes<size>::dyn_size;
1982 
1983   const off_t offset = this->offset();
1984   const off_t oview_size = this->data_size();
1985   unsigned char* const oview = of->get_output_view(offset, oview_size);
1986 
1987   unsigned char* pov = oview;
1988   for (typename Dynamic_entries::const_iterator p = this->entries_.begin();
1989        p != this->entries_.end();
1990        ++p)
1991     {
1992       p->write<size, big_endian>(pov, this->pool_);
1993       pov += dyn_size;
1994     }
1995 
1996   gold_assert(pov - oview == oview_size);
1997 
1998   of->write_output_view(offset, oview_size, oview);
1999 
2000   // We no longer need the dynamic entries.
2001   this->entries_.clear();
2002 }
2003 
2004 // Class Output_symtab_xindex.
2005 
2006 void
do_write(Output_file * of)2007 Output_symtab_xindex::do_write(Output_file* of)
2008 {
2009   const off_t offset = this->offset();
2010   const off_t oview_size = this->data_size();
2011   unsigned char* const oview = of->get_output_view(offset, oview_size);
2012 
2013   memset(oview, 0, oview_size);
2014 
2015   if (parameters->target().is_big_endian())
2016     this->endian_do_write<true>(oview);
2017   else
2018     this->endian_do_write<false>(oview);
2019 
2020   of->write_output_view(offset, oview_size, oview);
2021 
2022   // We no longer need the data.
2023   this->entries_.clear();
2024 }
2025 
2026 template<bool big_endian>
2027 void
endian_do_write(unsigned char * const oview)2028 Output_symtab_xindex::endian_do_write(unsigned char* const oview)
2029 {
2030   for (Xindex_entries::const_iterator p = this->entries_.begin();
2031        p != this->entries_.end();
2032        ++p)
2033     {
2034       unsigned int symndx = p->first;
2035       gold_assert(static_cast<off_t>(symndx) * 4 < this->data_size());
2036       elfcpp::Swap<32, big_endian>::writeval(oview + symndx * 4, p->second);
2037     }
2038 }
2039 
2040 // Output_fill_debug_info methods.
2041 
2042 // Return the minimum size needed for a dummy compilation unit header.
2043 
2044 size_t
do_minimum_hole_size() const2045 Output_fill_debug_info::do_minimum_hole_size() const
2046 {
2047   // Compile unit header fields: unit_length, version, debug_abbrev_offset,
2048   // address_size.
2049   const size_t len = 4 + 2 + 4 + 1;
2050   // For type units, add type_signature, type_offset.
2051   if (this->is_debug_types_)
2052     return len + 8 + 4;
2053   return len;
2054 }
2055 
2056 // Write a dummy compilation unit header to fill a hole in the
2057 // .debug_info or .debug_types section.
2058 
2059 void
do_write(Output_file * of,off_t off,size_t len) const2060 Output_fill_debug_info::do_write(Output_file* of, off_t off, size_t len) const
2061 {
2062   gold_debug(DEBUG_INCREMENTAL, "fill_debug_info(%08lx, %08lx)",
2063 	     static_cast<long>(off), static_cast<long>(len));
2064 
2065   gold_assert(len >= this->do_minimum_hole_size());
2066 
2067   unsigned char* const oview = of->get_output_view(off, len);
2068   unsigned char* pov = oview;
2069 
2070   // Write header fields: unit_length, version, debug_abbrev_offset,
2071   // address_size.
2072   if (this->is_big_endian())
2073     {
2074       elfcpp::Swap_unaligned<32, true>::writeval(pov, len - 4);
2075       elfcpp::Swap_unaligned<16, true>::writeval(pov + 4, this->version);
2076       elfcpp::Swap_unaligned<32, true>::writeval(pov + 6, 0);
2077     }
2078   else
2079     {
2080       elfcpp::Swap_unaligned<32, false>::writeval(pov, len - 4);
2081       elfcpp::Swap_unaligned<16, false>::writeval(pov + 4, this->version);
2082       elfcpp::Swap_unaligned<32, false>::writeval(pov + 6, 0);
2083     }
2084   pov += 4 + 2 + 4;
2085   *pov++ = 4;
2086 
2087   // For type units, the additional header fields -- type_signature,
2088   // type_offset -- can be filled with zeroes.
2089 
2090   // Fill the remainder of the free space with zeroes.  The first
2091   // zero should tell the consumer there are no DIEs to read in this
2092   // compilation unit.
2093   if (pov < oview + len)
2094     memset(pov, 0, oview + len - pov);
2095 
2096   of->write_output_view(off, len, oview);
2097 }
2098 
2099 // Output_fill_debug_line methods.
2100 
2101 // Return the minimum size needed for a dummy line number program header.
2102 
2103 size_t
do_minimum_hole_size() const2104 Output_fill_debug_line::do_minimum_hole_size() const
2105 {
2106   // Line number program header fields: unit_length, version, header_length,
2107   // minimum_instruction_length, default_is_stmt, line_base, line_range,
2108   // opcode_base, standard_opcode_lengths[], include_directories, filenames.
2109   const size_t len = 4 + 2 + 4 + this->header_length;
2110   return len;
2111 }
2112 
2113 // Write a dummy line number program header to fill a hole in the
2114 // .debug_line section.
2115 
2116 void
do_write(Output_file * of,off_t off,size_t len) const2117 Output_fill_debug_line::do_write(Output_file* of, off_t off, size_t len) const
2118 {
2119   gold_debug(DEBUG_INCREMENTAL, "fill_debug_line(%08lx, %08lx)",
2120 	     static_cast<long>(off), static_cast<long>(len));
2121 
2122   gold_assert(len >= this->do_minimum_hole_size());
2123 
2124   unsigned char* const oview = of->get_output_view(off, len);
2125   unsigned char* pov = oview;
2126 
2127   // Write header fields: unit_length, version, header_length,
2128   // minimum_instruction_length, default_is_stmt, line_base, line_range,
2129   // opcode_base, standard_opcode_lengths[], include_directories, filenames.
2130   // We set the header_length field to cover the entire hole, so the
2131   // line number program is empty.
2132   if (this->is_big_endian())
2133     {
2134       elfcpp::Swap_unaligned<32, true>::writeval(pov, len - 4);
2135       elfcpp::Swap_unaligned<16, true>::writeval(pov + 4, this->version);
2136       elfcpp::Swap_unaligned<32, true>::writeval(pov + 6, len - (4 + 2 + 4));
2137     }
2138   else
2139     {
2140       elfcpp::Swap_unaligned<32, false>::writeval(pov, len - 4);
2141       elfcpp::Swap_unaligned<16, false>::writeval(pov + 4, this->version);
2142       elfcpp::Swap_unaligned<32, false>::writeval(pov + 6, len - (4 + 2 + 4));
2143     }
2144   pov += 4 + 2 + 4;
2145   *pov++ = 1;	// minimum_instruction_length
2146   *pov++ = 0;	// default_is_stmt
2147   *pov++ = 0;	// line_base
2148   *pov++ = 5;	// line_range
2149   *pov++ = 13;	// opcode_base
2150   *pov++ = 0;	// standard_opcode_lengths[1]
2151   *pov++ = 1;	// standard_opcode_lengths[2]
2152   *pov++ = 1;	// standard_opcode_lengths[3]
2153   *pov++ = 1;	// standard_opcode_lengths[4]
2154   *pov++ = 1;	// standard_opcode_lengths[5]
2155   *pov++ = 0;	// standard_opcode_lengths[6]
2156   *pov++ = 0;	// standard_opcode_lengths[7]
2157   *pov++ = 0;	// standard_opcode_lengths[8]
2158   *pov++ = 1;	// standard_opcode_lengths[9]
2159   *pov++ = 0;	// standard_opcode_lengths[10]
2160   *pov++ = 0;	// standard_opcode_lengths[11]
2161   *pov++ = 1;	// standard_opcode_lengths[12]
2162   *pov++ = 0;	// include_directories (empty)
2163   *pov++ = 0;	// filenames (empty)
2164 
2165   // Some consumers don't check the header_length field, and simply
2166   // start reading the line number program immediately following the
2167   // header.  For those consumers, we fill the remainder of the free
2168   // space with DW_LNS_set_basic_block opcodes.  These are effectively
2169   // no-ops: the resulting line table program will not create any rows.
2170   if (pov < oview + len)
2171     memset(pov, elfcpp::DW_LNS_set_basic_block, oview + len - pov);
2172 
2173   of->write_output_view(off, len, oview);
2174 }
2175 
2176 // Output_section::Input_section methods.
2177 
2178 // Return the current data size.  For an input section we store the size here.
2179 // For an Output_section_data, we have to ask it for the size.
2180 
2181 off_t
current_data_size() const2182 Output_section::Input_section::current_data_size() const
2183 {
2184   if (this->is_input_section())
2185     return this->u1_.data_size;
2186   else
2187     {
2188       this->u2_.posd->pre_finalize_data_size();
2189       return this->u2_.posd->current_data_size();
2190     }
2191 }
2192 
2193 // Return the data size.  For an input section we store the size here.
2194 // For an Output_section_data, we have to ask it for the size.
2195 
2196 off_t
data_size() const2197 Output_section::Input_section::data_size() const
2198 {
2199   if (this->is_input_section())
2200     return this->u1_.data_size;
2201   else
2202     return this->u2_.posd->data_size();
2203 }
2204 
2205 // Return the object for an input section.
2206 
2207 Relobj*
relobj() const2208 Output_section::Input_section::relobj() const
2209 {
2210   if (this->is_input_section())
2211     return this->u2_.object;
2212   else if (this->is_merge_section())
2213     {
2214       gold_assert(this->u2_.pomb->first_relobj() != NULL);
2215       return this->u2_.pomb->first_relobj();
2216     }
2217   else if (this->is_relaxed_input_section())
2218     return this->u2_.poris->relobj();
2219   else
2220     gold_unreachable();
2221 }
2222 
2223 // Return the input section index for an input section.
2224 
2225 unsigned int
shndx() const2226 Output_section::Input_section::shndx() const
2227 {
2228   if (this->is_input_section())
2229     return this->shndx_;
2230   else if (this->is_merge_section())
2231     {
2232       gold_assert(this->u2_.pomb->first_relobj() != NULL);
2233       return this->u2_.pomb->first_shndx();
2234     }
2235   else if (this->is_relaxed_input_section())
2236     return this->u2_.poris->shndx();
2237   else
2238     gold_unreachable();
2239 }
2240 
2241 // Set the address and file offset.
2242 
2243 void
set_address_and_file_offset(uint64_t address,off_t file_offset,off_t section_file_offset)2244 Output_section::Input_section::set_address_and_file_offset(
2245     uint64_t address,
2246     off_t file_offset,
2247     off_t section_file_offset)
2248 {
2249   if (this->is_input_section())
2250     this->u2_.object->set_section_offset(this->shndx_,
2251 					 file_offset - section_file_offset);
2252   else
2253     this->u2_.posd->set_address_and_file_offset(address, file_offset);
2254 }
2255 
2256 // Reset the address and file offset.
2257 
2258 void
reset_address_and_file_offset()2259 Output_section::Input_section::reset_address_and_file_offset()
2260 {
2261   if (!this->is_input_section())
2262     this->u2_.posd->reset_address_and_file_offset();
2263 }
2264 
2265 // Finalize the data size.
2266 
2267 void
finalize_data_size()2268 Output_section::Input_section::finalize_data_size()
2269 {
2270   if (!this->is_input_section())
2271     this->u2_.posd->finalize_data_size();
2272 }
2273 
2274 // Try to turn an input offset into an output offset.  We want to
2275 // return the output offset relative to the start of this
2276 // Input_section in the output section.
2277 
2278 inline bool
output_offset(const Relobj * object,unsigned int shndx,section_offset_type offset,section_offset_type * poutput) const2279 Output_section::Input_section::output_offset(
2280     const Relobj* object,
2281     unsigned int shndx,
2282     section_offset_type offset,
2283     section_offset_type* poutput) const
2284 {
2285   if (!this->is_input_section())
2286     return this->u2_.posd->output_offset(object, shndx, offset, poutput);
2287   else
2288     {
2289       if (this->shndx_ != shndx || this->u2_.object != object)
2290 	return false;
2291       *poutput = offset;
2292       return true;
2293     }
2294 }
2295 
2296 // Write out the data.  We don't have to do anything for an input
2297 // section--they are handled via Object::relocate--but this is where
2298 // we write out the data for an Output_section_data.
2299 
2300 void
write(Output_file * of)2301 Output_section::Input_section::write(Output_file* of)
2302 {
2303   if (!this->is_input_section())
2304     this->u2_.posd->write(of);
2305 }
2306 
2307 // Write the data to a buffer.  As for write(), we don't have to do
2308 // anything for an input section.
2309 
2310 void
write_to_buffer(unsigned char * buffer)2311 Output_section::Input_section::write_to_buffer(unsigned char* buffer)
2312 {
2313   if (!this->is_input_section())
2314     this->u2_.posd->write_to_buffer(buffer);
2315 }
2316 
2317 // Print to a map file.
2318 
2319 void
print_to_mapfile(Mapfile * mapfile) const2320 Output_section::Input_section::print_to_mapfile(Mapfile* mapfile) const
2321 {
2322   switch (this->shndx_)
2323     {
2324     case OUTPUT_SECTION_CODE:
2325     case MERGE_DATA_SECTION_CODE:
2326     case MERGE_STRING_SECTION_CODE:
2327       this->u2_.posd->print_to_mapfile(mapfile);
2328       break;
2329 
2330     case RELAXED_INPUT_SECTION_CODE:
2331       {
2332 	Output_relaxed_input_section* relaxed_section =
2333 	  this->relaxed_input_section();
2334 	mapfile->print_input_section(relaxed_section->relobj(),
2335 				     relaxed_section->shndx());
2336       }
2337       break;
2338     default:
2339       mapfile->print_input_section(this->u2_.object, this->shndx_);
2340       break;
2341     }
2342 }
2343 
2344 // Output_section methods.
2345 
2346 // Construct an Output_section.  NAME will point into a Stringpool.
2347 
Output_section(const char * name,elfcpp::Elf_Word type,elfcpp::Elf_Xword flags)2348 Output_section::Output_section(const char* name, elfcpp::Elf_Word type,
2349 			       elfcpp::Elf_Xword flags)
2350   : name_(name),
2351     addralign_(0),
2352     entsize_(0),
2353     load_address_(0),
2354     link_section_(NULL),
2355     link_(0),
2356     info_section_(NULL),
2357     info_symndx_(NULL),
2358     info_(0),
2359     type_(type),
2360     flags_(flags),
2361     order_(ORDER_INVALID),
2362     out_shndx_(-1U),
2363     symtab_index_(0),
2364     dynsym_index_(0),
2365     input_sections_(),
2366     first_input_offset_(0),
2367     fills_(),
2368     postprocessing_buffer_(NULL),
2369     needs_symtab_index_(false),
2370     needs_dynsym_index_(false),
2371     should_link_to_symtab_(false),
2372     should_link_to_dynsym_(false),
2373     after_input_sections_(false),
2374     requires_postprocessing_(false),
2375     found_in_sections_clause_(false),
2376     has_load_address_(false),
2377     info_uses_section_index_(false),
2378     input_section_order_specified_(false),
2379     may_sort_attached_input_sections_(false),
2380     must_sort_attached_input_sections_(false),
2381     attached_input_sections_are_sorted_(false),
2382     is_relro_(false),
2383     is_small_section_(false),
2384     is_large_section_(false),
2385     generate_code_fills_at_write_(false),
2386     is_entsize_zero_(false),
2387     section_offsets_need_adjustment_(false),
2388     is_noload_(false),
2389     always_keeps_input_sections_(false),
2390     has_fixed_layout_(false),
2391     is_patch_space_allowed_(false),
2392     is_unique_segment_(false),
2393     tls_offset_(0),
2394     extra_segment_flags_(0),
2395     segment_alignment_(0),
2396     checkpoint_(NULL),
2397     lookup_maps_(new Output_section_lookup_maps),
2398     free_list_(),
2399     free_space_fill_(NULL),
2400     patch_space_(0),
2401     reloc_section_(NULL)
2402 {
2403   // An unallocated section has no address.  Forcing this means that
2404   // we don't need special treatment for symbols defined in debug
2405   // sections.
2406   if ((flags & elfcpp::SHF_ALLOC) == 0)
2407     this->set_address(0);
2408 }
2409 
~Output_section()2410 Output_section::~Output_section()
2411 {
2412   delete this->checkpoint_;
2413 }
2414 
2415 // Set the entry size.
2416 
2417 void
set_entsize(uint64_t v)2418 Output_section::set_entsize(uint64_t v)
2419 {
2420   if (this->is_entsize_zero_)
2421     ;
2422   else if (this->entsize_ == 0)
2423     this->entsize_ = v;
2424   else if (this->entsize_ != v)
2425     {
2426       this->entsize_ = 0;
2427       this->is_entsize_zero_ = 1;
2428     }
2429 }
2430 
2431 // Add the input section SHNDX, with header SHDR, named SECNAME, in
2432 // OBJECT, to the Output_section.  RELOC_SHNDX is the index of a
2433 // relocation section which applies to this section, or 0 if none, or
2434 // -1U if more than one.  Return the offset of the input section
2435 // within the output section.  Return -1 if the input section will
2436 // receive special handling.  In the normal case we don't always keep
2437 // track of input sections for an Output_section.  Instead, each
2438 // Object keeps track of the Output_section for each of its input
2439 // sections.  However, if HAVE_SECTIONS_SCRIPT is true, we do keep
2440 // track of input sections here; this is used when SECTIONS appears in
2441 // a linker script.
2442 
2443 template<int size, bool big_endian>
2444 off_t
add_input_section(Layout * layout,Sized_relobj_file<size,big_endian> * object,unsigned int shndx,const char * secname,const elfcpp::Shdr<size,big_endian> & shdr,unsigned int reloc_shndx,bool have_sections_script)2445 Output_section::add_input_section(Layout* layout,
2446 				  Sized_relobj_file<size, big_endian>* object,
2447 				  unsigned int shndx,
2448 				  const char* secname,
2449 				  const elfcpp::Shdr<size, big_endian>& shdr,
2450 				  unsigned int reloc_shndx,
2451 				  bool have_sections_script)
2452 {
2453   section_size_type input_section_size = shdr.get_sh_size();
2454   section_size_type uncompressed_size;
2455   elfcpp::Elf_Xword addralign = shdr.get_sh_addralign();
2456   if (object->section_is_compressed(shndx, &uncompressed_size,
2457 				    &addralign))
2458     input_section_size = uncompressed_size;
2459 
2460   if ((addralign & (addralign - 1)) != 0)
2461     {
2462       object->error(_("invalid alignment %lu for section \"%s\""),
2463 		    static_cast<unsigned long>(addralign), secname);
2464       addralign = 1;
2465     }
2466 
2467   if (addralign > this->addralign_)
2468     this->addralign_ = addralign;
2469 
2470   typename elfcpp::Elf_types<size>::Elf_WXword sh_flags = shdr.get_sh_flags();
2471   uint64_t entsize = shdr.get_sh_entsize();
2472 
2473   // .debug_str is a mergeable string section, but is not always so
2474   // marked by compilers.  Mark manually here so we can optimize.
2475   if (strcmp(secname, ".debug_str") == 0)
2476     {
2477       sh_flags |= (elfcpp::SHF_MERGE | elfcpp::SHF_STRINGS);
2478       entsize = 1;
2479     }
2480 
2481   this->update_flags_for_input_section(sh_flags);
2482   this->set_entsize(entsize);
2483 
2484   // If this is a SHF_MERGE section, we pass all the input sections to
2485   // a Output_data_merge.  We don't try to handle relocations for such
2486   // a section.  We don't try to handle empty merge sections--they
2487   // mess up the mappings, and are useless anyhow.
2488   // FIXME: Need to handle merge sections during incremental update.
2489   if ((sh_flags & elfcpp::SHF_MERGE) != 0
2490       && reloc_shndx == 0
2491       && shdr.get_sh_size() > 0
2492       && !parameters->incremental())
2493     {
2494       // Keep information about merged input sections for rebuilding fast
2495       // lookup maps if we have sections-script or we do relaxation.
2496       bool keeps_input_sections = (this->always_keeps_input_sections_
2497 				   || have_sections_script
2498 				   || parameters->target().may_relax());
2499 
2500       if (this->add_merge_input_section(object, shndx, sh_flags, entsize,
2501 					addralign, keeps_input_sections))
2502 	{
2503 	  // Tell the relocation routines that they need to call the
2504 	  // output_offset method to determine the final address.
2505 	  return -1;
2506 	}
2507     }
2508 
2509   off_t offset_in_section;
2510 
2511   if (this->has_fixed_layout())
2512     {
2513       // For incremental updates, find a chunk of unused space in the section.
2514       offset_in_section = this->free_list_.allocate(input_section_size,
2515 						    addralign, 0);
2516       if (offset_in_section == -1)
2517 	gold_fallback(_("out of patch space in section %s; "
2518 			"relink with --incremental-full"),
2519 		      this->name());
2520       return offset_in_section;
2521     }
2522 
2523   offset_in_section = this->current_data_size_for_child();
2524   off_t aligned_offset_in_section = align_address(offset_in_section,
2525 						  addralign);
2526   this->set_current_data_size_for_child(aligned_offset_in_section
2527 					+ input_section_size);
2528 
2529   // Determine if we want to delay code-fill generation until the output
2530   // section is written.  When the target is relaxing, we want to delay fill
2531   // generating to avoid adjusting them during relaxation.  Also, if we are
2532   // sorting input sections we must delay fill generation.
2533   if (!this->generate_code_fills_at_write_
2534       && !have_sections_script
2535       && (sh_flags & elfcpp::SHF_EXECINSTR) != 0
2536       && parameters->target().has_code_fill()
2537       && (parameters->target().may_relax()
2538 	  || layout->is_section_ordering_specified()))
2539     {
2540       gold_assert(this->fills_.empty());
2541       this->generate_code_fills_at_write_ = true;
2542     }
2543 
2544   if (aligned_offset_in_section > offset_in_section
2545       && !this->generate_code_fills_at_write_
2546       && !have_sections_script
2547       && (sh_flags & elfcpp::SHF_EXECINSTR) != 0
2548       && parameters->target().has_code_fill())
2549     {
2550       // We need to add some fill data.  Using fill_list_ when
2551       // possible is an optimization, since we will often have fill
2552       // sections without input sections.
2553       off_t fill_len = aligned_offset_in_section - offset_in_section;
2554       if (this->input_sections_.empty())
2555 	this->fills_.push_back(Fill(offset_in_section, fill_len));
2556       else
2557 	{
2558 	  std::string fill_data(parameters->target().code_fill(fill_len));
2559 	  Output_data_const* odc = new Output_data_const(fill_data, 1);
2560 	  this->input_sections_.push_back(Input_section(odc));
2561 	}
2562     }
2563 
2564   // We need to keep track of this section if we are already keeping
2565   // track of sections, or if we are relaxing.  Also, if this is a
2566   // section which requires sorting, or which may require sorting in
2567   // the future, we keep track of the sections.  If the
2568   // --section-ordering-file option is used to specify the order of
2569   // sections, we need to keep track of sections.
2570   if (this->always_keeps_input_sections_
2571       || have_sections_script
2572       || !this->input_sections_.empty()
2573       || this->may_sort_attached_input_sections()
2574       || this->must_sort_attached_input_sections()
2575       || parameters->options().user_set_Map()
2576       || parameters->target().may_relax()
2577       || layout->is_section_ordering_specified())
2578     {
2579       Input_section isecn(object, shndx, input_section_size, addralign);
2580       /* If section ordering is requested by specifying a ordering file,
2581 	 using --section-ordering-file, match the section name with
2582 	 a pattern.  */
2583       if (parameters->options().section_ordering_file())
2584 	{
2585 	  unsigned int section_order_index =
2586 	    layout->find_section_order_index(std::string(secname));
2587 	  if (section_order_index != 0)
2588 	    {
2589 	      isecn.set_section_order_index(section_order_index);
2590 	      this->set_input_section_order_specified();
2591 	    }
2592 	}
2593       this->input_sections_.push_back(isecn);
2594     }
2595 
2596   return aligned_offset_in_section;
2597 }
2598 
2599 // Add arbitrary data to an output section.
2600 
2601 void
add_output_section_data(Output_section_data * posd)2602 Output_section::add_output_section_data(Output_section_data* posd)
2603 {
2604   Input_section inp(posd);
2605   this->add_output_section_data(&inp);
2606 
2607   if (posd->is_data_size_valid())
2608     {
2609       off_t offset_in_section;
2610       if (this->has_fixed_layout())
2611 	{
2612 	  // For incremental updates, find a chunk of unused space.
2613 	  offset_in_section = this->free_list_.allocate(posd->data_size(),
2614 							posd->addralign(), 0);
2615 	  if (offset_in_section == -1)
2616 	    gold_fallback(_("out of patch space in section %s; "
2617 			    "relink with --incremental-full"),
2618 			  this->name());
2619 	  // Finalize the address and offset now.
2620 	  uint64_t addr = this->address();
2621 	  off_t offset = this->offset();
2622 	  posd->set_address_and_file_offset(addr + offset_in_section,
2623 					    offset + offset_in_section);
2624 	}
2625       else
2626 	{
2627 	  offset_in_section = this->current_data_size_for_child();
2628 	  off_t aligned_offset_in_section = align_address(offset_in_section,
2629 							  posd->addralign());
2630 	  this->set_current_data_size_for_child(aligned_offset_in_section
2631 						+ posd->data_size());
2632 	}
2633     }
2634   else if (this->has_fixed_layout())
2635     {
2636       // For incremental updates, arrange for the data to have a fixed layout.
2637       // This will mean that additions to the data must be allocated from
2638       // free space within the containing output section.
2639       uint64_t addr = this->address();
2640       posd->set_address(addr);
2641       posd->set_file_offset(0);
2642       // FIXME: This should eventually be unreachable.
2643       // gold_unreachable();
2644     }
2645 }
2646 
2647 // Add a relaxed input section.
2648 
2649 void
add_relaxed_input_section(Layout * layout,Output_relaxed_input_section * poris,const std::string & name)2650 Output_section::add_relaxed_input_section(Layout* layout,
2651 					  Output_relaxed_input_section* poris,
2652 					  const std::string& name)
2653 {
2654   Input_section inp(poris);
2655 
2656   // If the --section-ordering-file option is used to specify the order of
2657   // sections, we need to keep track of sections.
2658   if (layout->is_section_ordering_specified())
2659     {
2660       unsigned int section_order_index =
2661 	layout->find_section_order_index(name);
2662       if (section_order_index != 0)
2663 	{
2664 	  inp.set_section_order_index(section_order_index);
2665 	  this->set_input_section_order_specified();
2666 	}
2667     }
2668 
2669   this->add_output_section_data(&inp);
2670   if (this->lookup_maps_->is_valid())
2671     this->lookup_maps_->add_relaxed_input_section(poris->relobj(),
2672 						  poris->shndx(), poris);
2673 
2674   // For a relaxed section, we use the current data size.  Linker scripts
2675   // get all the input sections, including relaxed one from an output
2676   // section and add them back to the same output section to compute the
2677   // output section size.  If we do not account for sizes of relaxed input
2678   // sections, an output section would be incorrectly sized.
2679   off_t offset_in_section = this->current_data_size_for_child();
2680   off_t aligned_offset_in_section = align_address(offset_in_section,
2681 						  poris->addralign());
2682   this->set_current_data_size_for_child(aligned_offset_in_section
2683 					+ poris->current_data_size());
2684 }
2685 
2686 // Add arbitrary data to an output section by Input_section.
2687 
2688 void
add_output_section_data(Input_section * inp)2689 Output_section::add_output_section_data(Input_section* inp)
2690 {
2691   if (this->input_sections_.empty())
2692     this->first_input_offset_ = this->current_data_size_for_child();
2693 
2694   this->input_sections_.push_back(*inp);
2695 
2696   uint64_t addralign = inp->addralign();
2697   if (addralign > this->addralign_)
2698     this->addralign_ = addralign;
2699 
2700   inp->set_output_section(this);
2701 }
2702 
2703 // Add a merge section to an output section.
2704 
2705 void
add_output_merge_section(Output_section_data * posd,bool is_string,uint64_t entsize)2706 Output_section::add_output_merge_section(Output_section_data* posd,
2707 					 bool is_string, uint64_t entsize)
2708 {
2709   Input_section inp(posd, is_string, entsize);
2710   this->add_output_section_data(&inp);
2711 }
2712 
2713 // Add an input section to a SHF_MERGE section.
2714 
2715 bool
add_merge_input_section(Relobj * object,unsigned int shndx,uint64_t flags,uint64_t entsize,uint64_t addralign,bool keeps_input_sections)2716 Output_section::add_merge_input_section(Relobj* object, unsigned int shndx,
2717 					uint64_t flags, uint64_t entsize,
2718 					uint64_t addralign,
2719 					bool keeps_input_sections)
2720 {
2721   // We cannot merge sections with entsize == 0.
2722   if (entsize == 0)
2723     return false;
2724 
2725   bool is_string = (flags & elfcpp::SHF_STRINGS) != 0;
2726 
2727   // We cannot restore merged input section states.
2728   gold_assert(this->checkpoint_ == NULL);
2729 
2730   // Look up merge sections by required properties.
2731   // Currently, we only invalidate the lookup maps in script processing
2732   // and relaxation.  We should not have done either when we reach here.
2733   // So we assume that the lookup maps are valid to simply code.
2734   gold_assert(this->lookup_maps_->is_valid());
2735   Merge_section_properties msp(is_string, entsize, addralign);
2736   Output_merge_base* pomb = this->lookup_maps_->find_merge_section(msp);
2737   bool is_new = false;
2738   if (pomb != NULL)
2739     {
2740       gold_assert(pomb->is_string() == is_string
2741 		  && pomb->entsize() == entsize
2742 		  && pomb->addralign() == addralign);
2743     }
2744   else
2745     {
2746       // Create a new Output_merge_data or Output_merge_string_data.
2747       if (!is_string)
2748 	pomb = new Output_merge_data(entsize, addralign);
2749       else
2750 	{
2751 	  switch (entsize)
2752 	    {
2753 	    case 1:
2754 	      pomb = new Output_merge_string<char>(addralign);
2755 	      break;
2756 	    case 2:
2757 	      pomb = new Output_merge_string<uint16_t>(addralign);
2758 	      break;
2759 	    case 4:
2760 	      pomb = new Output_merge_string<uint32_t>(addralign);
2761 	      break;
2762 	    default:
2763 	      return false;
2764 	    }
2765 	}
2766       // If we need to do script processing or relaxation, we need to keep
2767       // the original input sections to rebuild the fast lookup maps.
2768       if (keeps_input_sections)
2769 	pomb->set_keeps_input_sections();
2770       is_new = true;
2771     }
2772 
2773   if (pomb->add_input_section(object, shndx))
2774     {
2775       // Add new merge section to this output section and link merge
2776       // section properties to new merge section in map.
2777       if (is_new)
2778 	{
2779 	  this->add_output_merge_section(pomb, is_string, entsize);
2780 	  this->lookup_maps_->add_merge_section(msp, pomb);
2781 	}
2782 
2783       return true;
2784     }
2785   else
2786     {
2787       // If add_input_section failed, delete new merge section to avoid
2788       // exporting empty merge sections in Output_section::get_input_section.
2789       if (is_new)
2790 	delete pomb;
2791       return false;
2792     }
2793 }
2794 
2795 // Build a relaxation map to speed up relaxation of existing input sections.
2796 // Look up to the first LIMIT elements in INPUT_SECTIONS.
2797 
2798 void
build_relaxation_map(const Input_section_list & input_sections,size_t limit,Relaxation_map * relaxation_map) const2799 Output_section::build_relaxation_map(
2800   const Input_section_list& input_sections,
2801   size_t limit,
2802   Relaxation_map* relaxation_map) const
2803 {
2804   for (size_t i = 0; i < limit; ++i)
2805     {
2806       const Input_section& is(input_sections[i]);
2807       if (is.is_input_section() || is.is_relaxed_input_section())
2808 	{
2809 	  Section_id sid(is.relobj(), is.shndx());
2810 	  (*relaxation_map)[sid] = i;
2811 	}
2812     }
2813 }
2814 
2815 // Convert regular input sections in INPUT_SECTIONS into relaxed input
2816 // sections in RELAXED_SECTIONS.  MAP is a prebuilt map from section id
2817 // indices of INPUT_SECTIONS.
2818 
2819 void
convert_input_sections_in_list_to_relaxed_sections(const std::vector<Output_relaxed_input_section * > & relaxed_sections,const Relaxation_map & map,Input_section_list * input_sections)2820 Output_section::convert_input_sections_in_list_to_relaxed_sections(
2821   const std::vector<Output_relaxed_input_section*>& relaxed_sections,
2822   const Relaxation_map& map,
2823   Input_section_list* input_sections)
2824 {
2825   for (size_t i = 0; i < relaxed_sections.size(); ++i)
2826     {
2827       Output_relaxed_input_section* poris = relaxed_sections[i];
2828       Section_id sid(poris->relobj(), poris->shndx());
2829       Relaxation_map::const_iterator p = map.find(sid);
2830       gold_assert(p != map.end());
2831       gold_assert((*input_sections)[p->second].is_input_section());
2832 
2833       // Remember section order index of original input section
2834       // if it is set.  Copy it to the relaxed input section.
2835       unsigned int soi =
2836 	(*input_sections)[p->second].section_order_index();
2837       (*input_sections)[p->second] = Input_section(poris);
2838       (*input_sections)[p->second].set_section_order_index(soi);
2839     }
2840 }
2841 
2842 // Convert regular input sections into relaxed input sections. RELAXED_SECTIONS
2843 // is a vector of pointers to Output_relaxed_input_section or its derived
2844 // classes.  The relaxed sections must correspond to existing input sections.
2845 
2846 void
convert_input_sections_to_relaxed_sections(const std::vector<Output_relaxed_input_section * > & relaxed_sections)2847 Output_section::convert_input_sections_to_relaxed_sections(
2848   const std::vector<Output_relaxed_input_section*>& relaxed_sections)
2849 {
2850   gold_assert(parameters->target().may_relax());
2851 
2852   // We want to make sure that restore_states does not undo the effect of
2853   // this.  If there is no checkpoint active, just search the current
2854   // input section list and replace the sections there.  If there is
2855   // a checkpoint, also replace the sections there.
2856 
2857   // By default, we look at the whole list.
2858   size_t limit = this->input_sections_.size();
2859 
2860   if (this->checkpoint_ != NULL)
2861     {
2862       // Replace input sections with relaxed input section in the saved
2863       // copy of the input section list.
2864       if (this->checkpoint_->input_sections_saved())
2865 	{
2866 	  Relaxation_map map;
2867 	  this->build_relaxation_map(
2868 		    *(this->checkpoint_->input_sections()),
2869 		    this->checkpoint_->input_sections()->size(),
2870 		    &map);
2871 	  this->convert_input_sections_in_list_to_relaxed_sections(
2872 		    relaxed_sections,
2873 		    map,
2874 		    this->checkpoint_->input_sections());
2875 	}
2876       else
2877 	{
2878 	  // We have not copied the input section list yet.  Instead, just
2879 	  // look at the portion that would be saved.
2880 	  limit = this->checkpoint_->input_sections_size();
2881 	}
2882     }
2883 
2884   // Convert input sections in input_section_list.
2885   Relaxation_map map;
2886   this->build_relaxation_map(this->input_sections_, limit, &map);
2887   this->convert_input_sections_in_list_to_relaxed_sections(
2888 	    relaxed_sections,
2889 	    map,
2890 	    &this->input_sections_);
2891 
2892   // Update fast look-up map.
2893   if (this->lookup_maps_->is_valid())
2894     for (size_t i = 0; i < relaxed_sections.size(); ++i)
2895       {
2896 	Output_relaxed_input_section* poris = relaxed_sections[i];
2897 	this->lookup_maps_->add_relaxed_input_section(poris->relobj(),
2898 						      poris->shndx(), poris);
2899       }
2900 }
2901 
2902 // Update the output section flags based on input section flags.
2903 
2904 void
update_flags_for_input_section(elfcpp::Elf_Xword flags)2905 Output_section::update_flags_for_input_section(elfcpp::Elf_Xword flags)
2906 {
2907   // If we created the section with SHF_ALLOC clear, we set the
2908   // address.  If we are now setting the SHF_ALLOC flag, we need to
2909   // undo that.
2910   if ((this->flags_ & elfcpp::SHF_ALLOC) == 0
2911       && (flags & elfcpp::SHF_ALLOC) != 0)
2912     this->mark_address_invalid();
2913 
2914   this->flags_ |= (flags
2915 		   & (elfcpp::SHF_WRITE
2916 		      | elfcpp::SHF_ALLOC
2917 		      | elfcpp::SHF_EXECINSTR));
2918 
2919   if ((flags & elfcpp::SHF_MERGE) == 0)
2920     this->flags_ &=~ elfcpp::SHF_MERGE;
2921   else
2922     {
2923       if (this->current_data_size_for_child() == 0)
2924 	this->flags_ |= elfcpp::SHF_MERGE;
2925     }
2926 
2927   if ((flags & elfcpp::SHF_STRINGS) == 0)
2928     this->flags_ &=~ elfcpp::SHF_STRINGS;
2929   else
2930     {
2931       if (this->current_data_size_for_child() == 0)
2932 	this->flags_ |= elfcpp::SHF_STRINGS;
2933     }
2934 }
2935 
2936 // Find the merge section into which an input section with index SHNDX in
2937 // OBJECT has been added.  Return NULL if none found.
2938 
2939 const Output_section_data*
find_merge_section(const Relobj * object,unsigned int shndx) const2940 Output_section::find_merge_section(const Relobj* object,
2941 				   unsigned int shndx) const
2942 {
2943   return object->find_merge_section(shndx);
2944 }
2945 
2946 // Build the lookup maps for relaxed sections.  This needs
2947 // to be declared as a const method so that it is callable with a const
2948 // Output_section pointer.  The method only updates states of the maps.
2949 
2950 void
build_lookup_maps() const2951 Output_section::build_lookup_maps() const
2952 {
2953   this->lookup_maps_->clear();
2954   for (Input_section_list::const_iterator p = this->input_sections_.begin();
2955        p != this->input_sections_.end();
2956        ++p)
2957     {
2958       if (p->is_relaxed_input_section())
2959 	{
2960 	  Output_relaxed_input_section* poris = p->relaxed_input_section();
2961 	  this->lookup_maps_->add_relaxed_input_section(poris->relobj(),
2962 							poris->shndx(), poris);
2963 	}
2964     }
2965 }
2966 
2967 // Find an relaxed input section corresponding to an input section
2968 // in OBJECT with index SHNDX.
2969 
2970 const Output_relaxed_input_section*
find_relaxed_input_section(const Relobj * object,unsigned int shndx) const2971 Output_section::find_relaxed_input_section(const Relobj* object,
2972 					   unsigned int shndx) const
2973 {
2974   if (!this->lookup_maps_->is_valid())
2975     this->build_lookup_maps();
2976   return this->lookup_maps_->find_relaxed_input_section(object, shndx);
2977 }
2978 
2979 // Given an address OFFSET relative to the start of input section
2980 // SHNDX in OBJECT, return whether this address is being included in
2981 // the final link.  This should only be called if SHNDX in OBJECT has
2982 // a special mapping.
2983 
2984 bool
is_input_address_mapped(const Relobj * object,unsigned int shndx,off_t offset) const2985 Output_section::is_input_address_mapped(const Relobj* object,
2986 					unsigned int shndx,
2987 					off_t offset) const
2988 {
2989   // Look at the Output_section_data_maps first.
2990   const Output_section_data* posd = this->find_merge_section(object, shndx);
2991   if (posd == NULL)
2992     posd = this->find_relaxed_input_section(object, shndx);
2993 
2994   if (posd != NULL)
2995     {
2996       section_offset_type output_offset;
2997       bool found = posd->output_offset(object, shndx, offset, &output_offset);
2998       // By default we assume that the address is mapped. See comment at the
2999       // end.
3000       if (!found)
3001         return true;
3002       return output_offset != -1;
3003     }
3004 
3005   // Fall back to the slow look-up.
3006   for (Input_section_list::const_iterator p = this->input_sections_.begin();
3007        p != this->input_sections_.end();
3008        ++p)
3009     {
3010       section_offset_type output_offset;
3011       if (p->output_offset(object, shndx, offset, &output_offset))
3012 	return output_offset != -1;
3013     }
3014 
3015   // By default we assume that the address is mapped.  This should
3016   // only be called after we have passed all sections to Layout.  At
3017   // that point we should know what we are discarding.
3018   return true;
3019 }
3020 
3021 // Given an address OFFSET relative to the start of input section
3022 // SHNDX in object OBJECT, return the output offset relative to the
3023 // start of the input section in the output section.  This should only
3024 // be called if SHNDX in OBJECT has a special mapping.
3025 
3026 section_offset_type
output_offset(const Relobj * object,unsigned int shndx,section_offset_type offset) const3027 Output_section::output_offset(const Relobj* object, unsigned int shndx,
3028 			      section_offset_type offset) const
3029 {
3030   // This can only be called meaningfully when we know the data size
3031   // of this.
3032   gold_assert(this->is_data_size_valid());
3033 
3034   // Look at the Output_section_data_maps first.
3035   const Output_section_data* posd = this->find_merge_section(object, shndx);
3036   if (posd == NULL)
3037     posd = this->find_relaxed_input_section(object, shndx);
3038   if (posd != NULL)
3039     {
3040       section_offset_type output_offset;
3041       bool found = posd->output_offset(object, shndx, offset, &output_offset);
3042       gold_assert(found);
3043       return output_offset;
3044     }
3045 
3046   // Fall back to the slow look-up.
3047   for (Input_section_list::const_iterator p = this->input_sections_.begin();
3048        p != this->input_sections_.end();
3049        ++p)
3050     {
3051       section_offset_type output_offset;
3052       if (p->output_offset(object, shndx, offset, &output_offset))
3053 	return output_offset;
3054     }
3055   gold_unreachable();
3056 }
3057 
3058 // Return the output virtual address of OFFSET relative to the start
3059 // of input section SHNDX in object OBJECT.
3060 
3061 uint64_t
output_address(const Relobj * object,unsigned int shndx,off_t offset) const3062 Output_section::output_address(const Relobj* object, unsigned int shndx,
3063 			       off_t offset) const
3064 {
3065   uint64_t addr = this->address() + this->first_input_offset_;
3066 
3067   // Look at the Output_section_data_maps first.
3068   const Output_section_data* posd = this->find_merge_section(object, shndx);
3069   if (posd == NULL)
3070     posd = this->find_relaxed_input_section(object, shndx);
3071   if (posd != NULL && posd->is_address_valid())
3072     {
3073       section_offset_type output_offset;
3074       bool found = posd->output_offset(object, shndx, offset, &output_offset);
3075       gold_assert(found);
3076       return posd->address() + output_offset;
3077     }
3078 
3079   // Fall back to the slow look-up.
3080   for (Input_section_list::const_iterator p = this->input_sections_.begin();
3081        p != this->input_sections_.end();
3082        ++p)
3083     {
3084       addr = align_address(addr, p->addralign());
3085       section_offset_type output_offset;
3086       if (p->output_offset(object, shndx, offset, &output_offset))
3087 	{
3088 	  if (output_offset == -1)
3089 	    return -1ULL;
3090 	  return addr + output_offset;
3091 	}
3092       addr += p->data_size();
3093     }
3094 
3095   // If we get here, it means that we don't know the mapping for this
3096   // input section.  This might happen in principle if
3097   // add_input_section were called before add_output_section_data.
3098   // But it should never actually happen.
3099 
3100   gold_unreachable();
3101 }
3102 
3103 // Find the output address of the start of the merged section for
3104 // input section SHNDX in object OBJECT.
3105 
3106 bool
find_starting_output_address(const Relobj * object,unsigned int shndx,uint64_t * paddr) const3107 Output_section::find_starting_output_address(const Relobj* object,
3108 					     unsigned int shndx,
3109 					     uint64_t* paddr) const
3110 {
3111   const Output_section_data* data = this->find_merge_section(object, shndx);
3112   if (data == NULL)
3113     return false;
3114 
3115   // FIXME: This becomes a bottle-neck if we have many relaxed sections.
3116   // Looking up the merge section map does not always work as we sometimes
3117   // find a merge section without its address set.
3118   uint64_t addr = this->address() + this->first_input_offset_;
3119   for (Input_section_list::const_iterator p = this->input_sections_.begin();
3120        p != this->input_sections_.end();
3121        ++p)
3122     {
3123       addr = align_address(addr, p->addralign());
3124 
3125       // It would be nice if we could use the existing output_offset
3126       // method to get the output offset of input offset 0.
3127       // Unfortunately we don't know for sure that input offset 0 is
3128       // mapped at all.
3129       if (!p->is_input_section() && p->output_section_data() == data)
3130 	{
3131 	  *paddr = addr;
3132 	  return true;
3133 	}
3134 
3135       addr += p->data_size();
3136     }
3137 
3138   // We couldn't find a merge output section for this input section.
3139   return false;
3140 }
3141 
3142 // Update the data size of an Output_section.
3143 
3144 void
update_data_size()3145 Output_section::update_data_size()
3146 {
3147   if (this->input_sections_.empty())
3148       return;
3149 
3150   if (this->must_sort_attached_input_sections()
3151       || this->input_section_order_specified())
3152     this->sort_attached_input_sections();
3153 
3154   off_t off = this->first_input_offset_;
3155   for (Input_section_list::iterator p = this->input_sections_.begin();
3156        p != this->input_sections_.end();
3157        ++p)
3158     {
3159       off = align_address(off, p->addralign());
3160       off += p->current_data_size();
3161     }
3162 
3163   this->set_current_data_size_for_child(off);
3164 }
3165 
3166 // Set the data size of an Output_section.  This is where we handle
3167 // setting the addresses of any Output_section_data objects.
3168 
3169 void
set_final_data_size()3170 Output_section::set_final_data_size()
3171 {
3172   off_t data_size;
3173 
3174   if (this->input_sections_.empty())
3175     data_size = this->current_data_size_for_child();
3176   else
3177     {
3178       if (this->must_sort_attached_input_sections()
3179 	  || this->input_section_order_specified())
3180 	this->sort_attached_input_sections();
3181 
3182       uint64_t address = this->address();
3183       off_t startoff = this->offset();
3184       off_t off = this->first_input_offset_;
3185       for (Input_section_list::iterator p = this->input_sections_.begin();
3186 	   p != this->input_sections_.end();
3187 	   ++p)
3188 	{
3189 	  off = align_address(off, p->addralign());
3190 	  p->set_address_and_file_offset(address + off, startoff + off,
3191 					 startoff);
3192 	  off += p->data_size();
3193 	}
3194       data_size = off;
3195     }
3196 
3197   // For full incremental links, we want to allocate some patch space
3198   // in most sections for subsequent incremental updates.
3199   if (this->is_patch_space_allowed_ && parameters->incremental_full())
3200     {
3201       double pct = parameters->options().incremental_patch();
3202       size_t extra = static_cast<size_t>(data_size * pct);
3203       if (this->free_space_fill_ != NULL
3204 	  && this->free_space_fill_->minimum_hole_size() > extra)
3205 	extra = this->free_space_fill_->minimum_hole_size();
3206       off_t new_size = align_address(data_size + extra, this->addralign());
3207       this->patch_space_ = new_size - data_size;
3208       gold_debug(DEBUG_INCREMENTAL,
3209 		 "set_final_data_size: %08lx + %08lx: section %s",
3210 		 static_cast<long>(data_size),
3211 		 static_cast<long>(this->patch_space_),
3212 		 this->name());
3213       data_size = new_size;
3214     }
3215 
3216   this->set_data_size(data_size);
3217 }
3218 
3219 // Reset the address and file offset.
3220 
3221 void
do_reset_address_and_file_offset()3222 Output_section::do_reset_address_and_file_offset()
3223 {
3224   // An unallocated section has no address.  Forcing this means that
3225   // we don't need special treatment for symbols defined in debug
3226   // sections.  We do the same in the constructor.  This does not
3227   // apply to NOLOAD sections though.
3228   if (((this->flags_ & elfcpp::SHF_ALLOC) == 0) && !this->is_noload_)
3229      this->set_address(0);
3230 
3231   for (Input_section_list::iterator p = this->input_sections_.begin();
3232        p != this->input_sections_.end();
3233        ++p)
3234     p->reset_address_and_file_offset();
3235 
3236   // Remove any patch space that was added in set_final_data_size.
3237   if (this->patch_space_ > 0)
3238     {
3239       this->set_current_data_size_for_child(this->current_data_size_for_child()
3240 					    - this->patch_space_);
3241       this->patch_space_ = 0;
3242     }
3243 }
3244 
3245 // Return true if address and file offset have the values after reset.
3246 
3247 bool
do_address_and_file_offset_have_reset_values() const3248 Output_section::do_address_and_file_offset_have_reset_values() const
3249 {
3250   if (this->is_offset_valid())
3251     return false;
3252 
3253   // An unallocated section has address 0 after its construction or a reset.
3254   if ((this->flags_ & elfcpp::SHF_ALLOC) == 0)
3255     return this->is_address_valid() && this->address() == 0;
3256   else
3257     return !this->is_address_valid();
3258 }
3259 
3260 // Set the TLS offset.  Called only for SHT_TLS sections.
3261 
3262 void
do_set_tls_offset(uint64_t tls_base)3263 Output_section::do_set_tls_offset(uint64_t tls_base)
3264 {
3265   this->tls_offset_ = this->address() - tls_base;
3266 }
3267 
3268 // In a few cases we need to sort the input sections attached to an
3269 // output section.  This is used to implement the type of constructor
3270 // priority ordering implemented by the GNU linker, in which the
3271 // priority becomes part of the section name and the sections are
3272 // sorted by name.  We only do this for an output section if we see an
3273 // attached input section matching ".ctors.*", ".dtors.*",
3274 // ".init_array.*" or ".fini_array.*".
3275 
3276 class Output_section::Input_section_sort_entry
3277 {
3278  public:
Input_section_sort_entry()3279   Input_section_sort_entry()
3280     : input_section_(), index_(-1U), section_name_()
3281   { }
3282 
Input_section_sort_entry(const Input_section & input_section,unsigned int index,bool must_sort_attached_input_sections,const char * output_section_name)3283   Input_section_sort_entry(const Input_section& input_section,
3284 			   unsigned int index,
3285 			   bool must_sort_attached_input_sections,
3286 			   const char* output_section_name)
3287     : input_section_(input_section), index_(index), section_name_()
3288   {
3289     if ((input_section.is_input_section()
3290 	 || input_section.is_relaxed_input_section())
3291 	&& must_sort_attached_input_sections)
3292       {
3293 	// This is only called single-threaded from Layout::finalize,
3294 	// so it is OK to lock.  Unfortunately we have no way to pass
3295 	// in a Task token.
3296 	const Task* dummy_task = reinterpret_cast<const Task*>(-1);
3297 	Object* obj = (input_section.is_input_section()
3298 		       ? input_section.relobj()
3299 		       : input_section.relaxed_input_section()->relobj());
3300 	Task_lock_obj<Object> tl(dummy_task, obj);
3301 
3302 	// This is a slow operation, which should be cached in
3303 	// Layout::layout if this becomes a speed problem.
3304 	this->section_name_ = obj->section_name(input_section.shndx());
3305       }
3306     else if (input_section.is_output_section_data()
3307     	     && must_sort_attached_input_sections)
3308       {
3309 	// For linker-generated sections, use the output section name.
3310 	this->section_name_.assign(output_section_name);
3311       }
3312   }
3313 
3314   // Return the Input_section.
3315   const Input_section&
input_section() const3316   input_section() const
3317   {
3318     gold_assert(this->index_ != -1U);
3319     return this->input_section_;
3320   }
3321 
3322   // The index of this entry in the original list.  This is used to
3323   // make the sort stable.
3324   unsigned int
index() const3325   index() const
3326   {
3327     gold_assert(this->index_ != -1U);
3328     return this->index_;
3329   }
3330 
3331   // The section name.
3332   const std::string&
section_name() const3333   section_name() const
3334   {
3335     return this->section_name_;
3336   }
3337 
3338   // Return true if the section name has a priority.  This is assumed
3339   // to be true if it has a dot after the initial dot.
3340   bool
has_priority() const3341   has_priority() const
3342   {
3343     return this->section_name_.find('.', 1) != std::string::npos;
3344   }
3345 
3346   // Return the priority.  Believe it or not, gcc encodes the priority
3347   // differently for .ctors/.dtors and .init_array/.fini_array
3348   // sections.
3349   unsigned int
get_priority() const3350   get_priority() const
3351   {
3352     bool is_ctors;
3353     if (is_prefix_of(".ctors.", this->section_name_.c_str())
3354 	|| is_prefix_of(".dtors.", this->section_name_.c_str()))
3355       is_ctors = true;
3356     else if (is_prefix_of(".init_array.", this->section_name_.c_str())
3357 	     || is_prefix_of(".fini_array.", this->section_name_.c_str()))
3358       is_ctors = false;
3359     else
3360       return 0;
3361     char* end;
3362     unsigned long prio = strtoul((this->section_name_.c_str()
3363 				  + (is_ctors ? 7 : 12)),
3364 				 &end, 10);
3365     if (*end != '\0')
3366       return 0;
3367     else if (is_ctors)
3368       return 65535 - prio;
3369     else
3370       return prio;
3371   }
3372 
3373   // Return true if this an input file whose base name matches
3374   // FILE_NAME.  The base name must have an extension of ".o", and
3375   // must be exactly FILE_NAME.o or FILE_NAME, one character, ".o".
3376   // This is to match crtbegin.o as well as crtbeginS.o without
3377   // getting confused by other possibilities.  Overall matching the
3378   // file name this way is a dreadful hack, but the GNU linker does it
3379   // in order to better support gcc, and we need to be compatible.
3380   bool
match_file_name(const char * file_name) const3381   match_file_name(const char* file_name) const
3382   {
3383     if (this->input_section_.is_output_section_data())
3384       return false;
3385     return Layout::match_file_name(this->input_section_.relobj(), file_name);
3386   }
3387 
3388   // Returns 1 if THIS should appear before S in section order, -1 if S
3389   // appears before THIS and 0 if they are not comparable.
3390   int
compare_section_ordering(const Input_section_sort_entry & s) const3391   compare_section_ordering(const Input_section_sort_entry& s) const
3392   {
3393     unsigned int this_secn_index = this->input_section_.section_order_index();
3394     unsigned int s_secn_index = s.input_section().section_order_index();
3395     if (this_secn_index > 0 && s_secn_index > 0)
3396       {
3397 	if (this_secn_index < s_secn_index)
3398 	  return 1;
3399 	else if (this_secn_index > s_secn_index)
3400 	  return -1;
3401       }
3402     return 0;
3403   }
3404 
3405  private:
3406   // The Input_section we are sorting.
3407   Input_section input_section_;
3408   // The index of this Input_section in the original list.
3409   unsigned int index_;
3410   // The section name if there is one.
3411   std::string section_name_;
3412 };
3413 
3414 // Return true if S1 should come before S2 in the output section.
3415 
3416 bool
operator ()(const Output_section::Input_section_sort_entry & s1,const Output_section::Input_section_sort_entry & s2) const3417 Output_section::Input_section_sort_compare::operator()(
3418     const Output_section::Input_section_sort_entry& s1,
3419     const Output_section::Input_section_sort_entry& s2) const
3420 {
3421   // crtbegin.o must come first.
3422   bool s1_begin = s1.match_file_name("crtbegin");
3423   bool s2_begin = s2.match_file_name("crtbegin");
3424   if (s1_begin || s2_begin)
3425     {
3426       if (!s1_begin)
3427 	return false;
3428       if (!s2_begin)
3429 	return true;
3430       return s1.index() < s2.index();
3431     }
3432 
3433   // crtend.o must come last.
3434   bool s1_end = s1.match_file_name("crtend");
3435   bool s2_end = s2.match_file_name("crtend");
3436   if (s1_end || s2_end)
3437     {
3438       if (!s1_end)
3439 	return true;
3440       if (!s2_end)
3441 	return false;
3442       return s1.index() < s2.index();
3443     }
3444 
3445   // A section with a priority follows a section without a priority.
3446   bool s1_has_priority = s1.has_priority();
3447   bool s2_has_priority = s2.has_priority();
3448   if (s1_has_priority && !s2_has_priority)
3449     return false;
3450   if (!s1_has_priority && s2_has_priority)
3451     return true;
3452 
3453   // Check if a section order exists for these sections through a section
3454   // ordering file.  If sequence_num is 0, an order does not exist.
3455   int sequence_num = s1.compare_section_ordering(s2);
3456   if (sequence_num != 0)
3457     return sequence_num == 1;
3458 
3459   // Otherwise we sort by name.
3460   int compare = s1.section_name().compare(s2.section_name());
3461   if (compare != 0)
3462     return compare < 0;
3463 
3464   // Otherwise we keep the input order.
3465   return s1.index() < s2.index();
3466 }
3467 
3468 // Return true if S1 should come before S2 in an .init_array or .fini_array
3469 // output section.
3470 
3471 bool
operator ()(const Output_section::Input_section_sort_entry & s1,const Output_section::Input_section_sort_entry & s2) const3472 Output_section::Input_section_sort_init_fini_compare::operator()(
3473     const Output_section::Input_section_sort_entry& s1,
3474     const Output_section::Input_section_sort_entry& s2) const
3475 {
3476   // A section without a priority follows a section with a priority.
3477   // This is the reverse of .ctors and .dtors sections.
3478   bool s1_has_priority = s1.has_priority();
3479   bool s2_has_priority = s2.has_priority();
3480   if (s1_has_priority && !s2_has_priority)
3481     return true;
3482   if (!s1_has_priority && s2_has_priority)
3483     return false;
3484 
3485   // .ctors and .dtors sections without priority come after
3486   // .init_array and .fini_array sections without priority.
3487   if (!s1_has_priority
3488       && (s1.section_name() == ".ctors" || s1.section_name() == ".dtors")
3489       && s1.section_name() != s2.section_name())
3490     return false;
3491   if (!s2_has_priority
3492       && (s2.section_name() == ".ctors" || s2.section_name() == ".dtors")
3493       && s2.section_name() != s1.section_name())
3494     return true;
3495 
3496   // Sort by priority if we can.
3497   if (s1_has_priority)
3498     {
3499       unsigned int s1_prio = s1.get_priority();
3500       unsigned int s2_prio = s2.get_priority();
3501       if (s1_prio < s2_prio)
3502 	return true;
3503       else if (s1_prio > s2_prio)
3504 	return false;
3505     }
3506 
3507   // Check if a section order exists for these sections through a section
3508   // ordering file.  If sequence_num is 0, an order does not exist.
3509   int sequence_num = s1.compare_section_ordering(s2);
3510   if (sequence_num != 0)
3511     return sequence_num == 1;
3512 
3513   // Otherwise we sort by name.
3514   int compare = s1.section_name().compare(s2.section_name());
3515   if (compare != 0)
3516     return compare < 0;
3517 
3518   // Otherwise we keep the input order.
3519   return s1.index() < s2.index();
3520 }
3521 
3522 // Return true if S1 should come before S2.  Sections that do not match
3523 // any pattern in the section ordering file are placed ahead of the sections
3524 // that match some pattern.
3525 
3526 bool
operator ()(const Output_section::Input_section_sort_entry & s1,const Output_section::Input_section_sort_entry & s2) const3527 Output_section::Input_section_sort_section_order_index_compare::operator()(
3528     const Output_section::Input_section_sort_entry& s1,
3529     const Output_section::Input_section_sort_entry& s2) const
3530 {
3531   unsigned int s1_secn_index = s1.input_section().section_order_index();
3532   unsigned int s2_secn_index = s2.input_section().section_order_index();
3533 
3534   // Keep input order if section ordering cannot determine order.
3535   if (s1_secn_index == s2_secn_index)
3536     return s1.index() < s2.index();
3537 
3538   return s1_secn_index < s2_secn_index;
3539 }
3540 
3541 // Return true if S1 should come before S2.  This is the sort comparison
3542 // function for .text to sort sections with prefixes
3543 // .text.{unlikely,exit,startup,hot} before other sections.
3544 
3545 bool
3546 Output_section::Input_section_sort_section_prefix_special_ordering_compare
operator ()(const Output_section::Input_section_sort_entry & s1,const Output_section::Input_section_sort_entry & s2) const3547   ::operator()(
3548     const Output_section::Input_section_sort_entry& s1,
3549     const Output_section::Input_section_sort_entry& s2) const
3550 {
3551   // Some input section names have special ordering requirements.
3552   const char *s1_section_name = s1.section_name().c_str();
3553   const char *s2_section_name = s2.section_name().c_str();
3554   int o1 = Layout::special_ordering_of_input_section(s1_section_name);
3555   int o2 = Layout::special_ordering_of_input_section(s2_section_name);
3556   if (o1 != o2)
3557     {
3558       if (o1 < 0)
3559 	return false;
3560       else if (o2 < 0)
3561 	return true;
3562       else
3563 	return o1 < o2;
3564     }
3565   else if (is_prefix_of(".text.sorted", s1_section_name))
3566     return strcmp(s1_section_name, s2_section_name) <= 0;
3567 
3568   // Keep input order otherwise.
3569   return s1.index() < s2.index();
3570 }
3571 
3572 // Return true if S1 should come before S2.  This is the sort comparison
3573 // function for sections to sort them by name.
3574 
3575 bool
3576 Output_section::Input_section_sort_section_name_compare
operator ()(const Output_section::Input_section_sort_entry & s1,const Output_section::Input_section_sort_entry & s2) const3577   ::operator()(
3578     const Output_section::Input_section_sort_entry& s1,
3579     const Output_section::Input_section_sort_entry& s2) const
3580 {
3581   // We sort by name.
3582   int compare = s1.section_name().compare(s2.section_name());
3583   if (compare != 0)
3584     return compare < 0;
3585 
3586   // Keep input order otherwise.
3587   return s1.index() < s2.index();
3588 }
3589 
3590 // This updates the section order index of input sections according to the
3591 // the order specified in the mapping from Section id to order index.
3592 
3593 void
update_section_layout(const Section_layout_order * order_map)3594 Output_section::update_section_layout(
3595   const Section_layout_order* order_map)
3596 {
3597   for (Input_section_list::iterator p = this->input_sections_.begin();
3598        p != this->input_sections_.end();
3599        ++p)
3600     {
3601       if (p->is_input_section()
3602 	  || p->is_relaxed_input_section())
3603 	{
3604 	  Relobj* obj = (p->is_input_section()
3605 			 ? p->relobj()
3606 			 : p->relaxed_input_section()->relobj());
3607 	  unsigned int shndx = p->shndx();
3608 	  Section_layout_order::const_iterator it
3609 	    = order_map->find(Section_id(obj, shndx));
3610 	  if (it == order_map->end())
3611 	    continue;
3612 	  unsigned int section_order_index = it->second;
3613 	  if (section_order_index != 0)
3614 	    {
3615 	      p->set_section_order_index(section_order_index);
3616 	      this->set_input_section_order_specified();
3617 	    }
3618 	}
3619     }
3620 }
3621 
3622 // Sort the input sections attached to an output section.
3623 
3624 void
sort_attached_input_sections()3625 Output_section::sort_attached_input_sections()
3626 {
3627   if (this->attached_input_sections_are_sorted_)
3628     return;
3629 
3630   if (this->checkpoint_ != NULL
3631       && !this->checkpoint_->input_sections_saved())
3632     this->checkpoint_->save_input_sections();
3633 
3634   // The only thing we know about an input section is the object and
3635   // the section index.  We need the section name.  Recomputing this
3636   // is slow but this is an unusual case.  If this becomes a speed
3637   // problem we can cache the names as required in Layout::layout.
3638 
3639   // We start by building a larger vector holding a copy of each
3640   // Input_section, plus its current index in the list and its name.
3641   std::vector<Input_section_sort_entry> sort_list;
3642 
3643   unsigned int i = 0;
3644   for (Input_section_list::iterator p = this->input_sections_.begin();
3645        p != this->input_sections_.end();
3646        ++p, ++i)
3647       sort_list.push_back(Input_section_sort_entry(*p, i,
3648 			    this->must_sort_attached_input_sections(),
3649 			    this->name()));
3650 
3651   // Sort the input sections.
3652   if (this->must_sort_attached_input_sections())
3653     {
3654       if (this->type() == elfcpp::SHT_PREINIT_ARRAY
3655 	  || this->type() == elfcpp::SHT_INIT_ARRAY
3656 	  || this->type() == elfcpp::SHT_FINI_ARRAY)
3657 	std::sort(sort_list.begin(), sort_list.end(),
3658 		  Input_section_sort_init_fini_compare());
3659       else if (strcmp(parameters->options().sort_section(), "name") == 0)
3660 	std::sort(sort_list.begin(), sort_list.end(),
3661 		  Input_section_sort_section_name_compare());
3662       else if (strcmp(this->name(), ".text") == 0)
3663 	std::sort(sort_list.begin(), sort_list.end(),
3664 		  Input_section_sort_section_prefix_special_ordering_compare());
3665       else
3666 	std::sort(sort_list.begin(), sort_list.end(),
3667 		  Input_section_sort_compare());
3668     }
3669   else
3670     {
3671       gold_assert(this->input_section_order_specified());
3672       std::sort(sort_list.begin(), sort_list.end(),
3673 		Input_section_sort_section_order_index_compare());
3674     }
3675 
3676   // Copy the sorted input sections back to our list.
3677   this->input_sections_.clear();
3678   for (std::vector<Input_section_sort_entry>::iterator p = sort_list.begin();
3679        p != sort_list.end();
3680        ++p)
3681     this->input_sections_.push_back(p->input_section());
3682   sort_list.clear();
3683 
3684   // Remember that we sorted the input sections, since we might get
3685   // called again.
3686   this->attached_input_sections_are_sorted_ = true;
3687 }
3688 
3689 // Write the section header to *OSHDR.
3690 
3691 template<int size, bool big_endian>
3692 void
write_header(const Layout * layout,const Stringpool * secnamepool,elfcpp::Shdr_write<size,big_endian> * oshdr) const3693 Output_section::write_header(const Layout* layout,
3694 			     const Stringpool* secnamepool,
3695 			     elfcpp::Shdr_write<size, big_endian>* oshdr) const
3696 {
3697   oshdr->put_sh_name(secnamepool->get_offset(this->name_));
3698   oshdr->put_sh_type(this->type_);
3699 
3700   elfcpp::Elf_Xword flags = this->flags_;
3701   if (this->info_section_ != NULL && this->info_uses_section_index_)
3702     flags |= elfcpp::SHF_INFO_LINK;
3703   oshdr->put_sh_flags(flags);
3704 
3705   oshdr->put_sh_addr(this->address());
3706   oshdr->put_sh_offset(this->offset());
3707   oshdr->put_sh_size(this->data_size());
3708   if (this->link_section_ != NULL)
3709     oshdr->put_sh_link(this->link_section_->out_shndx());
3710   else if (this->should_link_to_symtab_)
3711     oshdr->put_sh_link(layout->symtab_section_shndx());
3712   else if (this->should_link_to_dynsym_)
3713     oshdr->put_sh_link(layout->dynsym_section()->out_shndx());
3714   else
3715     oshdr->put_sh_link(this->link_);
3716 
3717   elfcpp::Elf_Word info;
3718   if (this->info_section_ != NULL)
3719     {
3720       if (this->info_uses_section_index_)
3721 	info = this->info_section_->out_shndx();
3722       else
3723 	info = this->info_section_->symtab_index();
3724     }
3725   else if (this->info_symndx_ != NULL)
3726     info = this->info_symndx_->symtab_index();
3727   else
3728     info = this->info_;
3729   oshdr->put_sh_info(info);
3730 
3731   oshdr->put_sh_addralign(this->addralign_);
3732   oshdr->put_sh_entsize(this->entsize_);
3733 }
3734 
3735 // Write out the data.  For input sections the data is written out by
3736 // Object::relocate, but we have to handle Output_section_data objects
3737 // here.
3738 
3739 void
do_write(Output_file * of)3740 Output_section::do_write(Output_file* of)
3741 {
3742   gold_assert(!this->requires_postprocessing());
3743 
3744   // If the target performs relaxation, we delay filler generation until now.
3745   gold_assert(!this->generate_code_fills_at_write_ || this->fills_.empty());
3746 
3747   off_t output_section_file_offset = this->offset();
3748   for (Fill_list::iterator p = this->fills_.begin();
3749        p != this->fills_.end();
3750        ++p)
3751     {
3752       std::string fill_data(parameters->target().code_fill(p->length()));
3753       of->write(output_section_file_offset + p->section_offset(),
3754 		fill_data.data(), fill_data.size());
3755     }
3756 
3757   off_t off = this->offset() + this->first_input_offset_;
3758   for (Input_section_list::iterator p = this->input_sections_.begin();
3759        p != this->input_sections_.end();
3760        ++p)
3761     {
3762       off_t aligned_off = align_address(off, p->addralign());
3763       if (this->generate_code_fills_at_write_ && (off != aligned_off))
3764 	{
3765 	  size_t fill_len = aligned_off - off;
3766 	  std::string fill_data(parameters->target().code_fill(fill_len));
3767 	  of->write(off, fill_data.data(), fill_data.size());
3768 	}
3769 
3770       p->write(of);
3771       off = aligned_off + p->data_size();
3772     }
3773 
3774   // For incremental links, fill in unused chunks in debug sections
3775   // with dummy compilation unit headers.
3776   if (this->free_space_fill_ != NULL)
3777     {
3778       for (Free_list::Const_iterator p = this->free_list_.begin();
3779 	   p != this->free_list_.end();
3780 	   ++p)
3781 	{
3782 	  off_t off = p->start_;
3783 	  size_t len = p->end_ - off;
3784 	  this->free_space_fill_->write(of, this->offset() + off, len);
3785 	}
3786       if (this->patch_space_ > 0)
3787 	{
3788 	  off_t off = this->current_data_size_for_child() - this->patch_space_;
3789 	  this->free_space_fill_->write(of, this->offset() + off,
3790 					this->patch_space_);
3791 	}
3792     }
3793 }
3794 
3795 // If a section requires postprocessing, create the buffer to use.
3796 
3797 void
create_postprocessing_buffer()3798 Output_section::create_postprocessing_buffer()
3799 {
3800   gold_assert(this->requires_postprocessing());
3801 
3802   if (this->postprocessing_buffer_ != NULL)
3803     return;
3804 
3805   if (!this->input_sections_.empty())
3806     {
3807       off_t off = this->first_input_offset_;
3808       for (Input_section_list::iterator p = this->input_sections_.begin();
3809 	   p != this->input_sections_.end();
3810 	   ++p)
3811 	{
3812 	  off = align_address(off, p->addralign());
3813 	  p->finalize_data_size();
3814 	  off += p->data_size();
3815 	}
3816       this->set_current_data_size_for_child(off);
3817     }
3818 
3819   off_t buffer_size = this->current_data_size_for_child();
3820   this->postprocessing_buffer_ = new unsigned char[buffer_size];
3821 }
3822 
3823 // Write all the data of an Output_section into the postprocessing
3824 // buffer.  This is used for sections which require postprocessing,
3825 // such as compression.  Input sections are handled by
3826 // Object::Relocate.
3827 
3828 void
write_to_postprocessing_buffer()3829 Output_section::write_to_postprocessing_buffer()
3830 {
3831   gold_assert(this->requires_postprocessing());
3832 
3833   // If the target performs relaxation, we delay filler generation until now.
3834   gold_assert(!this->generate_code_fills_at_write_ || this->fills_.empty());
3835 
3836   unsigned char* buffer = this->postprocessing_buffer();
3837   for (Fill_list::iterator p = this->fills_.begin();
3838        p != this->fills_.end();
3839        ++p)
3840     {
3841       std::string fill_data(parameters->target().code_fill(p->length()));
3842       memcpy(buffer + p->section_offset(), fill_data.data(),
3843 	     fill_data.size());
3844     }
3845 
3846   off_t off = this->first_input_offset_;
3847   for (Input_section_list::iterator p = this->input_sections_.begin();
3848        p != this->input_sections_.end();
3849        ++p)
3850     {
3851       off_t aligned_off = align_address(off, p->addralign());
3852       if (this->generate_code_fills_at_write_ && (off != aligned_off))
3853 	{
3854 	  size_t fill_len = aligned_off - off;
3855 	  std::string fill_data(parameters->target().code_fill(fill_len));
3856 	  memcpy(buffer + off, fill_data.data(), fill_data.size());
3857 	}
3858 
3859       p->write_to_buffer(buffer + aligned_off);
3860       off = aligned_off + p->data_size();
3861     }
3862 }
3863 
3864 // Get the input sections for linker script processing.  We leave
3865 // behind the Output_section_data entries.  Note that this may be
3866 // slightly incorrect for merge sections.  We will leave them behind,
3867 // but it is possible that the script says that they should follow
3868 // some other input sections, as in:
3869 //    .rodata { *(.rodata) *(.rodata.cst*) }
3870 // For that matter, we don't handle this correctly:
3871 //    .rodata { foo.o(.rodata.cst*) *(.rodata.cst*) }
3872 // With luck this will never matter.
3873 
3874 uint64_t
get_input_sections(uint64_t address,const std::string & fill,std::list<Input_section> * input_sections)3875 Output_section::get_input_sections(
3876     uint64_t address,
3877     const std::string& fill,
3878     std::list<Input_section>* input_sections)
3879 {
3880   if (this->checkpoint_ != NULL
3881       && !this->checkpoint_->input_sections_saved())
3882     this->checkpoint_->save_input_sections();
3883 
3884   // Invalidate fast look-up maps.
3885   this->lookup_maps_->invalidate();
3886 
3887   uint64_t orig_address = address;
3888 
3889   address = align_address(address, this->addralign());
3890 
3891   Input_section_list remaining;
3892   for (Input_section_list::iterator p = this->input_sections_.begin();
3893        p != this->input_sections_.end();
3894        ++p)
3895     {
3896       if (p->is_input_section()
3897 	  || p->is_relaxed_input_section()
3898 	  || p->is_merge_section())
3899 	input_sections->push_back(*p);
3900       else
3901 	{
3902 	  uint64_t aligned_address = align_address(address, p->addralign());
3903 	  if (aligned_address != address && !fill.empty())
3904 	    {
3905 	      section_size_type length =
3906 		convert_to_section_size_type(aligned_address - address);
3907 	      std::string this_fill;
3908 	      this_fill.reserve(length);
3909 	      while (this_fill.length() + fill.length() <= length)
3910 		this_fill += fill;
3911 	      if (this_fill.length() < length)
3912 		this_fill.append(fill, 0, length - this_fill.length());
3913 
3914 	      Output_section_data* posd = new Output_data_const(this_fill, 0);
3915 	      remaining.push_back(Input_section(posd));
3916 	    }
3917 	  address = aligned_address;
3918 
3919 	  remaining.push_back(*p);
3920 
3921 	  p->finalize_data_size();
3922 	  address += p->data_size();
3923 	}
3924     }
3925 
3926   this->input_sections_.swap(remaining);
3927   this->first_input_offset_ = 0;
3928 
3929   uint64_t data_size = address - orig_address;
3930   this->set_current_data_size_for_child(data_size);
3931   return data_size;
3932 }
3933 
3934 // Add a script input section.  SIS is an Output_section::Input_section,
3935 // which can be either a plain input section or a special input section like
3936 // a relaxed input section.  For a special input section, its size must be
3937 // finalized.
3938 
3939 void
add_script_input_section(const Input_section & sis)3940 Output_section::add_script_input_section(const Input_section& sis)
3941 {
3942   uint64_t data_size = sis.data_size();
3943   uint64_t addralign = sis.addralign();
3944   if (addralign > this->addralign_)
3945     this->addralign_ = addralign;
3946 
3947   off_t offset_in_section = this->current_data_size_for_child();
3948   off_t aligned_offset_in_section = align_address(offset_in_section,
3949 						  addralign);
3950 
3951   this->set_current_data_size_for_child(aligned_offset_in_section
3952 					+ data_size);
3953 
3954   this->input_sections_.push_back(sis);
3955 
3956   // Update fast lookup maps if necessary.
3957   if (this->lookup_maps_->is_valid())
3958     {
3959       if (sis.is_relaxed_input_section())
3960 	{
3961 	  Output_relaxed_input_section* poris = sis.relaxed_input_section();
3962 	  this->lookup_maps_->add_relaxed_input_section(poris->relobj(),
3963 							poris->shndx(), poris);
3964 	}
3965     }
3966 }
3967 
3968 // Save states for relaxation.
3969 
3970 void
save_states()3971 Output_section::save_states()
3972 {
3973   gold_assert(this->checkpoint_ == NULL);
3974   Checkpoint_output_section* checkpoint =
3975     new Checkpoint_output_section(this->addralign_, this->flags_,
3976 				  this->input_sections_,
3977 				  this->first_input_offset_,
3978 				  this->attached_input_sections_are_sorted_);
3979   this->checkpoint_ = checkpoint;
3980   gold_assert(this->fills_.empty());
3981 }
3982 
3983 void
discard_states()3984 Output_section::discard_states()
3985 {
3986   gold_assert(this->checkpoint_ != NULL);
3987   delete this->checkpoint_;
3988   this->checkpoint_ = NULL;
3989   gold_assert(this->fills_.empty());
3990 
3991   // Simply invalidate the fast lookup maps since we do not keep
3992   // track of them.
3993   this->lookup_maps_->invalidate();
3994 }
3995 
3996 void
restore_states()3997 Output_section::restore_states()
3998 {
3999   gold_assert(this->checkpoint_ != NULL);
4000   Checkpoint_output_section* checkpoint = this->checkpoint_;
4001 
4002   this->addralign_ = checkpoint->addralign();
4003   this->flags_ = checkpoint->flags();
4004   this->first_input_offset_ = checkpoint->first_input_offset();
4005 
4006   if (!checkpoint->input_sections_saved())
4007     {
4008       // If we have not copied the input sections, just resize it.
4009       size_t old_size = checkpoint->input_sections_size();
4010       gold_assert(this->input_sections_.size() >= old_size);
4011       this->input_sections_.resize(old_size);
4012     }
4013   else
4014     {
4015       // We need to copy the whole list.  This is not efficient for
4016       // extremely large output with hundreads of thousands of input
4017       // objects.  We may need to re-think how we should pass sections
4018       // to scripts.
4019       this->input_sections_ = *checkpoint->input_sections();
4020     }
4021 
4022   this->attached_input_sections_are_sorted_ =
4023     checkpoint->attached_input_sections_are_sorted();
4024 
4025   // Simply invalidate the fast lookup maps since we do not keep
4026   // track of them.
4027   this->lookup_maps_->invalidate();
4028 }
4029 
4030 // Update the section offsets of input sections in this.  This is required if
4031 // relaxation causes some input sections to change sizes.
4032 
4033 void
adjust_section_offsets()4034 Output_section::adjust_section_offsets()
4035 {
4036   if (!this->section_offsets_need_adjustment_)
4037     return;
4038 
4039   off_t off = 0;
4040   for (Input_section_list::iterator p = this->input_sections_.begin();
4041        p != this->input_sections_.end();
4042        ++p)
4043     {
4044       off = align_address(off, p->addralign());
4045       if (p->is_input_section())
4046 	p->relobj()->set_section_offset(p->shndx(), off);
4047       off += p->data_size();
4048     }
4049 
4050   this->section_offsets_need_adjustment_ = false;
4051 }
4052 
4053 // Print to the map file.
4054 
4055 void
do_print_to_mapfile(Mapfile * mapfile) const4056 Output_section::do_print_to_mapfile(Mapfile* mapfile) const
4057 {
4058   mapfile->print_output_section(this);
4059 
4060   for (Input_section_list::const_iterator p = this->input_sections_.begin();
4061        p != this->input_sections_.end();
4062        ++p)
4063     p->print_to_mapfile(mapfile);
4064 }
4065 
4066 // Print stats for merge sections to stderr.
4067 
4068 void
print_merge_stats()4069 Output_section::print_merge_stats()
4070 {
4071   Input_section_list::iterator p;
4072   for (p = this->input_sections_.begin();
4073        p != this->input_sections_.end();
4074        ++p)
4075     p->print_merge_stats(this->name_);
4076 }
4077 
4078 // Set a fixed layout for the section.  Used for incremental update links.
4079 
4080 void
set_fixed_layout(uint64_t sh_addr,off_t sh_offset,off_t sh_size,uint64_t sh_addralign)4081 Output_section::set_fixed_layout(uint64_t sh_addr, off_t sh_offset,
4082 				 off_t sh_size, uint64_t sh_addralign)
4083 {
4084   this->addralign_ = sh_addralign;
4085   this->set_current_data_size(sh_size);
4086   if ((this->flags_ & elfcpp::SHF_ALLOC) != 0)
4087     this->set_address(sh_addr);
4088   this->set_file_offset(sh_offset);
4089   this->finalize_data_size();
4090   this->free_list_.init(sh_size, false);
4091   this->has_fixed_layout_ = true;
4092 }
4093 
4094 // Reserve space within the fixed layout for the section.  Used for
4095 // incremental update links.
4096 
4097 void
reserve(uint64_t sh_offset,uint64_t sh_size)4098 Output_section::reserve(uint64_t sh_offset, uint64_t sh_size)
4099 {
4100   this->free_list_.remove(sh_offset, sh_offset + sh_size);
4101 }
4102 
4103 // Allocate space from the free list for the section.  Used for
4104 // incremental update links.
4105 
4106 off_t
allocate(off_t len,uint64_t addralign)4107 Output_section::allocate(off_t len, uint64_t addralign)
4108 {
4109   return this->free_list_.allocate(len, addralign, 0);
4110 }
4111 
4112 // Output segment methods.
4113 
Output_segment(elfcpp::Elf_Word type,elfcpp::Elf_Word flags)4114 Output_segment::Output_segment(elfcpp::Elf_Word type, elfcpp::Elf_Word flags)
4115   : vaddr_(0),
4116     paddr_(0),
4117     memsz_(0),
4118     align_(0),
4119     max_align_(0),
4120     min_p_align_(0),
4121     offset_(0),
4122     filesz_(0),
4123     type_(type),
4124     flags_(flags),
4125     is_max_align_known_(false),
4126     are_addresses_set_(false),
4127     is_large_data_segment_(false),
4128     is_unique_segment_(false)
4129 {
4130   // The ELF ABI specifies that a PT_TLS segment always has PF_R as
4131   // the flags.
4132   if (type == elfcpp::PT_TLS)
4133     this->flags_ = elfcpp::PF_R;
4134 }
4135 
4136 // Add an Output_section to a PT_LOAD Output_segment.
4137 
4138 void
add_output_section_to_load(Layout * layout,Output_section * os,elfcpp::Elf_Word seg_flags)4139 Output_segment::add_output_section_to_load(Layout* layout,
4140 					   Output_section* os,
4141 					   elfcpp::Elf_Word seg_flags)
4142 {
4143   gold_assert(this->type() == elfcpp::PT_LOAD);
4144   gold_assert((os->flags() & elfcpp::SHF_ALLOC) != 0);
4145   gold_assert(!this->is_max_align_known_);
4146   gold_assert(os->is_large_data_section() == this->is_large_data_segment());
4147 
4148   this->update_flags_for_output_section(seg_flags);
4149 
4150   // We don't want to change the ordering if we have a linker script
4151   // with a SECTIONS clause.
4152   Output_section_order order = os->order();
4153   if (layout->script_options()->saw_sections_clause())
4154     order = static_cast<Output_section_order>(0);
4155   else
4156     gold_assert(order != ORDER_INVALID);
4157 
4158   this->output_lists_[order].push_back(os);
4159 }
4160 
4161 // Add an Output_section to a non-PT_LOAD Output_segment.
4162 
4163 void
add_output_section_to_nonload(Output_section * os,elfcpp::Elf_Word seg_flags)4164 Output_segment::add_output_section_to_nonload(Output_section* os,
4165 					      elfcpp::Elf_Word seg_flags)
4166 {
4167   gold_assert(this->type() != elfcpp::PT_LOAD);
4168   gold_assert((os->flags() & elfcpp::SHF_ALLOC) != 0);
4169   gold_assert(!this->is_max_align_known_);
4170 
4171   this->update_flags_for_output_section(seg_flags);
4172 
4173   this->output_lists_[0].push_back(os);
4174 }
4175 
4176 // Remove an Output_section from this segment.  It is an error if it
4177 // is not present.
4178 
4179 void
remove_output_section(Output_section * os)4180 Output_segment::remove_output_section(Output_section* os)
4181 {
4182   for (int i = 0; i < static_cast<int>(ORDER_MAX); ++i)
4183     {
4184       Output_data_list* pdl = &this->output_lists_[i];
4185       for (Output_data_list::iterator p = pdl->begin(); p != pdl->end(); ++p)
4186 	{
4187 	  if (*p == os)
4188 	    {
4189 	      pdl->erase(p);
4190 	      return;
4191 	    }
4192 	}
4193     }
4194   gold_unreachable();
4195 }
4196 
4197 // Add an Output_data (which need not be an Output_section) to the
4198 // start of a segment.
4199 
4200 void
add_initial_output_data(Output_data * od)4201 Output_segment::add_initial_output_data(Output_data* od)
4202 {
4203   gold_assert(!this->is_max_align_known_);
4204   Output_data_list::iterator p = this->output_lists_[0].begin();
4205   this->output_lists_[0].insert(p, od);
4206 }
4207 
4208 // Return true if this segment has any sections which hold actual
4209 // data, rather than being a BSS section.
4210 
4211 bool
has_any_data_sections() const4212 Output_segment::has_any_data_sections() const
4213 {
4214   for (int i = 0; i < static_cast<int>(ORDER_MAX); ++i)
4215     {
4216       const Output_data_list* pdl = &this->output_lists_[i];
4217       for (Output_data_list::const_iterator p = pdl->begin();
4218 	   p != pdl->end();
4219 	   ++p)
4220 	{
4221 	  if (!(*p)->is_section())
4222 	    return true;
4223 	  if ((*p)->output_section()->type() != elfcpp::SHT_NOBITS)
4224 	    return true;
4225 	}
4226     }
4227   return false;
4228 }
4229 
4230 // Return whether the first data section (not counting TLS sections)
4231 // is a relro section.
4232 
4233 bool
is_first_section_relro() const4234 Output_segment::is_first_section_relro() const
4235 {
4236   for (int i = 0; i < static_cast<int>(ORDER_MAX); ++i)
4237     {
4238       if (i == static_cast<int>(ORDER_TLS_BSS))
4239 	continue;
4240       const Output_data_list* pdl = &this->output_lists_[i];
4241       if (!pdl->empty())
4242 	{
4243 	  Output_data* p = pdl->front();
4244 	  return p->is_section() && p->output_section()->is_relro();
4245 	}
4246     }
4247   return false;
4248 }
4249 
4250 // Return the maximum alignment of the Output_data in Output_segment.
4251 
4252 uint64_t
maximum_alignment()4253 Output_segment::maximum_alignment()
4254 {
4255   if (!this->is_max_align_known_)
4256     {
4257       for (int i = 0; i < static_cast<int>(ORDER_MAX); ++i)
4258 	{
4259 	  const Output_data_list* pdl = &this->output_lists_[i];
4260 	  uint64_t addralign = Output_segment::maximum_alignment_list(pdl);
4261 	  if (addralign > this->max_align_)
4262 	    this->max_align_ = addralign;
4263 	}
4264       this->is_max_align_known_ = true;
4265     }
4266 
4267   return this->max_align_;
4268 }
4269 
4270 // Return the maximum alignment of a list of Output_data.
4271 
4272 uint64_t
maximum_alignment_list(const Output_data_list * pdl)4273 Output_segment::maximum_alignment_list(const Output_data_list* pdl)
4274 {
4275   uint64_t ret = 0;
4276   for (Output_data_list::const_iterator p = pdl->begin();
4277        p != pdl->end();
4278        ++p)
4279     {
4280       uint64_t addralign = (*p)->addralign();
4281       if (addralign > ret)
4282 	ret = addralign;
4283     }
4284   return ret;
4285 }
4286 
4287 // Return whether this segment has any dynamic relocs.
4288 
4289 bool
has_dynamic_reloc() const4290 Output_segment::has_dynamic_reloc() const
4291 {
4292   for (int i = 0; i < static_cast<int>(ORDER_MAX); ++i)
4293     if (this->has_dynamic_reloc_list(&this->output_lists_[i]))
4294       return true;
4295   return false;
4296 }
4297 
4298 // Return whether this Output_data_list has any dynamic relocs.
4299 
4300 bool
has_dynamic_reloc_list(const Output_data_list * pdl) const4301 Output_segment::has_dynamic_reloc_list(const Output_data_list* pdl) const
4302 {
4303   for (Output_data_list::const_iterator p = pdl->begin();
4304        p != pdl->end();
4305        ++p)
4306     if ((*p)->has_dynamic_reloc())
4307       return true;
4308   return false;
4309 }
4310 
4311 // Set the section addresses for an Output_segment.  If RESET is true,
4312 // reset the addresses first.  ADDR is the address and *POFF is the
4313 // file offset.  Set the section indexes starting with *PSHNDX.
4314 // INCREASE_RELRO is the size of the portion of the first non-relro
4315 // section that should be included in the PT_GNU_RELRO segment.
4316 // If this segment has relro sections, and has been aligned for
4317 // that purpose, set *HAS_RELRO to TRUE.  Return the address of
4318 // the immediately following segment.  Update *HAS_RELRO, *POFF,
4319 // and *PSHNDX.
4320 
4321 uint64_t
set_section_addresses(const Target * target,Layout * layout,bool reset,uint64_t addr,unsigned int * increase_relro,bool * has_relro,off_t * poff,unsigned int * pshndx)4322 Output_segment::set_section_addresses(const Target* target,
4323 				      Layout* layout, bool reset,
4324 				      uint64_t addr,
4325 				      unsigned int* increase_relro,
4326 				      bool* has_relro,
4327 				      off_t* poff,
4328 				      unsigned int* pshndx)
4329 {
4330   gold_assert(this->type_ == elfcpp::PT_LOAD);
4331 
4332   uint64_t last_relro_pad = 0;
4333   off_t orig_off = *poff;
4334 
4335   bool in_tls = false;
4336 
4337   // If we have relro sections, we need to pad forward now so that the
4338   // relro sections plus INCREASE_RELRO end on an abi page boundary.
4339   if (parameters->options().relro()
4340       && this->is_first_section_relro()
4341       && (!this->are_addresses_set_ || reset))
4342     {
4343       uint64_t relro_size = 0;
4344       off_t off = *poff;
4345       uint64_t max_align = 0;
4346       for (int i = 0; i <= static_cast<int>(ORDER_RELRO_LAST); ++i)
4347 	{
4348 	  Output_data_list* pdl = &this->output_lists_[i];
4349 	  Output_data_list::iterator p;
4350 	  for (p = pdl->begin(); p != pdl->end(); ++p)
4351 	    {
4352 	      if (!(*p)->is_section())
4353 		break;
4354 	      uint64_t align = (*p)->addralign();
4355 	      if (align > max_align)
4356 		max_align = align;
4357 	      if ((*p)->is_section_flag_set(elfcpp::SHF_TLS))
4358 		in_tls = true;
4359 	      else if (in_tls)
4360 		{
4361 		  // Align the first non-TLS section to the alignment
4362 		  // of the TLS segment.
4363 		  align = max_align;
4364 		  in_tls = false;
4365 		}
4366 	      // Ignore the size of the .tbss section.
4367 	      if ((*p)->is_section_flag_set(elfcpp::SHF_TLS)
4368 		  && (*p)->is_section_type(elfcpp::SHT_NOBITS))
4369 		continue;
4370 	      relro_size = align_address(relro_size, align);
4371 	      if ((*p)->is_address_valid())
4372 		relro_size += (*p)->data_size();
4373 	      else
4374 		{
4375 		  // FIXME: This could be faster.
4376 		  (*p)->set_address_and_file_offset(relro_size,
4377 						    relro_size);
4378 		  relro_size += (*p)->data_size();
4379 		  (*p)->reset_address_and_file_offset();
4380 		}
4381 	    }
4382 	  if (p != pdl->end())
4383 	    break;
4384 	}
4385       relro_size += *increase_relro;
4386       // Pad the total relro size to a multiple of the maximum
4387       // section alignment seen.
4388       uint64_t aligned_size = align_address(relro_size, max_align);
4389       // Note the amount of padding added after the last relro section.
4390       last_relro_pad = aligned_size - relro_size;
4391       *has_relro = true;
4392 
4393       uint64_t page_align = parameters->target().abi_pagesize();
4394 
4395       // Align to offset N such that (N + RELRO_SIZE) % PAGE_ALIGN == 0.
4396       uint64_t desired_align = page_align - (aligned_size % page_align);
4397       if (desired_align < off % page_align)
4398 	off += page_align;
4399       off += desired_align - off % page_align;
4400       addr += off - orig_off;
4401       orig_off = off;
4402       *poff = off;
4403     }
4404 
4405   if (!reset && this->are_addresses_set_)
4406     {
4407       gold_assert(this->paddr_ == addr);
4408       addr = this->vaddr_;
4409     }
4410   else
4411     {
4412       this->vaddr_ = addr;
4413       this->paddr_ = addr;
4414       this->are_addresses_set_ = true;
4415     }
4416 
4417   in_tls = false;
4418 
4419   this->offset_ = orig_off;
4420 
4421   off_t off = 0;
4422   off_t foff = *poff;
4423   uint64_t ret = 0;
4424   for (int i = 0; i < static_cast<int>(ORDER_MAX); ++i)
4425     {
4426       if (i == static_cast<int>(ORDER_RELRO_LAST))
4427 	{
4428 	  *poff += last_relro_pad;
4429 	  foff += last_relro_pad;
4430 	  addr += last_relro_pad;
4431 	  if (this->output_lists_[i].empty())
4432 	    {
4433 	      // If there is nothing in the ORDER_RELRO_LAST list,
4434 	      // the padding will occur at the end of the relro
4435 	      // segment, and we need to add it to *INCREASE_RELRO.
4436 	      *increase_relro += last_relro_pad;
4437 	    }
4438 	}
4439       addr = this->set_section_list_addresses(layout, reset,
4440 					      &this->output_lists_[i],
4441 					      addr, poff, &foff, pshndx,
4442 					      &in_tls);
4443 
4444       // FOFF tracks the last offset used for the file image,
4445       // and *POFF tracks the last offset used for the memory image.
4446       // When not using a linker script, bss sections should all
4447       // be processed in the ORDER_SMALL_BSS and later buckets.
4448       gold_assert(*poff == foff
4449 		  || i == static_cast<int>(ORDER_TLS_BSS)
4450 		  || i >= static_cast<int>(ORDER_SMALL_BSS)
4451 		  || layout->script_options()->saw_sections_clause());
4452 
4453       this->filesz_ = foff - orig_off;
4454       off = foff;
4455 
4456       ret = addr;
4457     }
4458 
4459   // If the last section was a TLS section, align upward to the
4460   // alignment of the TLS segment, so that the overall size of the TLS
4461   // segment is aligned.
4462   if (in_tls)
4463     {
4464       uint64_t segment_align = layout->tls_segment()->maximum_alignment();
4465       *poff = align_address(*poff, segment_align);
4466     }
4467 
4468   this->memsz_ = *poff - orig_off;
4469 
4470   // Ignore the file offset adjustments made by the BSS Output_data
4471   // objects.
4472   *poff = off;
4473 
4474   // If code segments must contain only code, and this code segment is
4475   // page-aligned in the file, then fill it out to a whole page with
4476   // code fill (the tail of the segment will not be within any section).
4477   // Thus the entire code segment can be mapped from the file as whole
4478   // pages and that mapping will contain only valid instructions.
4479   if (target->isolate_execinstr() && (this->flags() & elfcpp::PF_X) != 0)
4480     {
4481       uint64_t abi_pagesize = target->abi_pagesize();
4482       if (orig_off % abi_pagesize == 0 && off % abi_pagesize != 0)
4483 	{
4484 	  size_t fill_size = abi_pagesize - (off % abi_pagesize);
4485 
4486 	  std::string fill_data;
4487 	  if (target->has_code_fill())
4488 	    fill_data = target->code_fill(fill_size);
4489 	  else
4490 	    fill_data.resize(fill_size); // Zero fill.
4491 
4492 	  Output_data_const* fill = new Output_data_const(fill_data, 0);
4493 	  fill->set_address(this->vaddr_ + this->memsz_);
4494 	  fill->set_file_offset(off);
4495 	  layout->add_relax_output(fill);
4496 
4497 	  off += fill_size;
4498 	  gold_assert(off % abi_pagesize == 0);
4499 	  ret += fill_size;
4500 	  gold_assert(ret % abi_pagesize == 0);
4501 
4502 	  gold_assert((uint64_t) this->filesz_ == this->memsz_);
4503 	  this->memsz_ = this->filesz_ += fill_size;
4504 
4505 	  *poff = off;
4506 	}
4507     }
4508 
4509   return ret;
4510 }
4511 
4512 // Set the addresses and file offsets in a list of Output_data
4513 // structures.
4514 
4515 uint64_t
set_section_list_addresses(Layout * layout,bool reset,Output_data_list * pdl,uint64_t addr,off_t * poff,off_t * pfoff,unsigned int * pshndx,bool * in_tls)4516 Output_segment::set_section_list_addresses(Layout* layout, bool reset,
4517 					   Output_data_list* pdl,
4518 					   uint64_t addr, off_t* poff,
4519 					   off_t* pfoff,
4520 					   unsigned int* pshndx,
4521 					   bool* in_tls)
4522 {
4523   off_t startoff = *poff;
4524   // For incremental updates, we may allocate non-fixed sections from
4525   // free space in the file.  This keeps track of the high-water mark.
4526   off_t maxoff = startoff;
4527 
4528   off_t off = startoff;
4529   off_t foff = *pfoff;
4530   for (Output_data_list::iterator p = pdl->begin();
4531        p != pdl->end();
4532        ++p)
4533     {
4534       bool is_bss = (*p)->is_section_type(elfcpp::SHT_NOBITS);
4535       bool is_tls = (*p)->is_section_flag_set(elfcpp::SHF_TLS);
4536 
4537       if (reset)
4538 	(*p)->reset_address_and_file_offset();
4539 
4540       // When doing an incremental update or when using a linker script,
4541       // the section will most likely already have an address.
4542       if (!(*p)->is_address_valid())
4543 	{
4544 	  uint64_t align = (*p)->addralign();
4545 
4546 	  if (is_tls)
4547 	    {
4548 	      // Give the first TLS section the alignment of the
4549 	      // entire TLS segment.  Otherwise the TLS segment as a
4550 	      // whole may be misaligned.
4551 	      if (!*in_tls)
4552 		{
4553 		  Output_segment* tls_segment = layout->tls_segment();
4554 		  gold_assert(tls_segment != NULL);
4555 		  uint64_t segment_align = tls_segment->maximum_alignment();
4556 		  gold_assert(segment_align >= align);
4557 		  align = segment_align;
4558 
4559 		  *in_tls = true;
4560 		}
4561 	    }
4562 	  else
4563 	    {
4564 	      // If this is the first section after the TLS segment,
4565 	      // align it to at least the alignment of the TLS
4566 	      // segment, so that the size of the overall TLS segment
4567 	      // is aligned.
4568 	      if (*in_tls)
4569 		{
4570 		  uint64_t segment_align =
4571 		      layout->tls_segment()->maximum_alignment();
4572 		  if (segment_align > align)
4573 		    align = segment_align;
4574 
4575 		  *in_tls = false;
4576 		}
4577 	    }
4578 
4579 	  if (!parameters->incremental_update())
4580 	    {
4581 	      gold_assert(off == foff || is_bss);
4582 	      off = align_address(off, align);
4583 	      if (is_tls || !is_bss)
4584 		foff = off;
4585 	      (*p)->set_address_and_file_offset(addr + (off - startoff), foff);
4586 	    }
4587 	  else
4588 	    {
4589 	      // Incremental update: allocate file space from free list.
4590 	      (*p)->pre_finalize_data_size();
4591 	      off_t current_size = (*p)->current_data_size();
4592 	      off = layout->allocate(current_size, align, startoff);
4593 	      foff = off;
4594 	      if (off == -1)
4595 		{
4596 		  gold_assert((*p)->output_section() != NULL);
4597 		  gold_fallback(_("out of patch space for section %s; "
4598 				  "relink with --incremental-full"),
4599 				(*p)->output_section()->name());
4600 		}
4601 	      (*p)->set_address_and_file_offset(addr + (off - startoff), foff);
4602 	      if ((*p)->data_size() > current_size)
4603 		{
4604 		  gold_assert((*p)->output_section() != NULL);
4605 		  gold_fallback(_("%s: section changed size; "
4606 				  "relink with --incremental-full"),
4607 				(*p)->output_section()->name());
4608 		}
4609 	    }
4610 	}
4611       else if (parameters->incremental_update())
4612 	{
4613 	  // For incremental updates, use the fixed offset for the
4614 	  // high-water mark computation.
4615 	  off = (*p)->offset();
4616 	  foff = off;
4617 	}
4618       else
4619 	{
4620 	  // The script may have inserted a skip forward, but it
4621 	  // better not have moved backward.
4622 	  if ((*p)->address() >= addr + (off - startoff))
4623 	    {
4624 	      if (!is_bss && off > foff)
4625 	        gold_warning(_("script places BSS section in the middle "
4626 			       "of a LOAD segment; space will be allocated "
4627 			       "in the file"));
4628 	      off += (*p)->address() - (addr + (off - startoff));
4629 	      if (is_tls || !is_bss)
4630 		foff = off;
4631 	    }
4632 	  else
4633 	    {
4634 	      if (!layout->script_options()->saw_sections_clause())
4635 		gold_unreachable();
4636 	      else
4637 		{
4638 		  Output_section* os = (*p)->output_section();
4639 
4640 		  // Cast to unsigned long long to avoid format warnings.
4641 		  unsigned long long previous_dot =
4642 		    static_cast<unsigned long long>(addr + (off - startoff));
4643 		  unsigned long long dot =
4644 		    static_cast<unsigned long long>((*p)->address());
4645 
4646 		  if (os == NULL)
4647 		    gold_error(_("dot moves backward in linker script "
4648 				 "from 0x%llx to 0x%llx"), previous_dot, dot);
4649 		  else
4650 		    gold_error(_("address of section '%s' moves backward "
4651 				 "from 0x%llx to 0x%llx"),
4652 			       os->name(), previous_dot, dot);
4653 		}
4654 	    }
4655 	  (*p)->set_file_offset(foff);
4656 	  (*p)->finalize_data_size();
4657 	}
4658 
4659       if (parameters->incremental_update())
4660 	gold_debug(DEBUG_INCREMENTAL,
4661 		   "set_section_list_addresses: %08lx %08lx %s",
4662 		   static_cast<long>(off),
4663 		   static_cast<long>((*p)->data_size()),
4664 		   ((*p)->output_section() != NULL
4665 		    ? (*p)->output_section()->name() : "(special)"));
4666 
4667       // We want to ignore the size of a SHF_TLS SHT_NOBITS
4668       // section.  Such a section does not affect the size of a
4669       // PT_LOAD segment.
4670       if (!is_tls || !is_bss)
4671 	off += (*p)->data_size();
4672 
4673       // We don't allocate space in the file for SHT_NOBITS sections,
4674       // unless a script has force-placed one in the middle of a segment.
4675       if (!is_bss)
4676 	foff = off;
4677 
4678       if (off > maxoff)
4679 	maxoff = off;
4680 
4681       if ((*p)->is_section())
4682 	{
4683 	  (*p)->set_out_shndx(*pshndx);
4684 	  ++*pshndx;
4685 	}
4686     }
4687 
4688   *poff = maxoff;
4689   *pfoff = foff;
4690   return addr + (maxoff - startoff);
4691 }
4692 
4693 // For a non-PT_LOAD segment, set the offset from the sections, if
4694 // any.  Add INCREASE to the file size and the memory size.
4695 
4696 void
set_offset(unsigned int increase)4697 Output_segment::set_offset(unsigned int increase)
4698 {
4699   gold_assert(this->type_ != elfcpp::PT_LOAD);
4700 
4701   gold_assert(!this->are_addresses_set_);
4702 
4703   // A non-load section only uses output_lists_[0].
4704 
4705   Output_data_list* pdl = &this->output_lists_[0];
4706 
4707   if (pdl->empty())
4708     {
4709       gold_assert(increase == 0);
4710       this->vaddr_ = 0;
4711       this->paddr_ = 0;
4712       this->are_addresses_set_ = true;
4713       this->memsz_ = 0;
4714       this->min_p_align_ = 0;
4715       this->offset_ = 0;
4716       this->filesz_ = 0;
4717       return;
4718     }
4719 
4720   // Find the first and last section by address.
4721   const Output_data* first = NULL;
4722   const Output_data* last_data = NULL;
4723   const Output_data* last_bss = NULL;
4724   for (Output_data_list::const_iterator p = pdl->begin();
4725        p != pdl->end();
4726        ++p)
4727     {
4728       if (first == NULL
4729 	  || (*p)->address() < first->address()
4730 	  || ((*p)->address() == first->address()
4731 	      && (*p)->data_size() < first->data_size()))
4732 	first = *p;
4733       const Output_data** plast;
4734       if ((*p)->is_section()
4735 	  && (*p)->output_section()->type() == elfcpp::SHT_NOBITS)
4736 	plast = &last_bss;
4737       else
4738 	plast = &last_data;
4739       if (*plast == NULL
4740 	  || (*p)->address() > (*plast)->address()
4741 	  || ((*p)->address() == (*plast)->address()
4742 	      && (*p)->data_size() > (*plast)->data_size()))
4743 	*plast = *p;
4744     }
4745 
4746   this->vaddr_ = first->address();
4747   this->paddr_ = (first->has_load_address()
4748 		  ? first->load_address()
4749 		  : this->vaddr_);
4750   this->are_addresses_set_ = true;
4751   this->offset_ = first->offset();
4752 
4753   if (last_data == NULL)
4754     this->filesz_ = 0;
4755   else
4756     this->filesz_ = (last_data->address()
4757 		     + last_data->data_size()
4758 		     - this->vaddr_);
4759 
4760   const Output_data* last = last_bss != NULL ? last_bss : last_data;
4761   this->memsz_ = (last->address()
4762 		  + last->data_size()
4763 		  - this->vaddr_);
4764 
4765   this->filesz_ += increase;
4766   this->memsz_ += increase;
4767 
4768   // If this is a RELRO segment, verify that the segment ends at a
4769   // page boundary.
4770   if (this->type_ == elfcpp::PT_GNU_RELRO)
4771     {
4772       uint64_t page_align = parameters->target().abi_pagesize();
4773       uint64_t segment_end = this->vaddr_ + this->memsz_;
4774       if (parameters->incremental_update())
4775 	{
4776 	  // The INCREASE_RELRO calculation is bypassed for an incremental
4777 	  // update, so we need to adjust the segment size manually here.
4778 	  segment_end = align_address(segment_end, page_align);
4779 	  this->memsz_ = segment_end - this->vaddr_;
4780 	}
4781       else
4782 	gold_assert(segment_end == align_address(segment_end, page_align));
4783     }
4784 
4785   // If this is a TLS segment, align the memory size.  The code in
4786   // set_section_list ensures that the section after the TLS segment
4787   // is aligned to give us room.
4788   if (this->type_ == elfcpp::PT_TLS)
4789     {
4790       uint64_t segment_align = this->maximum_alignment();
4791       gold_assert(this->vaddr_ == align_address(this->vaddr_, segment_align));
4792       this->memsz_ = align_address(this->memsz_, segment_align);
4793     }
4794 }
4795 
4796 // Set the TLS offsets of the sections in the PT_TLS segment.
4797 
4798 void
set_tls_offsets()4799 Output_segment::set_tls_offsets()
4800 {
4801   gold_assert(this->type_ == elfcpp::PT_TLS);
4802 
4803   for (Output_data_list::iterator p = this->output_lists_[0].begin();
4804        p != this->output_lists_[0].end();
4805        ++p)
4806     (*p)->set_tls_offset(this->vaddr_);
4807 }
4808 
4809 // Return the first section.
4810 
4811 Output_section*
first_section() const4812 Output_segment::first_section() const
4813 {
4814   for (int i = 0; i < static_cast<int>(ORDER_MAX); ++i)
4815     {
4816       const Output_data_list* pdl = &this->output_lists_[i];
4817       for (Output_data_list::const_iterator p = pdl->begin();
4818 	   p != pdl->end();
4819 	   ++p)
4820 	{
4821 	  if ((*p)->is_section())
4822 	    return (*p)->output_section();
4823 	}
4824     }
4825   return NULL;
4826 }
4827 
4828 // Return the number of Output_sections in an Output_segment.
4829 
4830 unsigned int
output_section_count() const4831 Output_segment::output_section_count() const
4832 {
4833   unsigned int ret = 0;
4834   for (int i = 0; i < static_cast<int>(ORDER_MAX); ++i)
4835     ret += this->output_section_count_list(&this->output_lists_[i]);
4836   return ret;
4837 }
4838 
4839 // Return the number of Output_sections in an Output_data_list.
4840 
4841 unsigned int
output_section_count_list(const Output_data_list * pdl) const4842 Output_segment::output_section_count_list(const Output_data_list* pdl) const
4843 {
4844   unsigned int count = 0;
4845   for (Output_data_list::const_iterator p = pdl->begin();
4846        p != pdl->end();
4847        ++p)
4848     {
4849       if ((*p)->is_section())
4850 	++count;
4851     }
4852   return count;
4853 }
4854 
4855 // Return the section attached to the list segment with the lowest
4856 // load address.  This is used when handling a PHDRS clause in a
4857 // linker script.
4858 
4859 Output_section*
section_with_lowest_load_address() const4860 Output_segment::section_with_lowest_load_address() const
4861 {
4862   Output_section* found = NULL;
4863   uint64_t found_lma = 0;
4864   for (int i = 0; i < static_cast<int>(ORDER_MAX); ++i)
4865     this->lowest_load_address_in_list(&this->output_lists_[i], &found,
4866 				      &found_lma);
4867   return found;
4868 }
4869 
4870 // Look through a list for a section with a lower load address.
4871 
4872 void
lowest_load_address_in_list(const Output_data_list * pdl,Output_section ** found,uint64_t * found_lma) const4873 Output_segment::lowest_load_address_in_list(const Output_data_list* pdl,
4874 					    Output_section** found,
4875 					    uint64_t* found_lma) const
4876 {
4877   for (Output_data_list::const_iterator p = pdl->begin();
4878        p != pdl->end();
4879        ++p)
4880     {
4881       if (!(*p)->is_section())
4882 	continue;
4883       Output_section* os = static_cast<Output_section*>(*p);
4884       uint64_t lma = (os->has_load_address()
4885 		      ? os->load_address()
4886 		      : os->address());
4887       if (*found == NULL || lma < *found_lma)
4888 	{
4889 	  *found = os;
4890 	  *found_lma = lma;
4891 	}
4892     }
4893 }
4894 
4895 // Write the segment data into *OPHDR.
4896 
4897 template<int size, bool big_endian>
4898 void
write_header(elfcpp::Phdr_write<size,big_endian> * ophdr)4899 Output_segment::write_header(elfcpp::Phdr_write<size, big_endian>* ophdr)
4900 {
4901   ophdr->put_p_type(this->type_);
4902   ophdr->put_p_offset(this->offset_);
4903   ophdr->put_p_vaddr(this->vaddr_);
4904   ophdr->put_p_paddr(this->paddr_);
4905   ophdr->put_p_filesz(this->filesz_);
4906   ophdr->put_p_memsz(this->memsz_);
4907   ophdr->put_p_flags(this->flags_);
4908   ophdr->put_p_align(std::max(this->min_p_align_, this->maximum_alignment()));
4909 }
4910 
4911 // Write the section headers into V.
4912 
4913 template<int size, bool big_endian>
4914 unsigned char*
write_section_headers(const Layout * layout,const Stringpool * secnamepool,unsigned char * v,unsigned int * pshndx) const4915 Output_segment::write_section_headers(const Layout* layout,
4916 				      const Stringpool* secnamepool,
4917 				      unsigned char* v,
4918 				      unsigned int* pshndx) const
4919 {
4920   // Every section that is attached to a segment must be attached to a
4921   // PT_LOAD segment, so we only write out section headers for PT_LOAD
4922   // segments.
4923   if (this->type_ != elfcpp::PT_LOAD)
4924     return v;
4925 
4926   for (int i = 0; i < static_cast<int>(ORDER_MAX); ++i)
4927     {
4928       const Output_data_list* pdl = &this->output_lists_[i];
4929       v = this->write_section_headers_list<size, big_endian>(layout,
4930 							     secnamepool,
4931 							     pdl,
4932 							     v, pshndx);
4933     }
4934 
4935   return v;
4936 }
4937 
4938 template<int size, bool big_endian>
4939 unsigned char*
write_section_headers_list(const Layout * layout,const Stringpool * secnamepool,const Output_data_list * pdl,unsigned char * v,unsigned int * pshndx) const4940 Output_segment::write_section_headers_list(const Layout* layout,
4941 					   const Stringpool* secnamepool,
4942 					   const Output_data_list* pdl,
4943 					   unsigned char* v,
4944 					   unsigned int* pshndx) const
4945 {
4946   const int shdr_size = elfcpp::Elf_sizes<size>::shdr_size;
4947   for (Output_data_list::const_iterator p = pdl->begin();
4948        p != pdl->end();
4949        ++p)
4950     {
4951       if ((*p)->is_section())
4952 	{
4953 	  const Output_section* ps = static_cast<const Output_section*>(*p);
4954 	  gold_assert(*pshndx == ps->out_shndx());
4955 	  elfcpp::Shdr_write<size, big_endian> oshdr(v);
4956 	  ps->write_header(layout, secnamepool, &oshdr);
4957 	  v += shdr_size;
4958 	  ++*pshndx;
4959 	}
4960     }
4961   return v;
4962 }
4963 
4964 // Print the output sections to the map file.
4965 
4966 void
print_sections_to_mapfile(Mapfile * mapfile) const4967 Output_segment::print_sections_to_mapfile(Mapfile* mapfile) const
4968 {
4969   if (this->type() != elfcpp::PT_LOAD)
4970     return;
4971   for (int i = 0; i < static_cast<int>(ORDER_MAX); ++i)
4972     this->print_section_list_to_mapfile(mapfile, &this->output_lists_[i]);
4973 }
4974 
4975 // Print an output section list to the map file.
4976 
4977 void
print_section_list_to_mapfile(Mapfile * mapfile,const Output_data_list * pdl) const4978 Output_segment::print_section_list_to_mapfile(Mapfile* mapfile,
4979 					      const Output_data_list* pdl) const
4980 {
4981   for (Output_data_list::const_iterator p = pdl->begin();
4982        p != pdl->end();
4983        ++p)
4984     (*p)->print_to_mapfile(mapfile);
4985 }
4986 
4987 // Output_file methods.
4988 
Output_file(const char * name)4989 Output_file::Output_file(const char* name)
4990   : name_(name),
4991     o_(-1),
4992     file_size_(0),
4993     base_(NULL),
4994     map_is_anonymous_(false),
4995     map_is_allocated_(false),
4996     is_temporary_(false)
4997 {
4998 }
4999 
5000 // Try to open an existing file.  Returns false if the file doesn't
5001 // exist, has a size of 0 or can't be mmapped.  If BASE_NAME is not
5002 // NULL, open that file as the base for incremental linking, and
5003 // copy its contents to the new output file.  This routine can
5004 // be called for incremental updates, in which case WRITABLE should
5005 // be true, or by the incremental-dump utility, in which case
5006 // WRITABLE should be false.
5007 
5008 bool
open_base_file(const char * base_name,bool writable)5009 Output_file::open_base_file(const char* base_name, bool writable)
5010 {
5011   // The name "-" means "stdout".
5012   if (strcmp(this->name_, "-") == 0)
5013     return false;
5014 
5015   bool use_base_file = base_name != NULL;
5016   if (!use_base_file)
5017     base_name = this->name_;
5018   else if (strcmp(base_name, this->name_) == 0)
5019     gold_fatal(_("%s: incremental base and output file name are the same"),
5020 	       base_name);
5021 
5022   // Don't bother opening files with a size of zero.
5023   struct stat s;
5024   if (::stat(base_name, &s) != 0)
5025     {
5026       gold_info(_("%s: stat: %s"), base_name, strerror(errno));
5027       return false;
5028     }
5029   if (s.st_size == 0)
5030     {
5031       gold_info(_("%s: incremental base file is empty"), base_name);
5032       return false;
5033     }
5034 
5035   // If we're using a base file, we want to open it read-only.
5036   if (use_base_file)
5037     writable = false;
5038 
5039   int oflags = writable ? O_RDWR : O_RDONLY;
5040   int o = open_descriptor(-1, base_name, oflags, 0);
5041   if (o < 0)
5042     {
5043       gold_info(_("%s: open: %s"), base_name, strerror(errno));
5044       return false;
5045     }
5046 
5047   // If the base file and the output file are different, open a
5048   // new output file and read the contents from the base file into
5049   // the newly-mapped region.
5050   if (use_base_file)
5051     {
5052       this->open(s.st_size);
5053       ssize_t bytes_to_read = s.st_size;
5054       unsigned char* p = this->base_;
5055       while (bytes_to_read > 0)
5056 	{
5057 	  ssize_t len = ::read(o, p, bytes_to_read);
5058 	  if (len < 0)
5059 	    {
5060 	      gold_info(_("%s: read failed: %s"), base_name, strerror(errno));
5061 	      return false;
5062 	    }
5063 	  if (len == 0)
5064 	    {
5065 	      gold_info(_("%s: file too short: read only %lld of %lld bytes"),
5066 			base_name,
5067 			static_cast<long long>(s.st_size - bytes_to_read),
5068 			static_cast<long long>(s.st_size));
5069 	      return false;
5070 	    }
5071 	  p += len;
5072 	  bytes_to_read -= len;
5073 	}
5074       ::close(o);
5075       return true;
5076     }
5077 
5078   this->o_ = o;
5079   this->file_size_ = s.st_size;
5080 
5081   if (!this->map_no_anonymous(writable))
5082     {
5083       release_descriptor(o, true);
5084       this->o_ = -1;
5085       this->file_size_ = 0;
5086       return false;
5087     }
5088 
5089   return true;
5090 }
5091 
5092 // Open the output file.
5093 
5094 void
open(off_t file_size)5095 Output_file::open(off_t file_size)
5096 {
5097   this->file_size_ = file_size;
5098 
5099   // Unlink the file first; otherwise the open() may fail if the file
5100   // is busy (e.g. it's an executable that's currently being executed).
5101   //
5102   // However, the linker may be part of a system where a zero-length
5103   // file is created for it to write to, with tight permissions (gcc
5104   // 2.95 did something like this).  Unlinking the file would work
5105   // around those permission controls, so we only unlink if the file
5106   // has a non-zero size.  We also unlink only regular files to avoid
5107   // trouble with directories/etc.
5108   //
5109   // If we fail, continue; this command is merely a best-effort attempt
5110   // to improve the odds for open().
5111 
5112   // We let the name "-" mean "stdout"
5113   if (!this->is_temporary_)
5114     {
5115       if (strcmp(this->name_, "-") == 0)
5116 	this->o_ = STDOUT_FILENO;
5117       else
5118 	{
5119 	  struct stat s;
5120 	  if (::stat(this->name_, &s) == 0
5121 	      && (S_ISREG (s.st_mode) || S_ISLNK (s.st_mode)))
5122 	    {
5123 	      if (s.st_size != 0)
5124 		::unlink(this->name_);
5125 	      else if (!parameters->options().relocatable())
5126 		{
5127 		  // If we don't unlink the existing file, add execute
5128 		  // permission where read permissions already exist
5129 		  // and where the umask permits.
5130 		  int mask = ::umask(0);
5131 		  ::umask(mask);
5132 		  s.st_mode |= (s.st_mode & 0444) >> 2;
5133 		  ::chmod(this->name_, s.st_mode & ~mask);
5134 		}
5135 	    }
5136 
5137 	  int mode = parameters->options().relocatable() ? 0666 : 0777;
5138 	  int o = open_descriptor(-1, this->name_, O_RDWR | O_CREAT | O_TRUNC,
5139 				  mode);
5140 	  if (o < 0)
5141 	    gold_fatal(_("%s: open: %s"), this->name_, strerror(errno));
5142 	  this->o_ = o;
5143 	}
5144     }
5145 
5146   this->map();
5147 }
5148 
5149 // Resize the output file.
5150 
5151 void
resize(off_t file_size)5152 Output_file::resize(off_t file_size)
5153 {
5154   // If the mmap is mapping an anonymous memory buffer, this is easy:
5155   // just mremap to the new size.  If it's mapping to a file, we want
5156   // to unmap to flush to the file, then remap after growing the file.
5157   if (this->map_is_anonymous_)
5158     {
5159       void* base;
5160       if (!this->map_is_allocated_)
5161 	{
5162 	  base = ::mremap(this->base_, this->file_size_, file_size,
5163 			  MREMAP_MAYMOVE);
5164 	  if (base == MAP_FAILED)
5165 	    gold_fatal(_("%s: mremap: %s"), this->name_, strerror(errno));
5166 	}
5167       else
5168 	{
5169 	  base = realloc(this->base_, file_size);
5170 	  if (base == NULL)
5171 	    gold_nomem();
5172 	  if (file_size > this->file_size_)
5173 	    memset(static_cast<char*>(base) + this->file_size_, 0,
5174 		   file_size - this->file_size_);
5175 	}
5176       this->base_ = static_cast<unsigned char*>(base);
5177       this->file_size_ = file_size;
5178     }
5179   else
5180     {
5181       this->unmap();
5182       this->file_size_ = file_size;
5183       if (!this->map_no_anonymous(true))
5184 	gold_fatal(_("%s: mmap: %s"), this->name_, strerror(errno));
5185     }
5186 }
5187 
5188 // Map an anonymous block of memory which will later be written to the
5189 // file.  Return whether the map succeeded.
5190 
5191 bool
map_anonymous()5192 Output_file::map_anonymous()
5193 {
5194   void* base = ::mmap(NULL, this->file_size_, PROT_READ | PROT_WRITE,
5195 		      MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
5196   if (base == MAP_FAILED)
5197     {
5198       base = malloc(this->file_size_);
5199       if (base == NULL)
5200 	return false;
5201       memset(base, 0, this->file_size_);
5202       this->map_is_allocated_ = true;
5203     }
5204   this->base_ = static_cast<unsigned char*>(base);
5205   this->map_is_anonymous_ = true;
5206   return true;
5207 }
5208 
5209 // Map the file into memory.  Return whether the mapping succeeded.
5210 // If WRITABLE is true, map with write access.
5211 
5212 bool
map_no_anonymous(bool writable)5213 Output_file::map_no_anonymous(bool writable)
5214 {
5215   const int o = this->o_;
5216 
5217   // If the output file is not a regular file, don't try to mmap it;
5218   // instead, we'll mmap a block of memory (an anonymous buffer), and
5219   // then later write the buffer to the file.
5220   void* base;
5221   struct stat statbuf;
5222   if (o == STDOUT_FILENO || o == STDERR_FILENO
5223       || ::fstat(o, &statbuf) != 0
5224       || !S_ISREG(statbuf.st_mode)
5225       || this->is_temporary_)
5226     return false;
5227 
5228   // Ensure that we have disk space available for the file.  If we
5229   // don't do this, it is possible that we will call munmap, close,
5230   // and exit with dirty buffers still in the cache with no assigned
5231   // disk blocks.  If the disk is out of space at that point, the
5232   // output file will wind up incomplete, but we will have already
5233   // exited.  The alternative to fallocate would be to use fdatasync,
5234   // but that would be a more significant performance hit.
5235   if (writable)
5236     {
5237       int err = gold_fallocate(o, 0, this->file_size_);
5238       if (err != 0)
5239        gold_fatal(_("%s: %s"), this->name_, strerror(err));
5240     }
5241 
5242   // Map the file into memory.
5243   int prot = PROT_READ;
5244   if (writable)
5245     prot |= PROT_WRITE;
5246   base = ::mmap(NULL, this->file_size_, prot, MAP_SHARED, o, 0);
5247 
5248   // The mmap call might fail because of file system issues: the file
5249   // system might not support mmap at all, or it might not support
5250   // mmap with PROT_WRITE.
5251   if (base == MAP_FAILED)
5252     return false;
5253 
5254   this->map_is_anonymous_ = false;
5255   this->base_ = static_cast<unsigned char*>(base);
5256   return true;
5257 }
5258 
5259 // Map the file into memory.
5260 
5261 void
map()5262 Output_file::map()
5263 {
5264   if (parameters->options().mmap_output_file()
5265       && this->map_no_anonymous(true))
5266     return;
5267 
5268   // The mmap call might fail because of file system issues: the file
5269   // system might not support mmap at all, or it might not support
5270   // mmap with PROT_WRITE.  I'm not sure which errno values we will
5271   // see in all cases, so if the mmap fails for any reason and we
5272   // don't care about file contents, try for an anonymous map.
5273   if (this->map_anonymous())
5274     return;
5275 
5276   gold_fatal(_("%s: mmap: failed to allocate %lu bytes for output file: %s"),
5277 	     this->name_, static_cast<unsigned long>(this->file_size_),
5278 	     strerror(errno));
5279 }
5280 
5281 // Unmap the file from memory.
5282 
5283 void
unmap()5284 Output_file::unmap()
5285 {
5286   if (this->map_is_anonymous_)
5287     {
5288       // We've already written out the data, so there is no reason to
5289       // waste time unmapping or freeing the memory.
5290     }
5291   else
5292     {
5293       if (::munmap(this->base_, this->file_size_) < 0)
5294 	gold_error(_("%s: munmap: %s"), this->name_, strerror(errno));
5295     }
5296   this->base_ = NULL;
5297 }
5298 
5299 // Close the output file.
5300 
5301 void
close()5302 Output_file::close()
5303 {
5304   // If the map isn't file-backed, we need to write it now.
5305   if (this->map_is_anonymous_ && !this->is_temporary_)
5306     {
5307       size_t bytes_to_write = this->file_size_;
5308       size_t offset = 0;
5309       while (bytes_to_write > 0)
5310 	{
5311 	  ssize_t bytes_written = ::write(this->o_, this->base_ + offset,
5312 					  bytes_to_write);
5313 	  if (bytes_written == 0)
5314 	    gold_error(_("%s: write: unexpected 0 return-value"), this->name_);
5315 	  else if (bytes_written < 0)
5316 	    gold_error(_("%s: write: %s"), this->name_, strerror(errno));
5317 	  else
5318 	    {
5319 	      bytes_to_write -= bytes_written;
5320 	      offset += bytes_written;
5321 	    }
5322 	}
5323     }
5324   this->unmap();
5325 
5326   // We don't close stdout or stderr
5327   if (this->o_ != STDOUT_FILENO
5328       && this->o_ != STDERR_FILENO
5329       && !this->is_temporary_)
5330     if (::close(this->o_) < 0)
5331       gold_error(_("%s: close: %s"), this->name_, strerror(errno));
5332   this->o_ = -1;
5333 }
5334 
5335 // Instantiate the templates we need.  We could use the configure
5336 // script to restrict this to only the ones for implemented targets.
5337 
5338 #ifdef HAVE_TARGET_32_LITTLE
5339 template
5340 off_t
5341 Output_section::add_input_section<32, false>(
5342     Layout* layout,
5343     Sized_relobj_file<32, false>* object,
5344     unsigned int shndx,
5345     const char* secname,
5346     const elfcpp::Shdr<32, false>& shdr,
5347     unsigned int reloc_shndx,
5348     bool have_sections_script);
5349 #endif
5350 
5351 #ifdef HAVE_TARGET_32_BIG
5352 template
5353 off_t
5354 Output_section::add_input_section<32, true>(
5355     Layout* layout,
5356     Sized_relobj_file<32, true>* object,
5357     unsigned int shndx,
5358     const char* secname,
5359     const elfcpp::Shdr<32, true>& shdr,
5360     unsigned int reloc_shndx,
5361     bool have_sections_script);
5362 #endif
5363 
5364 #ifdef HAVE_TARGET_64_LITTLE
5365 template
5366 off_t
5367 Output_section::add_input_section<64, false>(
5368     Layout* layout,
5369     Sized_relobj_file<64, false>* object,
5370     unsigned int shndx,
5371     const char* secname,
5372     const elfcpp::Shdr<64, false>& shdr,
5373     unsigned int reloc_shndx,
5374     bool have_sections_script);
5375 #endif
5376 
5377 #ifdef HAVE_TARGET_64_BIG
5378 template
5379 off_t
5380 Output_section::add_input_section<64, true>(
5381     Layout* layout,
5382     Sized_relobj_file<64, true>* object,
5383     unsigned int shndx,
5384     const char* secname,
5385     const elfcpp::Shdr<64, true>& shdr,
5386     unsigned int reloc_shndx,
5387     bool have_sections_script);
5388 #endif
5389 
5390 #ifdef HAVE_TARGET_32_LITTLE
5391 template
5392 class Output_reloc<elfcpp::SHT_REL, false, 32, false>;
5393 #endif
5394 
5395 #ifdef HAVE_TARGET_32_BIG
5396 template
5397 class Output_reloc<elfcpp::SHT_REL, false, 32, true>;
5398 #endif
5399 
5400 #ifdef HAVE_TARGET_64_LITTLE
5401 template
5402 class Output_reloc<elfcpp::SHT_REL, false, 64, false>;
5403 #endif
5404 
5405 #ifdef HAVE_TARGET_64_BIG
5406 template
5407 class Output_reloc<elfcpp::SHT_REL, false, 64, true>;
5408 #endif
5409 
5410 #ifdef HAVE_TARGET_32_LITTLE
5411 template
5412 class Output_reloc<elfcpp::SHT_REL, true, 32, false>;
5413 #endif
5414 
5415 #ifdef HAVE_TARGET_32_BIG
5416 template
5417 class Output_reloc<elfcpp::SHT_REL, true, 32, true>;
5418 #endif
5419 
5420 #ifdef HAVE_TARGET_64_LITTLE
5421 template
5422 class Output_reloc<elfcpp::SHT_REL, true, 64, false>;
5423 #endif
5424 
5425 #ifdef HAVE_TARGET_64_BIG
5426 template
5427 class Output_reloc<elfcpp::SHT_REL, true, 64, true>;
5428 #endif
5429 
5430 #ifdef HAVE_TARGET_32_LITTLE
5431 template
5432 class Output_reloc<elfcpp::SHT_RELA, false, 32, false>;
5433 #endif
5434 
5435 #ifdef HAVE_TARGET_32_BIG
5436 template
5437 class Output_reloc<elfcpp::SHT_RELA, false, 32, true>;
5438 #endif
5439 
5440 #ifdef HAVE_TARGET_64_LITTLE
5441 template
5442 class Output_reloc<elfcpp::SHT_RELA, false, 64, false>;
5443 #endif
5444 
5445 #ifdef HAVE_TARGET_64_BIG
5446 template
5447 class Output_reloc<elfcpp::SHT_RELA, false, 64, true>;
5448 #endif
5449 
5450 #ifdef HAVE_TARGET_32_LITTLE
5451 template
5452 class Output_reloc<elfcpp::SHT_RELA, true, 32, false>;
5453 #endif
5454 
5455 #ifdef HAVE_TARGET_32_BIG
5456 template
5457 class Output_reloc<elfcpp::SHT_RELA, true, 32, true>;
5458 #endif
5459 
5460 #ifdef HAVE_TARGET_64_LITTLE
5461 template
5462 class Output_reloc<elfcpp::SHT_RELA, true, 64, false>;
5463 #endif
5464 
5465 #ifdef HAVE_TARGET_64_BIG
5466 template
5467 class Output_reloc<elfcpp::SHT_RELA, true, 64, true>;
5468 #endif
5469 
5470 #ifdef HAVE_TARGET_32_LITTLE
5471 template
5472 class Output_data_reloc<elfcpp::SHT_REL, false, 32, false>;
5473 #endif
5474 
5475 #ifdef HAVE_TARGET_32_BIG
5476 template
5477 class Output_data_reloc<elfcpp::SHT_REL, false, 32, true>;
5478 #endif
5479 
5480 #ifdef HAVE_TARGET_64_LITTLE
5481 template
5482 class Output_data_reloc<elfcpp::SHT_REL, false, 64, false>;
5483 #endif
5484 
5485 #ifdef HAVE_TARGET_64_BIG
5486 template
5487 class Output_data_reloc<elfcpp::SHT_REL, false, 64, true>;
5488 #endif
5489 
5490 #ifdef HAVE_TARGET_32_LITTLE
5491 template
5492 class Output_data_reloc<elfcpp::SHT_REL, true, 32, false>;
5493 #endif
5494 
5495 #ifdef HAVE_TARGET_32_BIG
5496 template
5497 class Output_data_reloc<elfcpp::SHT_REL, true, 32, true>;
5498 #endif
5499 
5500 #ifdef HAVE_TARGET_64_LITTLE
5501 template
5502 class Output_data_reloc<elfcpp::SHT_REL, true, 64, false>;
5503 #endif
5504 
5505 #ifdef HAVE_TARGET_64_BIG
5506 template
5507 class Output_data_reloc<elfcpp::SHT_REL, true, 64, true>;
5508 #endif
5509 
5510 #ifdef HAVE_TARGET_32_LITTLE
5511 template
5512 class Output_data_reloc<elfcpp::SHT_RELA, false, 32, false>;
5513 #endif
5514 
5515 #ifdef HAVE_TARGET_32_BIG
5516 template
5517 class Output_data_reloc<elfcpp::SHT_RELA, false, 32, true>;
5518 #endif
5519 
5520 #ifdef HAVE_TARGET_64_LITTLE
5521 template
5522 class Output_data_reloc<elfcpp::SHT_RELA, false, 64, false>;
5523 #endif
5524 
5525 #ifdef HAVE_TARGET_64_BIG
5526 template
5527 class Output_data_reloc<elfcpp::SHT_RELA, false, 64, true>;
5528 #endif
5529 
5530 #ifdef HAVE_TARGET_32_LITTLE
5531 template
5532 class Output_data_reloc<elfcpp::SHT_RELA, true, 32, false>;
5533 #endif
5534 
5535 #ifdef HAVE_TARGET_32_BIG
5536 template
5537 class Output_data_reloc<elfcpp::SHT_RELA, true, 32, true>;
5538 #endif
5539 
5540 #ifdef HAVE_TARGET_64_LITTLE
5541 template
5542 class Output_data_reloc<elfcpp::SHT_RELA, true, 64, false>;
5543 #endif
5544 
5545 #ifdef HAVE_TARGET_64_BIG
5546 template
5547 class Output_data_reloc<elfcpp::SHT_RELA, true, 64, true>;
5548 #endif
5549 
5550 #ifdef HAVE_TARGET_32_LITTLE
5551 template
5552 class Output_relocatable_relocs<elfcpp::SHT_REL, 32, false>;
5553 #endif
5554 
5555 #ifdef HAVE_TARGET_32_BIG
5556 template
5557 class Output_relocatable_relocs<elfcpp::SHT_REL, 32, true>;
5558 #endif
5559 
5560 #ifdef HAVE_TARGET_64_LITTLE
5561 template
5562 class Output_relocatable_relocs<elfcpp::SHT_REL, 64, false>;
5563 #endif
5564 
5565 #ifdef HAVE_TARGET_64_BIG
5566 template
5567 class Output_relocatable_relocs<elfcpp::SHT_REL, 64, true>;
5568 #endif
5569 
5570 #ifdef HAVE_TARGET_32_LITTLE
5571 template
5572 class Output_relocatable_relocs<elfcpp::SHT_RELA, 32, false>;
5573 #endif
5574 
5575 #ifdef HAVE_TARGET_32_BIG
5576 template
5577 class Output_relocatable_relocs<elfcpp::SHT_RELA, 32, true>;
5578 #endif
5579 
5580 #ifdef HAVE_TARGET_64_LITTLE
5581 template
5582 class Output_relocatable_relocs<elfcpp::SHT_RELA, 64, false>;
5583 #endif
5584 
5585 #ifdef HAVE_TARGET_64_BIG
5586 template
5587 class Output_relocatable_relocs<elfcpp::SHT_RELA, 64, true>;
5588 #endif
5589 
5590 #ifdef HAVE_TARGET_32_LITTLE
5591 template
5592 class Output_data_group<32, false>;
5593 #endif
5594 
5595 #ifdef HAVE_TARGET_32_BIG
5596 template
5597 class Output_data_group<32, true>;
5598 #endif
5599 
5600 #ifdef HAVE_TARGET_64_LITTLE
5601 template
5602 class Output_data_group<64, false>;
5603 #endif
5604 
5605 #ifdef HAVE_TARGET_64_BIG
5606 template
5607 class Output_data_group<64, true>;
5608 #endif
5609 
5610 template
5611 class Output_data_got<32, false>;
5612 
5613 template
5614 class Output_data_got<32, true>;
5615 
5616 template
5617 class Output_data_got<64, false>;
5618 
5619 template
5620 class Output_data_got<64, true>;
5621 
5622 } // End namespace gold.
5623