summaryrefslogtreecommitdiff
path: root/src/third_party/SConscript
diff options
context:
space:
mode:
authorRyan Egesdahl <ryan.egesdahl@mongodb.com>2020-12-07 09:33:33 -0800
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-12-09 16:16:17 +0000
commitb0120ee8b2a50a62f0b92a259f32d82f4c1aea22 (patch)
treee854f47000b6ec2d01de250677d8fc946ade8889 /src/third_party/SConscript
parent51e3e36ac48cac80c920e5e418013fdb0a6747f2 (diff)
downloadmongo-b0120ee8b2a50a62f0b92a259f32d82f4c1aea22.tar.gz
SERVER-48291 Ensure runtime is dynamically linked in dynamic builds
Prior to this point, a dynamic build might have resulted in some runtime libraries being statically linked into shared objects and executables in cases where "shared" runtime libraries were actually linker scripts that linked static versions. This was the case with the MongoDB toolchain and some distro toolchains, including those installed as updated compiler versions in RHEL. The effect of having runtime libraries statically linked was that symbols from those libraries would end up scattered over the compiled objects, increasing object sizes and slowing down server startup. Now, whenever a dynamic build is selected, the user can choose whether to create "shim" runtime libraries that wrap the static ones. The default behavior remains as it was before, and dynamic runtime must be enabled in order to use it.
Diffstat (limited to 'src/third_party/SConscript')
-rw-r--r--src/third_party/SConscript124
1 files changed, 37 insertions, 87 deletions
diff --git a/src/third_party/SConscript b/src/third_party/SConscript
index 0c2674ff356..fbd884fbf1e 100644
--- a/src/third_party/SConscript
+++ b/src/third_party/SConscript
@@ -1,12 +1,8 @@
# -*- mode: python -*-
-import SCons
-
-from site_scons.mongo import insort_wrapper
import json
Import("env use_system_version_of_library usemozjs get_option")
-Import("get_option")
Import("use_libunwind")
Import("use_system_libunwind")
Import("use_vendored_libunwind")
@@ -85,59 +81,6 @@ def injectMozJS(thisEnv):
env.AddMethod(injectMozJS, 'InjectMozJS');
-def add_shim_allocator_hack(target, source, env):
-
- # If we allowed conftests to become dependent, any TryLink
- # that happened after we made the below modifications would
- # cause the configure steps to try to compile tcmalloc and any
- # of its dependencies. Oops!
- if any('conftest' in str(t) for t in target):
- return target, source
-
- # It is possible that 'env' isn't a unique
- # OverrideEnvironment, since if you didn't pass any kw args
- # into your builder call, you just reuse the env you were
- # called with. That could mean that we see the same
- # environment here multiple times. But that is really OK,
- # since the operation we are performing would be performed on
- # all of them anyway. The flag serves as a way to disable the
- # auto-injection for the handful of libraries where we must do
- # so to avoid forming a cycle.
- if not env.get('DISABLE_ALLOCATOR_SHIM_INJECTION', False):
- lds = env.get('LIBDEPS', [])
- shim_allocator = '$BUILD_DIR/third_party/shim_allocator'
- if shim_allocator not in lds:
- insort_wrapper(lds, shim_allocator)
- env['LIBDEPS'] = lds
-
- return target, source
-
-
-if get_option("build-tools") == "stable":
- for builder_name in ('Program', 'SharedLibrary', 'LoadableModule', 'StaticLibrary'):
- builder = env['BUILDERS'][builder_name]
- base_emitter = builder.emitter
- builder.emitter = SCons.Builder.ListEmitter([add_shim_allocator_hack, base_emitter])
-
-
-def shim_library(env, name, needs_link=False, *args, **kwargs):
- nodes = env.Library(
- target=f"shim_{name}" if name else name,
- source=[
- f"shim_{name}.cpp" if name else name,
- ],
- *args,
- **kwargs
- )
-
- for n in nodes:
- setattr(n.attributes, "needs_link", needs_link)
-
- return nodes
-
-env.AddMethod(shim_library, 'ShimLibrary')
-
-
if not use_system_version_of_library('tcmalloc'):
# GPerftools does this slightly differently than the others.
thirdPartyEnvironmentModifications['gperftools'] = {}
@@ -287,11 +230,11 @@ s2Env.SConscript('s2/SConscript', exports={'env' : s2Env})
if use_libunwind:
unwindEnv = env.Clone(
- LIBDEPS_GLOBAL=[
- dep
- for dep in env.get('LIBDEPS_GLOBAL', [])
- if not dep.endswith('shim_allocator')
- ]
+ LIBDEPS_NO_INHERIT=[
+ '$BUILD_DIR/shim_crt',
+ '$BUILD_DIR/shim_cxx',
+ '$BUILD_DIR/third_party/shim_allocator',
+ ],
)
if use_system_libunwind:
unwindEnv = unwindEnv.Clone(
@@ -319,11 +262,6 @@ if use_libunwind:
unwindEnv.ShimLibrary(
name="unwind",
- # We don't want the shim_allocator hack to apply to this library, since
- # otherwise we would create a loop, since tcmalloc might use us. That should
- # be OK, unless libunwind had static initializers that invoked malloc.
- # TODO: Remove when SERVER-48291 is merged into stable build tools
- DISABLE_ALLOCATOR_SHIM_INJECTION=True,
)
fmtEnv = env.Clone()
@@ -447,7 +385,9 @@ else:
'zlib' + zlibSuffix + '/zlib',
])
-zlibEnv.ShimLibrary(name="zlib")
+zlibEnv.ShimLibrary(
+ name="zlib",
+)
zstdEnv = env.Clone()
if use_system_version_of_library("zstd"):
@@ -464,7 +404,9 @@ else:
'zstandard' + zstdSuffix + '/zstd',
])
-zstdEnv.ShimLibrary(name="zstd")
+zstdEnv.ShimLibrary(
+ name="zstd",
+)
benchmarkEnv = env.Clone()
if use_system_version_of_library("google-benchmark"):
@@ -504,14 +446,16 @@ if "tom" in env["MONGO_CRYPTO"]:
'tomcrypt' + tomcryptSuffix + '/tomcrypt',
])
- tomcryptEnv.ShimLibrary(name="tomcrypt")
+ tomcryptEnv.ShimLibrary(
+ name="tomcrypt",
+ )
gperftoolsEnv = env.Clone(
- LIBDEPS_GLOBAL=[
- dep
- for dep in env.get('LIBDEPS_GLOBAL', [])
- if not dep.endswith('shim_allocator')
+ LIBDEPS_NO_INHERIT=[
+ '$BUILD_DIR/shim_crt',
+ '$BUILD_DIR/shim_cxx',
+ '$BUILD_DIR/third_party/shim_allocator',
],
)
if gperftoolsEnv['MONGO_ALLOCATOR'] in ["tcmalloc", "tcmalloc-experimental"]:
@@ -539,19 +483,17 @@ if gperftoolsEnv['MONGO_ALLOCATOR'] in ["tcmalloc", "tcmalloc-experimental"]:
gperftoolsEnv.ShimLibrary(
name="allocator",
- # TODO: Remove when SERVER-48291 is merged into stable build tools
- DISABLE_ALLOCATOR_SHIM_INJECTION=True,
LIBDEPS_TAGS=[
- # TODO: Remove all of these when SERVER-48291 is merged into stable build tools
- # The shim allocator must be linked to every node, including what would
- # be considered a leaf node to ensure the system allocator
- # is not linked in before tcmalloc. This tag allows nodes tagged as
- # leaf nodes to still get the correct allocator.
+ # TODO: Remove when SERVER-48291 is merged into stable build tools.
+ # An inserted dependency must be linked to every node, including what would
+ # be considered a leaf node to ensure that a system dependency is not linked
+ # in before this one. This tag allows nodes tagged as leaf nodes to still
+ # get the correct allocator.
'lint-leaf-node-allowed-dep',
- # This tag allows the allocator to be linked to nodes marked as not
+ # This tag allows this dependency to be linked to nodes marked as not
# allowed to have public dependencies.
'lint-public-dep-allowed'
- ],
+ ]
)
@@ -598,7 +540,9 @@ timelibEnv = timelibEnv.Clone(
'timelib' + timelibSuffix + '/timelib',
])
-timelibEnv.ShimLibrary(name='timelib')
+timelibEnv.ShimLibrary(
+ name='timelib',
+)
wiredtigerEnv = env.Clone()
if wiredtiger:
@@ -650,7 +594,9 @@ else:
'IntelRDFPMathLib20U1/intel_decimal128',
])
-intelDecimal128Env.ShimLibrary(name="intel_decimal128")
+intelDecimal128Env.ShimLibrary(
+ name="intel_decimal128",
+)
icuEnv = env.Clone()
if use_system_version_of_library("icu"):
@@ -669,7 +615,9 @@ else:
'icu4c' + icuSuffix + '/source/icu_i18n',
])
-icuEnv.ShimLibrary(name="icu")
+icuEnv.ShimLibrary(
+ name="icu",
+)
kmsEnv = env.Clone()
if get_option('ssl') == 'on':
@@ -687,5 +635,7 @@ if get_option('ssl') == 'on':
'kms-message/kms-message',
])
- kmsEnv.ShimLibrary(name="kms_message")
+ kmsEnv.ShimLibrary(
+ name="kms_message",
+ )