Skip to content

Commit

Permalink
[ELF][MIPS] Revert r264761 and add test case to demonstrate the problem
Browse files Browse the repository at this point in the history
If we make R_MIPS_LO16 a relative relocation, linker:
- never creates R_MIPS_COPY relocation for it
- attempts to create R_MIPS_REL32 dynamic relocation if R_MIPS_LO16's
  target is a preemptible symbol

Differential Revision: http://reviews.llvm.org/D18607

llvm-svn: 264956
atanasyan committed Mar 30, 2016
1 parent a7e5210 commit cf8c42f
Showing 3 changed files with 33 additions and 0 deletions.
1 change: 1 addition & 0 deletions lld/ELF/Target.cpp
Original file line number Diff line number Diff line change
@@ -1844,6 +1844,7 @@ bool MipsTargetInfo<ELFT>::isRelRelative(uint32_t Type) const {
case R_MIPS_32:
case R_MIPS_64:
case R_MIPS_HI16:
case R_MIPS_LO16:
case R_MIPS_TLS_DTPREL_HI16:
case R_MIPS_TLS_DTPREL_LO16:
case R_MIPS_TLS_TPREL_HI16:
9 changes: 9 additions & 0 deletions lld/ELF/Writer.cpp
Original file line number Diff line number Diff line change
@@ -434,6 +434,15 @@ void Writer<ELFT>::scanRelocs(InputSectionBase<ELFT> &C,
}

if (Config->EMachine == EM_MIPS) {
if (Type == R_MIPS_LO16)
// Ignore R_MIPS_LO16 relocation. If it is a pair for R_MIPS_GOT16 we
// already completed all required action (GOT entry allocation) when
// handle R_MIPS_GOT16. If it is a pair for R_MIPS_HI16 against
// _gp_disp it does not require dynamic relocation. If its a pair for
// R_MIPS_HI16 against a regular symbol it does not require dynamic
// relocation too because that case is possible for executable file
// linking only.
continue;
if (&Body == Config->MipsGpDisp || &Body == Config->MipsLocalGp)
// MIPS _gp_disp designates offset between start of function and 'gp'
// pointer into GOT. __gnu_local_gp is equal to the current value of
23 changes: 23 additions & 0 deletions lld/test/ELF/mips-lo16-not-relative.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Check that R_MIPS_LO16 relocation is handled as non-relative,
# and if a target symbol is a DSO data symbol, LLD create a copy
# relocation.

# RUN: llvm-mc -filetype=obj -triple=mips-unknown-linux \
# RUN: %S/Inputs/mips-dynamic.s -o %t.so.o
# RUN: ld.lld %t.so.o -shared -o %t.so
# RUN: llvm-mc -filetype=obj -triple=mips-unknown-linux %s -o %t.o
# RUN: ld.lld %t.o %t.so -o %t.exe
# RUN: llvm-readobj -r %t.exe | FileCheck %s

# REQUIRES: mips

# CHECK: Relocations [
# CHECK-NEXT: Section (7) .rel.dyn {
# CHECK-NEXT: 0x{{[0-9A-F]+}} R_MIPS_COPY data0 0x0
# CHECK-NEXT: }
# CHECK-NEXT: ]

.text
.global __start
__start:
addi $t0, $t0, %lo(data0)

0 comments on commit cf8c42f

Please sign in to comment.