mirror of
https://github.com/intel/llvm.git
synced 2026-01-23 07:58:23 +08:00
[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: 292594
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -372,6 +372,8 @@ public:
|
||||
|
||||
ArrayRef<SymbolTableEntry> getSymbols() const { return Symbols; }
|
||||
|
||||
static const OutputSectionBase *getOutputSection(SymbolBody *Sym);
|
||||
|
||||
unsigned NumLocals = 0;
|
||||
StringTableSection<ELFT> &StrTabSec;
|
||||
|
||||
@@ -379,8 +381,6 @@ 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;
|
||||
};
|
||||
|
||||
48
lld/test/ELF/linkerscript/common-assign.s
Normal file
48
lld/test/ELF/linkerscript/common-assign.s
Normal file
@@ -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)
|
||||
Reference in New Issue
Block a user