From cf8c42f54605ad0d941751cd3b7d65b9a5463265 Mon Sep 17 00:00:00 2001 From: Simon Atanasyan Date: Wed, 30 Mar 2016 22:43:14 +0000 Subject: [PATCH] [ELF][MIPS] Revert r264761 and add test case to demonstrate the problem 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 --- lld/ELF/Target.cpp | 1 + lld/ELF/Writer.cpp | 9 +++++++++ lld/test/ELF/mips-lo16-not-relative.s | 23 +++++++++++++++++++++++ 3 files changed, 33 insertions(+) create mode 100644 lld/test/ELF/mips-lo16-not-relative.s diff --git a/lld/ELF/Target.cpp b/lld/ELF/Target.cpp index c075c8d..09e3ee6 100644 --- a/lld/ELF/Target.cpp +++ b/lld/ELF/Target.cpp @@ -1844,6 +1844,7 @@ bool MipsTargetInfo::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: diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 2ab47f7..76cde10 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -434,6 +434,15 @@ void Writer::scanRelocs(InputSectionBase &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 diff --git a/lld/test/ELF/mips-lo16-not-relative.s b/lld/test/ELF/mips-lo16-not-relative.s new file mode 100644 index 0000000..614e639 --- /dev/null +++ b/lld/test/ELF/mips-lo16-not-relative.s @@ -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) -- 2.7.4