brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.4 KiB · d05fcc2 Raw
233 lines · plain
1# REQUIRES: x862## Test symbol resolution related to .symver produced symbols in object files.3 4# RUN: split-file %s %t5# RUN: llvm-mc -filetype=obj -triple=x86_64 %t/ref.s -o %t/ref.o6# RUN: llvm-mc -filetype=obj -triple=x86_64 %t/ref1.s -o %t/ref1.o7# RUN: llvm-mc -filetype=obj -triple=x86_64 %t/ref1p.s -o %t/ref1p.o8# RUN: llvm-mc -filetype=obj -triple=x86_64 %t/ref1w.s -o %t/ref1w.o9# RUN: llvm-mc -filetype=obj -triple=x86_64 %t/def1.s -o %t/def1.o10# RUN: llvm-mc -filetype=obj -triple=x86_64 %t/def1w.s -o %t/def1w.o11# RUN: llvm-mc -filetype=obj -triple=x86_64 %t/hid1.s -o %t/hid1.o12# RUN: llvm-mc -filetype=obj -triple=x86_64 %t/hid1w.s -o %t/hid1w.o13# RUN: llvm-mc -filetype=obj -triple=x86_64 %t/def2.s -o %t/def2.o14# RUN: llvm-mc -filetype=obj -triple=x86_64 %t/wrap.s -o %t/wrap.o15# RUN: llvm-mc -filetype=obj -triple=x86_64 %t/wrap1.s -o %t/wrap1.o16# RUN: ld.lld -shared --soname=def1.so --version-script=%t/ver %t/def1.o -o %t/def1.so17# RUN: ld.lld -shared --soname=hid1.so --version-script=%t/ver %t/hid1.o -o %t/hid1.so18 19## Report a duplicate definition error for foo@v1 and foo@@v1.20# RUN: not ld.lld -shared --version-script=%t/ver %t/def1.o %t/hid1.o -o /dev/null 2>&1 | \21# RUN:   FileCheck %s --check-prefix=DUP22# RUN: ld.lld -shared --version-script=%t/ver %t/def1w.o %t/hid1.o -o /dev/null23# RUN: ld.lld -shared --version-script=%t/ver %t/def1.o %t/hid1w.o -o /dev/null24# RUN: ld.lld -shared --version-script=%t/ver %t/def1w.o %t/hid1w.o -o /dev/null25 26# DUP:      error: duplicate symbol: foo@@v127# DUP-NEXT: >>> defined at {{.*}}/def1{{w?}}.o:(.text+0x0)28# DUP-NEXT: >>> defined at {{.*}}/hid1.o:(.text+0x0)29 30## Protected undefined foo@v1 makes the output symbol protected.31# RUN: ld.lld -shared --version-script=%t/ver %t/ref1p.o %t/def1.o -o %t.protected32# RUN: llvm-readelf --dyn-syms %t.protected | FileCheck %s --check-prefix=PROTECTED33 34# PROTECTED:  NOTYPE GLOBAL PROTECTED [[#]] foo@@v135 36## foo@@v1 resolves both undefined foo and foo@v1. There is one single definition.37## Note: set soname so that the name string referenced by .gnu.version_d is fixed.38# RUN: ld.lld -shared --soname=t --version-script=%t/ver %t/ref.o %t/ref1.o %t/def1.o -o %t139# RUN: llvm-readelf -r --dyn-syms %t1 | FileCheck %s40 41# CHECK:       Relocation section '.rela.plt' at offset {{.*}} contains 1 entries:42# CHECK-NEXT:  {{.*}} Type               {{.*}}43# CHECK-NEXT:  {{.*}} R_X86_64_JUMP_SLOT {{.*}} foo@@v1 + 044 45# CHECK:       1: {{.*}} NOTYPE GLOBAL DEFAULT [[#]] foo@@v146# CHECK-EMPTY:47 48## foo@@v2 does not resolve undefined foo@v1.49# RUN: not ld.lld -shared --soname=t --version-script=%t/ver %t/ref.o %t/ref1.o %t/def2.o \50# RUN:   -o /dev/null 2>&1 | FileCheck %s --check-prefix=UNDEF51 52# UNDEF: error: undefined symbol: foo@v153 54## An undefined weak unversioned symbol is not errored. However, an undefined55## weak versioned symbol should still be errored because we cannot construct56## a Verneed entry (Verneed::vn_file is unavailable).57# RUN: not ld.lld -shared --version-script=%t/ver %t/ref1w.o -o /dev/null 2>&1 | \58# RUN:   FileCheck %s --check-prefix=UNDEF59 60## foo@@v2 resolves undefined foo while foo@v1 resolves undefined foo@v1.61# RUN: ld.lld -shared --soname=t --version-script=%t/ver %t/ref.o %t/ref1.o %t/hid1.o %t/def2.o -o %t362# RUN: llvm-readelf -r --dyn-syms %t3 | FileCheck %s --check-prefix=CHECK363# RUN: llvm-objdump -d --no-show-raw-insn %t3 | FileCheck %s --check-prefix=DIS364 65# CHECK3:       00000000000034a8 {{.*}} R_X86_64_JUMP_SLOT {{.*}} foo@@v2 + 066# CHECK3-NEXT:  00000000000034b0 {{.*}} R_X86_64_JUMP_SLOT {{.*}} foo@v1 + 067 68# CHECK3:       1: {{.*}} NOTYPE GLOBAL DEFAULT [[#]] foo@@v269# CHECK3-NEXT:  2: {{.*}} NOTYPE GLOBAL DEFAULT [[#]] foo@v170# CHECK3-NEXT:  3: {{.*}} NOTYPE GLOBAL DEFAULT [[#]] foo_v171# CHECK3-EMPTY:72 73# DIS3-LABEL: <.text>:74# DIS3-NEXT:    callq 0x1380 <foo@plt>75# DIS3-COUNT-3: int376# DIS3-NEXT:    callq 0x1390 <foo@plt>77# DIS3-LABEL: <foo@plt>:78# DIS3-NEXT:    jmpq *{{.*}}(%rip) # 0x34a879# DIS3-LABEL: <foo@plt>:80# DIS3-NEXT:    jmpq *{{.*}}(%rip) # 0x34b081 82## Then, test the interaction with versioned definitions in shared objects.83 84## TODO Both foo and foo@v1 are undefined. Ideally we should not create two .dynsym entries.85# RUN: ld.lld -shared --soname=t --version-script=%t/ver %t/ref.o %t/ref1.o %t/def1.so -o %t486# RUN: llvm-readelf --dyn-syms %t4 | FileCheck %s --check-prefix=CHECK487 88# CHECK4:       1: {{.*}} NOTYPE GLOBAL DEFAULT UND   foo@v189# CHECK4-NEXT:  2: {{.*}} NOTYPE GLOBAL DEFAULT UND   foo@v190# CHECK4-EMPTY:91 92## hid1.so resolves undefined foo@v1. foo is undefined.93# RUN: ld.lld -shared --soname=t --version-script=%t/ver %t/ref.o %t/ref1.o %t/hid1.so -o %t594# RUN: llvm-readelf --dyn-syms %t5 | FileCheck %s --check-prefix=CHECK595 96# CHECK5:       1: {{.*}} NOTYPE GLOBAL DEFAULT UND   foo{{$}}97# CHECK5-NEXT:  2: {{.*}} NOTYPE GLOBAL DEFAULT UND   foo@v198# CHECK5-EMPTY:99 100## Test the interaction with --wrap.101 102## The reference from ref.o is redirected. The reference from ref1.o is not.103# RUN: ld.lld -shared --soname=t --version-script=%t/ver --wrap=foo %t/ref.o %t/ref1.o %t/def1.o %t/wrap.o -o %t.w1104# RUN: llvm-readobj -r %t.w1 | FileCheck %s --check-prefix=W1REL105# RUN: llvm-objdump -d --no-show-raw-insn %t.w1 | FileCheck %s --check-prefix=W1DIS106 107# W1REL:      .rela.plt {108# W1REL-NEXT:   R_X86_64_JUMP_SLOT foo@@v1 0x0109# W1REL-NEXT:   R_X86_64_JUMP_SLOT __wrap_foo 0x0110# W1REL-NEXT: }111 112# W1DIS-LABEL: <.text>:113# W1DIS-NEXT:    callq {{.*}} <__wrap_foo@plt>114# W1DIS-COUNT-3: int3115# W1DIS-NEXT:    callq {{.*}} <foo@plt>116 117## The reference from ref.o is redirected. The reference from ref1.o is not.118## Note: this case demonstrates the typical behavior wrapping a glibc libc.so definition.119# RUN: ld.lld -shared --soname=t --version-script=%t/ver --wrap=foo %t/ref.o %t/ref1.o %t/def1.so %t/wrap.o -o %t.w2120# RUN: llvm-readobj -r %t.w2 | FileCheck %s --check-prefix=W2REL121# RUN: llvm-objdump -d --no-show-raw-insn %t.w2 | FileCheck %s --check-prefix=W2DIS122 123# W2REL:      .rela.plt {124# W2REL-NEXT:   R_X86_64_JUMP_SLOT foo@v1 0x0125# W2REL-NEXT:   R_X86_64_JUMP_SLOT __wrap_foo 0x0126# W2REL-NEXT: }127 128# W2DIS-LABEL: <.text>:129# W2DIS-NEXT:    callq {{.*}} <__wrap_foo@plt>130# W2DIS-COUNT-3: int3131# W2DIS-NEXT:    callq {{.*}} <foo@plt>132 133## Test --wrap on @ and @@.134 135## Error because __wrap_foo@v1 is not defined.136## Note: GNU ld errors "no symbol version section for versioned symbol `__wrap_foo@v1'".137# RUN: not ld.lld -shared --soname=t --version-script=%t/ver --wrap=foo@v1 %t/ref.o %t/ref1.o %t/def1.o %t/wrap.o \138# RUN:   -o /dev/null 2>&1 | FileCheck %s --check-prefix=W3139 140# W3:      error: undefined symbol: __wrap_foo@v1141# W3-NEXT: >>> referenced by {{.*}}ref1.o:(.text+0x1)142# W3-NEXT: >>> did you mean: __wrap_foo{{$}}143# W3-NEXT: >>> defined in: {{.*}}wrap.o144 145## foo@v1 is correctly wrapped.146# RUN: ld.lld -shared --soname=t --version-script=%t/ver --wrap=foo@v1 %t/ref.o %t/ref1.o %t/def1.o %t/wrap1.o -o %t.w4147# RUN: llvm-readobj -r %t.w4 | FileCheck %s --check-prefix=W4REL148# RUN: llvm-objdump -d --no-show-raw-insn %t.w4 | FileCheck %s --check-prefix=W4DIS149 150# W4REL:      .rela.plt {151# W4REL-NEXT:   R_X86_64_JUMP_SLOT foo@@v1 0x0152# W4REL-NEXT:   R_X86_64_JUMP_SLOT __wrap_foo@v1 0x0153# W4REL-NEXT: }154 155# W4DIS-LABEL: <.text>:156# W4DIS-NEXT:    callq {{.*}} <foo@plt>157# W4DIS-COUNT-3: int3158# W4DIS-NEXT:    callq {{.*}} <__wrap_foo@plt>159 160## Note: GNU ld errors "no symbol version section for versioned symbol `__wrap_foo@@v1'".161# RUN: ld.lld -shared --soname=t --version-script=%t/ver --wrap=foo@@v1 %t/ref.o %t/ref1.o %t/def1.o %t/wrap.o -o %t.w5162# RUN: llvm-readobj -r %t.w5 | FileCheck %s --check-prefix=W5REL163# RUN: llvm-objdump -d --no-show-raw-insn %t.w5 | FileCheck %s --check-prefix=W5DIS164 165# W5REL:      .rela.plt {166# W5REL-NEXT:   R_X86_64_JUMP_SLOT foo@@v1 0x0167# W5REL-NEXT: }168 169# W5DIS-LABEL: <.text>:170# W5DIS-NEXT:    callq 0x1350 <foo@plt>171# W5DIS-COUNT-3: int3172# W5DIS-NEXT:    callq 0x1350 <foo@plt>173 174#--- ver175v1 {};176v2 {};177 178#--- ref.s179call foo180 181#--- ref1.s182.symver foo, foo@@@v1183call foo184 185#--- ref1p.s186.protected foo187.symver foo, foo@@@v1188call foo189 190#--- ref1w.s191.weak foo192.symver foo, foo@@@v1193call foo194 195#--- def1.s196.globl foo197.symver foo, foo@@@v1198foo:199 200#--- def1w.s201.weak foo202.symver foo, foo@@@v1203foo:204 205#--- hid1.s206.globl foo_v1207.symver foo_v1, foo@v1208foo_v1:209  ret210 211#--- hid1w.s212.weak foo_v1213.symver foo_v1, foo@v1214foo_v1:215  ret216 217#--- def2.s218.globl foo219.symver foo, foo@@@v2220foo:221  ret222 223#--- wrap.s224.globl __wrap_foo225__wrap_foo:226  hlt227 228#--- wrap1.s229.globl __wrap_foo_v1230.symver __wrap_foo_v1, __wrap_foo@v1231__wrap_foo_v1:232  int3233