diff options
| author | Fangrui Song <maskray@google.com> | 2019-09-06 15:10:31 +0000 |
|---|---|---|
| committer | Fangrui Song <maskray@google.com> | 2019-09-06 15:10:31 +0000 |
| commit | 8f10a5f42d5b391efe57a982c98de5e1ae245e4d (patch) | |
| tree | 7f03bdd584c23d35f527fb2572da6cae99104c20 | |
| parent | ad1cea0ddafe7494e9726623bd08d1814c8cf19e (diff) | |
| download | bcm5719-llvm-8f10a5f42d5b391efe57a982c98de5e1ae245e4d.tar.gz bcm5719-llvm-8f10a5f42d5b391efe57a982c98de5e1ae245e4d.zip | |
[ELF][test] Simplify and reorganize tests
Add file-level comments
Delete insignificant addresses to make them more tolerant to layout changes
Simplify test output
Delete simple Inputs/*.s files
Delete version-script-copy-rel.s - covered by verdef-defaultver.s
Delete version-wildcard.test - covered by version-script-glob.s
llvm-svn: 371213
41 files changed, 367 insertions, 1129 deletions
diff --git a/lld/test/ELF/Inputs/abs-hidden.s b/lld/test/ELF/Inputs/abs-hidden.s deleted file mode 100644 index 44bff383a8e..00000000000 --- a/lld/test/ELF/Inputs/abs-hidden.s +++ /dev/null @@ -1,3 +0,0 @@ -.global foo -.hidden foo -foo = 0x42 diff --git a/lld/test/ELF/Inputs/ehframe-relocation.s b/lld/test/ELF/Inputs/ehframe-relocation.s deleted file mode 100644 index 7ba6c0510cc..00000000000 --- a/lld/test/ELF/Inputs/ehframe-relocation.s +++ /dev/null @@ -1,2 +0,0 @@ - .cfi_startproc - .cfi_endproc diff --git a/lld/test/ELF/abs-hidden.s b/lld/test/ELF/abs-hidden.s index e607b42584e..5bdd1e4fd83 100644 --- a/lld/test/ELF/abs-hidden.s +++ b/lld/test/ELF/abs-hidden.s @@ -1,46 +1,19 @@ -// 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/abs-hidden.s -o %t2.o -// RUN: ld.lld --hash-style=sysv %t.o %t2.o -o %t.so -shared -// RUN: llvm-readobj -r -S --section-data %t.so | FileCheck %s +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o +# RUN: echo '.globl foo; .hidden foo; foo = 42' | llvm-mc -filetype=obj -triple=x86_64 - -o %t2.o +# RUN: ld.lld %t.o %t2.o -o %t.so -shared +# RUN: llvm-readelf -r -S -x .got -x .data %t.so | FileCheck %s - .quad foo - .long foo@gotpcrel +## Test we don't create relocations for non-preemptable absolute symbols. -// CHECK: Name: .text -// CHECK-NEXT: Type: SHT_PROGBITS -// CHECK-NEXT: Flags [ -// CHECK-NEXT: SHF_ALLOC -// CHECK-NEXT: SHF_EXECINSTR -// CHECK-NEXT: ] -// CHECK-NEXT: Address: 0x1000 -// CHECK-NEXT: Offset: -// CHECK-NEXT: Size: 12 -// CHECK-NEXT: Link: 0 -// CHECK-NEXT: Info: 0 -// CHECK-NEXT: AddressAlignment: 4 -// CHECK-NEXT: EntrySize: 0 -// CHECK-NEXT: SectionData ( -// CHECK-NEXT: 0000: 42000000 00000000 58100000 -// 0x2060 - (0x1000 + 8) = 1058 -// CHECK-NEXT: ) +# CHECK: There are no relocations in this file. +# CHECK: section '.got': +# CHECK: 0x00001070 2a000000 00000000 -// CHECK: Name: .got -// CHECK-NEXT: Type: SHT_PROGBITS -// CHECK-NEXT: Flags [ -// CHECK-NEXT: SHF_ALLOC -// CHECK-NEXT: SHF_WRITE -// CHECK-NEXT: ] -// CHECK-NEXT: Address: 0x2060 -// CHECK-NEXT: Offset: -// CHECK-NEXT: Size: 8 -// CHECK-NEXT: Link: 0 -// CHECK-NEXT: Info: 0 -// CHECK-NEXT: AddressAlignment: 8 -// CHECK-NEXT: EntrySize: 0 -// CHECK-NEXT: SectionData ( -// CHECK-NEXT: 0000: 42000000 00000000 -// CHECK-NEXT: ) +## .got - (.data+8) = 0xfffff068 +# CHECK: section '.data': +# CHECK: 0x00002000 2a000000 00000000 68f0ffff -// CHECK: Relocations [ -// CHECK-NEXT: ] +.data +.quad foo +.long foo@gotpcrel diff --git a/lld/test/ELF/allow-multiple-definition.s b/lld/test/ELF/allow-multiple-definition.s index 06684f47e61..46a7290f88f 100644 --- a/lld/test/ELF/allow-multiple-definition.s +++ b/lld/test/ELF/allow-multiple-definition.s @@ -21,10 +21,10 @@ # meet symbol should be used. # CHECK: _bar: -# CHECK-NEXT: 201000: b8 01 00 00 00 movl $1, %eax +# CHECK-NEXT: movl $1, %eax # REVERT: _bar: -# REVERT-NEXT: 201000: b8 02 00 00 00 movl $2, %eax +# REVERT-NEXT: movl $2, %eax .globl _bar .type _bar, @function diff --git a/lld/test/ELF/apply-dynamic-relocs.s b/lld/test/ELF/apply-dynamic-relocs.s new file mode 100644 index 00000000000..70f83324d1b --- /dev/null +++ b/lld/test/ELF/apply-dynamic-relocs.s @@ -0,0 +1,32 @@ +# REQUIRES: x86 + +## On RELA targets, --apply-dynamic-relocs writes addends to the relocated positions. + +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o +# RUN: ld.lld %t.o -o %t.so -shared --apply-dynamic-relocs +# RUN: llvm-readobj -r -S -l --section-data %t.so | FileCheck -check-prefixes=CHECK,APPLY %s + +# RUN: ld.lld %t.o -o %t2.so -shared +# RUN: llvm-readobj -r -S -l --section-data %t2.so | FileCheck -check-prefixes=CHECK,NOAPPLY %s +# RUN: ld.lld %t.o -o %t3.so -shared --no-apply-dynamic-relocs +# RUN: cmp %t2.so %t3.so + +# CHECK: Name: .got +# CHECK: Address: 0x[[GOT:.*]] +# CHECK: SectionData ( +# APPLY-NEXT: 0000: 00200000 00000000 | +# NOAPPLY-NEXT: 0000: 00000000 00000000 | +# CHECK-NEXT: ) + +# CHECK: Relocations [ +# CHECK-NEXT: Section ({{.*}}) .rela.dyn { +# CHECK-NEXT: 0x[[GOT]] R_X86_64_RELATIVE - 0x[[ADDEND:.*]] +# CHECK-NEXT: } +# CHECK-NEXT: ] + +# CHECK: Type: PT_DYNAMIC +# CHECK-NEXT: Offset: 0x[[ADDEND]] +# CHECK-NEXT: VirtualAddress: 0x[[ADDEND]] +# CHECK-NEXT: PhysicalAddress: 0x[[ADDEND]] + +cmpq $0, _DYNAMIC@GOTPCREL(%rip) diff --git a/lld/test/ELF/bss-start-common.s b/lld/test/ELF/bss-start-common.s index 3a32f858999..7537cf28e3d 100644 --- a/lld/test/ELF/bss-start-common.s +++ b/lld/test/ELF/bss-start-common.s @@ -3,11 +3,13 @@ # RUN: ld.lld %t -o %t2 # RUN: llvm-objdump -t -section-headers %t2 | FileCheck %s +## Test __bss_start is defined at the start of .bss + # CHECK: Sections: -# CHECK: Idx Name Size VMA Type -# CHECK: 2 .bss 00000004 0000000000201000 BSS +# CHECK: Idx Name Size VMA Type +# CHECK: 2 .bss 00000004 [[ADDR:[0-za-f]+]] BSS # CHECK: SYMBOL TABLE: -# CHECK: 0000000000201000 .bss 00000000 __bss_start +# CHECK: [[ADDR]] .bss 00000000 __bss_start .global __bss_start .text diff --git a/lld/test/ELF/copy-rel-abs.s b/lld/test/ELF/copy-rel-abs.s index 37a2c432381..725f4cd5913 100644 --- a/lld/test/ELF/copy-rel-abs.s +++ b/lld/test/ELF/copy-rel-abs.s @@ -1,46 +1,22 @@ -// REQUIRES: x86 -// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/copy-rel-abs.s -o %t1.o -// RUN: ld.lld --hash-style=gnu -shared %t1.o -o %t1.so -// RUN: llvm-readelf --dyn-symbols %t1.so | FileCheck --check-prefix=SYMS %s +# REQUIRES: x86 -// The symbols have the same st_value, but one is ABS. -// SYMS: 0000000000001000 {{.*}} 4 bar -// SYMS: 0000000000001000 {{.*}} 4 foo -// SYMS: 0000000000001000 {{.*}} ABS zed +## Test SHN_ABS symbols are not copy relocated. -// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t2.o -// RUN: ld.lld %t2.o %t1.so -o %t2 -// RUN: llvm-readobj --dyn-symbols %t2 | FileCheck %s +# RUN: llvm-mc -filetype=obj -triple=x86_64 %p/Inputs/copy-rel-abs.s -o %t1.o +# RUN: ld.lld -shared %t1.o -o %t1.so +# RUN: llvm-readelf --dyn-syms %t1.so | FileCheck --check-prefix=SYMS %s -// CHECK: DynamicSymbols [ -// CHECK-NEXT: Symbol { -// CHECK-NEXT: Name: -// CHECK-NEXT: Value: -// CHECK-NEXT: Size: -// CHECK-NEXT: Binding: -// CHECK-NEXT: Type: -// CHECK-NEXT: Other: -// CHECK-NEXT: Section: -// CHECK-NEXT: } -// CHECK-NEXT: Symbol { -// CHECK-NEXT: Name: foo -// CHECK-NEXT: Value: -// CHECK-NEXT: Size: -// CHECK-NEXT: Binding: -// CHECK-NEXT: Type: -// CHECK-NEXT: Other: -// CHECK-NEXT: Section: .bss.rel.ro -// CHECK-NEXT: } -// CHECK-NEXT: Symbol { -// CHECK-NEXT: Name: bar -// CHECK-NEXT: Value: -// CHECK-NEXT: Size: -// CHECK-NEXT: Binding: -// CHECK-NEXT: Type: -// CHECK-NEXT: Other: -// CHECK-NEXT: Section: .bss.rel.ro -// CHECK-NEXT: } -// CHECK-NEXT: ] +# SYMS: [[ADDR:[0-9a-f]+]] {{.*}} 5 bar +# SYMS: [[ADDR]] {{.*}} 5 foo +# SYMS: [[ADDR]] {{.*}} ABS zed + +# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t2.o +# RUN: ld.lld %t2.o %t1.so -o %t2 +# RUN: llvm-objdump -t %t2 | FileCheck %s --implicit-check-not=zed + +# CHECK: SYMBOL TABLE: +# CHECK: .bss.rel.ro {{.*}} foo +# CHECK: .bss.rel.ro {{.*}} bar .global _start _start: diff --git a/lld/test/ELF/copy-rel-large.s b/lld/test/ELF/copy-rel-large.s index 035eca3bf10..f763a0e937f 100644 --- a/lld/test/ELF/copy-rel-large.s +++ b/lld/test/ELF/copy-rel-large.s @@ -1,20 +1,17 @@ -// REQUIRES: x86 -// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/copy-rel-large.s -o %t1.o -// RUN: ld.lld -shared %t1.o -o %t1.so -// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t2.o -// RUN: ld.lld %t2.o %t1.so -o %t2 -// RUN: llvm-readobj --dyn-symbols %t2 | FileCheck %s +# REQUIRES: x86 + +## Test symbols larger than 2**32 can be copy relocated. + +# RUN: echo '.globl foo; .type foo,@object; foo: .size foo, 0x100000001' | \ +# RUN: llvm-mc -filetype=obj -triple=x86_64 - -o %t1.o +# RUN: ld.lld -shared %t1.o -o %t1.so +# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o +# RUN: ld.lld %t.o %t1.so -o %t +# RUN: llvm-readelf -S --dyn-syms %t | FileCheck %s + +# CHECK: [ 8] .bss.rel.ro +# CHECK: 4294967297 OBJECT GLOBAL DEFAULT 8 foo .global _start _start: .quad foo - -// CHECK: Symbol { -// CHECK: Name: foo -// CHECK-NEXT: Value: -// CHECK-NEXT: Size: 4294967297 -// CHECK-NEXT: Binding: -// CHECK-NEXT: Type: -// CHECK-NEXT: Other: -// CHECK-NEXT: Section: .bss.rel.ro -// CHECK-NEXT: } diff --git a/lld/test/ELF/copy-rel-pie.s b/lld/test/ELF/copy-rel-pie.s index 4a485e5b3c4..5a7a71f5317 100644 --- a/lld/test/ELF/copy-rel-pie.s +++ b/lld/test/ELF/copy-rel-pie.s @@ -1,10 +1,13 @@ -// REQUIRES: x86 -// RUN: llvm-mc %s -o %t.o -filetype=obj -triple=x86_64-pc-linux -// RUN: llvm-mc %p/Inputs/copy-rel-pie.s -o %t2.o -filetype=obj -triple=x86_64-pc-linux -// RUN: ld.lld %t2.o -o %t2.so -shared -// RUN: ld.lld --hash-style=sysv %t.o %t2.so -o %t.exe -pie -// RUN: llvm-readobj -S -r %t.exe | FileCheck %s -// RUN: llvm-objdump -d %t.exe | FileCheck --check-prefix=DISASM %s +# REQUIRES: x86 + +## Test copy relocations can be created for -pie. + +# RUN: llvm-mc %s -o %t.o -filetype=obj -triple=x86_64-pc-linux +# RUN: llvm-mc %p/Inputs/copy-rel-pie.s -o %t2.o -filetype=obj -triple=x86_64-pc-linux +# RUN: ld.lld %t2.o -o %t2.so -shared +# RUN: ld.lld %t.o %t2.so -o %t -pie +# RUN: llvm-readobj -r %t | FileCheck %s +# RUN: llvm-objdump -d %t | FileCheck --check-prefix=DISASM %s .global _start _start: @@ -13,36 +16,15 @@ _start: .byte 0xe8 .long foo - . -4 -// CHECK: Name: .plt -// CHECK-NEXT: Type: SHT_PROGBITS -// CHECK-NEXT: Flags [ -// CHECK-NEXT: SHF_ALLOC -// CHECK-NEXT: SHF_EXECINSTR -// CHECK-NEXT: ] -// CHECK-NEXT: Address: 0x1010 - -// CHECK: Name: .bss -// CHECK-NEXT: Type: SHT_NOBITS -// CHECK-NEXT: Flags [ -// CHECK-NEXT: SHF_ALLOC -// CHECK-NEXT: SHF_WRITE -// CHECK-NEXT: ] -// CHECK-NEXT: Address: 0x3020 - // CHECK: Relocations [ -// CHECK-NEXT: Section (4) .rela.dyn { -// CHECK-NEXT: 0x3020 R_X86_64_COPY foo 0x0 +// CHECK-NEXT: .rela.dyn { +// CHECK-NEXT: R_X86_64_COPY foo 0x0 // CHECK-NEXT: } -// CHECK-NEXT: Section (5) .rela.plt { -// CHECK-NEXT: 0x3018 R_X86_64_JUMP_SLOT bar 0x0 +// CHECK-NEXT: .rela.plt { +// CHECK-NEXT: R_X86_64_JUMP_SLOT bar 0x0 // CHECK-NEXT: } // CHECK-NEXT: ] -// (0x1010 + 0x10) - 0x1005 = 27 -// 0x3020 - 0x100a = 8214 - -// DISASM: Disassembly of section .text: -// DISASM-EMPTY: -// DISASM-NEXT: _start: -// DISASM-NEXT: 1000: e8 1b 00 00 00 callq 27 -// DISASM-NEXT: 1005: e8 16 20 00 00 callq 8214 <foo> +// DISASM: _start: +// DISASM-NEXT: callq {{.*}} <bar@plt> +// DISASM-NEXT: callq {{.*}} <foo> diff --git a/lld/test/ELF/ctors_dtors_priority.s b/lld/test/ELF/ctors_dtors_priority.s index 203bf247aa3..15fde3f63b3 100644 --- a/lld/test/ELF/ctors_dtors_priority.s +++ b/lld/test/ELF/ctors_dtors_priority.s @@ -1,4 +1,7 @@ // REQUIRES: x86 + +// Test .ctors* and .dtors* are sorted by priority. + // RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t1 // RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux \ // RUN: %p/Inputs/ctors_dtors_priority1.s -o %t-crtbegin.o @@ -36,13 +39,13 @@ _start: .quad 0x15 // CHECK: Contents of section .ctors: -// CHECK-NEXT: 202000 a1000000 00000000 01000000 00000000 -// CHECK-NEXT: 202010 04000000 00000000 05000000 00000000 -// CHECK-NEXT: 202020 b1000000 00000000 03000000 00000000 -// CHECK-NEXT: 202030 02000000 00000000 c1000000 00000000 +// CHECK-NEXT: a1000000 00000000 01000000 00000000 +// CHECK-NEXT: 04000000 00000000 05000000 00000000 +// CHECK-NEXT: b1000000 00000000 03000000 00000000 +// CHECK-NEXT: 02000000 00000000 c1000000 00000000 // CHECK: Contents of section .dtors: -// CHECK-NEXT: 202040 a2000000 00000000 11000000 00000000 -// CHECK-NEXT: 202050 14000000 00000000 15000000 00000000 -// CHECK-NEXT: 202060 b2000000 00000000 13000000 00000000 -// CHECK-NEXT: 202070 12000000 00000000 c2000000 00000000 +// CHECK-NEXT: a2000000 00000000 11000000 00000000 +// CHECK-NEXT: 14000000 00000000 15000000 00000000 +// CHECK-NEXT: b2000000 00000000 13000000 00000000 +// CHECK-NEXT: 12000000 00000000 c2000000 00000000 diff --git a/lld/test/ELF/discard-merge-locals.s b/lld/test/ELF/discard-merge-locals.s index 80e7670d28b..d720ee88477 100644 --- a/lld/test/ELF/discard-merge-locals.s +++ b/lld/test/ELF/discard-merge-locals.s @@ -1,35 +1,14 @@ -// REQUIRES: x86 -// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t -// RUN: ld.lld %t -o %t2 -shared -// RUN: llvm-readobj --symbols %t2 | FileCheck %s +# REQUIRES: x86 - leaq .L.str(%rip), %rdi +## Test that the .L symbol in a SHF_MERGE section is omitted. - .section .rodata.str1.1,"aMS",@progbits,1 -.L.str: - .asciz "foobar" +# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o +# RUN: ld.lld %t.o -o %t +# RUN: llvm-readelf -s %t | FileCheck /dev/null --implicit-check-not=.L.str -// Test that the .L symbol is omitted +lea .L.str(%rip), %rdi +lea local(%rip), %rdi -// CHECK: Symbols [ -// CHECK-NEXT: Symbol { -// CHECK-NEXT: Name: (0) -// CHECK-NEXT: Value: 0x0 -// CHECK-NEXT: Size: 0 -// CHECK-NEXT: Binding: Local -// CHECK-NEXT: Type: None -// CHECK-NEXT: Other: 0 -// CHECK-NEXT: Section: Undefined -// CHECK-NEXT: } -// CHECK-NEXT: Symbol { -// CHECK-NEXT: Name: _DYNAMIC -// CHECK-NEXT: Value: 0x2000 -// CHECK-NEXT: Size: 0 -// CHECK-NEXT: Binding: Local -// CHECK-NEXT: Type: None -// CHECK-NEXT: Other [ (0x2) -// CHECK-NEXT: STV_HIDDEN -// CHECK-NEXT: ] -// CHECK-NEXT: Section: .dynamic -// CHECK-NEXT: } -// CHECK-NEXT: ] +.section .rodata.str1.1,"aMS",@progbits,1 +.L.str: +local: diff --git a/lld/test/ELF/dynamic-got-rela.s b/lld/test/ELF/dynamic-got-rela.s deleted file mode 100644 index 6899363d9ea..00000000000 --- a/lld/test/ELF/dynamic-got-rela.s +++ /dev/null @@ -1,55 +0,0 @@ -// REQUIRES: x86 -// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o -// RUN: ld.lld %t.o -o %t.so -shared --apply-dynamic-relocs -// RUN: llvm-readobj -r -S -l --section-data %t.so | FileCheck -check-prefix CHECK -check-prefix APPLYDYNREL %s -// RUN: ld.lld %t.o -o %t2.so -shared -// RUN: llvm-readobj -r -S -l --section-data %t2.so | FileCheck -check-prefix CHECK -check-prefix NOAPPLYDYNREL %s -// RUN: ld.lld %t.o -o %t2.so -shared --no-apply-dynamic-relocs -// RUN: llvm-readobj -r -S -l --section-data %t2.so | FileCheck -check-prefix CHECK -check-prefix NOAPPLYDYNREL %s - -// APPLYDYNREL: Name: .got -// APPLYDYNREL-NEXT: Type: SHT_PROGBITS -// APPLYDYNREL-NEXT: Flags [ -// APPLYDYNREL-NEXT: SHF_ALLOC -// APPLYDYNREL-NEXT: SHF_WRITE -// APPLYDYNREL-NEXT: ] -// APPLYDYNREL-NEXT: Address: 0x[[GOT:.*]] -// APPLYDYNREL-NEXT: Offset: -// APPLYDYNREL-NEXT: Size: -// APPLYDYNREL-NEXT: Link: -// APPLYDYNREL-NEXT: Info: -// APPLYDYNREL-NEXT: AddressAlignment: -// APPLYDYNREL-NEXT: EntrySize: -// APPLYDYNREL-NEXT: SectionData ( -// APPLYDYNREL-NEXT: 0000: 00200000 00000000 | -// APPLYDYNREL-NEXT: ) - -// NOAPPLYDYNREL: Name: .got -// NOAPPLYDYNREL-NEXT: Type: SHT_PROGBITS -// NOAPPLYDYNREL-NEXT: Flags [ -// NOAPPLYDYNREL-NEXT: SHF_ALLOC -// NOAPPLYDYNREL-NEXT: SHF_WRITE -// NOAPPLYDYNREL-NEXT: ] -// NOAPPLYDYNREL-NEXT: Address: 0x[[GOT:.*]] -// NOAPPLYDYNREL-NEXT: Offset: -// NOAPPLYDYNREL-NEXT: Size: -// NOAPPLYDYNREL-NEXT: Link: -// NOAPPLYDYNREL-NEXT: Info: -// NOAPPLYDYNREL-NEXT: AddressAlignment: -// NOAPPLYDYNREL-NEXT: EntrySize: -// NOAPPLYDYNREL-NEXT: SectionData ( -// NOAPPLYDYNREL-NEXT: 0000: 00000000 00000000 | -// NOAPPLYDYNREL-NEXT: ) - -// CHECK: Relocations [ -// CHECK-NEXT: Section ({{.*}}) .rela.dyn { -// CHECK-NEXT: 0x[[GOT]] R_X86_64_RELATIVE - 0x[[ADDEND:.*]] -// CHECK-NEXT: } -// CHECK-NEXT: ] - -// CHECK: Type: PT_DYNAMIC -// CHECK-NEXT: Offset: 0x[[ADDEND]] -// CHECK-NEXT: VirtualAddress: 0x[[ADDEND]] -// CHECK-NEXT: PhysicalAddress: 0x[[ADDEND]] - -cmpq $0, _DYNAMIC@GOTPCREL(%rip) diff --git a/lld/test/ELF/dynamic-list-wildcard.s b/lld/test/ELF/dynamic-list-wildcard.s index 7c140f2d0dc..7e933cd1e27 100644 --- a/lld/test/ELF/dynamic-list-wildcard.s +++ b/lld/test/ELF/dynamic-list-wildcard.s @@ -3,51 +3,15 @@ # RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t # RUN: echo "{ foo1*; };" > %t.list -# RUN: ld.lld --hash-style=sysv -pie --dynamic-list %t.list %t -o %t.exe -# RUN: llvm-readobj --dyn-syms %t.exe | FileCheck %s +# RUN: ld.lld -pie --dynamic-list %t.list %t -o %t +# RUN: llvm-nm -D %t | FileCheck %s -# CHECK: DynamicSymbols [ -# CHECK-NEXT: Symbol { -# CHECK-NEXT: Name: -# CHECK-NEXT: Value: 0x0 -# CHECK-NEXT: Size: 0 -# CHECK-NEXT: Binding: Local (0x0) -# CHECK-NEXT: Type: None (0x0) -# CHECK-NEXT: Other: 0 -# CHECK-NEXT: Section: Undefined (0x0) -# CHECK-NEXT: } -# CHECK-NEXT: Symbol { -# CHECK-NEXT: Name: foo1 -# CHECK-NEXT: Value: 0x1000 -# CHECK-NEXT: Size: 0 -# CHECK-NEXT: Binding: Global (0x1) -# CHECK-NEXT: Type: None (0x0) -# CHECK-NEXT: Other: 0 -# CHECK-NEXT: Section: .text (0x4) -# CHECK-NEXT: } -# CHECK-NEXT: Symbol { -# CHECK-NEXT: Name: foo11 -# CHECK-NEXT: Value: 0x1001 -# CHECK-NEXT: Size: 0 -# CHECK-NEXT: Binding: Global (0x1) -# CHECK-NEXT: Type: None (0x0) -# CHECK-NEXT: Other: 0 -# CHECK-NEXT: Section: .text (0x4) -# CHECK-NEXT: } -# CHECK-NEXT: ] +# CHECK: foo1 +# CHECK-NEXT: foo11 +# CHECK-NOT: {{.}} -.globl foo1 +.globl _start, foo1, foo11, foo2 foo1: - ret - -.globl foo11 foo11: - ret - -.globl foo2 foo2: - ret - -.globl _start _start: - retq diff --git a/lld/test/ELF/dynamic-list.s b/lld/test/ELF/dynamic-list.s index 74361bf5cd5..dfc468596fb 100644 --- a/lld/test/ELF/dynamic-list.s +++ b/lld/test/ELF/dynamic-list.s @@ -1,167 +1,57 @@ # REQUIRES: x86 -# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/shared.s -o %t2.o +# RUN: llvm-mc -filetype=obj -triple=x86_64 %p/Inputs/shared.s -o %t2.o # RUN: ld.lld --hash-style=sysv -shared %t2.o -soname shared -o %t2.so -# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t +# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o ## Check exporting only one symbol. -# RUN: echo "{ foo1; };" > %t.list -# RUN: ld.lld --hash-style=sysv --dynamic-list %t.list %t %t2.so -o %t.exe -# RUN: llvm-readobj --dyn-syms %t.exe | FileCheck %s +# RUN: echo '{ foo1; };' > %t.list +# RUN: ld.lld --dynamic-list %t.list %t.o %t2.so -o %t +# RUN: nm -D %t | FileCheck %s --implicit-check-not=foo -## And now using quoted strings (the output is the same since it does +## And now using quoted strings (the output is the same since it does not ## use any wildcard character). -# RUN: echo "{ \"foo1\"; };" > %t.list -# RUN: ld.lld --hash-style=sysv --dynamic-list %t.list %t %t2.so -o %t.exe -# RUN: llvm-readobj --dyn-syms %t.exe | FileCheck %s +# RUN: echo '{ "foo1"; };' > %t.list +# RUN: ld.lld --dynamic-list %t.list %t.o %t2.so -o %t2 +# RUN: cmp %t %t2 ## And now using --export-dynamic-symbol. -# RUN: ld.lld --hash-style=sysv --export-dynamic-symbol foo1 %t %t2.so -o %t.exe -# RUN: llvm-readobj --dyn-syms %t.exe | FileCheck %s -# RUN: ld.lld --hash-style=sysv --export-dynamic-symbol=foo1 %t %t2.so -o %t.exe -# RUN: llvm-readobj --dyn-syms %t.exe | FileCheck %s - -# CHECK: DynamicSymbols [ -# CHECK-NEXT: Symbol { -# CHECK-NEXT: Name: -# CHECK-NEXT: Value: 0x0 -# CHECK-NEXT: Size: 0 -# CHECK-NEXT: Binding: Local -# CHECK-NEXT: Type: None -# CHECK-NEXT: Other: 0 -# CHECK-NEXT: Section: Undefined -# CHECK-NEXT: } -# CHECK-NEXT: Symbol { -# CHECK-NEXT: Name: foo1 -# CHECK-NEXT: Value: 0x201000 -# CHECK-NEXT: Size: 0 -# CHECK-NEXT: Binding: Global (0x1) -# CHECK-NEXT: Type: None (0x0) -# CHECK-NEXT: Other: 0 -# CHECK-NEXT: Section: .text (0x4) -# CHECK-NEXT: } -# CHECK-NEXT: ] +# RUN: ld.lld --export-dynamic-symbol foo1 %t.o %t2.so -o %t2 +# RUN: cmp %t %t2 +# RUN: ld.lld --export-dynamic-symbol=foo1 %t.o %t2.so -o %t2 +# RUN: cmp %t %t2 +# CHECK: foo1 ## Now export all the foo1, foo2, and foo31 symbols # RUN: echo "{ foo1; foo2; foo31; };" > %t.list -# RUN: ld.lld --hash-style=sysv --dynamic-list %t.list %t %t2.so -o %t.exe -# RUN: llvm-readobj --dyn-syms %t.exe | FileCheck -check-prefix=CHECK2 %s +# RUN: ld.lld --dynamic-list %t.list %t.o %t2.so -o %t +# RUN: nm -D %t | FileCheck --check-prefix=CHECK2 %s --implicit-check-not=foo # RUN: echo "{ foo1; foo2; };" > %t1.list # RUN: echo "{ foo31; };" > %t2.list -# RUN: ld.lld --hash-style=sysv --dynamic-list %t1.list --dynamic-list %t2.list %t %t2.so -o %t.exe -# RUN: llvm-readobj --dyn-syms %t.exe | FileCheck -check-prefix=CHECK2 %s - -# CHECK2: DynamicSymbols [ -# CHECK2-NEXT: Symbol { -# CHECK2-NEXT: Name: -# CHECK2-NEXT: Value: 0x0 -# CHECK2-NEXT: Size: 0 -# CHECK2-NEXT: Binding: Local -# CHECK2-NEXT: Type: None -# CHECK2-NEXT: Other: 0 -# CHECK2-NEXT: Section: Undefined -# CHECK2-NEXT: } -# CHECK2-NEXT: Symbol { -# CHECK2-NEXT: Name: foo1 -# CHECK2-NEXT: Value: 0x201000 -# CHECK2-NEXT: Size: 0 -# CHECK2-NEXT: Binding: Global (0x1) -# CHECK2-NEXT: Type: None (0x0) -# CHECK2-NEXT: Other: 0 -# CHECK2-NEXT: Section: .text (0x4) -# CHECK2-NEXT: } -# CHECK2-NEXT: Symbol { -# CHECK2-NEXT: Name: foo2 -# CHECK2-NEXT: Value: 0x201001 -# CHECK2-NEXT: Size: 0 -# CHECK2-NEXT: Binding: Global (0x1) -# CHECK2-NEXT: Type: None (0x0) -# CHECK2-NEXT: Other: 0 -# CHECK2-NEXT: Section: .text (0x4) -# CHECK2-NEXT: } -# CHECK2-NEXT: Symbol { -# CHECK2-NEXT: Name: foo31 -# CHECK2-NEXT: Value: 0x201002 -# CHECK2-NEXT: Size: 0 -# CHECK2-NEXT: Binding: Global (0x1) -# CHECK2-NEXT: Type: None (0x0) -# CHECK2-NEXT: Other: 0 -# CHECK2-NEXT: Section: .text (0x4) -# CHECK2-NEXT: } -# CHECK2-NEXT: ] +# RUN: ld.lld --dynamic-list %t1.list --dynamic-list %t2.list %t.o %t2.so -o %t2 +# RUN: cmp %t %t2 +# CHECK2: foo1 +# CHECK2-NEXT: foo2 +# CHECK2-NEXT: foo31 -## --export-dynamic overrides --dynamic-list, i.e. --export-dynamic with an -## incomplete dynamic-list still exports everything. +## --export-dynamic is similar to --dynamic-list with '{ * }' # RUN: echo "{ foo2; };" > %t.list -# RUN: ld.lld --hash-style=sysv --dynamic-list %t.list --export-dynamic %t %t2.so -o %t.exe -# RUN: llvm-readobj --dyn-syms %t.exe | FileCheck -check-prefix=CHECK3 %s +# RUN: ld.lld --dynamic-list %t.list --export-dynamic %t.o %t2.so -o %t +# RUN: nm -D %t | FileCheck --check-prefix=CHECK3 %s --implicit-check-not=foo ## The same with --export-dynamic-symbol. -# RUN: ld.lld --hash-style=sysv --export-dynamic-symbol=foo2 --export-dynamic %t %t2.so -o %t.exe -# RUN: llvm-readobj --dyn-syms %t.exe | FileCheck -check-prefix=CHECK3 %s +# RUN: ld.lld --export-dynamic-symbol=foo2 --export-dynamic %t.o %t2.so -o %t2 +# RUN: cmp %t %t2 -# CHECK3: DynamicSymbols [ -# CHECK3-NEXT: Symbol { -# CHECK3-NEXT: Name: -# CHECK3-NEXT: Value: 0x0 -# CHECK3-NEXT: Size: 0 -# CHECK3-NEXT: Binding: Local -# CHECK3-NEXT: Type: None -# CHECK3-NEXT: Other: 0 -# CHECK3-NEXT: Section: Undefined -# CHECK3-NEXT: } -# CHECK3-NEXT: Symbol { -# CHECK3-NEXT: Name: _start -# CHECK3-NEXT: Value: 0x201003 -# CHECK3-NEXT: Size: 0 -# CHECK3-NEXT: Binding: Global (0x1) -# CHECK3-NEXT: Type: None (0x0) -# CHECK3-NEXT: Other: 0 -# CHECK3-NEXT: Section: .text (0x4) -# CHECK3-NEXT: } -# CHECK3-NEXT: Symbol { -# CHECK3-NEXT: Name: foo1 -# CHECK3-NEXT: Value: 0x201000 -# CHECK3-NEXT: Size: 0 -# CHECK3-NEXT: Binding: Global (0x1) -# CHECK3-NEXT: Type: None (0x0) -# CHECK3-NEXT: Other: 0 -# CHECK3-NEXT: Section: .text (0x4) -# CHECK3-NEXT: } -# CHECK3-NEXT: Symbol { -# CHECK3-NEXT: Name: foo2 -# CHECK3-NEXT: Value: 0x201001 -# CHECK3-NEXT: Size: 0 -# CHECK3-NEXT: Binding: Global (0x1) -# CHECK3-NEXT: Type: None (0x0) -# CHECK3-NEXT: Other: 0 -# CHECK3-NEXT: Section: .text (0x4) -# CHECK3-NEXT: } -# CHECK3-NEXT: Symbol { -# CHECK3-NEXT: Name: foo31 -# CHECK3-NEXT: Value: 0x201002 -# CHECK3-NEXT: Size: 0 -# CHECK3-NEXT: Binding: Global (0x1) -# CHECK3-NEXT: Type: None (0x0) -# CHECK3-NEXT: Other: 0 -# CHECK3-NEXT: Section: .text (0x4) -# CHECK3-NEXT: } -# CHECK3-NEXT: ] +# CHECK3: _start +# CHECK3-NEXT: foo1 +# CHECK3-NEXT: foo2 +# CHECK3-NEXT: foo31 -.globl foo1 +.globl _start, foo1, foo2, foo31 foo1: - ret - -.globl foo2 foo2: - ret - -.globl foo31 foo31: - ret - -.globl _start _start: - retq diff --git a/lld/test/ELF/dynamic-reloc-index.s b/lld/test/ELF/dynamic-reloc-index.s index 2aa0133400f..d6f1e153fa1 100644 --- a/lld/test/ELF/dynamic-reloc-index.s +++ b/lld/test/ELF/dynamic-reloc-index.s @@ -9,7 +9,7 @@ // CHECK: Relocations [ // CHECK-NEXT: Section ({{.*}}) .rela.plt { -// CHECK-NEXT: 0x203018 R_X86_64_JUMP_SLOT bar 0x0 +// CHECK-NEXT: {{.*}} R_X86_64_JUMP_SLOT bar 0x0 // CHECK-NEXT: } // CHECK-NEXT: ] diff --git a/lld/test/ELF/dynamic-reloc.s b/lld/test/ELF/dynamic-reloc.s index 9d639fdd870..52e55ea9326 100644 --- a/lld/test/ELF/dynamic-reloc.s +++ b/lld/test/ELF/dynamic-reloc.s @@ -2,8 +2,8 @@ // RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o // RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/shared.s -o %t2.o // RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/dynamic-reloc.s -o %t3.o -// RUN: ld.lld -shared %t2.o -o %t2.so -// RUN: ld.lld --hash-style=sysv %t.o %t3.o %t2.so -o %t +// RUN: ld.lld -shared %t2.o -soname=so -o %t2.so +// RUN: ld.lld %t.o %t3.o %t2.so -o %t // RUN: llvm-readobj --dynamic-table -r --expand-relocs -S %t | FileCheck %s // CHECK: Index: 1 @@ -18,7 +18,7 @@ // CHECK-NEXT: Offset: // CHECK-NEXT: Size: [[RELASIZE:.*]] // CHECK-NEXT: Link: 1 -// CHECK-NEXT: Info: 8 +// CHECK-NEXT: Info: 9 // CHECK-NEXT: AddressAlignment: 8 // CHECK-NEXT: EntrySize: 24 @@ -28,12 +28,11 @@ // CHECK-NEXT: SHF_ALLOC // CHECK-NEXT: SHF_EXECINSTR // CHECK-NEXT: ] -// CHECK-NEXT: Address: 0x201000 // CHECK: Relocations [ // CHECK-NEXT: Section ({{.*}}) .rela.plt { // CHECK-NEXT: Relocation { -// CHECK-NEXT: Offset: 0x203018 +// CHECK-NEXT: Offset: // CHECK-NEXT: Type: R_X86_64_JUMP_SLOT // CHECK-NEXT: Symbol: bar // CHECK-NEXT: Addend: 0x0 @@ -43,7 +42,7 @@ // CHECK: DynamicSection [ // CHECK-NEXT: Tag Type Name/Value -// CHECK-NEXT: 0x0000000000000001 NEEDED Shared library: [{{.*}}2.so] +// CHECK-NEXT: 0x0000000000000001 NEEDED Shared library: [so] // CHECK-NEXT: 0x0000000000000015 DEBUG 0x0 // CHECK-NEXT: 0x0000000000000017 JMPREL // CHECK-NEXT: 0x0000000000000002 PLTRELSZ 24 (bytes) @@ -53,6 +52,7 @@ // CHECK-NEXT: 0x000000000000000B SYMENT 24 (bytes) // CHECK-NEXT: 0x0000000000000005 STRTAB // CHECK-NEXT: 0x000000000000000A STRSZ +// CHECK-NEXT: 0x000000006FFFFEF5 GNU_HASH // CHECK-NEXT: 0x0000000000000004 HASH // CHECK-NEXT: 0x0000000000000000 NULL 0x0 // CHECK-NEXT: ] diff --git a/lld/test/ELF/dynamic.s b/lld/test/ELF/dynamic.s index 91177eb2c86..9ef8ffae75f 100644 --- a/lld/test/ELF/dynamic.s +++ b/lld/test/ELF/dynamic.s @@ -1,10 +1,13 @@ # REQUIRES: x86 -# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-freebsd %s -o %t.o +# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o ## Check that _DYNAMIC symbol is created when creating dynamic output, ## and has hidden visibility and address equal to .dynamic section. # RUN: ld.lld -shared %t.o -o %t.so # RUN: llvm-readobj --sections --symbols %t.so | FileCheck %s +# RUN: ld.lld -pie %t.o -o %t +# RUN: llvm-readobj --sections --symbols %t | FileCheck %s + # CHECK: Section { # CHECK: Index: 5 # CHECK: Name: .dynamic @@ -14,13 +17,6 @@ # CHECK-NEXT: SHF_WRITE # CHECK-NEXT: ] # CHECK-NEXT: Address: 0x[[ADDR:.*]] -# CHECK-NEXT: Offset: 0x1000 -# CHECK-NEXT: Size: -# CHECK-NEXT: Link: -# CHECK-NEXT: Info: -# CHECK-NEXT: AddressAlignment: -# CHECK-NEXT: EntrySize: -# CHECK-NEXT: } # CHECK: Symbols [ # CHECK: Symbol { # CHECK: Name: _DYNAMIC @@ -35,10 +31,7 @@ # CHECK-NEXT: } # RUN: ld.lld %t.o -o %t2 -# RUN: llvm-readobj --sections --symbols %t2 | FileCheck -check-prefix=NODYN %s -# NODYN: Symbols [ -# NODYN-NOT: Name: _DYNAMIC -# NODYN: ] +# RUN: llvm-readobj --sections --symbols %t2 | FileCheck /dev/null --implicit-check-not=_DYNAMIC .globl _start _start: diff --git a/lld/test/ELF/edata-no-bss.s b/lld/test/ELF/edata-no-bss.s index 5127c4710fa..b8660976cf6 100644 --- a/lld/test/ELF/edata-no-bss.s +++ b/lld/test/ELF/edata-no-bss.s @@ -1,4 +1,7 @@ # REQUIRES: x86 + +## _edata points to the end of the last mapped initialized section. + # RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o # RUN: ld.lld %t.o -o %t --gc-sections # RUN: llvm-objdump -t -section-headers %t | FileCheck %s diff --git a/lld/test/ELF/ehframe-relocation.s b/lld/test/ELF/ehframe-relocation.s index f860df4e0ba..562fcfbeeae 100644 --- a/lld/test/ELF/ehframe-relocation.s +++ b/lld/test/ELF/ehframe-relocation.s @@ -1,6 +1,6 @@ // 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/ehframe-relocation.s -o %t2.o +// RUN: echo '.cfi_startproc; .cfi_endproc' | llvm-mc -filetype=obj -triple=x86_64 - -o %t2.o // RUN: ld.lld %t.o %t2.o -o %t // RUN: llvm-readobj -S %t | FileCheck %s // RUN: llvm-objdump -d %t | FileCheck --check-prefix=DISASM %s diff --git a/lld/test/ELF/emit-relocs-merge.s b/lld/test/ELF/emit-relocs-merge.s index 3ac2d13e148..eefee473b70 100644 --- a/lld/test/ELF/emit-relocs-merge.s +++ b/lld/test/ELF/emit-relocs-merge.s @@ -1,16 +1,20 @@ # REQUIRES: x86 -# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o + +## .data.foo and .data.bar are combined into .data, +## so their relocation sections should also be combined. + +# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o # RUN: ld.lld --emit-relocs %t.o -o %t.so -shared # RUN: llvm-readobj -r %t.so | FileCheck %s # CHECK: Relocations [ # CHECK-NEXT: Section ({{.*}}) .rela.dyn { -# CHECK-NEXT: 0x2000 R_X86_64_64 zed 0x0 -# CHECK-NEXT: 0x2008 R_X86_64_64 zed 0x0 +# CHECK-NEXT: [[ADDR1:[0-9a-f]+]] R_X86_64_64 zed 0x0 +# CHECK-NEXT: [[ADDR2:[0-9a-f]+]] R_X86_64_64 zed 0x0 # CHECK-NEXT: } # CHECK-NEXT: Section ({{.*}}) .rela.data { -# CHECK-NEXT: 0x2000 R_X86_64_64 zed 0x0 -# CHECK-NEXT: 0x2008 R_X86_64_64 zed 0x0 +# CHECK-NEXT: [[ADDR1]] R_X86_64_64 zed 0x0 +# CHECK-NEXT: [[ADDR2]] R_X86_64_64 zed 0x0 # CHECK-NEXT: } # CHECK-NEXT: ] diff --git a/lld/test/ELF/string-gc.s b/lld/test/ELF/gc-sections-string.s index 4bc7e80db71..4bc7e80db71 100644 --- a/lld/test/ELF/string-gc.s +++ b/lld/test/ELF/gc-sections-string.s diff --git a/lld/test/ELF/relocation-copy-flags.s b/lld/test/ELF/relocation-copy-flags.s index 7b85196c0b6..1b3b877def0 100644 --- a/lld/test/ELF/relocation-copy-flags.s +++ b/lld/test/ELF/relocation-copy-flags.s @@ -6,30 +6,21 @@ // RUN: ld.lld --hash-style=sysv %t.o %t2.so -o %t.exe // RUN: llvm-readobj -S --section-data -r %t.exe | FileCheck %s +// Copy relocate x in a non-writable position. .global _start _start: .quad x +// Resolved to 0 in a non-alloc section. .section foo .quad y +// Produce a dynamic relocation in a writable position. .section bar, "aw" .quad z // CHECK: Name: .text -// CHECK-NEXT: Type: SHT_PROGBITS -// CHECK-NEXT: Flags [ -// CHECK-NEXT: SHF_ALLOC -// CHECK-NEXT: SHF_EXECINSTR -// CHECK-NEXT: ] -// CHECK-NEXT: Address: 0x201000 -// CHECK-NEXT: Offset: 0x1000 -// CHECK-NEXT: Size: 8 -// CHECK-NEXT: Link: 0 -// CHECK-NEXT: Info: 0 -// CHECK-NEXT: AddressAlignment: 4 -// CHECK-NEXT: EntrySize: 0 -// CHECK-NEXT: SectionData ( +// CHECK: SectionData ( // CHECK-NEXT: 0000: 10302000 // CHECK-NEXT: ) diff --git a/lld/test/ELF/relocation-copy-relro.s b/lld/test/ELF/relocation-copy-relro.s index 5f03c6910ab..b4117a176bb 100644 --- a/lld/test/ELF/relocation-copy-relro.s +++ b/lld/test/ELF/relocation-copy-relro.s @@ -1,4 +1,7 @@ // REQUIRES: x86 + +// Reserve space for copy relocations of read-only symbols in .bss.rel.ro + // 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-relro.s -o %t2.o // RUN: ld.lld -shared %t2.o -o %t.so diff --git a/lld/test/ELF/relocation-relative-weak.s b/lld/test/ELF/relocation-relative-weak.s index ff1c79ddb26..5ae5d1df7f7 100644 --- a/lld/test/ELF/relocation-relative-weak.s +++ b/lld/test/ELF/relocation-relative-weak.s @@ -1,12 +1,12 @@ # REQUIRES: x86 -# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/dummy-shared.s -o %t1.o +# RUN: llvm-mc -filetype=obj -triple=x86_64 /dev/null -o %t1.o # RUN: ld.lld %t1.o -shared -o %t1.so -# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o +# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o # RUN: ld.lld %t.o %t1.so -o %t -pie # RUN: llvm-readobj --dyn-relocations %t | FileCheck %s # CHECK: Dynamic Relocations { -# CHECK-NEXT: 0x3018 R_X86_64_JUMP_SLOT w 0x0 +# CHECK-NEXT: R_X86_64_JUMP_SLOT w 0x0 # CHECK-NEXT: } .globl _start diff --git a/lld/test/ELF/relocation-size.s b/lld/test/ELF/relocation-size.s deleted file mode 100644 index 58df74c1c8e..00000000000 --- a/lld/test/ELF/relocation-size.s +++ /dev/null @@ -1,115 +0,0 @@ -// REQUIRES: x86 -// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o -// RUN: ld.lld %t.o -o %t1 -// RUN: llvm-readobj -r %t1 | FileCheck --check-prefix=NORELOC %s -// RUN: llvm-objdump -d %t1 | FileCheck --check-prefix=DISASM %s -// RUN: ld.lld -shared %t.o -o %t1 -// RUN: llvm-readobj -r %t1 | FileCheck --check-prefix=RELOCSHARED %s -// RUN: llvm-objdump -d %t1 | FileCheck --check-prefix=DISASMSHARED %s - -// NORELOC: Relocations [ -// NORELOC-NEXT: ] - -// DISASM: Disassembly of section test: -// DISASM-EMPTY: -// DISASM-NEXT: _data: -// DISASM-NEXT: 201000: 19 00 -// DISASM-NEXT: 201002: 00 00 -// DISASM-NEXT: 201004: 00 00 -// DISASM-NEXT: 201006: 00 00 -// DISASM-NEXT: 201008: 1a 00 -// DISASM-NEXT: 20100a: 00 00 -// DISASM-NEXT: 20100c: 00 00 -// DISASM-NEXT: 20100e: 00 00 -// DISASM-NEXT: 201010: 1b 00 -// DISASM-NEXT: 201012: 00 00 -// DISASM-NEXT: 201014: 00 00 -// DISASM-NEXT: 201016: 00 00 -// DISASM-NEXT: 201018: 19 00 -// DISASM-NEXT: 20101a: 00 00 -// DISASM-NEXT: 20101c: 00 00 -// DISASM-NEXT: 20101e: 00 00 -// DISASM-NEXT: 201020: 1a 00 -// DISASM-NEXT: 201022: 00 00 -// DISASM-NEXT: 201024: 00 00 -// DISASM-NEXT: 201026: 00 00 -// DISASM-NEXT: 201028: 1b 00 -// DISASM-NEXT: 20102a: 00 00 -// DISASM-NEXT: 20102c: 00 00 -// DISASM-NEXT: 20102e: 00 00 -// DISASM: _start: -// DISASM-NEXT: 201030: 8b 04 25 19 00 00 00 movl 25, %eax -// DISASM-NEXT: 201037: 8b 04 25 1a 00 00 00 movl 26, %eax -// DISASM-NEXT: 20103e: 8b 04 25 1b 00 00 00 movl 27, %eax -// DISASM-NEXT: 201045: 8b 04 25 19 00 00 00 movl 25, %eax -// DISASM-NEXT: 20104c: 8b 04 25 1a 00 00 00 movl 26, %eax -// DISASM-NEXT: 201053: 8b 04 25 1b 00 00 00 movl 27, %eax - -// RELOCSHARED: Relocations [ -// RELOCSHARED-NEXT: Section ({{.*}}) .rela.dyn { -// RELOCSHARED-NEXT: 0x1000 R_X86_64_SIZE64 foo 0xFFFFFFFFFFFFFFFF -// RELOCSHARED-NEXT: 0x1008 R_X86_64_SIZE64 foo 0x0 -// RELOCSHARED-NEXT: 0x1010 R_X86_64_SIZE64 foo 0x1 -// RELOCSHARED-NEXT: 0x1033 R_X86_64_SIZE32 foo 0xFFFFFFFFFFFFFFFF -// RELOCSHARED-NEXT: 0x103A R_X86_64_SIZE32 foo 0x0 -// RELOCSHARED-NEXT: 0x1041 R_X86_64_SIZE32 foo 0x1 -// RELOCSHARED-NEXT: } -// RELOCSHARED-NEXT: ] - -// DISASMSHARED: Disassembly of section test: -// DISASMSHARED-EMPTY: -// DISASMSHARED-NEXT: _data: -// DISASMSHARED-NEXT: ... -// DISASMSHARED-NEXT: 1018: 19 00 -// DISASMSHARED-NEXT: 101a: 00 00 -// DISASMSHARED-NEXT: 101c: 00 00 -// DISASMSHARED-NEXT: 101e: 00 00 -// DISASMSHARED-NEXT: 1020: 1a 00 -// DISASMSHARED-NEXT: 1022: 00 00 -// DISASMSHARED-NEXT: 1024: 00 00 -// DISASMSHARED-NEXT: 1026: 00 00 -// DISASMSHARED-NEXT: 1028: 1b 00 -// DISASMSHARED-NEXT: 102a: 00 00 -// DISASMSHARED-NEXT: 102c: 00 00 -// DISASMSHARED-NEXT: 102e: 00 00 -// DISASMSHARED: _start: -// DISASMSHARED-NEXT: 1030: 8b 04 25 00 00 00 00 movl 0, %eax -// DISASMSHARED-NEXT: 1037: 8b 04 25 00 00 00 00 movl 0, %eax -// DISASMSHARED-NEXT: 103e: 8b 04 25 00 00 00 00 movl 0, %eax -// DISASMSHARED-NEXT: 1045: 8b 04 25 19 00 00 00 movl 25, %eax -// DISASMSHARED-NEXT: 104c: 8b 04 25 1a 00 00 00 movl 26, %eax -// DISASMSHARED-NEXT: 1053: 8b 04 25 1b 00 00 00 movl 27, %eax - -.data -.global foo -.type foo,%object -.size foo,26 -foo: -.zero 26 - -.data -.global foohidden -.hidden foohidden -.type foohidden,%object -.size foohidden,26 -foohidden: -.zero 26 - -.section test,"axw" -_data: - // R_X86_64_SIZE64: - .quad foo@SIZE-1 - .quad foo@SIZE - .quad foo@SIZE+1 - .quad foohidden@SIZE-1 - .quad foohidden@SIZE - .quad foohidden@SIZE+1 -.globl _start -_start: - // R_X86_64_SIZE32: - movl foo@SIZE-1,%eax - movl foo@SIZE,%eax - movl foo@SIZE+1,%eax - movl foohidden@SIZE-1,%eax - movl foohidden@SIZE,%eax - movl foohidden@SIZE+1,%eax diff --git a/lld/test/ELF/relocation-undefined-weak.s b/lld/test/ELF/relocation-undefined-weak.s index 2d83c6e3d45..ce658f67ee0 100644 --- a/lld/test/ELF/relocation-undefined-weak.s +++ b/lld/test/ELF/relocation-undefined-weak.s @@ -1,10 +1,12 @@ -// REQUIRES: x86 -// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t -// RUN: ld.lld %t -o %tout -// RUN: llvm-readobj --sections %tout | FileCheck %s -// RUN: llvm-objdump -d %tout | FileCheck %s --check-prefix DISASM +# REQUIRES: x86 -// Check that undefined weak symbols are treated as having a VA of 0. +## On some targets (e.g. ARM, AArch64, and PPC), PC relative relocations to +## weak undefined symbols resolve to special positions. On many others +## the target symbols as treated as VA 0. + +# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o +# RUN: ld.lld %t.o -o %t +# RUN: llvm-objdump -d --no-show-raw-insn --print-imm-hex %t | FileCheck %s .global _start _start: @@ -12,16 +14,4 @@ _start: .weak sym1 -// CHECK: Name: .text -// CHECK-NEXT: Type: SHT_PROGBITS -// CHECK-NEXT: Flags [ -// CHECK-NEXT: SHF_ALLOC -// CHECK-NEXT: SHF_EXECINSTR -// CHECK-NEXT: ] -// CHECK-NEXT: Address: 0x201000 - -// Unfortunately FileCheck can't do math, so we have to check for explicit -// values: -// R_86_64_PC32 = 0 + (-8 - (0x201000 + 2)) = -2101258 - -// DISASM: movl $1, -2101258(%rip) +# CHECK: 201000: movl $0x1, -0x20100a(%rip) diff --git a/lld/test/ELF/relro-non-contiguous.s b/lld/test/ELF/relro-non-contiguous.s index 99cd59ee156..3eeeff7c521 100644 --- a/lld/test/ELF/relro-non-contiguous.s +++ b/lld/test/ELF/relro-non-contiguous.s @@ -13,7 +13,7 @@ // RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t3.o // Expect error for non-contiguous relro -// RUN: not ld.lld %t3.o %t.so -z relro -o %t --script=%t.script 2>&1 | FileCheck %s +// RUN: not ld.lld %t3.o %t.so -z relro -o /dev/null --script=%t.script 2>&1 | FileCheck %s // No error when we do not request relro. // RUN: ld.lld %t3.o %t.so -z norelro -o %t --script=%t.script diff --git a/lld/test/ELF/relro-tls.s b/lld/test/ELF/relro-tls.s index 79e383d10d7..42f982e320d 100644 --- a/lld/test/ELF/relro-tls.s +++ b/lld/test/ELF/relro-tls.s @@ -1,23 +1,20 @@ -// REQUIRES: x86 -// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t -// RUN: ld.lld %t -o %tout -// RUN: llvm-readobj -l %tout | FileCheck %s +# REQUIRES: x86 -// CHECK: Type: PT_GNU_RELRO -// CHECK-NEXT: Offset: -// CHECK-NEXT: VirtualAddress: -// CHECK-NEXT: PhysicalAddress: -// CHECK-NEXT: FileSize: 4 -// CHECK-NEXT: MemSize: 4 -// CHECK-NEXT: Flags [ -// CHECK-NEXT: PF_R -// CHECK-NEXT: ] -// CHECK-NEXT: Alignment: 1 +## PT_GNU_RELRO includes TLS sections. -.global _start -_start: +# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o +# RUN: ld.lld %t.o -o %t +# RUN: llvm-readobj -l %t | FileCheck %s + +## Currently p_memsz of PT_GNU_RELRO is rounded up to protect the last page. + +# CHECK: Type: PT_GNU_RELRO +# CHECK: FileSize: 4 +# CHECK-NEXT: MemSize: 4096 +# CHECK: Alignment: 1 -.global d .section .foo,"awT",@progbits -d: -.long 2 +.long 1 + +.section .bar,"awT",@nobits +.space 2 diff --git a/lld/test/ELF/stdout.s b/lld/test/ELF/stdout.s index 6c41436bc3b..64cf64a72b4 100644 --- a/lld/test/ELF/stdout.s +++ b/lld/test/ELF/stdout.s @@ -4,8 +4,7 @@ # RUN: ld.lld %t.o -o - > %t1 # RUN: llvm-objdump -d %t1 | FileCheck %s -# CHECK: 0000000000201000 _start: -# CHECK: 201000: 90 nop +# CHECK: nop # RUN: ld.lld %t.o -o %t2 # RUN: diff %t1 %t2 diff --git a/lld/test/ELF/symbol-override.s b/lld/test/ELF/symbol-override.s index 1d8330f2208..6da11338ba0 100644 --- a/lld/test/ELF/symbol-override.s +++ b/lld/test/ELF/symbol-override.s @@ -3,37 +3,11 @@ // RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/symbol-override.s -o %t2.o // RUN: ld.lld -shared %t2.o -o %t2.so // RUN: ld.lld %t1.o %t2.so -o %t -// RUN: llvm-readobj --dyn-syms %t | FileCheck %s +// RUN: nm -D %t | FileCheck %s -// CHECK: DynamicSymbols [ -// CHECK-NEXT: Symbol { -// CHECK-NEXT: Name: -// CHECK-NEXT: Value: 0x0 -// CHECK-NEXT: Size: 0 -// CHECK-NEXT: Binding: Local -// CHECK-NEXT: Type: None -// CHECK-NEXT: Other: 0 -// CHECK-NEXT: Section: Undefined -// CHECK-NEXT: } -// CHECK-NEXT: Symbol { -// CHECK-NEXT: Name: do -// CHECK-NEXT: Value: 0x0 -// CHECK-NEXT: Size: 0 -// CHECK-NEXT: Binding: Global -// CHECK-NEXT: Type: Function -// CHECK-NEXT: Other: 0 -// CHECK-NEXT: Section: Undefined -// CHECK-NEXT: } -// CHECK-NEXT: Symbol { -// CHECK-NEXT: Name: foo -// CHECK-NEXT: Value: 0x201000 -// CHECK-NEXT: Size: 0 -// CHECK-NEXT: Binding: Global -// CHECK-NEXT: Type: Function -// CHECK-NEXT: Other: 0 -// CHECK-NEXT: Section: .text -// CHECK-NEXT: } -// CHECK-NEXT: ] +// CHECK: do +// CHECK-NEXT: foo +// CHECK-NOT: {{.}} .text .globl foo diff --git a/lld/test/ELF/tls-offset.s b/lld/test/ELF/tls-offset.s index d14ef28e546..2eeebdbf24d 100644 --- a/lld/test/ELF/tls-offset.s +++ b/lld/test/ELF/tls-offset.s @@ -11,7 +11,6 @@ // RUN: .data.rel.ro : { *(.data.rel.ro) } \ // RUN: }" > %t.script // RUN: ld.lld -T %t.script %t -o %tout2 -// RUN: echo SCRIPT // RUN: llvm-readobj -S %tout2 | FileCheck %s .global _start _start: diff --git a/lld/test/ELF/version-script-copy-rel.s b/lld/test/ELF/version-script-copy-rel.s deleted file mode 100644 index abff08c411f..00000000000 --- a/lld/test/ELF/version-script-copy-rel.s +++ /dev/null @@ -1,24 +0,0 @@ -# REQUIRES: x86 -# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/copy-in-shared.s -o %t1.o -# RUN: echo "FOOVER { global: *; };" > %t.script -# RUN: ld.lld --version-script %t.script -shared %t1.o -o %t.so -# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t2.o -# RUN: ld.lld %t2.o %t.so -o %tout -# RUN: llvm-readobj --dyn-syms %tout | FileCheck %s - -# CHECK: DynamicSymbols [ -# CHECK: Symbol { -# CHECK: Name: foo@FOOVER -# CHECK-NEXT: Value: -# CHECK-NEXT: Size: -# CHECK-NEXT: Binding: Global -# CHECK-NEXT: Type: Object -# CHECK-NEXT: Other: -# CHECK-NEXT: Section: .bss.rel.ro -# CHECK-NEXT: } -# CHECK-NEXT: ] - -.text -.global _start -_start: -movl $0, foo diff --git a/lld/test/ELF/version-script-glob.s b/lld/test/ELF/version-script-glob.s index eca1e332c6c..b3b9f255ddc 100644 --- a/lld/test/ELF/version-script-glob.s +++ b/lld/test/ELF/version-script-glob.s @@ -3,70 +3,21 @@ # RUN: echo "{ global: foo*; bar*; local: *; };" > %t.script # RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o # RUN: ld.lld -shared --version-script %t.script %t.o -o %t.so -# RUN: llvm-readobj --dyn-syms %t.so | FileCheck %s +# RUN: llvm-readelf --dyn-syms %t.so | FileCheck %s - .globl foo1 +.globl foo1, bar1, zed1, local foo1: - - .globl bar1 bar1: - - .globl zed1 zed1: - - .globl local local: -# CHECK: DynamicSymbols [ -# CHECK-NEXT: Symbol { -# CHECK-NEXT: Name: -# CHECK-NEXT: Value: 0x0 -# CHECK-NEXT: Size: 0 -# CHECK-NEXT: Binding: Local -# CHECK-NEXT: Type: None -# CHECK-NEXT: Other: 0 -# CHECK-NEXT: Section: Undefined -# CHECK-NEXT: } -# CHECK-NEXT: Symbol { -# CHECK-NEXT: Name: bar1 -# CHECK-NEXT: Value: 0x1000 -# CHECK-NEXT: Size: 0 -# CHECK-NEXT: Binding: Global -# CHECK-NEXT: Type: None -# CHECK-NEXT: Other: 0 -# CHECK-NEXT: Section: .text -# CHECK-NEXT: } -# CHECK-NEXT: Symbol { -# CHECK-NEXT: Name: foo1 -# CHECK-NEXT: Value: 0x1000 -# CHECK-NEXT: Size: 0 -# CHECK-NEXT: Binding: Global -# CHECK-NEXT: Type: None -# CHECK-NEXT: Other: 0 -# CHECK-NEXT: Section: .text -# CHECK-NEXT: } -# CHECK-NEXT: ] +# CHECK: bar1{{$}} +# CHECK-NEXT: foo1{{$}} +# CHECK-NOT: {{.}} # RUN: echo "{ global : local; local: *; };" > %t1.script -# RUN: ld.lld -shared --version-script %t1.script %t.o -o /dev/null +# RUN: ld.lld -shared --version-script %t1.script %t.o -o %t.so +# RUN: llvm-readelf --dyn-syms %t.so | FileCheck --check-prefix=LOCAL %s -# LOCAL: DynamicSymbols [ -# LOCAL-NEXT: Symbol { -# LOCAL-NEXT: Name: -# LOCAL-NEXT: Value: 0x0 -# LOCAL-NEXT: Size: 0 -# LOCAL-NEXT: Binding: Local -# LOCAL-NEXT: Type: None -# LOCAL-NEXT: Other: 0 -# LOCAL-NEXT: Section: Undefined -# LOCAL-NEXT: } -# LOCAL-NEXT: Symbol { -# LOCAL-NEXT: Name: local -# LOCAL-NEXT: Value: 0x1000 -# LOCAL-NEXT: Size: 0 -# LOCAL-NEXT: Binding: Global -# LOCAL-NEXT: Type: None -# LOCAL-NEXT: Other: 0 -# LOCAL-NEXT: Section: .text -# LOCAL-NEXT: } -# LOCAL-NEXT: ] +# LOCAL: local{{$}} +# LOCAL-NOT: {{.}} diff --git a/lld/test/ELF/version-script-weak.s b/lld/test/ELF/version-script-weak.s index d5924500f55..7c902eb98bf 100644 --- a/lld/test/ELF/version-script-weak.s +++ b/lld/test/ELF/version-script-weak.s @@ -1,16 +1,17 @@ # 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 %S/Inputs/version-script-weak.s -o %tmp.o -# RUN: rm -f %t.a -# RUN: llvm-ar rcs %t.a %tmp.o +## An weak undefined symbol does not fetch the lazy definition. +## Version scripts do not affect undefined symbols. + +# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o +# RUN: echo '.globl foo; foo:' | llvm-mc -filetype=obj -triple=x86_64 - -o %t1.o # RUN: echo "{ local: *; };" > %t.script -# RUN: ld.lld -shared --version-script %t.script %t.o %t.a -o %t.so +# RUN: ld.lld -shared --version-script %t.script %t.o --start-lib %t1.o --end-lib -o %t.so # RUN: llvm-readobj --dyn-syms -r %t.so | FileCheck %s # CHECK: Relocations [ # CHECK-NEXT: Section ({{.*}}) .rela.plt { -# CHECK-NEXT: 0x3018 R_X86_64_JUMP_SLOT foo +# CHECK-NEXT: R_X86_64_JUMP_SLOT foo # CHECK-NEXT: } # CHECK-NEXT: ] # CHECK: Symbol { diff --git a/lld/test/ELF/version-script.s b/lld/test/ELF/version-script.s index b74a8d61234..874766ea1d8 100644 --- a/lld/test/ELF/version-script.s +++ b/lld/test/ELF/version-script.s @@ -6,19 +6,19 @@ # RUN: echo "{ global: foo1; foo3; local: *; };" > %t.script # RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o # RUN: ld.lld --version-script %t.script -shared %t.o %t2.so -o %t.so --fatal-warnings -# RUN: llvm-readobj --dyn-syms %t.so | FileCheck --check-prefix=DSO %s +# RUN: llvm-readelf --dyn-syms %t.so | FileCheck --check-prefix=DSO %s # RUN: echo "# comment" > %t3.script # RUN: echo "{ local: *; # comment" >> %t3.script # RUN: echo -n "}; # comment" >> %t3.script # RUN: ld.lld --version-script %t3.script -shared %t.o %t2.so -o %t3.so -# RUN: llvm-readobj --dyn-syms %t3.so | FileCheck --check-prefix=DSO2 %s +# RUN: llvm-readelf --dyn-syms %t3.so | FileCheck --check-prefix=DSO2 %s ## Also check that both "global:" and "global :" forms are accepted # RUN: echo "VERSION_1.0 { global : foo1; local : *; };" > %t4.script # RUN: echo "VERSION_2.0 { global: foo3; local: *; };" >> %t4.script # RUN: ld.lld --version-script %t4.script -shared %t.o %t2.so -o %t4.so --fatal-warnings -# RUN: llvm-readobj --dyn-syms %t4.so | FileCheck --check-prefix=VERDSO %s +# RUN: llvm-readelf --dyn-syms %t4.so | FileCheck --check-prefix=VERDSO %s # RUN: echo "VERSION_1.0 { global: foo1; local: *; };" > %t5.script # RUN: echo "{ global: foo3; local: *; };" >> %t5.script @@ -40,172 +40,36 @@ # RUN: echo "VERSION_1.0 { global : foo1; local : *; };" > %t7a.script # RUN: echo "VERSION_2.0 { global: foo3; local: *; };" > %t7b.script # RUN: ld.lld --version-script %t7a.script --version-script %t7b.script -shared %t.o %t2.so -o %t7.so -# RUN: llvm-readobj --dyn-syms %t7.so | FileCheck --check-prefix=VERDSO %s - -# DSO: DynamicSymbols [ -# DSO-NEXT: Symbol { -# DSO-NEXT: Name: -# DSO-NEXT: Value: 0x0 -# DSO-NEXT: Size: 0 -# DSO-NEXT: Binding: Local (0x0) -# DSO-NEXT: Type: None (0x0) -# DSO-NEXT: Other: 0 -# DSO-NEXT: Section: Undefined (0x0) -# DSO-NEXT: } -# DSO-NEXT: Symbol { -# DSO-NEXT: Name: bar -# DSO-NEXT: Value: 0x0 -# DSO-NEXT: Size: 0 -# DSO-NEXT: Binding: Global (0x1) -# DSO-NEXT: Type: Function (0x2) -# DSO-NEXT: Other: 0 -# DSO-NEXT: Section: Undefined (0x0) -# DSO-NEXT: } -# DSO-NEXT: Symbol { -# DSO-NEXT: Name: foo1 -# DSO-NEXT: Value: 0x1000 -# DSO-NEXT: Size: 0 -# DSO-NEXT: Binding: Global (0x1) -# DSO-NEXT: Type: None (0x0) -# DSO-NEXT: Other: 0 -# DSO-NEXT: Section: .text -# DSO-NEXT: } -# DSO-NEXT: Symbol { -# DSO-NEXT: Name: foo3 -# DSO-NEXT: Value: 0x1007 -# DSO-NEXT: Size: 0 -# DSO-NEXT: Binding: Global (0x1) -# DSO-NEXT: Type: None (0x0) -# DSO-NEXT: Other: 0 -# DSO-NEXT: Section: .text -# DSO-NEXT: } -# DSO-NEXT: ] - -# DSO2: DynamicSymbols [ -# DSO2-NEXT: Symbol { -# DSO2-NEXT: Name: -# DSO2-NEXT: Value: 0x0 -# DSO2-NEXT: Size: 0 -# DSO2-NEXT: Binding: Local (0x0) -# DSO2-NEXT: Type: None (0x0) -# DSO2-NEXT: Other: 0 -# DSO2-NEXT: Section: Undefined (0x0) -# DSO2-NEXT: } -# DSO2-NEXT: Symbol { -# DSO2-NEXT: Name: bar -# DSO2-NEXT: Value: 0x0 -# DSO2-NEXT: Size: 0 -# DSO2-NEXT: Binding: Global (0x1) -# DSO2-NEXT: Type: Function (0x2) -# DSO2-NEXT: Other: 0 -# DSO2-NEXT: Section: Undefined (0x0) -# DSO2-NEXT: } -# DSO2-NEXT: ] - -# VERDSO: DynamicSymbols [ -# VERDSO-NEXT: Symbol { -# VERDSO-NEXT: Name: -# VERDSO-NEXT: Value: 0x0 -# VERDSO-NEXT: Size: 0 -# VERDSO-NEXT: Binding: Local -# VERDSO-NEXT: Type: None -# VERDSO-NEXT: Other: 0 -# VERDSO-NEXT: Section: Undefined -# VERDSO-NEXT: } -# VERDSO-NEXT: Symbol { -# VERDSO-NEXT: Name: bar -# VERDSO-NEXT: Value: 0x0 -# VERDSO-NEXT: Size: 0 -# VERDSO-NEXT: Binding: Global -# VERDSO-NEXT: Type: Function -# VERDSO-NEXT: Other: 0 -# VERDSO-NEXT: Section: Undefined -# VERDSO-NEXT: } -# VERDSO-NEXT: Symbol { -# VERDSO-NEXT: Name: foo1@@VERSION_1.0 -# VERDSO-NEXT: Value: 0x1000 -# VERDSO-NEXT: Size: 0 -# VERDSO-NEXT: Binding: Global -# VERDSO-NEXT: Type: None -# VERDSO-NEXT: Other: 0 -# VERDSO-NEXT: Section: .text -# VERDSO-NEXT: } -# VERDSO-NEXT: Symbol { -# VERDSO-NEXT: Name: foo3@@VERSION_2.0 -# VERDSO-NEXT: Value: 0x1007 -# VERDSO-NEXT: Size: 0 -# VERDSO-NEXT: Binding: Global -# VERDSO-NEXT: Type: None -# VERDSO-NEXT: Other: 0 -# VERDSO-NEXT: Section: .text -# VERDSO-NEXT: } -# VERDSO-NEXT: ] +# RUN: llvm-readelf --dyn-syms %t7.so | FileCheck --check-prefix=VERDSO %s + +# DSO: bar{{$}} +# DSO-NEXT: foo1{{$}} +# DSO-NEXT: foo3{{$}} +# DSO-NOT: {{.}} + +# DSO2: bar{{$}} +# DSO2-NOT: {{.}} + +# VERDSO: bar{{$}} +# VERDSO-NEXT: foo1@@VERSION_1.0 +# VERDSO-NEXT: foo3@@VERSION_2.0 +# VERDSO-NOT: {{.}} # RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o # RUN: ld.lld --hash-style=sysv -shared %t.o %t2.so -o %t.so -# RUN: llvm-readobj --dyn-syms %t.so | FileCheck --check-prefix=ALL %s +# RUN: llvm-readelf --dyn-syms %t.so | FileCheck --check-prefix=ALL %s # RUN: echo "{ global: foo1; foo3; };" > %t2.script # RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o # RUN: ld.lld --hash-style=sysv --version-script %t2.script -shared %t.o %t2.so -o %t.so -# RUN: llvm-readobj --dyn-syms %t.so | FileCheck --check-prefix=ALL %s - -# ALL: DynamicSymbols [ -# ALL-NEXT: Symbol { -# ALL-NEXT: Name: -# ALL-NEXT: Value: 0x0 -# ALL-NEXT: Size: 0 -# ALL-NEXT: Binding: Local -# ALL-NEXT: Type: None -# ALL-NEXT: Other: 0 -# ALL-NEXT: Section: Undefined -# ALL-NEXT: } -# ALL-NEXT: Symbol { -# ALL-NEXT: Name: _start -# ALL-NEXT: Value: -# ALL-NEXT: Size: 0 -# ALL-NEXT: Binding: Global -# ALL-NEXT: Type: None -# ALL-NEXT: Other: 0 -# ALL-NEXT: Section: .text -# ALL-NEXT: } -# ALL-NEXT: Symbol { -# ALL-NEXT: Name: bar -# ALL-NEXT: Value: -# ALL-NEXT: Size: 0 -# ALL-NEXT: Binding: Global -# ALL-NEXT: Type: Function -# ALL-NEXT: Other: 0 -# ALL-NEXT: Section: Undefined -# ALL-NEXT: } -# ALL-NEXT: Symbol { -# ALL-NEXT: Name: foo1 -# ALL-NEXT: Value: -# ALL-NEXT: Size: 0 -# ALL-NEXT: Binding: Global -# ALL-NEXT: Type: None -# ALL-NEXT: Other: 0 -# ALL-NEXT: Section: .text -# ALL-NEXT: } -# ALL-NEXT: Symbol { -# ALL-NEXT: Name: foo2 -# ALL-NEXT: Value: -# ALL-NEXT: Size: 0 -# ALL-NEXT: Binding: Global -# ALL-NEXT: Type: None -# ALL-NEXT: Other: 0 -# ALL-NEXT: Section: .text -# ALL-NEXT: } -# ALL-NEXT: Symbol { -# ALL-NEXT: Name: foo3 -# ALL-NEXT: Value: -# ALL-NEXT: Size: 0 -# ALL-NEXT: Binding: Global -# ALL-NEXT: Type: None -# ALL-NEXT: Other: 0 -# ALL-NEXT: Section: .text -# ALL-NEXT: } -# ALL-NEXT: ] +# RUN: llvm-readelf --dyn-syms %t.so | FileCheck --check-prefix=ALL %s + +# ALL: _start{{$}} +# ALL-NEXT: bar{{$}} +# ALL-NEXT: foo1{{$}} +# ALL-NEXT: foo2{{$}} +# ALL-NEXT: foo3{{$}} +# ALL-NOT: {{.}} # RUN: echo "VERSION_1.0 { global: foo1; foo1; local: *; };" > %t8.script # RUN: ld.lld --version-script %t8.script -shared %t.o -o /dev/null --fatal-warnings diff --git a/lld/test/ELF/version-wildcard.test b/lld/test/ELF/version-wildcard.test deleted file mode 100644 index ddc2b0866d4..00000000000 --- a/lld/test/ELF/version-wildcard.test +++ /dev/null @@ -1,108 +0,0 @@ -# REQUIRES: x86 - -# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o -# RUN: echo "VERSION_1.0 { global: foo*; local: *; };" > %t.script -# RUN: ld.lld --version-script %t.script -shared %t.o -o %t.so -# RUN: llvm-readobj --dyn-syms %t.so | FileCheck %s - -# CHECK: DynamicSymbols [ -# CHECK-NEXT: Symbol { -# CHECK-NEXT: Name: -# CHECK-NEXT: Value: 0x0 -# CHECK-NEXT: Size: 0 -# CHECK-NEXT: Binding: Local -# CHECK-NEXT: Type: None -# CHECK-NEXT: Other: 0 -# CHECK-NEXT: Section: Undefined -# CHECK-NEXT: } -# CHECK-NEXT: Symbol { -# CHECK-NEXT: Name: foo1@@VERSION_1.0 -# CHECK-NEXT: Value: 0x1000 -# CHECK-NEXT: Size: 0 -# CHECK-NEXT: Binding: Global -# CHECK-NEXT: Type: None -# CHECK-NEXT: Other: 0 -# CHECK-NEXT: Section: .text -# CHECK-NEXT: } -# CHECK-NEXT: Symbol { -# CHECK-NEXT: Name: foo2@@VERSION_1.0 -# CHECK-NEXT: Value: 0x1001 -# CHECK-NEXT: Size: 0 -# CHECK-NEXT: Binding: Global -# CHECK-NEXT: Type: None -# CHECK-NEXT: Other: 0 -# CHECK-NEXT: Section: .text -# CHECK-NEXT: } -# CHECK-NEXT: Symbol { -# CHECK-NEXT: Name: foo3@@VERSION_1.0 -# CHECK-NEXT: Value: 0x1007 -# CHECK-NEXT: Size: 0 -# CHECK-NEXT: Binding: Global -# CHECK-NEXT: Type: None -# CHECK-NEXT: Other: 0 -# CHECK-NEXT: Section: .text -# CHECK-NEXT: } -# CHECK-NEXT: ] - -# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o -# RUN: echo "VERSION_1.0 { global: foo2; local: *; };" > %t2.script -# RUN: echo "VERSION_2.0 { global: foo*; };" >> %t2.script -# RUN: ld.lld --version-script %t2.script -shared %t.o -o %t2.so -# RUN: llvm-readobj --dyn-syms %t2.so | FileCheck --check-prefix=MIX %s - -# MIX: DynamicSymbols [ -# MIX-NEXT: Symbol { -# MIX-NEXT: Name: -# MIX-NEXT: Value: 0x0 -# MIX-NEXT: Size: 0 -# MIX-NEXT: Binding: Local -# MIX-NEXT: Type: None -# MIX-NEXT: Other: 0 -# MIX-NEXT: Section: Undefined -# MIX-NEXT: } -# MIX-NEXT: Symbol { -# MIX-NEXT: Name: foo1@@VERSION_2.0 -# MIX-NEXT: Value: 0x1000 -# MIX-NEXT: Size: 0 -# MIX-NEXT: Binding: Global -# MIX-NEXT: Type: None -# MIX-NEXT: Other: 0 -# MIX-NEXT: Section: .text -# MIX-NEXT: } -# MIX-NEXT: Symbol { -# MIX-NEXT: Name: foo2@@VERSION_1.0 -# MIX-NEXT: Value: 0x1001 -# MIX-NEXT: Size: 0 -# MIX-NEXT: Binding: Global -# MIX-NEXT: Type: None -# MIX-NEXT: Other: 0 -# MIX-NEXT: Section: .text -# MIX-NEXT: } -# MIX-NEXT: Symbol { -# MIX-NEXT: Name: foo3@@VERSION_2.0 -# MIX-NEXT: Value: 0x1007 -# MIX-NEXT: Size: 0 -# MIX-NEXT: Binding: Global -# MIX-NEXT: Type: None -# MIX-NEXT: Other: 0 -# MIX-NEXT: Section: .text -# MIX-NEXT: } -# MIX-NEXT: ] - -.globl foo1 -foo1: - ret - -.globl foo2 -foo2: - call foo1@PLT - ret - -.globl foo3 -foo3: - call foo2@PLT - ret - -.globl _start -_start: - ret diff --git a/lld/test/ELF/visibility.s b/lld/test/ELF/visibility.s index 1c9bafc3269..cbb3dd532ce 100644 --- a/lld/test/ELF/visibility.s +++ b/lld/test/ELF/visibility.s @@ -1,116 +1,21 @@ -// REQUIRES: x86 -// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t -// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/visibility.s -o %t2 -// RUN: ld.lld -shared %t %t2 -o %t3 -// RUN: llvm-readobj --symbols --dyn-syms %t3 | FileCheck %s +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o +# RUN: llvm-mc -filetype=obj -triple=x86_64 %p/Inputs/visibility.s -o %t2.o +# RUN: ld.lld -shared %t.o %t2.o -o %t.so +# RUN: llvm-readelf -s %t.so | FileCheck %s -// CHECK: Symbols [ -// CHECK-NEXT: Symbol { -// CHECK-NEXT: Name: -// CHECK-NEXT: Value: 0x0 -// CHECK-NEXT: Size: 0 -// CHECK-NEXT: Binding: Local -// CHECK-NEXT: Type: None -// CHECK-NEXT: Other: 0 -// CHECK-NEXT: Section: Undefined -// CHECK-NEXT: } -// CHECK-NEXT: Symbol { -// CHECK-NEXT: Name: hidden -// CHECK-NEXT: Value: -// CHECK-NEXT: Size: 0 -// CHECK-NEXT: Binding: Local -// CHECK-NEXT: Type: None -// CHECK-NEXT: Other [ (0x2) -// CHECK-NEXT: STV_HIDDEN -// CHECK-NEXT: ] -// CHECK-NEXT: Section: .text -// CHECK-NEXT: } -// CHECK-NEXT: Symbol { -// CHECK-NEXT: Name: internal -// CHECK-NEXT: Value: -// CHECK-NEXT: Size: 0 -// CHECK-NEXT: Binding: Local -// CHECK-NEXT: Type: None -// CHECK-NEXT: Other [ (0x1) -// CHECK-NEXT: STV_INTERNAL -// CHECK-NEXT: ] -// CHECK-NEXT: Section: .text -// CHECK-NEXT: } -// CHECK-NEXT: Symbol { -// CHECK-NEXT: Name: protected_with_hidden -// CHECK-NEXT: Value: -// CHECK-NEXT: Size: 0 -// CHECK-NEXT: Binding: Local -// CHECK-NEXT: Type: None -// CHECK-NEXT: Other [ (0x2) -// CHECK-NEXT: STV_HIDDEN -// CHECK-NEXT: ] -// CHECK-NEXT: Section: .text -// CHECK-NEXT: } -// CHECK-NEXT: Symbol { -// CHECK-NEXT: Name: _DYNAMIC -// CHECK-NEXT: Value: -// CHECK-NEXT: Size: 0 -// CHECK-NEXT: Binding: Local -// CHECK-NEXT: Type: None -// CHECK-NEXT: Other [ (0x2) -// CHECK-NEXT: STV_HIDDEN -// CHECK-NEXT: ] -// CHECK-NEXT: Section: .dynamic -// CHECK-NEXT: } -// CHECK-NEXT: Symbol { -// CHECK-NEXT: Name: default -// CHECK-NEXT: Value: -// CHECK-NEXT: Size: 0 -// CHECK-NEXT: Binding: Global -// CHECK-NEXT: Type: None -// CHECK-NEXT: Other: 0 -// CHECK-NEXT: Section: .text -// CHECK-NEXT: } -// CHECK-NEXT: Symbol { -// CHECK-NEXT: Name: protected -// CHECK-NEXT: Value: -// CHECK-NEXT: Size: 0 -// CHECK-NEXT: Binding: Global -// CHECK-NEXT: Type: None -// CHECK-NEXT: Other [ (0x3) -// CHECK-NEXT: STV_PROTECTED -// CHECK-NEXT: ] -// CHECK-NEXT: Section: .text -// CHECK-NEXT: } -// CHECK-NEXT: ] +## Check the most constraining visibility attribute is propagated to the symbol tables. -// CHECK: DynamicSymbols [ -// CHECK-NEXT: Symbol { -// CHECK-NEXT: Name: -// CHECK-NEXT: Value: 0x0 -// CHECK-NEXT: Size: 0 -// CHECK-NEXT: Binding: Local -// CHECK-NEXT: Type: None -// CHECK-NEXT: Other: 0 -// CHECK-NEXT: Section: Undefined -// CHECK-NEXT: } -// CHECK-NEXT: Symbol { -// CHECK-NEXT: Name: default -// CHECK-NEXT: Value: -// CHECK-NEXT: Size: 0 -// CHECK-NEXT: Binding: Global -// CHECK-NEXT: Type: None -// CHECK-NEXT: Other: 0 -// CHECK-NEXT: Section: .text -// CHECK-NEXT: } -// CHECK-NEXT: Symbol { -// CHECK-NEXT: Name: protected -// CHECK-NEXT: Value: -// CHECK-NEXT: Size: 0 -// CHECK-NEXT: Binding: Global -// CHECK-NEXT: Type: None -// CHECK-NEXT: Other [ (0x3) -// CHECK-NEXT: STV_PROTECTED -// CHECK-NEXT: ] -// CHECK-NEXT: Section: .text -// CHECK-NEXT: } -// CHECK-NEXT: ] +# CHECK: Symbol table '.dynsym' contains 3 entries: +# CHECK: GLOBAL DEFAULT 6 default +# CHECK-NEXT: GLOBAL PROTECTED 6 protected + +# CHECK: Symbol table '.symtab' contains 7 entries: +# CHECK: LOCAL HIDDEN 6 hidden +# CHECK-NEXT: LOCAL INTERNAL 6 internal +# CHECK-NEXT: LOCAL HIDDEN 6 protected_with_hidden +# CHECK: GLOBAL DEFAULT 6 default +# CHECK-NEXT: GLOBAL PROTECTED 6 protected .global default default: diff --git a/lld/test/ELF/relocation-size-shared.s b/lld/test/ELF/x86-64-reloc-size-shared.s index 13f52bc722e..13f52bc722e 100644 --- a/lld/test/ELF/relocation-size-shared.s +++ b/lld/test/ELF/x86-64-reloc-size-shared.s diff --git a/lld/test/ELF/x86-64-reloc-size.s b/lld/test/ELF/x86-64-reloc-size.s new file mode 100644 index 00000000000..9aa795f9bd5 --- /dev/null +++ b/lld/test/ELF/x86-64-reloc-size.s @@ -0,0 +1,73 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o +# RUN: ld.lld %t.o -o %t +# RUN: llvm-readobj -r %t | FileCheck --check-prefix=NORELOC %s +# RUN: llvm-readelf -x .data %t | FileCheck --check-prefix=DATA %s +# RUN: llvm-objdump -d --no-show-raw-insn %t | FileCheck --check-prefix=DISASM %s + +# RUN: ld.lld -shared %t.o -o %t.so +# RUN: llvm-readobj -r %t.so | FileCheck --check-prefix=RELOC2 %s +# RUN: llvm-readelf -x .data %t.so | FileCheck --check-prefix=DATA2 %s +# RUN: llvm-objdump -d --no-show-raw-insn %t.so | FileCheck --check-prefix=DISASM2 %s + +# NORELOC: Relocations [ +# NORELOC-NEXT: ] + +# DATA: section '.data': +# DATA-NEXT: 0x00202000 00000000 00000000 00000000 00000000 +# DATA-NEXT: 0x00202010 00000000 00000000 00001900 00000000 +# DATA-NEXT: 0x00202020 00001b00 00000000 00001900 00000000 +# DATA-NEXT: 0x00202030 00001b00 00000000 0000 + +# DISASM: _start: +# DISASM-NEXT: 201000: movl 25, %eax +# DISASM-NEXT: 201007: movl 27, %eax +# DISASM-NEXT: 20100e: movl 25, %eax +# DISASM-NEXT: 201015: movl 27, %eax + +# RELOC2: Relocations [ +# RELOC2-NEXT: Section ({{.*}}) .rela.dyn { +# RELOC2-NEXT: 0x1003 R_X86_64_SIZE32 foo 0xFFFFFFFFFFFFFFFF +# RELOC2-NEXT: 0x100A R_X86_64_SIZE32 foo 0x1 +# RELOC2-NEXT: 0x301A R_X86_64_SIZE64 foo 0xFFFFFFFFFFFFFFFF +# RELOC2-NEXT: 0x3022 R_X86_64_SIZE64 foo 0x1 +# RELOC2-NEXT: } +# RELOC2-NEXT: ] + +# DATA2: section '.data': +# DATA2-NEXT: 00000000 00000000 00000000 00000000 +# DATA2-NEXT: 00000000 00000000 00000000 00000000 +# DATA2-NEXT: 00000000 00000000 00001900 00000000 +# DATA2-NEXT: 00001b00 00000000 0000 + +# DISASM2: _start: +# DISASM2-NEXT: 1000: movl 0, %eax +# DISASM2-NEXT: 1007: movl 0, %eax +# DISASM2-NEXT: 100e: movl 25, %eax +# DISASM2-NEXT: 1015: movl 27, %eax + +.data +.global foo, foohidden +.hidden foohidden +.type foo,%object +.size foo,26 +.type foohidden,%object +.size foohidden,26 +foo: +foohidden: +.zero 26 + + // R_X86_64_SIZE64: + .quad foo@SIZE-1 + .quad foo@SIZE+1 + .quad foohidden@SIZE-1 + .quad foohidden@SIZE+1 + +.section test,"axw" +.globl _start +_start: + // R_X86_64_SIZE32: + movl foo@SIZE-1,%eax + movl foo@SIZE+1,%eax + movl foohidden@SIZE-1,%eax + movl foohidden@SIZE+1,%eax diff --git a/lld/test/ELF/x86-64-tls-ie-opt-local.s b/lld/test/ELF/x86-64-tls-ie-opt-local.s index 2dee78e37c9..9b0ae6e3757 100644 --- a/lld/test/ELF/x86-64-tls-ie-opt-local.s +++ b/lld/test/ELF/x86-64-tls-ie-opt-local.s @@ -10,18 +10,18 @@ // DISASM: Disassembly of section .text: // DISASM-EMPTY: // DISASM-NEXT: _start: -// DISASM-NEXT: 201000: 48 c7 c0 f8 ff ff ff movq $-8, %rax -// DISASM-NEXT: 201007: 49 c7 c7 f8 ff ff ff movq $-8, %r15 -// DISASM-NEXT: 20100e: 48 8d 80 f8 ff ff ff leaq -8(%rax), %rax -// DISASM-NEXT: 201015: 4d 8d bf f8 ff ff ff leaq -8(%r15), %r15 -// DISASM-NEXT: 20101c: 48 81 c4 f8 ff ff ff addq $-8, %rsp -// DISASM-NEXT: 201023: 49 81 c4 f8 ff ff ff addq $-8, %r12 -// DISASM-NEXT: 20102a: 48 c7 c0 fc ff ff ff movq $-4, %rax -// DISASM-NEXT: 201031: 49 c7 c7 fc ff ff ff movq $-4, %r15 -// DISASM-NEXT: 201038: 48 8d 80 fc ff ff ff leaq -4(%rax), %rax -// DISASM-NEXT: 20103f: 4d 8d bf fc ff ff ff leaq -4(%r15), %r15 -// DISASM-NEXT: 201046: 48 81 c4 fc ff ff ff addq $-4, %rsp -// DISASM-NEXT: 20104d: 49 81 c4 fc ff ff ff addq $-4, %r12 +// DISASM-NEXT: movq $-8, %rax +// DISASM-NEXT: movq $-8, %r15 +// DISASM-NEXT: leaq -8(%rax), %rax +// DISASM-NEXT: leaq -8(%r15), %r15 +// DISASM-NEXT: addq $-8, %rsp +// DISASM-NEXT: addq $-8, %r12 +// DISASM-NEXT: movq $-4, %rax +// DISASM-NEXT: movq $-4, %r15 +// DISASM-NEXT: leaq -4(%rax), %rax +// DISASM-NEXT: leaq -4(%r15), %r15 +// DISASM-NEXT: addq $-4, %rsp +// DISASM-NEXT: addq $-4, %r12 .section .tbss,"awT",@nobits diff --git a/lld/test/ELF/tls-got.s b/lld/test/ELF/x86-64-tls-ie.s index d05208bae3c..d05208bae3c 100644 --- a/lld/test/ELF/tls-got.s +++ b/lld/test/ELF/x86-64-tls-ie.s |

