From f39cdea879a8a8ca369b610030b66a55a3c743f3 Mon Sep 17 00:00:00 2001 From: George Rimar Date: Thu, 22 Dec 2016 11:05:05 +0000 Subject: [PATCH] [ELF] - Use error() instead of fatal() during relaxation of R_X86_64_GOTTPOFF This is last known noticable fatal() in target.cpp. We also have other ones for unknown relocations or creating unknown targets, but that one can be just error I think. Used yaml2obj to generate test. Differential revision: https://reviews.llvm.org/D28049 llvm-svn: 290335 --- lld/ELF/Target.cpp | 2 +- .../invalid/Inputs/broken-relaxation-x64.elf | Bin 0 -> 688 bytes lld/test/ELF/invalid/broken-relaxation-x64.s | 46 ++++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 lld/test/ELF/invalid/Inputs/broken-relaxation-x64.elf create mode 100644 lld/test/ELF/invalid/broken-relaxation-x64.s diff --git a/lld/ELF/Target.cpp b/lld/ELF/Target.cpp index c0fcd95878d5..edae7c65c1b4 100644 --- a/lld/ELF/Target.cpp +++ b/lld/ELF/Target.cpp @@ -799,7 +799,7 @@ void X86_64TargetInfo::relaxTlsIeToLe(uint8_t *Loc, uint32_t Type, memcpy(Inst, "\x48\xc7", 2); *RegSlot = 0xc0 | Reg; } else { - fatal(getErrorLocation(Loc - 3) + + error(getErrorLocation(Loc - 3) + "R_X86_64_GOTTPOFF must be used in MOVQ or ADDQ instructions only"); } diff --git a/lld/test/ELF/invalid/Inputs/broken-relaxation-x64.elf b/lld/test/ELF/invalid/Inputs/broken-relaxation-x64.elf new file mode 100644 index 0000000000000000000000000000000000000000..01a6af9a7fb53189acfbda03fa911c96e4656d39 GIT binary patch literal 688 zcmb<-^>JfjWE5n80!9Wq21XbMi8eqIbO4JxFt7ntrg(I-sDk*%8$cv85Ceroz(O-; z@`A*Uvv7fg@dII?G#dj8h9VxIhyVi&1 | FileCheck --check-prefix=ERR %s +# ERR: R_X86_64_GOTTPOFF must be used in MOVQ or ADDQ instructions only +# ERR: R_X86_64_GOTTPOFF must be used in MOVQ or ADDQ instructions only + +## YAML below contains 2 relocations of type R_X86_64_GOTTPOFF, and a .text +## with fake content filled by 0xFF. That means instructions for relaxation are +## "broken", so they does not match any known valid relaxations. We also generate +## .tls section because we need it for correct proccessing of STT_TLS symbol. +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_FREEBSD + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Type: SHT_PROGBITS + Name: .text + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Content: "FFFFFFFFFFFFFFFF" + - Type: SHT_PROGBITS + Name: .tls + Flags: [ SHF_ALLOC, SHF_TLS ] + - Type: SHT_REL + Name: .rel.text + Link: .symtab + Info: .text + AddressAlign: 0x04 + Relocations: + - Offset: 4 + Symbol: foo + Type: R_X86_64_GOTTPOFF + - Offset: 4 + Symbol: foo + Type: R_X86_64_GOTTPOFF +Symbols: + Global: + - Name: foo + Type: STT_TLS + Section: .text + Value: 0x12345 + Size: 4