default:
gold_unreachable();
}
+ // If this is a GOT entry for a known value global symbol,
+ // then the value should include the addend. If the value
+ // is not known leave the value as zero; The GOT entry
+ // will be set by a dynamic relocation.
+ if (this->addend_ && gsym->final_value_is_known())
+ val += this->addend_;
if (this->use_plt_or_tls_offset_
&& gsym->type() == elfcpp::STT_TLS)
val += parameters->target().tls_offset_for_global(gsym,
- got_indx);
+ got_indx,
+ this->addend_);
}
}
break;
val = convert_types<Valtype, uint64_t>(lval);
if (this->use_plt_or_tls_offset_ && is_tls)
val += parameters->target().tls_offset_for_local(object, lsi,
- got_indx);
+ got_indx,
+ this->addend_);
}
}
break;
int64_t
do_tls_offset_for_local(const Relobj* object,
unsigned int symndx,
- unsigned int got_indx) const;
+ unsigned int got_indx,
+ uint64_t addend) const;
// Return the offset to use for the GOT_INDX'th got entry which is
// for global tls symbol GSYM.
int64_t
- do_tls_offset_for_global(Symbol* gsym, unsigned int got_indx) const;
+ do_tls_offset_for_global(Symbol* gsym, unsigned int got_indx,
+ uint64_t addend) const;
void
do_function_location(Symbol_location*) const;
Target_powerpc<size, big_endian>::do_tls_offset_for_local(
const Relobj* object,
unsigned int symndx,
- unsigned int got_indx) const
+ unsigned int got_indx,
+ uint64_t addend) const
{
const Powerpc_relobj<size, big_endian>* ppc_object
= static_cast<const Powerpc_relobj<size, big_endian>*>(object);
for (Got_type got_type = GOT_TYPE_TLSGD;
got_type <= GOT_TYPE_TPREL;
got_type = Got_type(got_type + 1))
- if (ppc_object->local_has_got_offset(symndx, got_type))
+ if (ppc_object->local_has_got_offset(symndx, got_type, addend))
{
- unsigned int off = ppc_object->local_got_offset(symndx, got_type);
+ unsigned int off
+ = ppc_object->local_got_offset(symndx, got_type, addend);
if (got_type == GOT_TYPE_TLSGD)
off += size / 8;
if (off == got_indx * (size / 8))
int64_t
Target_powerpc<size, big_endian>::do_tls_offset_for_global(
Symbol* gsym,
- unsigned int got_indx) const
+ unsigned int got_indx,
+ uint64_t addend) const
{
if (gsym->type() == elfcpp::STT_TLS)
{
for (Got_type got_type = GOT_TYPE_TLSGD;
got_type <= GOT_TYPE_TPREL;
got_type = Got_type(got_type + 1))
- if (gsym->has_got_offset(got_type))
+ if (gsym->has_got_offset(got_type, addend))
{
- unsigned int off = gsym->got_offset(got_type);
+ unsigned int off = gsym->got_offset(got_type, addend);
if (got_type == GOT_TYPE_TLSGD)
off += size / 8;
if (off == got_indx * (size / 8))
int64_t
do_tls_offset_for_local(const Relobj* object,
unsigned int symndx,
- unsigned int got_indx) const;
+ unsigned int got_indx,
+ uint64_t addend) const;
// Return the offset to use for the GOT_INDX'th got entry which is
// for global tls symbol GSYM.
int64_t
- do_tls_offset_for_global(Symbol* gsym, unsigned int got_indx) const;
+ do_tls_offset_for_global(Symbol* gsym, unsigned int got_indx,
+ uint64_t addend) const;
// This function should be defined in targets that can use relocation
// types to determine (implemented in local_reloc_may_be_function_pointer
Target_s390<size>::do_tls_offset_for_local(
const Relobj*,
unsigned int,
- unsigned int) const
+ unsigned int,
+ uint64_t) const
{
// The only way we can get called is when IEENT/GOTIE12/GOTIE20
// couldn't be optimised to LE.
int64_t
Target_s390<size>::do_tls_offset_for_global(
Symbol*,
- unsigned int) const
+ unsigned int,
+ uint64_t) const
{
Output_segment* tls_segment = layout_->tls_segment();
return -tls_segment->memsz();
int64_t
tls_offset_for_local(const Relobj* object,
unsigned int symndx,
- unsigned int got_indx) const
- { return do_tls_offset_for_local(object, symndx, got_indx); }
+ unsigned int got_indx,
+ uint64_t addend) const
+ { return do_tls_offset_for_local(object, symndx, got_indx, addend); }
// Return the offset to use for the GOT_INDX'th got entry which is
// for global tls symbol GSYM.
int64_t
- tls_offset_for_global(Symbol* gsym, unsigned int got_indx) const
- { return do_tls_offset_for_global(gsym, got_indx); }
+ tls_offset_for_global(Symbol* gsym, unsigned int got_indx,
+ uint64_t addend) const
+ { return do_tls_offset_for_global(gsym, got_indx, addend); }
// For targets that use function descriptors, if LOC is the location
// of a function, modify it to point at the function entry location.
{ gold_unreachable(); }
virtual int64_t
- do_tls_offset_for_local(const Relobj*, unsigned int, unsigned int) const
+ do_tls_offset_for_local(const Relobj*, unsigned int, unsigned int,
+ uint64_t) const
{ gold_unreachable(); }
virtual int64_t
- do_tls_offset_for_global(Symbol*, unsigned int) const
+ do_tls_offset_for_global(Symbol*, unsigned int, uint64_t) const
{ gold_unreachable(); }
virtual void