Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[ELF] Do not error for missing version when symbol has local version.
If a symbol with an undefined version in a DSO is not going to be exported into the dynamic symbol table then do not give an error message for the missing version. This can happen with the --exclude-libs option which implicitly gives all symbols in a static library the local version. This matches the behavior of ld.gold and is exploited by the Bionic dynamic linker on Arm. Differential Revision: https://reviews.llvm.org/D43126 llvm-svn: 332224
- Loading branch information
Showing
3 changed files
with
43 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
.text | ||
.globl func_impl | ||
func_impl: | ||
ret | ||
.globl func_impl2 | ||
func_impl2: | ||
ret | ||
.symver func_impl, func@@VER2 | ||
.symver func_impl2, func@VER |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
// REQUIRES: x86 | ||
// RUN: llvm-mc %p/Inputs/versiondef.s -o %t.o -filetype=obj -triple=x86_64-pc-linux | ||
// RUN: llvm-ar -r %t.a %t.o | ||
// RUN: llvm-mc %s -o %t2.o -filetype=obj -triple=x86_64-pc-linux | ||
// RUN: ld.lld %t2.o %t.a --shared --exclude-libs ALL -o %t.so | ||
// RUN: llvm-readobj -symbols %t.so | FileCheck %s | ||
// RUN: llvm-readobj -dyn-symbols %t.so | FileCheck -check-prefix CHECK-DYN %s | ||
// RUN: not ld.lld %t2.o %t.a --shared -o %t.so 2>&1 | FileCheck -check-prefix=CHECK-ERR %s | ||
|
||
// Test that we do not give an error message for undefined versions when the | ||
// symbol is not exported to the dynamic symbol table. | ||
|
||
// CHECK: Name: func | ||
// CHECK-NEXT: Value: | ||
// CHECK-NEXT: Size: | ||
// CHECK-NEXT: Binding: Local (0x0) | ||
|
||
// CHECK-DYN-NOT: func | ||
|
||
// CHECK-ERR: symbol func@@VER2 has undefined version VER2 | ||
// CHECK-ERR-NEXT: symbol func@VER has undefined version VER | ||
|
||
.text | ||
.globl _start | ||
.globl func | ||
_start: | ||
ret | ||
|
||
.data | ||
.quad func |