// object.cc -- support for an object file for linking in gold
-// Copyright (C) 2006-2017 Free Software Foundation, Inc.
+// Copyright (C) 2006-2018 Free Software Foundation, Inc.
// Written by Ian Lance Taylor <iant@google.com>.
// This file is part of gold.
local_plt_offsets_(),
kept_comdat_sections_(),
has_eh_frame_(false),
- discarded_eh_frame_shndx_(-1U),
is_deferred_layout_(false),
deferred_layout_(),
deferred_layout_relocs_(),
return (this->has_eh_frame_
|| (!parameters->options().relocatable()
&& parameters->options().gdb_index()
- && (memmem(names, sd->section_names_size, "debug_info", 11) == 0
+ && (memmem(names, sd->section_names_size, "debug_info", 11) != NULL
|| memmem(names, sd->section_names_size,
- "debug_types", 12) == 0)));
+ "debug_types", 12) != NULL)));
}
// Read the sections and symbols from an object file.
&offset);
this->output_sections()[shndx] = os;
if (os == NULL || offset == -1)
- {
- // An object can contain at most one section holding exception
- // frame information.
- gold_assert(this->discarded_eh_frame_shndx_ == -1U);
- this->discarded_eh_frame_shndx_ = shndx;
- this->section_offsets()[shndx] = invalid_address;
- }
+ this->section_offsets()[shndx] = invalid_address;
else
this->section_offsets()[shndx] = convert_types<Address, off_t>(offset);
// Decide whether this symbol should go into the output file.
if (is_ordinary
- && ((shndx < shnum && out_sections[shndx] == NULL)
- || shndx == this->discarded_eh_frame_shndx_))
+ && shndx < shnum
+ && (out_sections[shndx] == NULL
+ || (out_sections[shndx]->order() == ORDER_EHFRAME
+ && out_section_offsets[shndx] == invalid_address)))
{
+ // This is either a discarded section or an optimized .eh_frame
+ // section.
lv.set_no_output_symtab_entry();
gold_assert(!lv.needs_output_dynsym_entry());
continue;
// This is a SHF_MERGE section or one which otherwise
// requires special handling.
- if (shndx == this->discarded_eh_frame_shndx_)
+ if (os->order() == ORDER_EHFRAME)
{
- // This local symbol belongs to a discarded .eh_frame
- // section. Just treat it like the case in which
+ // This local symbol belongs to a discarded or optimized
+ // .eh_frame section. Just treat it like the case in which
// os == NULL above.
gold_assert(this->has_eh_frame_);
return This::CFLV_DISCARDED;
{
// This is not a section symbol. We can determine
// the final value now.
- lv_out->set_output_value(
- os->output_address(this, shndx, lv_in->input_value()));
+ uint64_t value =
+ os->output_address(this, shndx, lv_in->input_value());
+ if (relocatable)
+ value -= os->address();
+ lv_out->set_output_value(value);
}
else if (!os->find_starting_output_address(this, shndx, &start))
{
os->find_relaxed_input_section(this, shndx);
if (posd != NULL)
{
- Address relocatable_link_adjustment =
- relocatable ? os->address() : 0;
- lv_out->set_output_value(posd->address()
- - relocatable_link_adjustment);
+ uint64_t value = posd->address();
+ if (relocatable)
+ value -= os->address();
+ lv_out->set_output_value(value);
}
else
lv_out->set_output_value(os->address());
elfcpp::Sym<size, big_endian> isym(psyms);
Symbol_value<size>& lv(this->local_values_[i]);
- typename elfcpp::Elf_types<size>::Elf_Addr sym_value = lv.value(this, 0);
bool is_ordinary;
unsigned int st_shndx = this->adjust_sym_shndx(i, isym.get_st_shndx(),
gold_assert(st_shndx < out_sections.size());
if (out_sections[st_shndx] == NULL)
continue;
- // In relocatable object files symbol values are section relative.
- if (parameters->options().relocatable())
- sym_value -= out_sections[st_shndx]->address();
st_shndx = out_sections[st_shndx]->out_shndx();
if (st_shndx >= elfcpp::SHN_LORESERVE)
{
gold_assert(isym.get_st_name() < strtab_size);
const char* name = pnames + isym.get_st_name();
osym.put_st_name(sympool->get_offset(name));
- osym.put_st_value(sym_value);
+ osym.put_st_value(lv.value(this, 0));
osym.put_st_size(isym.get_st_size());
osym.put_st_info(isym.get_st_info());
osym.put_st_other(isym.get_st_other());
gold_assert(isym.get_st_name() < strtab_size);
const char* name = pnames + isym.get_st_name();
osym.put_st_name(dynpool->get_offset(name));
- osym.put_st_value(sym_value);
+ osym.put_st_value(lv.value(this, 0));
osym.put_st_size(isym.get_st_size());
osym.put_st_info(isym.get_st_info());
osym.put_st_other(isym.get_st_other());