diff --git a/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp b/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp --- a/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp +++ b/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp @@ -216,8 +216,8 @@ (MI->FunctionPrefix + "_del").str(), InitTypes, InitArgs, /*VersionCheckName=*/StringRef(), /*Weak=*/ClWeakCallbacks) .first; - Constant *CtorData = nullptr; - Constant *DtorData = nullptr; + Constant *CtorComdatKey = nullptr; + Constant *DtorComdatKey = nullptr; if (TargetTriple.supportsCOMDAT()) { // Use COMDAT to deduplicate constructor/destructor function. The COMDAT // key needs to be a non-local linkage. @@ -225,11 +225,14 @@ Dtor->setComdat(Mod.getOrInsertComdat(Dtor->getName())); Ctor->setLinkage(GlobalValue::ExternalLinkage); Dtor->setLinkage(GlobalValue::ExternalLinkage); - CtorData = Ctor; - DtorData = Dtor; + // DSOs should _not_ call another constructor/destructor! + Ctor->setVisibility(GlobalValue::HiddenVisibility); + Dtor->setVisibility(GlobalValue::HiddenVisibility); + CtorComdatKey = Ctor; + DtorComdatKey = Dtor; } - appendToGlobalCtors(Mod, Ctor, kCtorDtorPriority, CtorData); - appendToGlobalDtors(Mod, Dtor, kCtorDtorPriority, DtorData); + appendToGlobalCtors(Mod, Ctor, kCtorDtorPriority, CtorComdatKey); + appendToGlobalDtors(Mod, Dtor, kCtorDtorPriority, DtorComdatKey); } return true; diff --git a/llvm/test/Instrumentation/SanitizerBinaryMetadata/ctor.ll b/llvm/test/Instrumentation/SanitizerBinaryMetadata/ctor.ll --- a/llvm/test/Instrumentation/SanitizerBinaryMetadata/ctor.ll +++ b/llvm/test/Instrumentation/SanitizerBinaryMetadata/ctor.ll @@ -9,8 +9,8 @@ ; CHECK: @llvm.global_ctors = appending global [2 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 2, ptr @__sanitizer_metadata_atomics.module_ctor, ptr @__sanitizer_metadata_atomics.module_ctor }, { i32, ptr, ptr } { i32 2, ptr @__sanitizer_metadata_covered.module_ctor, ptr @__sanitizer_metadata_covered.module_ctor }] ; CHECK: @llvm.global_dtors = appending global [2 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 2, ptr @__sanitizer_metadata_atomics.module_dtor, ptr @__sanitizer_metadata_atomics.module_dtor }, { i32, ptr, ptr } { i32 2, ptr @__sanitizer_metadata_covered.module_dtor, ptr @__sanitizer_metadata_covered.module_dtor }] -; CHECK: define dso_local void @__sanitizer_metadata_covered.module_ctor() #1 comdat { -; CHECK: define dso_local void @__sanitizer_metadata_covered.module_dtor() #1 comdat { +; CHECK: define hidden void @__sanitizer_metadata_covered.module_ctor() #1 comdat { +; CHECK: define hidden void @__sanitizer_metadata_covered.module_dtor() #1 comdat { target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu"