[llvm-objcopy] - Use replaceSectionReferences to update the sections for symbols...
authorGeorge Rimar <grimar@accesssoftek.com>
Wed, 20 Mar 2019 13:57:47 +0000 (13:57 +0000)
committerGeorge Rimar <grimar@accesssoftek.com>
Wed, 20 Mar 2019 13:57:47 +0000 (13:57 +0000)
If the compression was used and we had a symbol not involved in relocation,
we never updated its section and it was silently removed from the output.

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

llvm-svn: 356554

llvm/test/tools/llvm-objcopy/ELF/Inputs/compress-debug-sections.yaml
llvm/test/tools/llvm-objcopy/ELF/compress-debug-sections-symbols.test [new file with mode: 0644]
llvm/tools/llvm-objcopy/ELF/Object.cpp
llvm/tools/llvm-objcopy/ELF/Object.h

index 0f9f5a1..a3c607c 100644 (file)
@@ -21,6 +21,10 @@ Sections:
       - Offset:          0x2
         Symbol:          .notdebug_foo
         Type:            R_X86_64_32
+## This section should not be involved in relocations.
+  - Name:            .debug_bar
+    Type:            SHT_PROGBITS
+    Content:         0000000000000000
 Symbols:
   Global:
     - Name:    .debug_foo
@@ -29,4 +33,6 @@ Symbols:
     - Name:    .notdebug_foo
       Type:    STT_SECTION
       Section: .notdebug_foo
+    - Name:    .Linfo_string0
+      Section: .debug_bar
 ...
diff --git a/llvm/test/tools/llvm-objcopy/ELF/compress-debug-sections-symbols.test b/llvm/test/tools/llvm-objcopy/ELF/compress-debug-sections-symbols.test
new file mode 100644 (file)
index 0000000..1d6ac30
--- /dev/null
@@ -0,0 +1,21 @@
+# REQUIRES: zlib
+
+# RUN: yaml2obj %p/Inputs/compress-debug-sections.yaml -o %t.o
+
+## Test that after the compression is done we do not remove the symbol
+## and it is placed into the right section.
+
+# RUN: llvm-objcopy --compress-debug-sections %t.o %t-compressed1.o
+# RUN: llvm-readobj -symbols %t-compressed1.o | FileCheck %s --check-prefixes=CHECK,ZLIB
+
+# RUN: llvm-objcopy --compress-debug-sections=zlib-gnu %t.o %t-compressed2.o
+# RUN: llvm-readobj -symbols %t-compressed2.o | FileCheck %s --check-prefixes=CHECK,ZLIBGNU
+
+# CHECK:        Name:    .Linfo_string0
+# CHECK-NEXT:   Value:   0x0
+# CHECK-NEXT:   Size:    0
+# CHECK-NEXT:   Binding: Global
+# CHECK-NEXT:   Type:    None
+# CHECK-NEXT:   Other:   0
+# ZLIB-NEXT:    Section: .debug_bar
+# ZLIBGNU-NEXT: Section: .zdebug_bar
index 8b89582..ccc6efa 100644 (file)
@@ -457,6 +457,13 @@ Error SymbolTableSection::removeSymbols(
   return Error::success();
 }
 
+void SymbolTableSection::replaceSectionReferences(
+    const DenseMap<SectionBase *, SectionBase *> &FromTo) {
+  for (std::unique_ptr<Symbol> &Sym : Symbols)
+    if (SectionBase *To = FromTo.lookup(Sym->DefinedIn))
+      Sym->DefinedIn = To;
+}
+
 void SymbolTableSection::initialize(SectionTableRef SecTable) {
   Size = 0;
   setStrTab(SecTable.getSectionOfType<StringTableSection>(
@@ -638,12 +645,6 @@ void RelocationSection::replaceSectionReferences(
   // Update the target section if it was replaced.
   if (SectionBase *To = FromTo.lookup(SecToApplyRel))
     SecToApplyRel = To;
-
-  // Change the sections where symbols are defined in if their
-  // original sections were replaced.
-  for (const Relocation &R : Relocations)
-    if (SectionBase *To = FromTo.lookup(R.RelocSymbol->DefinedIn))
-      R.RelocSymbol->DefinedIn = To;
 }
 
 void SectionWriter::visit(const DynamicRelocationSection &Sec) {
index 8e72ced..732ff89 100644 (file)
@@ -529,6 +529,8 @@ public:
   void accept(SectionVisitor &Visitor) const override;
   void accept(MutableSectionVisitor &Visitor) override;
   Error removeSymbols(function_ref<bool(const Symbol &)> ToRemove) override;
+  void replaceSectionReferences(
+      const DenseMap<SectionBase *, SectionBase *> &FromTo) override;
 
   static bool classof(const SectionBase *S) {
     return S->Type == ELF::SHT_SYMTAB;