Skip to content

Commit

Permalink
Port r292594.
Browse files Browse the repository at this point in the history
[ELF] - Do not crash when assign common symbol's values in script

Found that during attempts of linking linux kernel,
previously we partially duplicated code from getOutputSection(),
and it missed commons symbol case.

Differential revision: https://reviews.llvm.org/D28903

llvm-svn: 293284
  • Loading branch information
espindola committed Jan 27, 2017
1 parent 345e759 commit 7c71653
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 8 deletions.
7 changes: 1 addition & 6 deletions lld/ELF/LinkerScript.cpp
Expand Up @@ -918,12 +918,7 @@ const OutputSectionBase *LinkerScript<ELFT>::getSymbolSection(StringRef S) {
return CurOutSec ? CurOutSec : (*OutputSections)[0];
}

if (auto *DR = dyn_cast_or_null<DefinedRegular<ELFT>>(Sym))
return DR->Section ? DR->Section->OutSec : nullptr;
if (auto *DS = dyn_cast_or_null<DefinedSynthetic>(Sym))
return DS->Section;

return nullptr;
return SymbolTableSection<ELFT>::getOutputSection(Sym);
}

// Returns indices of ELF headers containing specific section, identified
Expand Down
4 changes: 2 additions & 2 deletions lld/ELF/SyntheticSections.h
Expand Up @@ -372,15 +372,15 @@ class SymbolTableSection final : public SyntheticSection<ELFT> {

ArrayRef<SymbolTableEntry> getSymbols() const { return Symbols; }

static const OutputSectionBase *getOutputSection(SymbolBody *Sym);

unsigned NumLocals = 0;
StringTableSection<ELFT> &StrTabSec;

private:
void writeLocalSymbols(uint8_t *&Buf);
void writeGlobalSymbols(uint8_t *Buf);

const OutputSectionBase *getOutputSection(SymbolBody *Sym);

// A vector of symbols and their string table offsets.
std::vector<SymbolTableEntry> Symbols;
};
Expand Down
48 changes: 48 additions & 0 deletions lld/test/ELF/linkerscript/common-assign.s
@@ -0,0 +1,48 @@
# REQUIRES: x86
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
# RUN: echo "SECTIONS { . = SIZEOF_HEADERS; pfoo = foo; pbar = bar; }" > %t.script
# RUN: ld.lld -o %t1 --script %t.script %t
# RUN: llvm-readobj -symbols %t1 | FileCheck %s

# CHECK: Symbol {
# CHECK: Name: bar
# CHECK-NEXT: Value: 0x134
# CHECK-NEXT: Size: 4
# CHECK-NEXT: Binding: Global
# CHECK-NEXT: Type: Object
# CHECK-NEXT: Other: 0
# CHECK-NEXT: Section: .bss
# CHECK-NEXT: }
# CHECK-NEXT: Symbol {
# CHECK-NEXT: Name: foo
# CHECK-NEXT: Value: 0x138
# CHECK-NEXT: Size: 4
# CHECK-NEXT: Binding: Global
# CHECK-NEXT: Type: Object
# CHECK-NEXT: Other: 0
# CHECK-NEXT: Section: .bss
# CHECK-NEXT: }
# CHECK-NEXT: Symbol {
# CHECK-NEXT: Name: pfoo
# CHECK-NEXT: Value: 0x138
# CHECK-NEXT: Size: 0
# CHECK-NEXT: Binding: Global
# CHECK-NEXT: Type: None
# CHECK-NEXT: Other: 0
# CHECK-NEXT: Section: .bss
# CHECK-NEXT: }
# CHECK-NEXT: Symbol {
# CHECK-NEXT: Name: pbar
# CHECK-NEXT: Value: 0x134
# CHECK-NEXT: Size: 0
# CHECK-NEXT: Binding: Global
# CHECK-NEXT: Type: None
# CHECK-NEXT: Other: 0
# CHECK-NEXT: Section: .bss
# CHECK-NEXT: }
# CHECK-NEXT: ]

.comm foo,4,4
.comm bar,4,4
movl $1, foo(%rip)
movl $2, bar(%rip)

0 comments on commit 7c71653

Please sign in to comment.