[COFF] Write the debug directory and build id to a separate section for MinGW
authorMartin Storsjo <martin@martin.st>
Fri, 20 Jul 2018 05:44:34 +0000 (05:44 +0000)
committerMartin Storsjo <martin@martin.st>
Fri, 20 Jul 2018 05:44:34 +0000 (05:44 +0000)
For dwarf debug info, an executable normally either contains the debug
info, or it is stripped out. To reduce the storage needed (slightly)
for the debug info kept separately from the released, stripped binaries,
one can choose to only copy the debug data from the original executable
(essentially the reverse of the strip operation), producing a file with
only debug info.

When copying the debug data from an executable with GNU objcopy,
the build id and debug directory need to reside in a separate section,
as this will be kept while the rest of the .rdata section is removed.

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

llvm-svn: 337526

lld/COFF/Writer.cpp
lld/test/COFF/debug-reloc.s

index d17cc7b71decc3f98f48da8bc6435f03c110fc37..607a1d1c8ee42cad7a0bab87095c54f147b68341 100644 (file)
@@ -201,6 +201,7 @@ private:
 
   OutputSection *TextSec;
   OutputSection *RdataSec;
+  OutputSection *BuildidSec;
   OutputSection *DataSec;
   OutputSection *PdataSec;
   OutputSection *IdataSec;
@@ -420,6 +421,7 @@ void Writer::createSections() {
   TextSec = CreateSection(".text", CODE | R | X);
   CreateSection(".bss", BSS | R | W);
   RdataSec = CreateSection(".rdata", DATA | R);
+  BuildidSec = CreateSection(".buildid", DATA | R);
   DataSec = CreateSection(".data", DATA | R | W);
   PdataSec = CreateSection(".pdata", DATA | R);
   IdataSec = CreateSection(".idata", DATA | R);
@@ -503,6 +505,8 @@ void Writer::createMiscChunks() {
   if (Config->Debug) {
     DebugDirectory = make<DebugDirectoryChunk>(DebugRecords);
 
+    OutputSection *DebugInfoSec = Config->MinGW ? BuildidSec : RdataSec;
+
     // Make a CVDebugRecordChunk even when /DEBUG:CV is not specified.  We
     // output a PDB no matter what, and this chunk provides the only means of
     // allowing a debugger to match a PDB and an executable.  So we need it even
@@ -511,9 +515,9 @@ void Writer::createMiscChunks() {
     BuildId = CVChunk;
     DebugRecords.push_back(CVChunk);
 
-    RdataSec->addChunk(DebugDirectory);
+    DebugInfoSec->addChunk(DebugDirectory);
     for (Chunk *C : DebugRecords)
-      RdataSec->addChunk(C);
+      DebugInfoSec->addChunk(C);
   }
 
   // Create SEH table. x86-only.
index 43b511112a8086bcee1a634ad656bb9a941f4913..57ab9bf9cdbc9b6bee26e920e1a6a98f097da2dc 100644 (file)
@@ -5,7 +5,13 @@
 # RUN: lld-link -lldmingw -debug:dwarf -out:%t.exe -entry:mainfunc -subsystem:console %t.obj
 # RUN: llvm-readobj -sections %t.exe | FileCheck %s -check-prefix SECTIONS
 # RUN: llvm-readobj -coff-basereloc %t.exe | FileCheck %s -check-prefix RELOCS
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck %s -check-prefix HEADERS
+# RUN: llvm-readobj -coff-debug-directory %t.exe | FileCheck %s -check-prefix DEBUG
 
+# SECTIONS:         Number: 2
+# SECTIONS-NEXT:    Name: .buildid (2E 62 75 69 6C 64 69 64)
+# SECTIONS-NEXT:    VirtualSize: 0x35
+# SECTIONS-NEXT:    VirtualAddress: 0x2000
 # SECTIONS:         Number: 3
 # SECTIONS-NEXT:    Name: .data (2E 64 61 74 61 00 00 00)
 # SECTIONS-NEXT:    VirtualSize: 0x8
 # RELOCS-NEXT:   }
 # RELOCS-NEXT: ]
 
+# HEADERS:     DebugRVA: 0x2000
+# HEADERS:     DebugSize: 0x1C
+
+# DEBUG: DebugDirectory [
+# DEBUG:   DebugEntry {
+# DEBUG:     Type: CodeView (0x2)
+# DEBUG:     SizeOfData: 0x19
+# DEBUG:     AddressOfRawData: 0x201C
+# DEBUG:     PointerToRawData: 0x61C
+
        .text
        .def     mainfunc;
        .scl    2;