summaryrefslogtreecommitdiff
path: root/gold/symtab.h
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>2008-05-06 17:46:31 +0000
committerIan Lance Taylor <ian@airs.com>2008-05-06 17:46:31 +0000
commitf1f70eae2856e8a0aae42d74829cedcb02b9801b (patch)
treeeabe9268f7649ae9a9cd25237e287b1df0af567e /gold/symtab.h
parentcc28ec6162d8f06637d96cc750e3e33eff477cc8 (diff)
* options.h (class General_options): Add -Bsymbolic-functions.
* symtab.h (Symbol::is_preemptible): Check for -Bsymbolic-functions.
Diffstat (limited to 'gold/symtab.h')
-rw-r--r--gold/symtab.h36
1 files changed, 30 insertions, 6 deletions
diff --git a/gold/symtab.h b/gold/symtab.h
index 1ee3131d8f..020f242c50 100644
--- a/gold/symtab.h
+++ b/gold/symtab.h
@@ -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.