-
Notifications
You must be signed in to change notification settings - Fork 12.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[ELF] Do not skip relocation scanning checking if the symbol gets dyn…
…amic COPY relocation already It is possible that the same symbol referenced by two kinds of relocations at the same time. The first type requires say GOT entry creation, the second type requires dynamic copy relocation. For MIPS targets they might be R_MIPS_GOT16 and R_MIPS_HI16 relocations. For X86 target they might be R_386_GOT32 and R_386_32 respectively. Now LLD never creates GOT entry for a symbol if this symbol already has related copy relocation. This patch solves this problem. Differential Revision: http://reviews.llvm.org/D18862 llvm-svn: 265910
- llvmorg-20-init
- llvmorg-19.1.7
- llvmorg-19.1.6
- llvmorg-19.1.5
- llvmorg-19.1.4
- llvmorg-19.1.3
- llvmorg-19.1.2
- llvmorg-19.1.1
- llvmorg-19.1.0
- llvmorg-19.1.0-rc4
- llvmorg-19.1.0-rc3
- llvmorg-19.1.0-rc2
- llvmorg-19.1.0-rc1
- llvmorg-19-init
- llvmorg-18.1.8
- llvmorg-18.1.7
- llvmorg-18.1.6
- llvmorg-18.1.5
- llvmorg-18.1.4
- llvmorg-18.1.3
- llvmorg-18.1.2
- llvmorg-18.1.1
- llvmorg-18.1.0
- llvmorg-18.1.0-rc4
- llvmorg-18.1.0-rc3
- llvmorg-18.1.0-rc2
- llvmorg-18.1.0-rc1
- llvmorg-18-init
- llvmorg-17.0.6
- llvmorg-17.0.5
- llvmorg-17.0.4
- llvmorg-17.0.3
- llvmorg-17.0.2
- llvmorg-17.0.1
- llvmorg-17.0.0
- llvmorg-17.0.0-rc4
- llvmorg-17.0.0-rc3
- llvmorg-17.0.0-rc2
- llvmorg-17.0.0-rc1
- llvmorg-17-init
- llvmorg-16.0.6
- llvmorg-16.0.5
- llvmorg-16.0.4
- llvmorg-16.0.3
- llvmorg-16.0.2
- llvmorg-16.0.1
- llvmorg-16.0.0
- llvmorg-16.0.0-rc4
- llvmorg-16.0.0-rc3
- llvmorg-16.0.0-rc2
- llvmorg-16.0.0-rc1
- llvmorg-16-init
- llvmorg-15.0.7
- llvmorg-15.0.6
- llvmorg-15.0.5
- llvmorg-15.0.4
- llvmorg-15.0.3
- llvmorg-15.0.2
- llvmorg-15.0.1
- llvmorg-15.0.0
- llvmorg-15.0.0-rc3
- llvmorg-15.0.0-rc2
- llvmorg-15.0.0-rc1
- llvmorg-15-init
- llvmorg-14.0.6
- llvmorg-14.0.5
- llvmorg-14.0.4
- llvmorg-14.0.3
- llvmorg-14.0.2
- llvmorg-14.0.1
- llvmorg-14.0.0
- llvmorg-14.0.0-rc4
- llvmorg-14.0.0-rc3
- llvmorg-14.0.0-rc2
- llvmorg-14.0.0-rc1
- llvmorg-14-init
- llvmorg-13.0.1
- llvmorg-13.0.1-rc3
- llvmorg-13.0.1-rc2
- llvmorg-13.0.1-rc1
- llvmorg-13.0.0
- llvmorg-13.0.0-rc4
- llvmorg-13.0.0-rc3
- llvmorg-13.0.0-rc2
- llvmorg-13.0.0-rc1
- llvmorg-13-init
- llvmorg-12.0.1
- llvmorg-12.0.1-rc4
- llvmorg-12.0.1-rc3
- llvmorg-12.0.1-rc2
- llvmorg-12.0.1-rc1
- llvmorg-12.0.0
- llvmorg-12.0.0-rc5
- llvmorg-12.0.0-rc4
- llvmorg-12.0.0-rc3
- llvmorg-12.0.0-rc2
- llvmorg-12.0.0-rc1
- llvmorg-12-init
- llvmorg-11.1.0
- llvmorg-11.1.0-rc3
- llvmorg-11.1.0-rc2
- llvmorg-11.1.0-rc1
- llvmorg-11.0.1
- llvmorg-11.0.1-rc2
- llvmorg-11.0.1-rc1
- llvmorg-11.0.0
- llvmorg-11.0.0-rc6
- llvmorg-11.0.0-rc5
- llvmorg-11.0.0-rc4
- llvmorg-11.0.0-rc3
- llvmorg-11.0.0-rc2
- llvmorg-11.0.0-rc1
- llvmorg-11-init
- llvmorg-10.0.1
- llvmorg-10.0.1-rc4
- llvmorg-10.0.1-rc3
- llvmorg-10.0.1-rc2
- llvmorg-10.0.1-rc1
- llvmorg-10.0.0
- llvmorg-10.0.0-rc6
- llvmorg-10.0.0-rc5
- llvmorg-10.0.0-rc4
- llvmorg-10.0.0-rc3
- llvmorg-10.0.0-rc2
- llvmorg-10.0.0-rc1
- llvmorg-10-init
- llvmorg-9.0.1
- llvmorg-9.0.1-rc3
- llvmorg-9.0.1-rc2
- llvmorg-9.0.1-rc1
- llvmorg-9.0.0
- llvmorg-9.0.0-rc6
- llvmorg-9.0.0-rc5
- llvmorg-9.0.0-rc4
- llvmorg-9.0.0-rc3
- llvmorg-9.0.0-rc2
- llvmorg-9.0.0-rc1
- llvmorg-8.0.1
- llvmorg-8.0.1-rc4
- llvmorg-8.0.1-rc3
- llvmorg-8.0.1-rc2
- llvmorg-8.0.1-rc1
- llvmorg-8.0.0
- llvmorg-8.0.0-rc5
- llvmorg-8.0.0-rc4
- llvmorg-8.0.0-rc3
- llvmorg-8.0.0-rc2
- llvmorg-8.0.0-rc1
- llvmorg-7.1.0
- llvmorg-7.1.0-rc1
- llvmorg-7.0.1
- llvmorg-7.0.1-rc3
- llvmorg-7.0.1-rc2
- llvmorg-7.0.1-rc1
- llvmorg-7.0.0
- llvmorg-7.0.0-rc3
- llvmorg-7.0.0-rc2
- llvmorg-7.0.0-rc1
- llvmorg-6.0.1
- llvmorg-6.0.1-rc3
- llvmorg-6.0.1-rc2
- llvmorg-6.0.1-rc1
- llvmorg-6.0.0
- llvmorg-6.0.0-rc3
- llvmorg-6.0.0-rc2
- llvmorg-6.0.0-rc1
- llvmorg-5.0.2
- llvmorg-5.0.2-rc2
- llvmorg-5.0.2-rc1
- llvmorg-5.0.1
- llvmorg-5.0.1-rc3
- llvmorg-5.0.1-rc2
- llvmorg-5.0.1-rc1
- llvmorg-5.0.0
- llvmorg-5.0.0-rc5
- llvmorg-5.0.0-rc4
- llvmorg-5.0.0-rc3
- llvmorg-5.0.0-rc2
- llvmorg-5.0.0-rc1
- llvmorg-4.0.1
- llvmorg-4.0.1-rc3
- llvmorg-4.0.1-rc2
- llvmorg-4.0.1-rc1
- llvmorg-4.0.0
- llvmorg-4.0.0-rc4
- llvmorg-4.0.0-rc3
- llvmorg-4.0.0-rc2
- llvmorg-4.0.0-rc1
- llvmorg-3.9.1
- llvmorg-3.9.1-rc3
- llvmorg-3.9.1-rc2
- llvmorg-3.9.1-rc1
- llvmorg-3.9.0
- llvmorg-3.9.0-rc3
- llvmorg-3.9.0-rc2
- llvmorg-3.9.0-rc1
Showing
3 changed files
with
80 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
# REQUIRES: x86 | ||
|
||
# If there are two relocations such that the first one requires | ||
# dynamic COPY relocation, the second one requires GOT entry | ||
# creation, linker should create both - dynamic relocation | ||
# and GOT entry. | ||
|
||
# RUN: llvm-mc -filetype=obj -triple=i386-pc-linux \ | ||
# RUN: %S/Inputs/copy-in-shared.s -o %t.so.o | ||
# RUN: llvm-mc -filetype=obj -triple=i386-pc-linux %s -o %t.o | ||
# RUN: ld.lld %t.so.o -shared -o %t.so | ||
# RUN: ld.lld %t.o %t.so -o %t.exe | ||
# RUN: llvm-readobj -r %t.exe | FileCheck %s | ||
|
||
# CHECK: Relocations [ | ||
# CHECK-NEXT: Section (4) .rel.dyn { | ||
# CHECK-NEXT: 0x{{[0-9A-F]+}} R_386_COPY foo | ||
# CHECK-NEXT: 0x{{[0-9A-F]+}} R_386_GLOB_DAT foo | ||
# CHECK-NEXT: } | ||
# CHECK-NEXT: ] | ||
|
||
.text | ||
.global _start | ||
_start: | ||
movl $foo, (%esp) # R_386_32 - requires R_386_COPY relocation | ||
movl foo@GOT, %eax # R_386_GOT32 - requires GOT entry |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
# REQUIRES: mips | ||
|
||
# If there are two relocations such that the first one requires | ||
# dynamic COPY relocation, the second one requires GOT entry | ||
# creation, linker should create both - dynamic relocation | ||
# and GOT entry. | ||
|
||
# RUN: llvm-mc -filetype=obj -triple=mips-unknown-linux \ | ||
# RUN: %S/Inputs/mips-dynamic.s -o %t.so.o | ||
# RUN: llvm-mc -filetype=obj -triple=mips-unknown-linux %s -o %t.o | ||
# RUN: ld.lld %t.so.o -shared -o %t.so | ||
# RUN: ld.lld %t.o %t.so -o %t.exe | ||
# RUN: llvm-readobj -r -mips-plt-got %t.exe | FileCheck %s | ||
|
||
# CHECK: Relocations [ | ||
# CHECK-NEXT: Section (7) .rel.dyn { | ||
# CHECK-NEXT: 0x{{[0-9A-F]+}} R_MIPS_COPY data0 | ||
# CHECK-NEXT: 0x{{[0-9A-F]+}} R_MIPS_COPY data1 | ||
# CHECK-NEXT: } | ||
# CHECK-NEXT: ] | ||
# CHECK-NEXT: Primary GOT { | ||
# CHECK-NEXT: Canonical gp value: 0x37FF0 | ||
# CHECK-NEXT: Reserved entries [ | ||
# CHECK: ] | ||
# CHECK-NEXT: Local entries [ | ||
# CHECK-NEXT: ] | ||
# CHECK-NEXT: Global entries [ | ||
# CHECK-NEXT: Entry { | ||
# CHECK: Section: .bss | ||
# CHECK-NEXT: Name: data0 | ||
# CHECK-NEXT: } | ||
# CHECK-NEXT: Entry { | ||
# CHECK: Section: .bss | ||
# CHECK-NEXT: Name: data1 | ||
# CHECK-NEXT: } | ||
# CHECK-NEXT: ] | ||
# CHECK-NEXT: Number of TLS and multi-GOT entries: 0 | ||
# CHECK-NEXT: } | ||
|
||
.text | ||
.global __start | ||
__start: | ||
# Case A: 'got' relocation goes before 'copy' relocation | ||
lui $t0,%hi(data0) # R_MIPS_HI16 - requires R_MISP_COPY relocation | ||
addi $t0,$t0,%lo(data0) | ||
lw $t0,%got(data0)($gp) # R_MIPS_GOT16 - requires GOT entry | ||
|
||
# Case B: 'copy' relocation goes before 'got' relocation | ||
lw $t0,%got(data1)($gp) # R_MIPS_GOT16 - requires GOT entry | ||
lui $t0,%hi(data1) # R_MIPS_HI16 - requires R_MISP_COPY relocation | ||
addi $t0,$t0,%lo(data1) |