* options.h (class General_options): Add -Bsymbolic-functions.
* symtab.h (Symbol::is_preemptible): Check for -Bsymbolic-functions.
This commit is contained in:
parent
cc28ec6162
commit
f1f70eae28
@ -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>
|
2008-05-05 Ian Lance Taylor <iant@google.com>
|
||||||
|
|
||||||
* options.h (DEFINE_bool): For DASH_Z, create the negative option
|
* options.h (DEFINE_bool): For DASH_Z, create the negative option
|
||||||
|
@ -510,6 +510,9 @@ class General_options
|
|||||||
DEFINE_bool(Bsymbolic, options::ONE_DASH, '\0', false,
|
DEFINE_bool(Bsymbolic, options::ONE_DASH, '\0', false,
|
||||||
N_("Bind defined symbols locally"), NULL);
|
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",
|
DEFINE_optional_string(build_id, options::TWO_DASHES, '\0', "sha1",
|
||||||
N_("Generate build ID note"),
|
N_("Generate build ID note"),
|
||||||
N_("[=STYLE]"));
|
N_("[=STYLE]"));
|
||||||
|
@ -467,12 +467,36 @@ class Symbol
|
|||||||
// is preemptible.
|
// is preemptible.
|
||||||
gold_assert(!this->is_undefined());
|
gold_assert(!this->is_undefined());
|
||||||
|
|
||||||
return (this->visibility_ != elfcpp::STV_INTERNAL
|
// If a symbol does not have default visibility, it can not be
|
||||||
&& this->visibility_ != elfcpp::STV_HIDDEN
|
// seen outside this link unit and therefore is not preemptible.
|
||||||
&& this->visibility_ != elfcpp::STV_PROTECTED
|
if (this->visibility_ != elfcpp::STV_DEFAULT)
|
||||||
&& !this->is_forced_local_
|
return false;
|
||||||
&& parameters->options().shared()
|
|
||||||
&& !parameters->options().Bsymbolic());
|
// 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.
|
// Return true if this symbol is a function that needs a PLT entry.
|
||||||
|
Loading…
Reference in New Issue
Block a user