[llvm] r356554 - [llvm-objcopy] - Use replaceSectionReferences to update the sections for symbols in symbol table.

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 20 06:57:47 PDT 2019


Author: grimar
Date: Wed Mar 20 06:57:47 2019
New Revision: 356554

URL: http://llvm.org/viewvc/llvm-project?rev=356554&view=rev
Log:
[llvm-objcopy] - Use replaceSectionReferences to update the sections for symbols in symbol table.

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

Added:
    llvm/trunk/test/tools/llvm-objcopy/ELF/compress-debug-sections-symbols.test
Modified:
    llvm/trunk/test/tools/llvm-objcopy/ELF/Inputs/compress-debug-sections.yaml
    llvm/trunk/tools/llvm-objcopy/ELF/Object.cpp
    llvm/trunk/tools/llvm-objcopy/ELF/Object.h

Modified: llvm/trunk/test/tools/llvm-objcopy/ELF/Inputs/compress-debug-sections.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/ELF/Inputs/compress-debug-sections.yaml?rev=356554&r1=356553&r2=356554&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/ELF/Inputs/compress-debug-sections.yaml (original)
+++ llvm/trunk/test/tools/llvm-objcopy/ELF/Inputs/compress-debug-sections.yaml Wed Mar 20 06:57:47 2019
@@ -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
 ...

Added: llvm/trunk/test/tools/llvm-objcopy/ELF/compress-debug-sections-symbols.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/ELF/compress-debug-sections-symbols.test?rev=356554&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/ELF/compress-debug-sections-symbols.test (added)
+++ llvm/trunk/test/tools/llvm-objcopy/ELF/compress-debug-sections-symbols.test Wed Mar 20 06:57:47 2019
@@ -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

Modified: llvm/trunk/tools/llvm-objcopy/ELF/Object.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/ELF/Object.cpp?rev=356554&r1=356553&r2=356554&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objcopy/ELF/Object.cpp (original)
+++ llvm/trunk/tools/llvm-objcopy/ELF/Object.cpp Wed Mar 20 06:57:47 2019
@@ -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::replaceSectionRe
   // 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) {

Modified: llvm/trunk/tools/llvm-objcopy/ELF/Object.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/ELF/Object.h?rev=356554&r1=356553&r2=356554&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objcopy/ELF/Object.h (original)
+++ llvm/trunk/tools/llvm-objcopy/ELF/Object.h Wed Mar 20 06:57:47 2019
@@ -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;




More information about the llvm-commits mailing list