diff options
| author | George Rimar <grimar@accesssoftek.com> | 2016-08-19 15:36:32 +0000 | 
|---|---|---|
| committer | George Rimar <grimar@accesssoftek.com> | 2016-08-19 15:36:32 +0000 | 
| commit | e1937bb524b7c6fd07f13a1ff42bc942fc05458e (patch) | |
| tree | 1d4372ae3d2d6a75aaac030e51723ede01a31415 | |
| parent | 9989f80ae8f831888f8d263220cce3bb9585564b (diff) | |
| download | bcm5719-llvm-e1937bb524b7c6fd07f13a1ff42bc942fc05458e.tar.gz bcm5719-llvm-e1937bb524b7c6fd07f13a1ff42bc942fc05458e.zip | |
[ELF] - Give automatically generated __start_* and __stop_* symbols default visibility.
This patch is opposite to D19024, which made this symbols to be hidden by default.
Unfortunately FreeBSD loader wants to see
start_set_modmetadata_set/stop_set_modmetadata_set in the dynamic symbol table. 
They were not placed there because had hidden visibility.
Patch makes them to have default visibility again.
Differential revision: https://reviews.llvm.org/D23552
llvm-svn: 279262
| -rw-r--r-- | lld/ELF/LinkerScript.cpp | 4 | ||||
| -rw-r--r-- | lld/ELF/SymbolTable.cpp | 8 | ||||
| -rw-r--r-- | lld/ELF/SymbolTable.h | 2 | ||||
| -rw-r--r-- | lld/ELF/Writer.cpp | 16 | ||||
| -rw-r--r-- | lld/test/ELF/startstop-shared.s | 16 | ||||
| -rw-r--r-- | lld/test/ELF/startstop.s | 24 | 
6 files changed, 45 insertions, 25 deletions
| diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp index 6b037a021fb..9cfbb48a2ca 100644 --- a/lld/ELF/LinkerScript.cpp +++ b/lld/ELF/LinkerScript.cpp @@ -51,8 +51,8 @@ static void addRegular(SymbolAssignment *Cmd) {  }  template <class ELFT> static void addSynthetic(SymbolAssignment *Cmd) { -  Symbol *Sym = Symtab<ELFT>::X->addSynthetic(Cmd->Name, nullptr, 0); -  Sym->Visibility = Cmd->Hidden ? STV_HIDDEN : STV_DEFAULT; +  Symbol *Sym = Symtab<ELFT>::X->addSynthetic( +      Cmd->Name, nullptr, 0, Cmd->Hidden ? STV_HIDDEN : STV_DEFAULT);    Cmd->Sym = Sym->body();  } diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp index b4f9411ac49..c657a3a0608 100644 --- a/lld/ELF/SymbolTable.cpp +++ b/lld/ELF/SymbolTable.cpp @@ -418,12 +418,12 @@ Symbol *SymbolTable<ELFT>::addRegular(StringRef Name, uint8_t Binding,  template <typename ELFT>  Symbol *SymbolTable<ELFT>::addSynthetic(StringRef N,                                          OutputSectionBase<ELFT> *Section, -                                        uintX_t Value) { +                                        uintX_t Value, uint8_t StOther) {    Symbol *S;    bool WasInserted; -  std::tie(S, WasInserted) = -      insert(N, STT_NOTYPE, STV_HIDDEN, /*CanOmitFromDynSym*/ false, -             /*IsUsedInRegularObj*/ true, nullptr); +  std::tie(S, WasInserted) = insert(N, STT_NOTYPE, /*Visibility*/ StOther & 0x3, +                                    /*CanOmitFromDynSym*/ false, +                                    /*IsUsedInRegularObj*/ true, nullptr);    int Cmp = compareDefinedNonCommon<ELFT>(S, WasInserted, STB_GLOBAL);    if (Cmp > 0)      replaceBody<DefinedSynthetic<ELFT>>(S, N, Value, Section); diff --git a/lld/ELF/SymbolTable.h b/lld/ELF/SymbolTable.h index 416e9434296..7a2121c870f 100644 --- a/lld/ELF/SymbolTable.h +++ b/lld/ELF/SymbolTable.h @@ -65,7 +65,7 @@ public:                       InputSectionBase<ELFT> *Section);    Symbol *addRegular(StringRef Name, uint8_t Binding, uint8_t StOther);    Symbol *addSynthetic(StringRef N, OutputSectionBase<ELFT> *Section, -                       uintX_t Value); +                       uintX_t Value, uint8_t StOther);    void addShared(SharedFile<ELFT> *F, StringRef Name, const Elf_Sym &Sym,                   const typename ELFT::Verdef *Verdef); diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index ecbbc0a3352..b39897f8200 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -519,7 +519,7 @@ static Symbol *addOptionalSynthetic(StringRef Name,      return nullptr;    if (!S->isUndefined() && !S->isShared())      return S->symbol(); -  return Symtab<ELFT>::X->addSynthetic(Name, Sec, Val); +  return Symtab<ELFT>::X->addSynthetic(Name, Sec, Val, STV_HIDDEN);  }  template <class ELFT> @@ -527,7 +527,7 @@ static void addSynthetic(StringRef Name, OutputSectionBase<ELFT> *Sec,                                   typename ELFT::uint Val) {    SymbolBody *S = Symtab<ELFT>::X->find(Name);    if (!S || S->isUndefined() || S->isShared()) -    Symtab<ELFT>::X->addSynthetic(Name, Sec, Val); +    Symtab<ELFT>::X->addSynthetic(Name, Sec, Val, STV_HIDDEN);  }  // The beginning and the ending of .rel[a].plt section are marked  // with __rel[a]_iplt_{start,end} symbols if it is a statically linked @@ -554,7 +554,8 @@ template <class ELFT> void Writer<ELFT>::addReservedSymbols() {      // so that it points to an absolute address which is relative to GOT.      // See "Global Data Symbols" in Chapter 6 in the following document:      // ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf -    Symtab<ELFT>::X->addSynthetic("_gp", Out<ELFT>::Got, MipsGPOffset); +    Symtab<ELFT>::X->addSynthetic("_gp", Out<ELFT>::Got, MipsGPOffset, +                                  STV_HIDDEN);      // On MIPS O32 ABI, _gp_disp is a magic symbol designates offset between      // start of function and 'gp' pointer into GOT. @@ -701,7 +702,8 @@ template <class ELFT> void Writer<ELFT>::finalizeSections() {    // Even the author of gold doesn't remember why gold behaves that way.    // https://sourceware.org/ml/binutils/2002-03/msg00360.html    if (Out<ELFT>::DynSymTab) -    Symtab<ELFT>::X->addSynthetic("_DYNAMIC", Out<ELFT>::Dynamic, 0); +    Symtab<ELFT>::X->addSynthetic("_DYNAMIC", Out<ELFT>::Dynamic, 0, +                                  STV_HIDDEN);    // Define __rel[a]_iplt_{start,end} symbols if needed.    addRelIpltSymbols(); @@ -893,11 +895,11 @@ void Writer<ELFT>::addStartStopSymbols(OutputSectionBase<ELFT> *Sec) {    StringRef Stop = Saver.save("__stop_" + S);    if (SymbolBody *B = Symtab<ELFT>::X->find(Start))      if (B->isUndefined()) -      Symtab<ELFT>::X->addSynthetic(Start, Sec, 0); +      Symtab<ELFT>::X->addSynthetic(Start, Sec, 0, B->getVisibility());    if (SymbolBody *B = Symtab<ELFT>::X->find(Stop))      if (B->isUndefined()) -      Symtab<ELFT>::X->addSynthetic(Stop, Sec, -                                    DefinedSynthetic<ELFT>::SectionEnd); +      Symtab<ELFT>::X->addSynthetic( +          Stop, Sec, DefinedSynthetic<ELFT>::SectionEnd, B->getVisibility());  }  template <class ELFT> diff --git a/lld/test/ELF/startstop-shared.s b/lld/test/ELF/startstop-shared.s index 77411f3f25c..80ccf3df0aa 100644 --- a/lld/test/ELF/startstop-shared.s +++ b/lld/test/ELF/startstop-shared.s @@ -6,21 +6,23 @@          .data          .quad __start_foo          .section foo,"aw" -// By default the symbol is hidden. -// CHECK:      R_X86_64_RELATIVE - 0x[[ADDR1:.*]]          .hidden __start_bar          .quad __start_bar          .section bar,"a" -// References do not affect the visibility. -// CHECK:      R_X86_64_RELATIVE - 0x[[ADDR2:.*]] + +// Test that we are able to hide the symbol. +// CHECK:      R_X86_64_RELATIVE - 0x[[ADDR:.*]] + +// By default the symbol is visible and we need a dynamic reloc. +// CHECK:  R_X86_64_64 __start_foo 0x0  // CHECK:      Name: __start_bar -// CHECK-NEXT: Value: 0x[[ADDR2]] +// CHECK-NEXT: Value: 0x[[ADDR]]  // CHECK-NEXT: Size:  // CHECK-NEXT: Binding: Local  // CHECK:      Name: __start_foo -// CHECK-NEXT: Value: 0x[[ADDR1]] +// CHECK-NEXT: Value:  // CHECK-NEXT: Size: -// CHECK-NEXT: Binding: Local +// CHECK-NEXT: Binding: Global diff --git a/lld/test/ELF/startstop.s b/lld/test/ELF/startstop.s index a7b2e43e6a5..326196dafa6 100644 --- a/lld/test/ELF/startstop.s +++ b/lld/test/ELF/startstop.s @@ -22,30 +22,46 @@  // SYMBOL:      Relocations [  // SYMBOL-NEXT:   Section ({{.*}}) .rela.dyn { -// SYMBOL-NEXT:     0x3000 R_X86_64_RELATIVE - 0x3020 -// SYMBOL-NEXT:     0x3008 R_X86_64_RELATIVE - 0x3021 -// SYMBOL-NEXT:     0x3010 R_X86_64_RELATIVE - 0x3010 -// SYMBOL-NEXT:     0x3018 R_X86_64_RELATIVE - 0x3011 +// SYMBOL-NEXT:     0x3010 R_X86_64_64 __stop_zed1 0x0 +// SYMBOL-NEXT:     0x3018 R_X86_64_64 __stop_zed1 0x1 +// SYMBOL-NEXT:     0x3000 R_X86_64_64 __stop_zed2 0x0 +// SYMBOL-NEXT:     0x3008 R_X86_64_64 __stop_zed2 0x1  // SYMBOL-NEXT:   }  // SYMBOL-NEXT: ]  // SYMBOL: Symbol {  // SYMBOL:   Name: __start_bar  // SYMBOL:   Value: 0x1012 +// SYMBOL:   STV_HIDDEN  // SYMBOL:   Section: bar  // SYMBOL: }  // SYMBOL-NOT:   Section: __stop_bar  // SYMBOL: Symbol {  // SYMBOL:   Name: __start_foo  // SYMBOL:   Value: 0x100F +// SYMBOL:   STV_HIDDEN  // SYMBOL:   Section: foo  // SYMBOL: }  // SYMBOL: Symbol {  // SYMBOL:   Name: __stop_foo  // SYMBOL:   Value: 0x1012 +// STMBOL:   STV_HIDDEN  // SYMBOL:   Section: foo  // SYMBOL: } +// SYMBOL: Symbol { +// SYMBOL:   Name: __stop_zed1 +// SYMBOL:   Value: 0x3010 +// STMBOL:   Other: 0 +// SYMBOL:   Section: zed1 +// SYMBOL: } +// SYMBOL: Symbol { +// SYMBOL:   Name: __stop_zed2 +// SYMBOL:   Value: 0x3020 +// STMBOL:   Other: 0 +// SYMBOL:   Section: zed2 +// SYMBOL: } +  .hidden __start_foo  .hidden __stop_foo  .hidden __start_bar | 

