Mark R_GOTREL_FROM_END as a relative expression.
authorRafael Espindola <rafael.espindola@gmail.com>
Tue, 6 Sep 2016 13:57:15 +0000 (13:57 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Tue, 6 Sep 2016 13:57:15 +0000 (13:57 +0000)
Fixes pr30282.

llvm-svn: 280709

lld/ELF/Relocations.cpp
lld/test/ELF/i386-gotoff-shared.s [new file with mode: 0644]

index d10b594..47c0406 100644 (file)
@@ -283,8 +283,9 @@ static bool needsPlt(RelExpr Expr) {
 // True if this expression is of the form Sym - X, where X is a position in the
 // file (PC, or GOT for example).
 static bool isRelExpr(RelExpr Expr) {
-  return Expr == R_PC || Expr == R_GOTREL || Expr == R_PAGE_PC ||
-         Expr == R_RELAX_GOT_PC || Expr == R_THUNK_PC || Expr == R_THUNK_PLT_PC;
+  return Expr == R_PC || Expr == R_GOTREL || Expr == R_GOTREL_FROM_END ||
+         Expr == R_PAGE_PC || Expr == R_RELAX_GOT_PC || Expr == R_THUNK_PC ||
+         Expr == R_THUNK_PLT_PC;
 }
 
 template <class ELFT>
diff --git a/lld/test/ELF/i386-gotoff-shared.s b/lld/test/ELF/i386-gotoff-shared.s
new file mode 100644 (file)
index 0000000..01242ad
--- /dev/null
@@ -0,0 +1,23 @@
+// REQUIRES: x86
+// RUN: llvm-mc -filetype=obj -triple=i686-pc-linux %s -o %t.o
+// RUN: ld.lld %t.o -o %t.so -shared
+// RUN: llvm-readobj -s %t.so | FileCheck %s
+// RUN: llvm-objdump -d %t.so | FileCheck --check-prefix=DISASM %s
+
+bar:
+        movl    bar@GOTOFF(%ebx), %eax
+        mov     bar@GOT, %eax
+
+// CHECK:      Name: .got
+// CHECK-NEXT: Type: SHT_PROGBITS
+// CHECK-NEXT: Flags [
+// CHECK-NEXT:   SHF_ALLOC
+// CHECK-NEXT:   SHF_WRITE
+// CHECK-NEXT: ]
+// CHECK-NEXT: Address: 0x2050
+// CHECK-NEXT: Offset: 0x2050
+// CHECK-NEXT: Size: 4
+
+// 0x1000 - (0x2050 + 4) = -4180
+
+// DISASM:  1000: {{.*}} movl    -4180(%ebx), %eax