diff options
author | Pirama Arumuga Nainar <pirama@google.com> | 2021-10-15 11:56:16 -0700 |
---|---|---|
committer | Pirama Arumuga Nainar <pirama@google.com> | 2021-10-15 11:56:16 -0700 |
commit | 69708477be258dbea2711f6a35c02685659b49d3 (patch) | |
tree | 32ff14218c788ba902866df24a61728a1bd75dae /clang/lib/Lex/ModuleMap.cpp | |
parent | 659a08399a78c8807218558767f5d574a904ed30 (diff) | |
download | llvm-69708477be258dbea2711f6a35c02685659b49d3.zip llvm-69708477be258dbea2711f6a35c02685659b49d3.tar.gz llvm-69708477be258dbea2711f6a35c02685659b49d3.tar.bz2 |
[compiler-rt/profile] Hide __llvm_profile_raw_version
Hide __llvm_profile_raw_version so as not to resolve reference from a
dependent shared object. Since libclang_rt.profile is added later in
the command line, a definition of __llvm_profile_raw_version is not
included if it is provided from an earlier object, e.g. from a shared
dependency.
This causes an extra dependence edge where if libA.so depends on libB.so
and both are coverage-instrumented, libA.so uses libB.so's definition of
__llvm_profile_raw_version. This leads to a runtime link failure if the
libB.so available at runtime does not provide this symbol (but provides
the other dependent symbols). Such a scenario can occur in Android's
mainline modules.
E.g.:
ld -o libB.so libclang_rt.profile-x86_64.a
ld -o libA.so -l B libclang_rt.profile-x86_64.a
libB.so has a global definition of __llvm_profile_raw_version. libA.so
uses libB.so's definition of __llvm_profile_raw_version. At runtime,
libB.so may not be coverage-instrumented (i.e. not export
__llvm_profile_raw_version) so runtime linking of libA.so will fail.
Marking this symbol as hidden forces each binary to use the definition
of __llvm_profile_raw_version from libclang_rt.profile.
Differential Revision: https://reviews.llvm.org/D111759
Diffstat (limited to 'clang/lib/Lex/ModuleMap.cpp')
0 files changed, 0 insertions, 0 deletions