Skip to content

Commit

Permalink
[ELF] Do not create interworking thunks for undefined weak references.
Browse files Browse the repository at this point in the history
An undefined weak reference is given an address of 0 this will
incorrectly trigger the creation of a Thumb to ARM interworking Thunk
if there is a Thumb branch instruction to the symbol. This results in
an error as Thunks only make sense to defined or shared symbols.

We prevent this by detecting an undefined symbol and not creating a thunk
for it.

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

llvm-svn: 285896
  • Loading branch information
smithp35 committed Nov 3, 2016
1 parent db68845 commit 2227c7f
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 0 deletions.
3 changes: 3 additions & 0 deletions lld/ELF/Target.cpp
Expand Up @@ -1652,6 +1652,9 @@ void ARMTargetInfo::writePlt(uint8_t *Buf, uint64_t GotEntryAddr,
RelExpr ARMTargetInfo::getThunkExpr(RelExpr Expr, uint32_t RelocType,
const InputFile &File,
const SymbolBody &S) const {
// If S is an undefined weak symbol we don't need a Thunk
if (S.isUndefined())
return Expr;
// A state change from ARM to Thumb and vice versa must go through an
// interworking thunk if the relocation type is not R_ARM_CALL or
// R_ARM_THM_CALL.
Expand Down
23 changes: 23 additions & 0 deletions lld/test/ELF/arm-thumb-no-undefined-thunk.s
@@ -0,0 +1,23 @@
// RUN: llvm-mc -filetype=obj -triple=thumbv7a-none-linux-gnueabi %s -o %t
// RUN: ld.lld %t -o %t2 2>&1
// RUN: llvm-objdump -triple=thumbv7a-none-linux-gnueabi -d %t2 | FileCheck %s
// REQUIRES: arm

// Check that no thunks are created for an undefined weak symbol
.syntax unified

.weak target

.section .text.thumb, "ax", %progbits
.thumb
.global
_start:
bl target
b target
b.w target

// CHECK: Disassembly of section .text:
// CHECK-NEXT: _start:
// CHECK-NEXT: 11000: ee f7 fe ef blx #-69636
// CHECK-NEXT: 11004: ee f7 fc bf b.w #-69640
// CHECK-NEXT: 11008: ee f7 fa bf b.w #-69644

0 comments on commit 2227c7f

Please sign in to comment.