| # REQUIRES: x86 |
| ## Test that vna_flags is set to VER_FLG_WEAK if all references to a version |
| ## are weak. This allows rtld to continue with a warning instead of erroring |
| ## when the required version is not found. |
| |
| # RUN: rm -rf %t && split-file %s %t && cd %t |
| # RUN: llvm-mc -filetype=obj -triple=x86_64 ref.s -o ref.o |
| # RUN: llvm-mc -filetype=obj -triple=x86_64 refw.s -o refw.o |
| # RUN: llvm-mc -filetype=obj -triple=x86_64 refw-gh.s -o refw-gh.o |
| # RUN: llvm-mc -filetype=obj -triple=x86_64 def.s -o def.o |
| # RUN: ld.lld -shared --soname=def.so --version-script=ver def.o -o def.so |
| |
| ## All references are weak; vna_flags should be VER_FLG_WEAK. |
| # RUN: ld.lld -shared refw-gh.o def.so -o weakref.so |
| # RUN: llvm-readelf -V weakref.so | FileCheck %s --check-prefix=WEAK1 |
| |
| # WEAK1: Version needs section '.gnu.version_r' contains 1 entries: |
| # WEAK1-NEXT: Addr: |
| # WEAK1-NEXT: 0x0000: Version: 1 File: def.so Cnt: 2 |
| # WEAK1-NEXT: 0x0010: Name: v1 Flags: WEAK Version: 3 |
| # WEAK1-NEXT: 0x0020: Name: v2 Flags: WEAK Version: 2 |
| |
| ## All references are weak (from two object files); vna_flags should be VER_FLG_WEAK. |
| # RUN: ld.lld -shared refw.o refw-gh.o def.so -o weakref2.so |
| # RUN: llvm-readelf -V weakref2.so | FileCheck %s --check-prefix=WEAK2 |
| |
| # WEAK2: Version needs section '.gnu.version_r' contains 1 entries: |
| # WEAK2-NEXT: Addr: |
| # WEAK2-NEXT: 0x0000: Version: 1 File: def.so Cnt: 2 |
| # WEAK2-NEXT: 0x0010: Name: v1 Flags: WEAK Version: 2 |
| # WEAK2-NEXT: 0x0020: Name: v2 Flags: WEAK Version: 3 |
| |
| ## v1 has mixed references (none); v2 has weak references (WEAK). |
| # RUN: ld.lld -shared ref.o refw-gh.o def.so -o mixedref.so |
| # RUN: llvm-readelf -V mixedref.so | FileCheck %s --check-prefix=MIXED |
| |
| # MIXED: Version needs section '.gnu.version_r' contains 1 entries: |
| # MIXED-NEXT: Addr: |
| # MIXED-NEXT: 0x0000: Version: 1 File: def.so Cnt: 2 |
| # MIXED-NEXT: 0x0010: Name: v1 Flags: none Version: 2 |
| # MIXED-NEXT: 0x0020: Name: v2 Flags: WEAK Version: 3 |
| |
| ## All references are non-weak; vna_flags should be 0 (none). |
| # RUN: ld.lld -shared ref.o def.so -o strongref.so |
| # RUN: llvm-readelf -V strongref.so | FileCheck %s --check-prefix=STRONG |
| |
| # STRONG: Version needs section '.gnu.version_r' contains 1 entries: |
| # STRONG-NEXT: Addr: |
| # STRONG-NEXT: 0x0000: Version: 1 File: def.so Cnt: 1 |
| # STRONG-NEXT: 0x0010: Name: v1 Flags: none Version: 2 |
| # STRONG-EMPTY: |
| |
| ## --as-needed: weak reference doesn't pull in def.so, so no version needs. |
| # RUN: ld.lld -shared refw.o --as-needed def.so -o asneeded.so |
| # RUN: llvm-readelf -V asneeded.so | count 0 |
| |
| #--- ver |
| v1 { f; g; }; |
| v2 { h; }; |
| |
| #--- ref.s |
| .globl f |
| call f |
| |
| #--- refw.s |
| .weak f |
| call f |
| |
| #--- refw-gh.s |
| .weak g, h |
| .symver g, g@@@v1 |
| call g |
| call h |
| |
| #--- def.s |
| .globl f, g, h |
| f: |
| g: |
| h: |
| ret |