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