From 1af72b898cc2f2b3f22ff7bbaf55dd8757d318e5 Mon Sep 17 00:00:00 2001 From: Simon Atanasyan Date: Mon, 22 Jun 2015 09:26:33 +0000 Subject: [PATCH] [Mips] Reject R_MIPS_GPREL32 against external symbols llvm-svn: 240264 --- .../ReaderWriter/ELF/Mips/MipsRelocationPass.cpp | 18 ++++++++-- lld/test/elf/Mips/validate-rel-02.test | 41 ++++++++++++++++++++++ 2 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 lld/test/elf/Mips/validate-rel-02.test diff --git a/lld/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp b/lld/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp index b1eb218..3729908 100644 --- a/lld/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp +++ b/lld/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp @@ -680,15 +680,29 @@ make_reject_for_shared_lib_reloc_error(const ELFLinkingContext &ctx, atom.file().path() + " with -fPIC"); } +static std::error_code +make_external_gprel32_reloc_error(const ELFLinkingContext &ctx, + const DefinedAtom &atom, + const Reference &ref) { + return make_dynamic_error_code( + "R_MIPS_GPREL32 (12) relocation cannot be used " + "against external symbol " + + ref.target()->name() + " in file " + atom.file().path()); +} + template std::error_code RelocationPass::validateRelocation(const DefinedAtom &atom, const Reference &ref) const { - if (this->_ctx.getOutputELFType() != ET_DYN) - return std::error_code(); if (!ref.target()) return std::error_code(); + if (ref.kindValue() == R_MIPS_GPREL32 && !isLocal(ref.target())) + return make_external_gprel32_reloc_error(this->_ctx, atom, ref); + + if (this->_ctx.getOutputELFType() != ET_DYN) + return std::error_code(); + switch (ref.kindValue()) { case R_MIPS16_HI16: case R_MIPS_HI16: diff --git a/lld/test/elf/Mips/validate-rel-02.test b/lld/test/elf/Mips/validate-rel-02.test new file mode 100644 index 0000000..01160ee --- /dev/null +++ b/lld/test/elf/Mips/validate-rel-02.test @@ -0,0 +1,41 @@ +# Check that the linker does not accept R_MIPS_GPREL32 relocation +# against external symbol. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t.o +# RUN: not lld -flavor gnu -target mipsel -e T0 -o %t.exe %t.o 2>&1 \ +# RUN: | FileCheck %s + +# CHECK: R_MIPS_GPREL32 (12) relocation cannot be used against external symbol T0 in file {{.*}}validate-rel-02.test.tmp.o + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 16 + Size: 4 + + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 4 + Info: .text + Relocations: + - Offset: 0 + Symbol: T0 + Type: R_MIPS_GPREL32 + +Symbols: + Global: + - Name: T0 + Type: STT_FUNC + Section: .text + Size: 4 +... -- 2.7.4