[llvm] r351662 - [llvm-objcopy] [COFF] Implement --only-keep-debug

Martin Storsjo via llvm-commits llvm-commits at lists.llvm.org
Sat Jan 19 11:42:49 PST 2019


Author: mstorsjo
Date: Sat Jan 19 11:42:48 2019
New Revision: 351662

URL: http://llvm.org/viewvc/llvm-project?rev=351662&view=rev
Log:
[llvm-objcopy] [COFF] Implement --only-keep-debug

Differential Revision: https://reviews.llvm.org/D56840

Added:
    llvm/trunk/test/tools/llvm-objcopy/COFF/Inputs/only-keep-sections.yaml
    llvm/trunk/test/tools/llvm-objcopy/COFF/only-keep-debug.test
Modified:
    llvm/trunk/tools/llvm-objcopy/COFF/COFFObjcopy.cpp
    llvm/trunk/tools/llvm-objcopy/COFF/Object.cpp
    llvm/trunk/tools/llvm-objcopy/COFF/Object.h

Added: llvm/trunk/test/tools/llvm-objcopy/COFF/Inputs/only-keep-sections.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/COFF/Inputs/only-keep-sections.yaml?rev=351662&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/COFF/Inputs/only-keep-sections.yaml (added)
+++ llvm/trunk/test/tools/llvm-objcopy/COFF/Inputs/only-keep-sections.yaml Sat Jan 19 11:42:48 2019
@@ -0,0 +1,77 @@
+--- !COFF
+OptionalHeader:  
+  AddressOfEntryPoint: 4144
+  ImageBase:       1073741824
+  SectionAlignment: 4096
+  FileAlignment:   512
+  MajorOperatingSystemVersion: 6
+  MinorOperatingSystemVersion: 0
+  MajorImageVersion: 0
+  MinorImageVersion: 0
+  MajorSubsystemVersion: 6
+  MinorSubsystemVersion: 0
+  Subsystem:       IMAGE_SUBSYSTEM_WINDOWS_CUI
+  DLLCharacteristics: [  ]
+  SizeOfStackReserve: 1048576
+  SizeOfStackCommit: 4096
+  SizeOfHeapReserve: 1048576
+  SizeOfHeapCommit: 4096
+header:          
+  Machine:         IMAGE_FILE_MACHINE_AMD64
+  Characteristics: [  ]
+sections:        
+  - Name:            .text
+    Characteristics: [ IMAGE_SCN_CNT_CODE ]
+    VirtualAddress:  4096
+    VirtualSize:     4
+    SectionData:     C3C3C3C3
+  - Name:            .rdata
+    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA ]
+    VirtualAddress:  8192
+    VirtualSize:     4
+    SectionData:     2A000000
+  - Name:            .buildid
+    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA ]
+    VirtualAddress:  12288
+    VirtualSize:     4
+    SectionData:     2B000000
+  - Name:            .reloc
+    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE ]
+    VirtualAddress:  16384
+    VirtualSize:     4
+    SectionData:     2C000000
+  - Name:            .debug_discardable
+    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE ]
+    VirtualAddress:  20480
+    VirtualSize:     4
+    SectionData:     2D000000
+  - Name:            .debug_undiscardable
+    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA ]
+    VirtualAddress:  24576
+    VirtualSize:     4
+    SectionData:     2E000000
+  - Name:            .unflagged
+    Characteristics: [  ]
+    VirtualAddress:  28672
+    VirtualSize:     4
+    SectionData:     2F000000
+symbols:         
+  - Name:            main
+    Value:           2
+    SectionNumber:   1
+    SimpleType:      IMAGE_SYM_TYPE_NULL
+    ComplexType:     IMAGE_SYM_DTYPE_FUNCTION
+    StorageClass:    IMAGE_SYM_CLASS_EXTERNAL
+  - Name:            debug_discardable_sym
+    Value:           0
+    SectionNumber:   5
+    SimpleType:      IMAGE_SYM_TYPE_NULL
+    ComplexType:     IMAGE_SYM_DTYPE_FUNCTION
+    StorageClass:    IMAGE_SYM_CLASS_EXTERNAL
+  - Name:            debug_undiscardable_sym
+    Value:           0
+    SectionNumber:   6
+    SimpleType:      IMAGE_SYM_TYPE_NULL
+    ComplexType:     IMAGE_SYM_DTYPE_FUNCTION
+    StorageClass:    IMAGE_SYM_CLASS_EXTERNAL
+...

Added: llvm/trunk/test/tools/llvm-objcopy/COFF/only-keep-debug.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/COFF/only-keep-debug.test?rev=351662&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/COFF/only-keep-debug.test (added)
+++ llvm/trunk/test/tools/llvm-objcopy/COFF/only-keep-debug.test Sat Jan 19 11:42:48 2019
@@ -0,0 +1,58 @@
+RUN: yaml2obj %p/Inputs/only-keep-sections.yaml > %t.in.exe
+
+RUN: llvm-objcopy --only-keep-debug %t.in.exe %t.out.exe
+RUN: llvm-readobj --sections %t.out.exe | FileCheck %s --check-prefix=SECTIONS
+RUN: llvm-objdump -t %t.out.exe | FileCheck %s --check-prefix=SYMBOLS
+
+Check that all non-debug/buildid sections with IMAGE_SCN_CNT_CODE
+or IMAGE_SCN_CNT_INITIALIZED_DATA are truncated, and no others.
+
+SECTIONS:      Sections [
+SECTIONS-NEXT:  Section {
+SECTIONS-NEXT:   Number: 1
+SECTIONS-NEXT:   Name: .text
+SECTIONS-NEXT:   VirtualSize: 0x4
+SECTIONS-NEXT:   VirtualAddress:
+SECTIONS-NEXT:   RawDataSize: 0
+SECTIONS:       Section {
+SECTIONS-NEXT:   Number: 2
+SECTIONS-NEXT:   Name: .rdata
+SECTIONS-NEXT:   VirtualSize: 0x4
+SECTIONS-NEXT:   VirtualAddress:
+SECTIONS-NEXT:   RawDataSize: 0
+SECTIONS:       Section {
+SECTIONS-NEXT:   Number: 3
+SECTIONS-NEXT:   Name: .buildid
+SECTIONS-NEXT:   VirtualSize: 0x4
+SECTIONS-NEXT:   VirtualAddress:
+SECTIONS-NEXT:   RawDataSize: 512
+SECTIONS:       Section {
+SECTIONS-NEXT:   Number: 4
+SECTIONS-NEXT:   Name: .reloc
+SECTIONS-NEXT:   VirtualSize: 0x4
+SECTIONS-NEXT:   VirtualAddress:
+SECTIONS-NEXT:   RawDataSize: 0
+SECTIONS:       Section {
+SECTIONS-NEXT:   Number: 5
+SECTIONS-NEXT:   Name: .debug_discardable
+SECTIONS-NEXT:   VirtualSize: 0x4
+SECTIONS-NEXT:   VirtualAddress:
+SECTIONS-NEXT:   RawDataSize: 512
+SECTIONS:       Section {
+SECTIONS-NEXT:   Number: 6
+SECTIONS-NEXT:   Name: .debug_undiscardable
+SECTIONS-NEXT:   VirtualSize: 0x4
+SECTIONS-NEXT:   VirtualAddress:
+SECTIONS-NEXT:   RawDataSize: 512
+SECTIONS:       Section {
+SECTIONS-NEXT:   Number: 7
+SECTIONS-NEXT:   Name: .unflagged
+SECTIONS-NEXT:   VirtualSize: 0x4
+SECTIONS-NEXT:   VirtualAddress:
+SECTIONS-NEXT:   RawDataSize: 512
+
+SYMBOLS:      SYMBOL TABLE:
+SYMBOLS-NEXT: main
+SYMBOLS-NEXT: debug_discardable_sym
+SYMBOLS-NEXT: debug_undiscardable_sym
+SYMBOLS-EMPTY:

Modified: llvm/trunk/tools/llvm-objcopy/COFF/COFFObjcopy.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/COFF/COFFObjcopy.cpp?rev=351662&r1=351661&r2=351662&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objcopy/COFF/COFFObjcopy.cpp (original)
+++ llvm/trunk/tools/llvm-objcopy/COFF/COFFObjcopy.cpp Sat Jan 19 11:42:48 2019
@@ -46,6 +46,16 @@ static Error handleArgs(const CopyConfig
     return false;
   });
 
+  if (Config.OnlyKeepDebug) {
+    // For --only-keep-debug, we keep all other sections, but remove their
+    // content. The VirtualSize field in the section header is kept intact.
+    Obj.truncateSections([](const Section &Sec) {
+      return !isDebugSection(Sec) && Sec.Name != ".buildid" &&
+             ((Sec.Header.Characteristics &
+               (IMAGE_SCN_CNT_CODE | IMAGE_SCN_CNT_INITIALIZED_DATA)) != 0);
+    });
+  }
+
   // StripAll removes all symbols and thus also removes all relocations.
   if (Config.StripAll || Config.StripAllGNU)
     for (Section &Sec : Obj.getMutableSections())

Modified: llvm/trunk/tools/llvm-objcopy/COFF/Object.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/COFF/Object.cpp?rev=351662&r1=351661&r2=351662&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objcopy/COFF/Object.cpp (original)
+++ llvm/trunk/tools/llvm-objcopy/COFF/Object.cpp Sat Jan 19 11:42:48 2019
@@ -127,6 +127,16 @@ void Object::removeSections(function_ref
   updateSymbols();
 }
 
+void Object::truncateSections(function_ref<bool(const Section &)> ToTruncate) {
+  for (Section &Sec : Sections) {
+    if (ToTruncate(Sec)) {
+      Sec.Contents = ArrayRef<uint8_t>();
+      Sec.Relocs.clear();
+      Sec.Header.SizeOfRawData = 0;
+    }
+  }
+}
+
 } // end namespace coff
 } // end namespace objcopy
 } // end namespace llvm

Modified: llvm/trunk/tools/llvm-objcopy/COFF/Object.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/COFF/Object.h?rev=351662&r1=351661&r2=351662&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objcopy/COFF/Object.h (original)
+++ llvm/trunk/tools/llvm-objcopy/COFF/Object.h Sat Jan 19 11:42:48 2019
@@ -93,6 +93,7 @@ struct Object {
 
   void addSections(ArrayRef<Section> NewSections);
   void removeSections(function_ref<bool(const Section &)> ToRemove);
+  void truncateSections(function_ref<bool(const Section &)> ToTruncate);
 
 private:
   std::vector<Symbol> Symbols;




More information about the llvm-commits mailing list