[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