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

Michael Spencer via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 15 19:29:32 PDT 2015


On Tue, Sep 15, 2015 at 5:19 PM, Rui Ueyama <ruiu at google.com> wrote:
> On Tue, Sep 15, 2015 at 4:36 PM, Michael J. Spencer via llvm-commits
> <llvm-commits at lists.llvm.org> wrote:
>>
>> 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());
>
>
> We don't need the arbitrary precision integer to check for overflow. This
> can be written like this.
>
> uint64_t VA = SymVA + RI.r_addend;
> if ((RI.r_addend > 0 && VA < SymVA) || (RI.r_addend < 0 && VA > SymVA) || VA
> != uint32_t(VA))
>   error("Relocation out of range");
> support::endian::write32le(Location, VA);
>

Kind of fixed in r247768.

We still need to properly check for 64 bit overflow, but that's
actually a different check from the truncation check.

>>            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
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
>


More information about the llvm-commits mailing list