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. The visiblity is unchanged for Apple platforms where its presence is checked by the TAPI tool. Reviewed By: MaskRay, phosek, davidxl Differential Revision: https://reviews.llvm.org/D111759
27 lines
986 B
C
27 lines
986 B
C
/*===- InstrProfilingVersionVar.c - profile version variable setup -------===*\
|
|
|*
|
|
|* Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
|* See https://llvm.org/LICENSE.txt for license information.
|
|
|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
|*
|
|
\*===----------------------------------------------------------------------===*/
|
|
|
|
#include "InstrProfiling.h"
|
|
|
|
/* uint64 __llvm_profile_raw_version
|
|
*
|
|
* The runtime should only provide its own definition of this symbol when the
|
|
* user has not specified one. Set this up by moving the runtime's copy of this
|
|
* symbol to an object file within the archive.
|
|
*
|
|
* Hide this symbol everywhere except Apple platforms, where its presence is
|
|
* checked by the TAPI tool.
|
|
*/
|
|
#if !defined(__APPLE__)
|
|
#define VERSION_VAR_VISIBILITY COMPILER_RT_VISIBILITY
|
|
#else
|
|
#define VERSION_VAR_VISIBILITY
|
|
#endif
|
|
VERSION_VAR_VISIBILITY COMPILER_RT_WEAK uint64_t INSTR_PROF_RAW_VERSION_VAR =
|
|
INSTR_PROF_RAW_VERSION;
|