]> granicus.if.org Git - llvm/commitdiff
[llvm-objcopy] - Calculate the string table section sizes correctly.
authorGeorge Rimar <grimar@accesssoftek.com>
Mon, 18 Mar 2019 14:27:41 +0000 (14:27 +0000)
committerGeorge Rimar <grimar@accesssoftek.com>
Mon, 18 Mar 2019 14:27:41 +0000 (14:27 +0000)
This fixes the https://bugs.llvm.org/show_bug.cgi?id=40980.

Previously if string optimization occurred as a result of
StringTableBuilder's finalize() method, the size wasn't updated.

This hopefully also makes the interaction between sections during finalization
processes a bit more clear.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@356371 91177308-0d34-0410-b5e6-96231b3b80d8

test/tools/llvm-objcopy/ELF/basic-archive-copy.test
test/tools/llvm-objcopy/ELF/cross-arch-sections-symbols.test
test/tools/llvm-objcopy/ELF/shstrtab-optimize.test [new file with mode: 0644]
test/tools/llvm-objcopy/ELF/strtab-optimize.test [new file with mode: 0644]
tools/llvm-objcopy/ELF/Object.cpp
tools/llvm-objcopy/ELF/Object.h

index cf973d6cd3f66f5b32fc38fff5ad880384ca4746..6d7e86c7e995231fc45264ed2eb35446a0945167 100644 (file)
@@ -88,7 +88,7 @@ Symbols:
 # CHECK-NEXT: ]
 # CHECK-NEXT: Address:
 # CHECK-NEXT: Offset:
-# CHECK-NEXT: Size: 6
+# CHECK-NEXT: Size: 5
 
 # CHECK:      Name: .shstrtab
 # CHECK-NEXT: Type: SHT_STRTAB
index 1d959a976350e0a5f7ac6797fffc5586f0ec77ca..fa5832b9dfe682d77dbad8304068971007acc3ba 100644 (file)
@@ -101,7 +101,7 @@ Symbols:
 # CHECK-NEXT:     ]
 # CHECK-NEXT:     Address:
 # CHECK-NEXT:     Offset:
-# CHECK-NEXT:     Size: 10
+# CHECK-NEXT:     Size: 9
 # CHECK-NEXT:     Link: 0
 # CHECK-NEXT:     Info: 0
 # CHECK-NEXT:     AddressAlignment: 1
diff --git a/test/tools/llvm-objcopy/ELF/shstrtab-optimize.test b/test/tools/llvm-objcopy/ELF/shstrtab-optimize.test
new file mode 100644 (file)
index 0000000..24b546c
--- /dev/null
@@ -0,0 +1,28 @@
+# RUN: yaml2obj %s > %t
+# RUN: llvm-objcopy %t %t2
+# RUN: llvm-readobj --sections %t2 | FileCheck %s
+
+## Check we have the correct size of the .shstrtab section
+## after the strings tail merge optimization.
+
+# CHECK:      Name: .shstrtab
+# CHECK-NEXT: Type: SHT_STRTAB
+# CHECK-NEXT: Flags [
+# CHECK-NEXT: ]
+# CHECK-NEXT: Address:
+# CHECK-NEXT: Offset:
+# CHECK-NEXT: Size: 36
+
+!ELF
+FileHeader:
+  Class:           ELFCLASS64
+  Data:            ELFDATA2LSB
+  Type:            ET_REL
+  Machine:         EM_X86_64
+Sections:
+  - Name:            .bar
+    Type:            SHT_PROGBITS
+    Flags:           [ ]
+  - Name:            .foo.bar
+    Type:            SHT_PROGBITS
+    Flags:           [ ]
diff --git a/test/tools/llvm-objcopy/ELF/strtab-optimize.test b/test/tools/llvm-objcopy/ELF/strtab-optimize.test
new file mode 100644 (file)
index 0000000..41f8681
--- /dev/null
@@ -0,0 +1,21 @@
+# RUN: yaml2obj %s > %t
+# RUN: llvm-objcopy %t %t2 --add-symbol='foo=1' --add-symbol='foofoo=2'
+# RUN: llvm-readobj --sections %t2 | FileCheck %s
+
+## Check we have the correct size of the .strtab section
+## after the strings tail merge optimization.
+
+# CHECK:      Name: .strtab
+# CHECK-NEXT: Type: SHT_STRTAB
+# CHECK-NEXT: Flags [
+# CHECK-NEXT: ]
+# CHECK-NEXT: Address:
+# CHECK-NEXT: Offset:
+# CHECK-NEXT: Size: 8
+
+!ELF
+FileHeader:
+  Class:           ELFCLASS64
+  Data:            ELFDATA2LSB
+  Type:            ET_REL
+  Machine:         EM_X86_64
index afa48e5c8868a20969549f5cb39802d2bf38dce0..8b895826b3c2c27fb5d17f17e44665bdb4877b42 100644 (file)
@@ -297,16 +297,16 @@ void CompressedSection::accept(MutableSectionVisitor &Visitor) {
   Visitor.visit(*this);
 }
 
-void StringTableSection::addString(StringRef Name) {
-  StrTabBuilder.add(Name);
-  Size = StrTabBuilder.getSize();
-}
+void StringTableSection::addString(StringRef Name) { StrTabBuilder.add(Name); }
 
 uint32_t StringTableSection::findIndex(StringRef Name) const {
   return StrTabBuilder.getOffset(Name);
 }
 
-void StringTableSection::finalize() { StrTabBuilder.finalize(); }
+void StringTableSection::prepareForLayout() {
+  StrTabBuilder.finalize();
+  Size = StrTabBuilder.getSize();
+}
 
 void SectionWriter::visit(const StringTableSection &Sec) {
   Sec.StrTabBuilder.write(Out.getBufferStart() + Sec.Offset);
@@ -468,9 +468,6 @@ void SymbolTableSection::initialize(SectionTableRef SecTable) {
 }
 
 void SymbolTableSection::finalize() {
-  // Make sure SymbolNames is finalized before getting name indexes.
-  SymbolNames->finalize();
-
   uint32_t MaxLocalIndex = 0;
   for (auto &Sym : Symbols) {
     Sym->NameIndex = SymbolNames->findIndex(Sym->Name);
@@ -1612,11 +1609,14 @@ template <class ELFT> Error ELFWriter<ELFT>::finalize() {
   if (Obj.SymbolTable != nullptr)
     Obj.SymbolTable->prepareForLayout();
 
+  // Now that all strings are added we want to finalize string table builders,
+  // because that affects section sizes which in turn affects section offsets.
+  for (auto &Sec : Obj.sections())
+    if (auto StrTab = dyn_cast<StringTableSection>(&Sec))
+      StrTab->prepareForLayout();
+
   assignOffsets();
 
-  // Finalize SectionNames first so that we can assign name indexes.
-  if (Obj.SectionNames != nullptr)
-    Obj.SectionNames->finalize();
   // Finally now that all offsets and indexes have been set we can finalize any
   // remaining issues.
   uint64_t Offset = Obj.SHOffset + sizeof(Elf_Shdr);
index 6bb80469c5477ea9eb064cf6414dc9a12d44f9cc..8e72cedcf2751c1476e45a52880e009bcb128530 100644 (file)
@@ -421,7 +421,7 @@ public:
 
   void addString(StringRef Name);
   uint32_t findIndex(StringRef Name) const;
-  void finalize() override;
+  void prepareForLayout();
   void accept(SectionVisitor &Visitor) const override;
   void accept(MutableSectionVisitor &Visitor) override;