2008-04-04 Cary Coutant <ccoutant@google.com>

* symtab.h (Symbol::is_weak_undefined): New function.
	(Symbol::is_strong_undefined): New function.
	(Symbol::is_absolute): New function.
	(Symbol::needs_plt_entry): Exclude weak undefined symbols.
	(Symbol::needs_dynamic_reloc): Exclude weak undefined and
	absolute symbols.
	* testsuite/Makefile.am (check_PROGRAMS): Add weak_undef_test.
	(weak_undef_test): New target.
	* testsuite/Makefile.in: Rebuild.
	* testsuite/weak_undef_file1.cc: New file.
	* testsuite/weak_undef_file2.cc: New file.
	* testsuite/weak_undef_test.cc: New file.
This commit is contained in:
Cary Coutant
2008-04-04 17:24:47 +00:00
parent 594ab6a333
commit 86925eef33
7 changed files with 227 additions and 5 deletions

View File

@@ -405,6 +405,31 @@ class Symbol
return this->source_ == FROM_OBJECT && this->shndx() == elfcpp::SHN_UNDEF;
}
// Return whether this is a weak undefined symbol.
bool
is_weak_undefined() const
{
return (this->source_ == FROM_OBJECT
&& this->binding() == elfcpp::STB_WEAK
&& this->shndx() == elfcpp::SHN_UNDEF);
}
// Return whether this is a strong (i.e., not weak) undefined symbol.
bool
is_strong_undefined() const
{
return (this->source_ == FROM_OBJECT
&& this->binding() != elfcpp::STB_WEAK
&& this->shndx() == elfcpp::SHN_UNDEF);
}
// Return whether this is an absolute symbol.
bool
is_absolute() const
{
return this->source_ == FROM_OBJECT && this->shndx() == elfcpp::SHN_ABS;
}
// Return whether this is a common symbol.
bool
is_common() const
@@ -453,7 +478,7 @@ class Symbol
return (!parameters->doing_static_link()
&& this->type() == elfcpp::STT_FUNC
&& (this->is_from_dynobj()
|| this->is_undefined()
|| this->is_strong_undefined()
|| this->is_preemptible()));
}
@@ -481,6 +506,11 @@ class Symbol
if (parameters->doing_static_link())
return false;
// A reference to a weak undefined symbol or to an absolute symbol
// does not need a dynamic relocation.
if (this->is_weak_undefined() || this->is_absolute())
return false;
// An absolute reference within a position-independent output file
// will need a dynamic relocation.
if ((flags & ABSOLUTE_REF)