[PATCH] D49350: [LLD] [COFF] Don't produce base relocs for discardable sections

Martin Storsjö via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sun Jul 15 13:34:56 PDT 2018


mstorsjo created this revision.
mstorsjo added reviewers: ruiu, pcc.
Herald added subscribers: JDevlieghere, aprantl.

Dwarf debug info contains some data that otherwise would end up containing absolute addresses. Since these sections are discardable and aren't loaded at runtime, there's no point in adding base relocations for them.

This makes sure that after stripping out dwarf debug info, there are no base relocations that point to nonexistent sections.


Repository:
  rLLD LLVM Linker

https://reviews.llvm.org/D49350

Files:
  COFF/Writer.cpp
  test/COFF/debug-reloc.s


Index: test/COFF/debug-reloc.s
===================================================================
--- /dev/null
+++ test/COFF/debug-reloc.s
@@ -0,0 +1,42 @@
+# REQUIRES: x86
+
+# RUN: llvm-mc -triple=x86_64-windows-gnu %s -filetype=obj -o %t.obj
+
+# 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
+
+# SECTIONS:         Number: 3
+# SECTIONS-NEXT:    Name: .data (2E 64 61 74 61 00 00 00)
+# SECTIONS-NEXT:    VirtualSize: 0x8
+# SECTIONS-NEXT:    VirtualAddress: 0x3000
+
+# RELOCS:      BaseReloc [
+# RELOCS-NEXT:   Entry {
+# RELOCS-NEXT:     Type: DIR64
+# RELOCS-NEXT:     Address: 0x3000
+# RELOCS-NEXT:   }
+# RELOCS-NEXT:   Entry {
+# RELOCS-NEXT:     Type: ABSOLUTE
+# RELOCS-NEXT:     Address: 0x3000
+# RELOCS-NEXT:   }
+# RELOCS-NEXT: ]
+
+	.text
+	.def	 mainfunc;
+	.scl	2;
+	.type	32;
+	.endef
+	.globl	mainfunc
+mainfunc:
+.Lfunc_begin0:
+	xorl	%eax, %eax
+	retq
+
+	.data
+	.globl	ptr
+ptr:
+	.quad	mainfunc
+
+	.section	.debug_info,"dr"
+	.quad	.Lfunc_begin0
Index: COFF/Writer.cpp
===================================================================
--- COFF/Writer.cpp
+++ COFF/Writer.cpp
@@ -1260,7 +1260,7 @@
     return;
   std::vector<Baserel> V;
   for (OutputSection *Sec : OutputSections) {
-    if (Sec == RelocSec)
+    if (Sec->Header.Characteristics & IMAGE_SCN_MEM_DISCARDABLE)
       continue;
     // Collect all locations for base relocations.
     for (Chunk *C : Sec->getChunks())


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D49350.155593.patch
Type: text/x-patch
Size: 1619 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180715/c93be4c0/attachment.bin>


More information about the llvm-commits mailing list