[PATCH] D40174: [ELF][MIPS] Fix crash in LLD when linking code that needs PIC thunks

Alexander Richardson via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Nov 17 05:54:56 PST 2017


arichardson created this revision.
Herald added subscribers: krytarowski, sdardis, emaste.

The bug triggers when the following conditions are met:

- A thunk is created in a given input section S
- A linker script is specified
- There is at least one matcher in the linker script .text section output that does not match any of the sections in the input files, before the matcher that matches section S.

The issue was found when linking the FreeBSD kernel for MIPS when built
with -fPIC. Patch by Alfredo Mazzinghi.


https://reviews.llvm.org/D40174

Files:
  ELF/Relocations.cpp
  test/ELF/linkerscript/thunk-gen-mips.s


Index: test/ELF/linkerscript/thunk-gen-mips.s
===================================================================
--- /dev/null
+++ test/ELF/linkerscript/thunk-gen-mips.s
@@ -0,0 +1,40 @@
+# REQUIRES: mips
+# RUN:	llvm-mc -filetype=obj -defsym=MAIN=1 -triple=mips-unknown-freebsd %s -o %t
+# RUN:	llvm-mc -filetype=obj -defsym=TARGET=1 -triple=mips-unknown-freebsd %s -o %t1
+
+# SECTIONS command with the first pattern that does not match.
+# Linking a PIC and non-PIC object files triggers the LA25 thunk generation.
+# RUN:		echo "SECTIONS { \
+# RUN:		.text : { \
+# RUN:			*(.nomatch) \
+# RUN:			%t(.text) \
+# RUN:			. = . + 0x100000 ; \
+# RUN:			%t1(.text) \
+# RUN:		} \
+# RUN:	}" > %t.script
+# RUN: ld.lld -o %t.exe --script %t.script %t %t1
+# RUN: llvm-objdump -t %t.exe | FileCheck %s
+# CHECK: SYMBOL TABLE:
+# CHECK-ANY: 00000000         .text           00000000 _start
+# CHECK-ANY: 0010000c l     F .text           00000010 __LA25Thunk_too_far
+# CHECK-ANY: 00100020 g     F .text           00000024 too_far
+
+.ifdef MAIN
+.global _start
+_start:
+	j too_far
+	nop
+.endif
+
+.ifdef TARGET
+	.text
+	.abicalls
+	.set    noreorder
+	.globl  too_far
+	.ent    too_far
+too_far:
+	nop
+	jr      $ra
+	nop
+	.end    too_far
+.endif
\ No newline at end of file
Index: ELF/Relocations.cpp
===================================================================
--- ELF/Relocations.cpp
+++ ELF/Relocations.cpp
@@ -1224,6 +1224,8 @@
   OutputSection *TOS = IS->getParent();
   for (BaseCommand *BC : TOS->SectionCommands)
     if (auto *ISD = dyn_cast<InputSectionDescription>(BC)) {
+      if (ISD->Sections.empty())
+        continue;
       InputSection *first = ISD->Sections.front();
       InputSection *last = ISD->Sections.back();
       if (IS->OutSecOff >= first->OutSecOff &&


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D40174.123324.patch
Type: text/x-patch
Size: 1796 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171117/684359ff/attachment.bin>


More information about the llvm-commits mailing list