2019-07-02 19:37:21 +08:00
|
|
|
# REQUIRES: x86
|
|
|
|
# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o
|
|
|
|
# RUN: ld.lld -shared %t.o -o %t.so
|
2016-04-26 21:50:46 +08:00
|
|
|
|
2019-07-02 19:37:21 +08:00
|
|
|
# RUN: echo '.data; .weak foo; .quad foo' | llvm-mc -filetype=obj -triple=x86_64 - -o %t1.o
|
|
|
|
# RUN: echo '.data; .quad foo' | llvm-mc -filetype=obj -triple=x86_64 - -o %t2.o
|
2019-07-04 19:10:45 +08:00
|
|
|
# RUN: ld.lld -shared %t2.o -o %t2.so
|
2016-04-26 21:50:46 +08:00
|
|
|
|
2019-07-02 19:37:21 +08:00
|
|
|
## If the first undefined reference is weak, the binding changes to
|
|
|
|
## STB_WEAK.
|
|
|
|
# RUN: ld.lld %t1.o %t.so -o %t
|
|
|
|
# RUN: llvm-readelf --dyn-syms %t | FileCheck --check-prefix=WEAK %s
|
|
|
|
# RUN: ld.lld %t.so %t1.o -o %t
|
|
|
|
# RUN: llvm-readelf --dyn-syms %t | FileCheck --check-prefix=WEAK %s
|
|
|
|
|
|
|
|
## The binding remains STB_WEAK if there is no STB_GLOBAL undefined reference.
|
|
|
|
# RUN: ld.lld %t1.o %t.so %t1.o -o %t
|
|
|
|
# RUN: llvm-readelf --dyn-syms %t | FileCheck --check-prefix=WEAK %s
|
|
|
|
# RUN: ld.lld %t.so %t1.o %t1.o -o %t
|
|
|
|
# RUN: llvm-readelf --dyn-syms %t | FileCheck --check-prefix=WEAK %s
|
|
|
|
|
|
|
|
## The binding changes back to STB_GLOBAL if there is a STB_GLOBAL undefined reference.
|
|
|
|
# RUN: ld.lld %t1.o %t.so %t2.o -o %t
|
|
|
|
# RUN: llvm-readelf --dyn-syms %t | FileCheck --check-prefix=GLOBAL %s
|
|
|
|
# RUN: ld.lld %t2.o %t.so %t1.o -o %t
|
|
|
|
# RUN: llvm-readelf --dyn-syms %t | FileCheck --check-prefix=GLOBAL %s
|
|
|
|
|
2019-07-04 18:38:04 +08:00
|
|
|
## Check the binding (weak) is not affected by the STB_GLOBAL undefined
|
|
|
|
## reference in %t2.so
|
|
|
|
# RUN: ld.lld %t1.o %t2.so -o %t
|
|
|
|
# RUN: llvm-readelf --dyn-syms %t | FileCheck --check-prefix=WEAK %s
|
|
|
|
|
[ELF] Make binding (weak or non-weak) logic consistent for Undefined and SharedSymbol
This is a case missed by D64136. If %t1.o has a weak reference on foo,
and %t2.so has a non-weak reference on foo:
```
0. ld.lld %t1.o %t2.so # ok; STB_WEAK; accepted since D64136
1. ld.lld %t2.so %t1.o # undefined symbol: foo; STB_GLOBAL
2. gold %t1.o %t2.so # ok; STB_WEAK
3. gold %t2.so %t1.o # undefined reference to 'foo'; STB_GLOBAL
4. ld.bfd %t1.o %t2.so # undefined reference to `foo'; STB_WEAK
5. ld.bfd %t2.so %t1.o # undefined reference to `foo'; STB_WEAK
```
It can be argued that in both cases, the binding of the undefined foo
should be set to STB_WEAK, because the binding should not be affected by
referenced from shared objects.
--allow-shlib-undefined doesn't suppress errors (3,4,5), but -shared or
--noinhibit-exec allows ld.bfd/gold to produce a binary:
```
3. gold -shared %t2.so %t1.o # ok; STB_GLOBAL
4. ld.bfd -shared %t2.so %t1.o # ok; STB_WEAK
5. ld.bfd -shared %t1.o %t1.o # ok; STB_WEAK
```
If %t2.so has DT_NEEDED entries, ld.bfd will load them (lld/gold don't
have the behavior). If one of the DSO defines foo and it is in the
link-time search path (e.g. DT_NEEDED entry is an absolute path, via
-rpath=, via -rpath-link=, etc),
`ld.bfd %t1.o %t2.so` and `ld.bfd %t1.o %t2.so` will not error.
In this patch, we make Undefined and SharedSymbol share the same binding
computing logic. Case 1 will be allowed:
```
0. ld.lld %t1.o %t2.so # ok; STB_WEAK; accepted since D64136
1. ld.lld %t2.so %t1.o # ok; STB_WEAK; changed by this patch
```
In the future, we can explore the option that turns both (0,1) into
errors if --no-allow-shlib-undefined (default when linking an
executable) is in action.
Reviewed By: ruiu
Differential Revision: https://reviews.llvm.org/D65584
llvm-svn: 368038
2019-08-06 22:03:45 +08:00
|
|
|
# RUN: ld.lld %t2.so %t1.o -o %t
|
|
|
|
# RUN: llvm-readelf --dyn-syms %t | FileCheck --check-prefix=WEAK %s
|
|
|
|
|
2019-07-02 19:37:21 +08:00
|
|
|
# WEAK: NOTYPE WEAK DEFAULT UND foo
|
|
|
|
# GLOBAL: NOTYPE GLOBAL DEFAULT UND foo
|
|
|
|
|
|
|
|
.globl foo
|
|
|
|
foo:
|