Skip to content

Commit

Permalink
[ELF2] Add support for -discard-none.
Browse files Browse the repository at this point in the history
Differential Revision:	http://reviews.llvm.org/D13083

llvm-svn: 248499
  • Loading branch information
dcci committed Sep 24, 2015
1 parent e0f09fa commit d75d3b9
Show file tree
Hide file tree
Showing 7 changed files with 78 additions and 2 deletions.
1 change: 1 addition & 0 deletions lld/ELF/Config.h
Expand Up @@ -22,6 +22,7 @@ struct Configuration {
bool Shared = false;
bool DiscardAll = false;
bool DiscardLocals = false;
bool DiscardNone = false;
bool ExportDynamic = false;
};

Expand Down
3 changes: 3 additions & 0 deletions lld/ELF/Driver.cpp
Expand Up @@ -88,6 +88,9 @@ void LinkerDriver::link(ArrayRef<const char *> ArgsArr) {
if (Args.hasArg(OPT_discard_locals))
Config->DiscardLocals = true;

if (Args.hasArg(OPT_discard_none))
Config->DiscardNone = true;

if (Args.hasArg(OPT_export_dynamic))
Config->ExportDynamic = true;

Expand Down
3 changes: 3 additions & 0 deletions lld/ELF/Options.td
Expand Up @@ -28,6 +28,9 @@ def discard_locals : Flag<["-"], "discard-locals">,
def alias_discard_locals: Flag<["-"], "X">,
Alias<discard_locals>;

def discard_none : Flag<["-"], "discard-none">,
HelpText<"Keep all symbols in the symbol table">;

//===----------------------------------------------------------------------===//
/// Ignored options
//===----------------------------------------------------------------------===//
Expand Down
11 changes: 10 additions & 1 deletion lld/ELF/OutputSections.cpp
Expand Up @@ -272,6 +272,15 @@ bool lld::elf2::includeInSymtab(const SymbolBody &B) {
return true;
}

template <class ELFT>
bool SymbolTableSection<ELFT>::shouldKeepInSymtab(StringRef SymName) {
if (Config->DiscardNone)
return true;

// ELF defines dynamic locals as symbols which name starts with ".L".
return !(Config->DiscardLocals && SymName.startswith(".L"));
}

bool lld::elf2::includeInDynamicSymtab(const SymbolBody &B) {
if (Config->ExportDynamic || Config->Shared)
return true;
Expand All @@ -294,7 +303,7 @@ template <class ELFT> void SymbolTableSection<ELFT>::writeTo(uint8_t *Buf) {
auto *ESym = reinterpret_cast<Elf_Sym *>(Buf);
uint32_t SecIndex = Sym.st_shndx;
ErrorOr<StringRef> SymName = Sym.getName(File.getStringTable());
if (Config->DiscardLocals && SymName->startswith(".L"))
if (SymName && !shouldKeepInSymtab(*SymName))
continue;
ESym->st_name = (SymName) ? StrTabSec.getFileOff(*SymName) : 0;
ESym->st_size = Sym.st_size;
Expand Down
2 changes: 2 additions & 0 deletions lld/ELF/OutputSections.h
Expand Up @@ -186,6 +186,8 @@ class SymbolTableSection final : public OutputSectionBase<ELFT::Is64Bits> {
++NumLocals;
}

bool shouldKeepInSymtab(StringRef Name);

StringTableSection<ELFT::Is64Bits> &getStrTabSec() const { return StrTabSec; }
unsigned getNumSymbols() const { return NumVisible + 1; }

Expand Down
2 changes: 1 addition & 1 deletion lld/ELF/Writer.cpp
Expand Up @@ -336,7 +336,7 @@ template <class ELFT> void Writer<ELFT>::createSections() {
Elf_Sym_Range Syms = File.getLocalSymbols();
for (const Elf_Sym &Sym : Syms) {
ErrorOr<StringRef> SymName = Sym.getName(File.getStringTable());
if (SymName && !(Config->DiscardLocals && SymName->startswith(".L")))
if (SymName && SymTabSec.shouldKeepInSymtab(*SymName))
SymTabSec.addSymbol(*SymName, true);
}
}
Expand Down
58 changes: 58 additions & 0 deletions lld/test/elf2/discard-none.s
@@ -0,0 +1,58 @@
// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux -save-temp-labels %s -o %t
// RUN: lld -flavor gnu2 -discard-none -shared %t -o %t2
// RUN: llvm-readobj -s -sd -t %t2 | FileCheck %s
// REQUIRES: x86

.text
.Lmyvar:
.Lmyothervar:

// CHECK: Section {
// CHECK: Name: .strtab
// CHECK-NEXT: Type: SHT_STRTAB
// CHECK-NEXT: Flags [
// CHECK-NEXT: ]
// CHECK-NEXT: Address:
// CHECK-NEXT: Offset:
// CHECK-NEXT: Size:
// CHECK-NEXT: Link:
// CHECK-NEXT: Info:
// CHECK-NEXT: AddressAlignment:
// CHECK-NEXT: EntrySize:
// CHECK-NEXT: SectionData (
// CHECK-NEXT: 0000: 002E7465 7874002E 62737300 2E64796E |..text..bss..dyn|
// CHECK-NEXT: 0010: 73747200 2E4C6D79 76617200 2E4C6D79 |str..Lmyvar..Lmy|
// CHECK-NEXT: 0020: 6F746865 72766172 002E6479 6E73796D |othervar..dynsym|
// CHECK-NEXT: 0030: 002E6861 7368002E 64796E61 6D696300 |..hash..dynamic.|
// CHECK-NEXT: 0040: 2E737472 74616200 2E73796D 74616200 |.strtab..symtab.|
// CHECK-NEXT: 0050: 2E646174 6100 |.data.|
// CHECK-NEXT: )
// CHECK-NEXT: }

// CHECK: Symbol {
// CHECK-NEXT: Name:
// CHECK-NEXT: Value: 0x0
// CHECK-NEXT: Size: 0
// CHECK-NEXT: Binding: Local
// CHECK-NEXT: Type: None
// CHECK-NEXT: Other: 0
// CHECK-NEXT: Section: Undefined
// CHECK-NEXT: }
// CHECK-NEXT: Symbol {
// CHECK-NEXT: Name: .Lmyothervar
// CHECK-NEXT: Value: 0x1000
// CHECK-NEXT: Size: 0
// CHECK-NEXT: Binding: Local
// CHECK-NEXT: Type: None
// CHECK-NEXT: Other: 0
// CHECK-NEXT: Section: .text
// CHECK-NEXT: }
// CHECK-NEXT: Symbol {
// CHECK-NEXT: Name: .Lmyvar
// CHECK-NEXT: Value: 0x1000
// CHECK-NEXT: Size: 0
// CHECK-NEXT: Binding: Local
// CHECK-NEXT: Type: None
// CHECK-NEXT: Other: 0
// CHECK-NEXT: Section: .text
// CHECK-NEXT: }

0 comments on commit d75d3b9

Please sign in to comment.