[ELF] Improve test for copy relocations on aliases

This commit is contained in:
Fangrui Song 2021-12-13 20:04:24 -08:00
parent 062d9b7d43
commit d1014d9e6d
4 changed files with 60 additions and 105 deletions

View File

@ -1,11 +0,0 @@
.globl foo
.type foo, @object
.size foo, 4
foo:
.long 1
.weak bar
.type bar, @object
.size bar, 4
bar:
.long 2

View File

@ -0,0 +1,60 @@
# REQUIRES: x86
# RUN: rm -rf %t && split-file %s %t
# RUN: llvm-mc -filetype=obj -triple=x86_64 %t/1.s -o %t/1.o
# RUN: llvm-mc -filetype=obj -triple=x86_64 %t/2.s -o %t/2.o
# RUN: ld.lld -shared -soname=t2 %t/2.o -o %t/2.so
# RUN: ld.lld %t/1.o %t/2.so -o %t/1
# RUN: llvm-readelf -S -r --dyn-syms %t/1 | FileCheck %s
# RUN: ld.lld --gc-sections -pie %t/1.o %t/2.so -o %t/1
# RUN: llvm-readelf -S -r --dyn-syms %t/1 | FileCheck %s
# CHECK: [[#BSS:]]] .bss
# CHECK: R_X86_64_COPY [[#%x,]] a1 + 0
# CHECK-NEXT: R_X86_64_GLOB_DAT [[#%x,]] b1 + 0
# CHECK-NEXT: R_X86_64_COPY [[#%x,]] b1 + 0
# CHECK-NEXT: R_X86_64_GLOB_DAT [[#%x,]] a2 + 0
# CHECK: Value Size Type Bind Vis Ndx Name
# CHECK: [[#%x,ADDR:]] 1 OBJECT GLOBAL DEFAULT [[#BSS]] a1
# CHECK-NEXT: {{0*}}[[#ADDR+1]] 1 OBJECT WEAK DEFAULT [[#BSS]] b1
# CHECK-NEXT: {{0*}}[[#ADDR+1]] 1 OBJECT GLOBAL DEFAULT [[#BSS]] b2
# CHECK-NEXT: {{0*}}[[#ADDR]] 1 OBJECT WEAK DEFAULT [[#BSS]] a2
# CHECK-NEXT: {{0*}}[[#ADDR+1]] 1 OBJECT GLOBAL DEFAULT [[#BSS]] b3
#--- 1.s
.global _start
_start:
movl $5, a1
mov $b1 - ., %eax
mov $b2 - ., %eax
## Test that a copy relocated alias may have GOT entry.
.weak a2, b1
movq a2@gotpcrel(%rip), %rax
movq b1@gotpcrel(%rip), %rcx
#--- 2.s
.data
.globl a1, b3
.weak a2, b1, b2
.type a1, @object
.type a2, @object
a1:
a2:
.byte 1
.size a1, 1
.size a2, 1
.type b1, @object
.type b2, @object
.type b3, @object
b1:
b2:
b3:
.byte 2
.size b1, 1
.size b2, 1
.size b3, 1

View File

@ -1,25 +0,0 @@
# REQUIRES: x86
## Test copy relocations can be created for -no-pie and -pie.
# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o
# RUN: llvm-mc -filetype=obj -triple=x86_64 %p/Inputs/copy-rel.s -o %t1.o
# RUN: ld.lld %t1.o -o %t1.so -shared -soname=so
# RUN: ld.lld %t.o %t1.so -o %t
# RUN: llvm-readobj -r %t | FileCheck %s
# RUN: ld.lld %t.o %t1.so -o %t -pie
# RUN: llvm-readobj -r %t | FileCheck %s
# CHECK: Relocations [
# CHECK-NEXT: .rela.dyn {
# CHECK-NEXT: R_X86_64_COPY foo 0x0
# CHECK-NEXT: R_X86_64_COPY bar 0x0
# CHECK-NEXT: }
# CHECK-NEXT: ]
.global _start
_start:
mov $foo - ., %eax
movabs $bar, %rax

View File

@ -1,69 +0,0 @@
// REQUIRES: x86
// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/relocation-copy-alias.s -o %t2.o
// RUN: ld.lld --hash-style=sysv -shared %t2.o -o %t.so
// RUN: ld.lld --hash-style=sysv %t.o %t.so -o %t3
// RUN: llvm-readobj --dyn-symbols -r --expand-relocs %t3 | FileCheck %s
// RUN: ld.lld --hash-style=sysv --gc-sections %t.o %t.so -o %t3
// RUN: llvm-readobj --dyn-symbols -r --expand-relocs %t3 | FileCheck %s
.global _start
_start:
movl $5, a1
movl $5, b1
movl $5, b2
// CHECK: .rela.dyn {
// CHECK-NEXT: Relocation {
// CHECK-NEXT: Offset:
// CHECK-NEXT: Type: R_X86_64_COPY
// CHECK-NEXT: Symbol: a1
// CHECK-NEXT: Addend: 0x0
// CHECK-NEXT: }
// CHECK-NEXT: Relocation {
// CHECK-NEXT: Offset:
// CHECK-NEXT: Type: R_X86_64_COPY
// CHECK-NEXT: Symbol: b1
// CHECK-NEXT: Addend: 0x0
// CHECK-NEXT: }
// CHECK-NEXT: }
// CHECK: Name: a1
// CHECK-NEXT: Value: [[A:.*]]
// CHECK-NEXT: Size: 1
// CHECK-NEXT: Binding: Global (0x1)
// CHECK-NEXT: Type: Object (0x1)
// CHECK-NEXT: Other: 0
// CHECK-NEXT: Section: .bss (0x7)
// CHECK: Name: b1
// CHECK-NEXT: Value: [[B:.*]]
// CHECK-NEXT: Size: 1
// CHECK-NEXT: Binding: Global
// CHECK-NEXT: Type: Object (0x1)
// CHECK-NEXT: Other: 0
// CHECK-NEXT: Section: .bss
// CHECK: Name: b2
// CHECK-NEXT: Value: [[B]]
// CHECK-NEXT: Size: 1
// CHECK-NEXT: Binding: Global
// CHECK-NEXT: Type: Object (0x1)
// CHECK-NEXT: Other: 0
// CHECK-NEXT: Section: .bss
// CHECK: Name: a2
// CHECK-NEXT: Value: [[A]]
// CHECK-NEXT: Size: 1
// CHECK-NEXT: Binding: Weak
// CHECK-NEXT: Type: Object (0x1)
// CHECK-NEXT: Other: 0
// CHECK-NEXT: Section: .bss
// CHECK: Name: b3
// CHECK-NEXT: Value: [[B]]
// CHECK-NEXT: Size: 1
// CHECK-NEXT: Binding: Global
// CHECK-NEXT: Type: Object (0x1)
// CHECK-NEXT: Other: 0
// CHECK-NEXT: Section: .bss