aboutsummaryrefslogtreecommitdiff
path: root/gold/i386.cc
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>2008-08-04 22:22:13 +0000
committerIan Lance Taylor <ian@airs.com>2008-08-04 22:22:13 +0000
commitde4c45bd54870058d0ee91a652df9f1652b12cdb (patch)
tree84e4795da42d1cc11212fdea401c73944d38bac3 /gold/i386.cc
parente5e6a5ff6ea89e1f8627d16d492288e0b8e834b1 (diff)
downloadgdb-de4c45bd54870058d0ee91a652df9f1652b12cdb.zip
gdb-de4c45bd54870058d0ee91a652df9f1652b12cdb.tar.gz
gdb-de4c45bd54870058d0ee91a652df9f1652b12cdb.tar.bz2
* symtab.h (Symbol::use_plt_offset): New function.
* i386.cc (Relocate::relocate): Call Symbol::use_plt_offset. * powerpc.cc (Relocate::relocate): Likewise. * sparc.cc (Relocate::relocate): Likewise. * x86_64.cc (Relocate::relocate): Likewise. * testsuite/weak_plt.sh: New test. * testsuite/weak_plt_main.cc: New test. * testsuite/weak_plt_shared.cc: New test. * testsuite/Makefile.am (check_SCRIPTS): Add weak_plt.sh. (check_PROGRAMS): Add weak_plt. (check_DATA): Add weak_plt_shared.so. (weak_plt_main_pic.o, weak_plt): New targets. (weak_plt_shared_pic.o, weak_plt_shared.so): New targets. * testsuite/Makefile.in: Rebuild. * testsuite/Makefile.am (weak_alias_test_1.so): Depend upon gcctestdir/ld. (weak_alias_test_2.so, weak_alias_test_4.so): Likewise. * testsuite/Makefile.in: Rebuild.
Diffstat (limited to 'gold/i386.cc')
-rw-r--r--gold/i386.cc11
1 files changed, 3 insertions, 8 deletions
diff --git a/gold/i386.cc b/gold/i386.cc
index 2ccc3f9..54f1233 100644
--- a/gold/i386.cc
+++ b/gold/i386.cc
@@ -1595,15 +1595,10 @@ Target_i386::Relocate::relocate(const Relocate_info<32, false>* relinfo,
// Pick the value to use for symbols defined in shared objects.
Symbol_value<32> symval;
- bool is_nonpic = (r_type == elfcpp::R_386_PC8
- || r_type == elfcpp::R_386_PC16
- || r_type == elfcpp::R_386_PC32);
if (gsym != NULL
- && (gsym->is_from_dynobj()
- || (parameters->options().shared()
- && (gsym->is_undefined() || gsym->is_preemptible())))
- && gsym->has_plt_offset()
- && (!is_nonpic || !parameters->options().shared()))
+ && gsym->use_plt_offset(r_type == elfcpp::R_386_PC8
+ || r_type == elfcpp::R_386_PC16
+ || r_type == elfcpp::R_386_PC32))
{
symval.set_output_value(target->plt_section()->address()
+ gsym->plt_offset());