[lld] r337526 - [COFF] Write the debug directory and build id to a separate section for MinGW

Martin Storsjo via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 19 22:44:34 PDT 2018


Author: mstorsjo
Date: Thu Jul 19 22:44:34 2018
New Revision: 337526

URL: http://llvm.org/viewvc/llvm-project?rev=337526&view=rev
Log:
[COFF] Write the debug directory and build id to a separate section for MinGW

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

Modified:
    lld/trunk/COFF/Writer.cpp
    lld/trunk/test/COFF/debug-reloc.s

Modified: lld/trunk/COFF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Writer.cpp?rev=337526&r1=337525&r2=337526&view=diff
==============================================================================
--- lld/trunk/COFF/Writer.cpp (original)
+++ lld/trunk/COFF/Writer.cpp Thu Jul 19 22:44:34 2018
@@ -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.

Modified: lld/trunk/test/COFF/debug-reloc.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/debug-reloc.s?rev=337526&r1=337525&r2=337526&view=diff
==============================================================================
--- lld/trunk/test/COFF/debug-reloc.s (original)
+++ lld/trunk/test/COFF/debug-reloc.s Thu Jul 19 22:44:34 2018
@@ -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
@@ -22,6 +28,16 @@
 # 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;




More information about the llvm-commits mailing list