* options.h (class General_options): Add -Bsymbolic-functions.

* symtab.h (Symbol::is_preemptible): Check for
	-Bsymbolic-functions.
This commit is contained in:
Ian Lance Taylor 2008-05-06 17:46:31 +00:00
parent cc28ec6162
commit f1f70eae28
3 changed files with 39 additions and 6 deletions

View File

@ -1,3 +1,9 @@
2008-05-06 Ian Lance Taylor <iant@google.com>
* options.h (class General_options): Add -Bsymbolic-functions.
* symtab.h (Symbol::is_preemptible): Check for
-Bsymbolic-functions.
2008-05-05 Ian Lance Taylor <iant@google.com>
* options.h (DEFINE_bool): For DASH_Z, create the negative option

View File

@ -510,6 +510,9 @@ class General_options
DEFINE_bool(Bsymbolic, options::ONE_DASH, '\0', false,
N_("Bind defined symbols locally"), NULL);
DEFINE_bool(Bsymbolic_functions, options::ONE_DASH, '\0', false,
N_("Bind defined function symbols locally"), NULL);
DEFINE_optional_string(build_id, options::TWO_DASHES, '\0', "sha1",
N_("Generate build ID note"),
N_("[=STYLE]"));

View File

@ -467,12 +467,36 @@ class Symbol
// is preemptible.
gold_assert(!this->is_undefined());
return (this->visibility_ != elfcpp::STV_INTERNAL
&& this->visibility_ != elfcpp::STV_HIDDEN
&& this->visibility_ != elfcpp::STV_PROTECTED
&& !this->is_forced_local_
&& parameters->options().shared()
&& !parameters->options().Bsymbolic());
// If a symbol does not have default visibility, it can not be
// seen outside this link unit and therefore is not preemptible.
if (this->visibility_ != elfcpp::STV_DEFAULT)
return false;
// If this symbol has been forced to be a local symbol by a
// version script, then it is not visible outside this link unit
// and is not preemptible.
if (this->is_forced_local_)
return false;
// If we are not producing a shared library, then nothing is
// preemptible.
if (!parameters->options().shared())
return false;
// If the user used -Bsymbolic, then nothing is preemptible.
if (parameters->options().Bsymbolic())
return false;
// If the user used -Bsymbolic-functions, then functions are not
// preemptible. We explicitly check for not being STT_OBJECT,
// rather than for being STT_FUNC, because that is what the GNU
// linker does.
if (this->type() != elfcpp::STT_OBJECT
&& parameters->options().Bsymbolic_functions())
return false;
// Otherwise the symbol is preemptible.
return true;
}
// Return true if this symbol is a function that needs a PLT entry.