// inremental.cc -- incremental linking support for gold
-// Copyright (C) 2009-2016 Free Software Foundation, Inc.
+// Copyright (C) 2009-2021 Free Software Foundation, Inc.
// Written by Mikolaj Zalewski <mikolajz@google.com>.
// This file is part of gold.
// Return TRUE if a section of type SH_TYPE can be updated in place
// during an incremental update. We can update sections of type PROGBITS,
-// NOBITS, INIT_ARRAY, FINI_ARRAY, PREINIT_ARRAY, and NOTE. All others
-// will be regenerated.
+// NOBITS, INIT_ARRAY, FINI_ARRAY, PREINIT_ARRAY, NOTE, and
+// (processor-specific) unwind sections. All others will be regenerated.
bool
can_incremental_update(unsigned int sh_type)
|| sh_type == elfcpp::SHT_INIT_ARRAY
|| sh_type == elfcpp::SHT_FINI_ARRAY
|| sh_type == elfcpp::SHT_PREINIT_ARRAY
- || sh_type == elfcpp::SHT_NOTE);
+ || sh_type == elfcpp::SHT_NOTE
+ || sh_type == parameters->target().unwind_section_type());
}
// Find the .gnu_incremental_inputs section and related sections.
for (unsigned int i = 0; i < count; i++)
{
Input_entry_reader input_file = inputs.input_file(i);
+#if __cplusplus >= 2001103L
+ this->input_entry_readers_.emplace_back(input_file);
+#else
this->input_entry_readers_.push_back(Sized_input_reader(input_file));
+#endif
switch (input_file.type())
{
case INCREMENTAL_INPUT_OBJECT:
{
Target* target = select_target(NULL, 0, // XXX
ehdr.get_e_machine(), size, big_endian,
- ehdr.get_e_ident()[elfcpp::EI_OSABI],
- ehdr.get_e_ident()[elfcpp::EI_ABIVERSION]);
+ ehdr.get_ei_osabi(),
+ ehdr.get_ei_abiversion());
if (target == NULL)
{
explain_no_incremental(_("unsupported ELF machine number %d"),
{
const int sym_size = elfcpp::Elf_sizes<size>::sym_size;
unsigned char symbuf[sym_size];
- elfcpp::Sym<size, big_endian> sym(symbuf);
elfcpp::Sym_write<size, big_endian> osym(symbuf);
typedef typename elfcpp::Elf_types<size>::Elf_WXword Elf_size_type;
osym.put_st_other(gsym.get_st_other());
osym.put_st_shndx(shndx);
+ elfcpp::Sym<size, big_endian> sym(symbuf);
Symbol* res = symtab->add_from_incrobj(this, name, NULL, &sym);
if (shndx != elfcpp::SHN_UNDEF)
// Relocate the input sections and write out the local symbols.
// We don't actually do any relocation here. For unchanged input files,
// we reapply relocations only for symbols that have changed; that happens
-// in queue_final_tasks. We do need to rewrite the incremental relocations
-// for this object.
+// in Layout_task_runner::run(). We do need to rewrite the incremental
+// relocations for this object.
template<int size, bool big_endian>
void
{
const int sym_size = elfcpp::Elf_sizes<size>::sym_size;
unsigned char symbuf[sym_size];
- elfcpp::Sym<size, big_endian> sym(symbuf);
elfcpp::Sym_write<size, big_endian> osym(symbuf);
unsigned int nsyms = this->input_reader_.get_global_symbol_count();
osym.put_st_other(gsym.get_st_other());
osym.put_st_shndx(shndx);
+ elfcpp::Sym<size, big_endian> sym(symbuf);
Sized_symbol<size>* res =
symtab->add_from_incrobj<size, big_endian>(this, name, NULL, &sym);
this->symbols_[i] = res;