// object.cc -- support for an object file for linking in gold
-// Copyright (C) 2006-2015 Free Software Foundation, Inc.
+// Copyright (C) 2006-2016 Free Software Foundation, Inc.
// Written by Ian Lance Taylor <iant@google.com>.
// This file is part of gold.
unsigned int nsyms = this->local_symbol_count();
for (unsigned int i = 0; i < nsyms; i++)
{
- Local_got_offsets::const_iterator p = this->local_got_offsets_.find(i);
+ Local_got_entry_key key(i, 0);
+ Local_got_offsets::const_iterator p = this->local_got_offsets_.find(key);
if (p != this->local_got_offsets_.end())
{
const Got_offset_list* got_offsets = p->second;
discarded_eh_frame_shndx_(-1U),
is_deferred_layout_(false),
deferred_layout_(),
- deferred_layout_relocs_()
+ deferred_layout_relocs_(),
+ output_views_(NULL)
{
this->e_type_ = ehdr.get_e_type();
}
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(this->local_values_[i].value(this, 0));
+ osym.put_st_value(sym_value);
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(this->local_values_[i].value(this, 0));
+ osym.put_st_value(sym_value);
osym.put_st_size(isym.get_st_size());
osym.put_st_info(isym.get_st_info());
osym.put_st_other(isym.get_st_other());
Dynobj* dynobj = static_cast<Dynobj*>(obj);
const char* soname = dynobj->soname();
- std::pair<Unordered_set<std::string>::iterator, bool> ins =
- this->sonames_.insert(soname);
+ Unordered_map<std::string, Object*>::value_type val(soname, obj);
+ std::pair<Unordered_map<std::string, Object*>::iterator, bool> ins =
+ this->sonames_.insert(val);
if (!ins.second)
{
// We have already seen a dynamic object with this soname.
+ // If any instances of this object on the command line have
+ // the --no-as-needed flag, make sure the one we keep is
+ // marked so.
+ if (!obj->as_needed())
+ {
+ gold_assert(ins.first->second != NULL);
+ ins.first->second->clear_as_needed();
+ }
return false;
}