When there are multiple catch-all patterns (i.e. a single `*`), GNU ld and gold select the last pattern. Match their behavior. This change was inspired by a correction made by Michael Kerrisk to a blog post I wrote at https://maskray.me/blog/2020-11-26-all-about-symbol-versioning , following the current lld rules. Note: GNU ld prefers global: patterns to local: patterns, which might seem awkward (https://www.airs.com/blog/archives/300). gold doesn't follow this behavior, and we do not either.
27 lines
982 B
ArmAsm
27 lines
982 B
ArmAsm
# REQUIRES: x86
|
|
# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o
|
|
|
|
# RUN: echo 'foo { foo*; }; bar { *; };' > %t.ver
|
|
# RUN: ld.lld --version-script %t.ver %t.o -shared -o %t.so --fatal-warnings
|
|
# RUN: llvm-readelf --dyn-syms %t.so | FileCheck --check-prefix=FOO %s
|
|
|
|
# RUN: echo 'foo { foo*; }; bar { f*; };' > %t.ver
|
|
# RUN: ld.lld --version-script %t.ver %t.o -shared -o %t.so --fatal-warnings
|
|
# RUN: llvm-readelf --dyn-syms %t.so | FileCheck --check-prefix=BAR %s
|
|
|
|
# RUN: echo 'bar1 { *; }; bar2 { *; };' > %t2.ver
|
|
# RUN: ld.lld --version-script %t2.ver %t.o -shared -o %t2.so --fatal-warnings
|
|
# RUN: llvm-readelf --dyn-syms %t2.so | FileCheck --check-prefix=BAR2 %s
|
|
|
|
## If both a non-* glob and a * match, non-* wins.
|
|
## This is GNU linkers' behavior. We don't feel strongly this should be supported.
|
|
# FOO: GLOBAL DEFAULT 7 foo@@foo
|
|
|
|
# BAR: GLOBAL DEFAULT 7 foo@@bar
|
|
|
|
## When there are multiple * patterns, the last wins.
|
|
# BAR2: GLOBAL DEFAULT 7 foo@@bar2
|
|
|
|
.globl foo
|
|
foo:
|