[lld] r259481 - [ELF] Implemented -Bsymbolic-functions command line option
George Rimar via llvm-commits
llvm-commits at lists.llvm.org
Tue Feb 2 01:28:54 PST 2016
Author: grimar
Date: Tue Feb 2 03:28:53 2016
New Revision: 259481
URL: http://llvm.org/viewvc/llvm-project?rev=259481&view=rev
Log:
[ELF] Implemented -Bsymbolic-functions command line option
-Bsymbolic-functions:
When creating a shared library, bind references to global
function symbols to the definition within the shared library, if any.
This patch also fixed behavior of already existent -Bsymbolic:
previously PLT entries were created even if -Bsymbolic was specified.
Differential revision: http://reviews.llvm.org/D16411
Added:
lld/trunk/test/ELF/bsymbolic.s
Modified:
lld/trunk/ELF/Config.h
lld/trunk/ELF/Driver.cpp
lld/trunk/ELF/Options.td
lld/trunk/ELF/OutputSections.cpp
lld/trunk/ELF/Symbols.cpp
lld/trunk/ELF/Symbols.h
Modified: lld/trunk/ELF/Config.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Config.h?rev=259481&r1=259480&r2=259481&view=diff
==============================================================================
--- lld/trunk/ELF/Config.h (original)
+++ lld/trunk/ELF/Config.h Tue Feb 2 03:28:53 2016
@@ -53,6 +53,7 @@ struct Configuration {
bool AllowMultipleDefinition;
bool AsNeeded = false;
bool Bsymbolic;
+ bool BsymbolicFunctions;
bool Demangle = true;
bool DiscardAll;
bool DiscardLocals;
Modified: lld/trunk/ELF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=259481&r1=259480&r2=259481&view=diff
==============================================================================
--- lld/trunk/ELF/Driver.cpp (original)
+++ lld/trunk/ELF/Driver.cpp Tue Feb 2 03:28:53 2016
@@ -188,6 +188,7 @@ void LinkerDriver::readConfigs(opt::Inpu
Config->AllowMultipleDefinition = Args.hasArg(OPT_allow_multiple_definition);
Config->Bsymbolic = Args.hasArg(OPT_Bsymbolic);
+ Config->BsymbolicFunctions = Args.hasArg(OPT_Bsymbolic_functions);
Config->Demangle = !Args.hasArg(OPT_no_demangle);
Config->DiscardAll = Args.hasArg(OPT_discard_all);
Config->DiscardLocals = Args.hasArg(OPT_discard_locals);
Modified: lld/trunk/ELF/Options.td
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Options.td?rev=259481&r1=259480&r2=259481&view=diff
==============================================================================
--- lld/trunk/ELF/Options.td (original)
+++ lld/trunk/ELF/Options.td Tue Feb 2 03:28:53 2016
@@ -3,6 +3,9 @@ include "llvm/Option/OptParser.td"
def Bsymbolic: Flag<["-"], "Bsymbolic">,
HelpText<"Bind defined symbols locally">;
+def Bsymbolic_functions: Flag<["-"], "Bsymbolic-functions">,
+ HelpText<"Bind defined function symbols locally">;
+
def Bdynamic: Flag<["-"], "Bdynamic">,
HelpText<"Link against shared libraries">;
Modified: lld/trunk/ELF/OutputSections.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.cpp?rev=259481&r1=259480&r2=259481&view=diff
==============================================================================
--- lld/trunk/ELF/OutputSections.cpp (original)
+++ lld/trunk/ELF/OutputSections.cpp Tue Feb 2 03:28:53 2016
@@ -895,7 +895,11 @@ bool elf2::canBePreempted(const SymbolBo
}
if (!Config->Shared)
return false;
- return Body->getVisibility() == STV_DEFAULT;
+ if (Body->getVisibility() != STV_DEFAULT)
+ return false;
+ if (Config->Bsymbolic || (Config->BsymbolicFunctions && Body->isFunc()))
+ return false;
+ return true;
}
template <class ELFT> void OutputSection<ELFT>::writeTo(uint8_t *Buf) {
Modified: lld/trunk/ELF/Symbols.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.cpp?rev=259481&r1=259480&r2=259481&view=diff
==============================================================================
--- lld/trunk/ELF/Symbols.cpp (original)
+++ lld/trunk/ELF/Symbols.cpp Tue Feb 2 03:28:53 2016
@@ -146,12 +146,13 @@ template <class ELFT> int SymbolBody::co
}
Defined::Defined(Kind K, StringRef Name, bool IsWeak, uint8_t Visibility,
- bool IsTls)
- : SymbolBody(K, Name, IsWeak, Visibility, IsTls) {}
+ bool IsTls, bool IsFunction)
+ : SymbolBody(K, Name, IsWeak, Visibility, IsTls, IsFunction) {}
Undefined::Undefined(SymbolBody::Kind K, StringRef N, bool IsWeak,
uint8_t Visibility, bool IsTls)
- : SymbolBody(K, N, IsWeak, Visibility, IsTls), CanKeepUndefined(false) {}
+ : SymbolBody(K, N, IsWeak, Visibility, IsTls, /*IsFunction*/ false),
+ CanKeepUndefined(false) {}
Undefined::Undefined(StringRef N, bool IsWeak, uint8_t Visibility,
bool CanKeepUndefined)
@@ -170,12 +171,14 @@ UndefinedElf<ELFT>::UndefinedElf(StringR
template <typename ELFT>
DefinedSynthetic<ELFT>::DefinedSynthetic(StringRef N, uintX_t Value,
OutputSectionBase<ELFT> &Section)
- : Defined(SymbolBody::DefinedSyntheticKind, N, false, STV_DEFAULT, false),
+ : Defined(SymbolBody::DefinedSyntheticKind, N, false, STV_DEFAULT,
+ /*IsTls*/ false, /*IsFunction*/ false),
Value(Value), Section(Section) {}
DefinedCommon::DefinedCommon(StringRef N, uint64_t Size, uint64_t Alignment,
bool IsWeak, uint8_t Visibility)
- : Defined(SymbolBody::DefinedCommonKind, N, IsWeak, Visibility, false) {
+ : Defined(SymbolBody::DefinedCommonKind, N, IsWeak, Visibility,
+ /*IsTls*/ false, /*IsFunction*/ false) {
MaxAlignment = Alignment;
this->Size = Size;
}
Modified: lld/trunk/ELF/Symbols.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.h?rev=259481&r1=259480&r2=259481&view=diff
==============================================================================
--- lld/trunk/ELF/Symbols.h (original)
+++ lld/trunk/ELF/Symbols.h Tue Feb 2 03:28:53 2016
@@ -86,6 +86,7 @@ public:
bool isUsedInDynamicReloc() const { return IsUsedInDynamicReloc; }
void setUsedInDynamicReloc() { IsUsedInDynamicReloc = true; }
bool isTls() const { return IsTls; }
+ bool isFunc() const { return IsFunc; }
// Returns the symbol name.
StringRef getName() const { return Name; }
@@ -127,9 +128,9 @@ public:
protected:
SymbolBody(Kind K, StringRef Name, bool IsWeak, uint8_t Visibility,
- bool IsTls)
+ bool IsTls, bool IsFunc)
: SymbolKind(K), IsWeak(IsWeak), Visibility(Visibility), IsTls(IsTls),
- Name(Name) {
+ IsFunc(IsFunc), Name(Name) {
IsUsedInRegularObj = K != SharedKind && K != LazyKind;
IsUsedInDynamicReloc = 0;
}
@@ -148,6 +149,7 @@ protected:
unsigned IsUsedInDynamicReloc : 1;
unsigned IsTls : 1;
+ unsigned IsFunc : 1;
StringRef Name;
Symbol *Backref = nullptr;
};
@@ -155,7 +157,8 @@ protected:
// The base class for any defined symbols.
class Defined : public SymbolBody {
public:
- Defined(Kind K, StringRef Name, bool IsWeak, uint8_t Visibility, bool IsTls);
+ Defined(Kind K, StringRef Name, bool IsWeak, uint8_t Visibility, bool IsTls,
+ bool IsFunction);
static bool classof(const SymbolBody *S) { return S->isDefined(); }
};
@@ -167,7 +170,8 @@ protected:
public:
DefinedElf(Kind K, StringRef N, const Elf_Sym &Sym)
: Defined(K, N, Sym.getBinding() == llvm::ELF::STB_WEAK,
- Sym.getVisibility(), Sym.getType() == llvm::ELF::STT_TLS),
+ Sym.getVisibility(), Sym.getType() == llvm::ELF::STT_TLS,
+ Sym.getType() == llvm::ELF::STT_FUNC),
Sym(Sym) {}
const Elf_Sym &Sym;
@@ -289,7 +293,8 @@ public:
class Lazy : public SymbolBody {
public:
Lazy(ArchiveFile *F, const llvm::object::Archive::Symbol S)
- : SymbolBody(LazyKind, S.getName(), false, llvm::ELF::STV_DEFAULT, false),
+ : SymbolBody(LazyKind, S.getName(), false, llvm::ELF::STV_DEFAULT,
+ /*IsTls*/ false, /*IsFunction*/ false),
File(F), Sym(S) {}
static bool classof(const SymbolBody *S) { return S->kind() == LazyKind; }
Added: lld/trunk/test/ELF/bsymbolic.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/bsymbolic.s?rev=259481&view=auto
==============================================================================
--- lld/trunk/test/ELF/bsymbolic.s (added)
+++ lld/trunk/test/ELF/bsymbolic.s Tue Feb 2 03:28:53 2016
@@ -0,0 +1,30 @@
+// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
+// RUN: ld.lld -shared %t.o -o %t0.so
+// RUN: ld.lld -shared -Bsymbolic %t.o -o %t1.so
+// RUN: ld.lld -shared -Bsymbolic-functions %t.o -o %t2.so
+// RUN: llvm-readobj -s %t0.so | FileCheck -check-prefix=NOOPTION %s
+// RUN: llvm-readobj -s %t1.so | FileCheck -check-prefix=SYMBOLIC %s
+// RUN: llvm-readobj -s %t2.so | FileCheck -check-prefix=SYMBOLIC %s
+
+// NOOPTION: Section {
+// NOOPTION: Name: .plt
+
+// SYMBOLIC: Section {
+// SYMBOLIC-NOT: Name: .plt
+
+.text
+.globl foo
+.type foo, at function
+foo:
+nop
+
+.globl bar
+.type bar, at function
+bar:
+nop
+
+.globl do
+.type do, at function
+do:
+callq foo at PLT
+callq bar at PLT
More information about the llvm-commits
mailing list