[lld] r250584 - [ELF2] - Implemented R_X86_64_PLT32 relocation.

Hal Finkel via llvm-commits llvm-commits at lists.llvm.org
Fri Oct 16 17:39:48 PDT 2015


----- Original Message -----
> From: "George Rimar via llvm-commits" <llvm-commits at lists.llvm.org>
> To: llvm-commits at lists.llvm.org
> Sent: Friday, October 16, 2015 6:52:25 PM
> Subject: [lld] r250584 - [ELF2] - Implemented R_X86_64_PLT32 relocation.
> 
> Author: grimar
> Date: Fri Oct 16 18:52:24 2015
> New Revision: 250584
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=250584&view=rev
> Log:
> [ELF2] - Implemented R_X86_64_PLT32 relocation.
> 
> There is sometimes no need to generate relocation via PLT.
> Example - when symbol is not undefined and we are not creating shared
> library. Then we can create relative relocation instead of
> referencing and creating PLT records.
> 
> Differential Revision: http://reviews.llvm.org/D13835
> 
> Modified:
>     lld/trunk/ELF/Target.cpp
>     lld/trunk/test/elf2/plt.s
> 
> Modified: lld/trunk/ELF/Target.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Target.cpp?rev=250584&r1=250583&r2=250584&view=diff
> ==============================================================================
> --- lld/trunk/ELF/Target.cpp (original)
> +++ lld/trunk/ELF/Target.cpp Fri Oct 16 18:52:24 2015
> @@ -256,7 +256,7 @@ bool X86_64TargetInfo::relocNeedsPlt(uin
>      // R_386_JMP_SLOT, etc).
>      return S.isShared();
>    case R_X86_64_PLT32:
> -    return true;
> +    return canBePreempted(&S, true);

Why is the second parameter (NeedsGot) true here? This will cause a .plt entry to be required for undefined weak symbols even when not compiling with -shared.

 -Hal

>    }
>  }
>  
> @@ -297,6 +297,9 @@ void X86_64TargetInfo::relocateOne(uint8
>      write32le(Loc, SA);
>      break;
>    }
> +  case R_X86_64_PLT32:
> +    write32le(Loc, SA - BaseAddr - Offset);
> +    break;
>    default:
>      error("unrecognized reloc " + Twine(Type));
>    }
> 
> Modified: lld/trunk/test/elf2/plt.s
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf2/plt.s?rev=250584&r1=250583&r2=250584&view=diff
> ==============================================================================
> --- lld/trunk/test/elf2/plt.s (original)
> +++ lld/trunk/test/elf2/plt.s Fri Oct 16 18:52:24 2015
> @@ -2,8 +2,12 @@
>  // RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux
>  %p/Inputs/shared.s -o %t2.o
>  // RUN: ld.lld2 -shared %t2.o -o %t2.so
>  // RUN: ld.lld2 -shared %t.o %t2.so -o %t
> +// RUN: ld.lld2 %t.o %t2.so -o %t3
>  // RUN: llvm-readobj -s -r %t | FileCheck %s
>  // RUN: llvm-objdump -d %t | FileCheck --check-prefix=DISASM %s
> +// RUN: llvm-readobj -s -r %t3 | FileCheck --check-prefix=CHECK2 %s
> +// RUN: llvm-objdump -d %t3 | FileCheck --check-prefix=DISASM2 %s
> +
>  // REQUIRES: x86
>  
>  // CHECK:      Name: .plt
> @@ -27,20 +31,43 @@
>  // CHECK-NEXT:   }
>  // CHECK-NEXT: ]
>  
> +// CHECK2:      Name: .plt
> +// CHECK2-NEXT: Type: SHT_PROGBITS
> +// CHECK2-NEXT: Flags [
> +// CHECK2-NEXT:   SHF_ALLOC
> +// CHECK2-NEXT:   SHF_EXECINSTR
> +// CHECK2-NEXT: ]
> +// CHECK2-NEXT: Address: 0x11020
> +// CHECK2-NEXT: Offset:
> +// CHECK2-NEXT: Size: 16
> +// CHECK2-NEXT: Link: 0
> +// CHECK2-NEXT: Info: 0
> +// CHECK2-NEXT: AddressAlignment: 16
> +
> +// CHECK2:      Relocations [
> +// CHECK2-NEXT:   Section ({{.*}}) .rela.dyn {
> +// CHECK2-NEXT:     0x120A0 R_X86_64_GLOB_DAT bar 0x0
> +// CHECK2-NEXT:     0x120A8 R_X86_64_GLOB_DAT zed 0x0
> +// CHECK2-NEXT:   }
> +// CHECK2-NEXT: ]
> +
>  // Unfortunately FileCheck can't do math, so we have to check for
>  explicit
>  // values:
>  
> -// 0x11020 - (0x11000 + 1) - 4 = 27
> -// 0x11020 - (0x11005 + 1) - 4 = 22
> -// 0x11028 - (0x1100a + 1) - 4 = 25
> +// 0x1020 - (0x1000 + 1) - 4 = 27
> +// 0x1020 - (0x1005 + 1) - 4 = 22
> +// 0x1028 - (0x100a + 1) - 4 = 25
> +// 0x1030 - (0x100f + 1) - 4 = 28
>  
>  // DISASM:      _start:
>  // DISASM-NEXT:   1000:  e9 {{.*}}       jmp  27
>  // DISASM-NEXT:   1005:  e9 {{.*}}       jmp  22
>  // DISASM-NEXT:   100a:  e9 {{.*}}       jmp  25
> +// DISASM-NEXT:   100f:  e9 {{.*}}       jmp  28
>  
> -// 0x120A0 - 0x11026  = 4218
> -// 0x120A8 - 0x1102e  = 4218
> +// 0x20A0 - 0x1026  = 4218
> +// 0x20A8 - 0x102e  = 4218
> +// 0x20B0 - 0x1036  = 4218
>  
>  // DISASM:      Disassembly of section .plt:
>  // DISASM-NEXT: .plt:
> @@ -50,6 +77,30 @@
>  // DISASM-NEXT:   1028:  ff 25 {{.*}}       jmpq *4218(%rip)
>  // DISASM-NEXT:   102e:  90                 nop
>  // DISASM-NEXT:   102f:  90                 nop
> +// DISASM-NEXT:   1030:  ff 25 {{.*}}       jmpq *4218(%rip)
> +// DISASM-NEXT:   1036:  90                 nop
> +// DISASM-NEXT:   1037:  90                 nop
> +
> +// 0x11020 - (0x11000 + 1) - 4 = 27
> +// 0x11020 - (0x11005 + 1) - 4 = 22
> +// 0x11028 - (0x1100a + 1) - 4 = 25
> +// 0x11000 - (0x1100f + 1) - 4 = -20
> +
> +// DISASM2:      _start:
> +// DISASM2-NEXT:   11000:  e9 {{.*}}     jmp  27
> +// DISASM2-NEXT:   11005:  e9 {{.*}}     jmp  22
> +// DISASM2-NEXT:   1100a:  e9 {{.*}}     jmp  25
> +// DISASM2-NEXT:   1100f:  e9 {{.*}}     jmp  -20
> +
> +// DISASM2:      Disassembly of section .plt:
> +// DISASM2-NEXT: .plt:
> +// DISASM2-NEXT:     11020:  ff 25 7a 10 00 00 jmpq *4218(%rip)
> +// DISASM2-NEXT:     11026:  90                nop
> +// DISASM2-NEXT:     11027:  90                nop
> +// DISASM2-NEXT:     11028:  ff 25 7a 10 00 00 jmpq *4218(%rip)
> +// DISASM2-NEXT:     1102e:  90                nop
> +// DISASM2-NEXT:     1102f:  90                nop
> +// DISASM2-NEXT-NOT: 110C0
>  
>  .global _start
>  _start:
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
> 

-- 
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory


More information about the llvm-commits mailing list