aboutsummaryrefslogtreecommitdiff
path: root/gold/i386.cc
diff options
context:
space:
mode:
authorCary Coutant <ccoutant@gmail.com>2016-03-27 16:09:56 -0700
committerCary Coutant <ccoutant@gmail.com>2016-03-27 16:11:27 -0700
commited700649d0607e6509d5bbc51f4617bbae13a543 (patch)
treeb812af1440a0543bc74fd97eb083c551a7af2555 /gold/i386.cc
parent44f9a8af8544d5656f3bbb73b41d3b983c99e8f2 (diff)
downloadbinutils-ed700649d0607e6509d5bbc51f4617bbae13a543.zip
binutils-ed700649d0607e6509d5bbc51f4617bbae13a543.tar.gz
binutils-ed700649d0607e6509d5bbc51f4617bbae13a543.tar.bz2
Fix failure to diagnose GOTOFF relocation to undef symbol in shared lib (i386).
gold/ PR gold/16111 * i386.cc (Target_i386): Add check for fully-resolved symbol for R_386_GOTOFF.
Diffstat (limited to 'gold/i386.cc')
-rw-r--r--gold/i386.cc17
1 files changed, 17 insertions, 0 deletions
diff --git a/gold/i386.cc b/gold/i386.cc
index 8bcd44e..8aaa2a8 100644
--- a/gold/i386.cc
+++ b/gold/i386.cc
@@ -2394,6 +2394,23 @@ Target_i386::Scan::global(Symbol_table* symtab,
break;
case elfcpp::R_386_GOTOFF:
+ // A GOT-relative reference must resolve locally.
+ if (!gsym->is_defined())
+ gold_error(_("%s: relocation R_386_GOTOFF against undefined symbol %s"
+ " cannot be used when making a shared object"),
+ object->name().c_str(), gsym->name());
+ else if (gsym->is_from_dynobj())
+ gold_error(_("%s: relocation R_386_GOTOFF against external symbol %s"
+ " cannot be used when making a shared object"),
+ object->name().c_str(), gsym->name());
+ else if (gsym->is_preemptible())
+ gold_error(_("%s: relocation R_386_GOTOFF against preemptible symbol %s"
+ " cannot be used when making a shared object"),
+ object->name().c_str(), gsym->name());
+ // We need a GOT section.
+ target->got_section(symtab, layout);
+ break;
+
case elfcpp::R_386_GOTPC:
// We need a GOT section.
target->got_section(symtab, layout);