diff options
Diffstat (limited to 'binutils-2.22/gold/resolve.cc')
-rw-r--r-- | binutils-2.22/gold/resolve.cc | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/binutils-2.22/gold/resolve.cc b/binutils-2.22/gold/resolve.cc index 1119f38..0da8da2 100644 --- a/binutils-2.22/gold/resolve.cc +++ b/binutils-2.22/gold/resolve.cc @@ -296,7 +296,7 @@ Symbol_table::resolve(Sized_symbol<size>* to, // Record if we've seen this symbol in a real ELF object (i.e., the // symbol is referenced from outside the world known to the plugin). - if (object->pluginobj() == NULL) + if (object->pluginobj() == NULL && !object->is_dynamic()) to->set_in_real_elf(); // If we're processing replacement files, allow new symbols to override @@ -356,9 +356,15 @@ Symbol_table::resolve(Sized_symbol<size>* to, &adjust_dyndef)) { elfcpp::STB tobinding = to->binding(); + typename Sized_symbol<size>::Value_type tovalue = to->value(); this->override(to, sym, st_shndx, is_ordinary, object, version); - if (adjust_common_sizes && tosize > to->symsize()) - to->set_symsize(tosize); + if (adjust_common_sizes) + { + if (tosize > to->symsize()) + to->set_symsize(tosize); + if (tovalue > to->value()) + to->set_value(tovalue); + } if (adjust_dyndef) { // We are overriding an UNDEF or WEAK UNDEF with a DYN DEF. @@ -368,8 +374,13 @@ Symbol_table::resolve(Sized_symbol<size>* to, } else { - if (adjust_common_sizes && sym.get_st_size() > tosize) - to->set_symsize(sym.get_st_size()); + if (adjust_common_sizes) + { + if (sym.get_st_size() > tosize) + to->set_symsize(sym.get_st_size()); + if (sym.get_st_value() > to->value()) + to->set_value(sym.get_st_value()); + } if (adjust_dyndef) { // We are keeping a DYN DEF after seeing an UNDEF or WEAK UNDEF. |