[lld] r245943 - Set the symbol value in the symbol table.
Rafael Espindola via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 25 08:53:17 PDT 2015
Author: rafael
Date: Tue Aug 25 10:53:17 2015
New Revision: 245943
URL: http://llvm.org/viewvc/llvm-project?rev=245943&view=rev
Log:
Set the symbol value in the symbol table.
Modified:
lld/trunk/ELF/Chunks.h
lld/trunk/ELF/Writer.cpp
lld/trunk/test/elf2/symbols.s
Modified: lld/trunk/ELF/Chunks.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Chunks.h?rev=245943&r1=245942&r2=245943&view=diff
==============================================================================
--- lld/trunk/ELF/Chunks.h (original)
+++ lld/trunk/ELF/Chunks.h Tue Aug 25 10:53:17 2015
@@ -40,7 +40,7 @@ public:
const Elf_Shdr *getSectionHdr() const { return Header; }
// The writer sets and uses the addresses.
- uint64_t getOutputSectionOff() { return OutputSectionOff; }
+ uintX_t getOutputSectionOff() const { return OutputSectionOff; }
uintX_t getAlign() { return Header->sh_addralign; }
void setOutputSectionOff(uint64_t V) { OutputSectionOff = V; }
Modified: lld/trunk/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=245943&r1=245942&r2=245943&view=diff
==============================================================================
--- lld/trunk/ELF/Writer.cpp (original)
+++ lld/trunk/ELF/Writer.cpp Tue Aug 25 10:53:17 2015
@@ -45,6 +45,7 @@ public:
Header.sh_flags = sh_flags;
}
void setVA(uintX_t VA) { Header.sh_addr = VA; }
+ uintX_t getVA() { return Header.sh_addr; }
void setFileOffset(uintX_t Off) { Header.sh_offset = Off; }
template <endianness E>
void writeHeaderTo(typename ELFFile<ELFType<E, Is64Bits>>::Elf_Shdr *SHdr);
@@ -113,6 +114,7 @@ template <class ELFT>
class SymbolTableSection final : public OutputSectionBase<ELFT::Is64Bits> {
public:
typedef typename ELFFile<ELFT>::Elf_Sym Elf_Sym;
+ typedef typename OutputSectionBase<ELFT::Is64Bits>::uintX_t uintX_t;
SymbolTableSection(SymbolTable &Table)
: OutputSectionBase<ELFT::Is64Bits>(".symtab", SHT_SYMTAB, 0),
Table(Table) {
@@ -233,35 +235,42 @@ template <class ELFT> void SymbolTableSe
auto *ESym = reinterpret_cast<Elf_Sym *>(Buf);
ESym->st_name = Builder.getOffset(Name);
- uint8_t Binding;
+ uint8_t Binding = 0;
SymbolBody *Body = Sym->Body;
uint8_t Type = 0;
const SectionChunk<ELFT> *Section = nullptr;
+ const Elf_Sym *InputSym = nullptr;
switch (Body->kind()) {
case SymbolBody::UndefinedKind:
case SymbolBody::UndefinedSyntheticKind:
llvm_unreachable("Should be defined by now");
+ case SymbolBody::DefinedWeakKind:
case SymbolBody::DefinedRegularKind: {
- Binding = STB_GLOBAL;
- auto *Def = cast<DefinedRegular<ELFT>>(Body);
- Type = Def->Sym.getType();
+ auto *Def = cast<Defined<ELFT>>(Body);
+ InputSym = &Def->Sym;
Section = &Def->Section;
break;
}
- case SymbolBody::DefinedWeakKind:
- Section = &cast<Defined<ELFT>>(Body)->Section;
case SymbolBody::UndefinedWeakKind:
- Binding = STB_WEAK;
- Type = cast<ELFSymbolBody<ELFT>>(Body)->Sym.getType();
+ InputSym = &cast<ELFSymbolBody<ELFT>>(Body)->Sym;
break;
}
+
+ if (InputSym) {
+ Type = InputSym->getType();
+ Binding = InputSym->getBinding();
+ }
ESym->setBindingAndType(Binding, Type);
if (Section) {
OutputSection<ELFT> *Out = Section->getOutputSection();
ESym->st_shndx = Out->getSectionIndex();
+ uintX_t VA = Out->getVA();
+ VA += Section->getOutputSectionOff();
+ VA += InputSym->st_value;
+ ESym->st_value = VA;
}
Buf += sizeof(Elf_Sym);
Modified: lld/trunk/test/elf2/symbols.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf2/symbols.s?rev=245943&r1=245942&r2=245943&view=diff
==============================================================================
--- lld/trunk/test/elf2/symbols.s (original)
+++ lld/trunk/test/elf2/symbols.s Tue Aug 25 10:53:17 2015
@@ -1,6 +1,6 @@
// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
// RUN: lld -flavor gnu2 %t -o %t2
-// RUN: llvm-readobj -symbols %t2 | FileCheck %s
+// RUN: llvm-readobj -symbols -sections %t2 | FileCheck %s
// REQUIRES: x86
.type _start, @function
@@ -15,9 +15,32 @@ foo:
.weak bar
.long bar
-.data
+.section foobar,"a", at nobits,unique,1
.globl zed
zed:
+ .long 0
+.globl zed2
+zed2:
+.long 0
+
+.section foobar,"a", at nobits,unique,2
+.globl zed3
+zed3:
+
+// CHECK: Name: .text
+// CHECK-NEXT: Type: SHT_PROGBITS
+// CHECK-NEXT: Flags [
+// CHECK-NEXT: SHF_ALLOC
+// CHECK-NEXT: SHF_EXECINSTR
+// CHECK-NEXT: ]
+// CHECK-NEXT: Address: 0x1000
+
+// CHECK: Name: foobar
+// CHECK-NEXT: Type: SHT_NOBITS
+// CHECK-NEXT: Flags [
+// CHECK-NEXT: SHF_ALLOC
+// CHECK-NEXT: ]
+// CHECK-NEXT: Address: 0x1004
// CHECK: Symbols [
// CHECK-NEXT: Symbol {
@@ -31,16 +54,25 @@ zed:
// CHECK-NEXT: }
// CHECK-NEXT: Symbol {
// CHECK-NEXT: Name: zed
-// CHECK-NEXT: Value: 0x0
+// CHECK-NEXT: Value: 0x1004
// CHECK-NEXT: Size: 0
// CHECK-NEXT: Binding: Global (0x1)
// CHECK-NEXT: Type: None
// CHECK-NEXT: Other: 0
-// CHECK-NEXT: Section: .data
+// CHECK-NEXT: Section: foobar
+// CHECK-NEXT: }
+// CHECK-NEXT: Symbol {
+// CHECK-NEXT: Name: zed3
+// CHECK-NEXT: Value: 0x100C
+// CHECK-NEXT: Size: 0
+// CHECK-NEXT: Binding: Global
+// CHECK-NEXT: Type: None
+// CHECK-NEXT: Other: 0
+// CHECK-NEXT: Section: foobar
// CHECK-NEXT: }
// CHECK-NEXT: Symbol {
// CHECK-NEXT: Name: _start
-// CHECK-NEXT: Value: 0x0
+// CHECK-NEXT: Value: 0x1000
// CHECK-NEXT: Size: 0
// CHECK-NEXT: Binding: Global (0x1)
// CHECK-NEXT: Type: Function
@@ -58,11 +90,20 @@ zed:
// CHECK-NEXT: }
// CHECK-NEXT: Symbol {
// CHECK-NEXT: Name: foo
-// CHECK-NEXT: Value: 0x0
+// CHECK-NEXT: Value: 0x1000
// CHECK-NEXT: Size: 0
// CHECK-NEXT: Binding: Weak (0x2)
// CHECK-NEXT: Type: Object
// CHECK-NEXT: Other: 0
// CHECK-NEXT: Section: .text
// CHECK-NEXT: }
+// CHECK-NEXT: Symbol {
+// CHECK-NEXT: Name: zed2
+// CHECK-NEXT: Value: 0x1008
+// CHECK-NEXT: Size: 0
+// CHECK-NEXT: Binding: Global
+// CHECK-NEXT: Type: None
+// CHECK-NEXT: Other: 0
+// CHECK-NEXT: Section: foobar
+// CHECK-NEXT: }
// CHECK-NEXT: ]
More information about the llvm-commits
mailing list