[lld] r247745 - [elf2] Add error checking for the R_X86_64_32 relocation.

Michael J. Spencer via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 15 16:36:30 PDT 2015


Author: mspencer
Date: Tue Sep 15 18:36:30 2015
New Revision: 247745

URL: http://llvm.org/viewvc/llvm-project?rev=247745&view=rev
Log:
[elf2] Add error checking for the R_X86_64_32 relocation.

Added:
    lld/trunk/test/elf2/relocation-errors.s
Modified:
    lld/trunk/ELF/Writer.cpp
    lld/trunk/test/elf2/Inputs/abs.s

Modified: lld/trunk/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=247745&r1=247744&r2=247745&view=diff
==============================================================================
--- lld/trunk/ELF/Writer.cpp (original)
+++ lld/trunk/ELF/Writer.cpp Tue Sep 15 18:36:30 2015
@@ -14,6 +14,7 @@
 #include "Symbols.h"
 #include "SymbolTable.h"
 
+#include "llvm/ADT/APInt.h"
 #include "llvm/ADT/DenseMap.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/MC/StringTableBuilder.h"
@@ -499,9 +500,16 @@ template <class ELFT> void OutputSection
         case llvm::ELF::R_X86_64_64:
           support::endian::write64le(Location, SymVA + RI.r_addend);
           break;
-        case llvm::ELF::R_X86_64_32:
-          support::endian::write32le(Location, SymVA + RI.r_addend);
+        case llvm::ELF::R_X86_64_32: {
+          APInt VA(64, SymVA);
+          APInt Addend(64, RI.r_addend, true);
+          APInt Result64 = VA + Addend;
+          APInt Result = Result64.trunc(32);
+          if (Result.zext(64) != Result64)
+            error("Relocation out of range");
+          support::endian::write32le(Location, Result.getZExtValue());
           break;
+        }
         default:
           llvm::errs() << Twine("unrecognized reloc ") + Twine(Type) << '\n';
           break;

Modified: lld/trunk/test/elf2/Inputs/abs.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf2/Inputs/abs.s?rev=247745&r1=247744&r2=247745&view=diff
==============================================================================
--- lld/trunk/test/elf2/Inputs/abs.s (original)
+++ lld/trunk/test/elf2/Inputs/abs.s Tue Sep 15 18:36:30 2015
@@ -1,2 +1,4 @@
 .global abs
 abs = 0x42
+.global big
+big = 0x1000000000

Added: lld/trunk/test/elf2/relocation-errors.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf2/relocation-errors.s?rev=247745&view=auto
==============================================================================
--- lld/trunk/test/elf2/relocation-errors.s (added)
+++ lld/trunk/test/elf2/relocation-errors.s Tue Sep 15 18:36:30 2015
@@ -0,0 +1,10 @@
+// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %S/Inputs/abs.s -o %tabs
+// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t
+// RUN: not lld -flavor gnu2 %tabs %t -o %t2 2>&1 | FileCheck %s
+// REQUIRES: x86
+
+.global _start
+_start:
+  movl $big, %edx
+
+#CHECK: Relocation out of range




More information about the llvm-commits mailing list