[PATCH] D48092: [COFF] Fix crash when emitting symbol tables with GC

Shoaib Meenai via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 12 13:31:36 PDT 2018


smeenai created this revision.
smeenai added reviewers: pcc, rnk, ruiu.

When running with linker GC (`-opt:ref`), defined imported symbols that
are referenced but then dropped by GC end up with their `Location`
member being nullptr, which means `getChunk()` returns nullptr for them
and attempting to call `getChunk()->getOutputSection()` causes a crash
from the nullptr dereference. Check for `getChunk()` being nullptr and
bail out early to avoid the crash.


Repository:
  rLLD LLVM Linker

https://reviews.llvm.org/D48092

Files:
  COFF/Writer.cpp
  test/COFF/symtab-gc.s


Index: test/COFF/symtab-gc.s
===================================================================
--- /dev/null
+++ test/COFF/symtab-gc.s
@@ -0,0 +1,27 @@
+# REQUIRES: x86
+
+# RUN: llvm-mc -filetype=obj -triple=x86_64-windows-msvc -o %tobject.obj %S/Inputs/object.s
+# RUN: lld-link -dll -entry:f -out:%t.dll -implib:%t.lib %tobject.obj
+# RUN: llvm-mc -filetype=obj -triple=x86_64-windows-msvc -o %tmain.obj %s
+# RUN: lld-link -entry:main -out:%t.exe -opt:ref -debug:dwarf %tmain.obj %t.lib
+# RUN: llvm-readobj -coff-imports %t.exe | FileCheck %s
+
+# CHECK-NOT: Symbol: f
+
+	.def	 main;
+	.scl	2;
+	.type	32;
+	.endef
+	.section	.text,"xr",one_only,main
+	.globl	main
+main:
+	retq
+
+	.def	 stripped;
+	.scl	3;
+	.type	32;
+	.endef
+	.section	.text,"xr",one_only,stripped
+stripped:
+	callq	__imp_f
+	retq
Index: COFF/Writer.cpp
===================================================================
--- COFF/Writer.cpp
+++ COFF/Writer.cpp
@@ -614,7 +614,10 @@
   default: {
     // Don't write symbols that won't be written to the output to the symbol
     // table.
-    OutputSection *OS = Def->getChunk()->getOutputSection();
+    Chunk *C = Def->getChunk();
+    if (!C)
+      return None;
+    OutputSection *OS = C->getOutputSection();
     if (!OS)
       return None;
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D48092.151012.patch
Type: text/x-patch
Size: 1283 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180612/5668f081/attachment.bin>


More information about the llvm-commits mailing list