ELF: Handle R_ARM_V4BX correctly in PIC output files.

Previously we considered R_ARM_V4BX to be an absolute relocation,
which meant that we rejected it in read-only sections in PIC output
files. Instead, treat it as a hint relocation so that relocation
processing ignores it entirely.

Also fix a problem with the test case where it was never being run
because it has a .yaml extension and we don't run tests with that
extension.

Differential Revision: https://reviews.llvm.org/D55728

llvm-svn: 349216
This commit is contained in:
Peter Collingbourne 2018-12-15 00:20:17 +00:00
parent a6682a413d
commit ae15e7232a
2 changed files with 8 additions and 6 deletions

View File

@ -134,6 +134,12 @@ RelExpr ARM::getRelExpr(RelType Type, const Symbol &S,
return R_NONE;
case R_ARM_TLS_LE32:
return R_TLS;
case R_ARM_V4BX:
// V4BX is just a marker to indicate there's a "bx rN" instruction at the
// given address. It can be used to implement a special linker mode which
// rewrites ARMv4T inputs to ARMv4. Since we support only ARMv4 input and
// not ARMv4 output, we can just ignore it.
return R_HINT;
default:
return R_ABS;
}
@ -514,12 +520,6 @@ void ARM::relocateOne(uint8_t *Loc, RelType Type, uint64_t Val) const {
((Val << 4) & 0x7000) | // imm3
(Val & 0x00ff)); // imm8
break;
case R_ARM_V4BX:
// V4BX is just a marker to indicate there's a "bx rN" instruction at the
// given address. It can be used to implement a special linker mode which
// rewrites ARMv4T inputs to ARMv4. Since we support only ARMv4 input and
// not ARMv4 output, we can just ignore it.
break;
default:
error(getErrorLocation(Loc) + "unrecognized reloc " + Twine(Type));
}

View File

@ -2,6 +2,8 @@
# RUN: yaml2obj %s -o %t.o
# RUN: ld.lld %t.o -o %t
# RUN: llvm-readelf -sections %t | FileCheck %s
# RUN: ld.lld -shared %t.o -o %t
# RUN: llvm-readelf -sections %t | FileCheck %s
# CHECK: .text