Re-land https://codereview.chromium.org/11642018/: Add a postbuild action for executables built with ASan on Mac OS.
The action will copy the ASan dynamic runtime to the output dir and into every bundled executable being built. Unlike the previous change, this one does not touch build/all.gyp, since our target doesn't need to be built when building 'All'. BUG=170629 TBR=thakis,mark Review URL: https://codereview.chromium.org/12685006 git-svn-id: http://src.chromium.org/svn/trunk/src/build@187566 4ff67af0-8c30-449e-8e8b-ad334ec8d88c
This commit is contained in:
Родитель
2d827c22b2
Коммит
3920cdb878
28
common.gypi
28
common.gypi
|
@ -1657,6 +1657,11 @@
|
|||
# throughout the codebase.
|
||||
'defines' : ['USE_SKIA'],
|
||||
'conditions': [
|
||||
['asan==1', {
|
||||
'dependencies': [
|
||||
'<(DEPTH)/build/mac/asan.gyp:asan_dynamic_runtime',
|
||||
],
|
||||
}],
|
||||
['OS=="linux" and linux_use_tcmalloc==1 and clang_type_profiler==1', {
|
||||
'cflags_cc!': ['-fno-rtti'],
|
||||
'cflags_cc+': [
|
||||
|
@ -3526,6 +3531,29 @@
|
|||
}],
|
||||
['_mac_bundle', {
|
||||
'xcode_settings': {'OTHER_LDFLAGS': ['-Wl,-ObjC']},
|
||||
'target_conditions': [
|
||||
['_type=="executable"', {
|
||||
'conditions': [
|
||||
['asan==1', {
|
||||
'postbuilds': [
|
||||
{
|
||||
'variables': {
|
||||
# Define copy_asan_dylib_path in a variable ending in
|
||||
# _path so that gyp understands it's a path and
|
||||
# performs proper relativization during dict merging.
|
||||
'copy_asan_dylib_path':
|
||||
'mac/copy_asan_runtime_dylib.sh',
|
||||
},
|
||||
'postbuild_name': 'Copy ASan runtime dylib',
|
||||
'action': [
|
||||
'<(copy_asan_dylib_path)',
|
||||
],
|
||||
},
|
||||
],
|
||||
}],
|
||||
],
|
||||
}],
|
||||
],
|
||||
}],
|
||||
], # target_conditions
|
||||
}, # target_defaults
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
# Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
{
|
||||
'targets': [
|
||||
{
|
||||
'target_name': 'asan_dynamic_runtime',
|
||||
'type': 'none',
|
||||
'variables': {
|
||||
# Every target is going to depend on asan_dynamic_runtime, so allow
|
||||
# this one to depend on itself.
|
||||
'prune_self_dependency': 1,
|
||||
# Path is relative to this GYP file.
|
||||
'asan_rtl_mask_path':
|
||||
'../../third_party/llvm-build/Release+Asserts/lib/clang/*/lib/darwin/libclang_rt.asan_osx_dynamic.dylib',
|
||||
},
|
||||
'conditions': [
|
||||
['OS=="mac"', {
|
||||
'copies': [
|
||||
{
|
||||
'destination': '<(PRODUCT_DIR)',
|
||||
'files': [
|
||||
'<!(/bin/ls <(asan_rtl_mask_path))',
|
||||
],
|
||||
},
|
||||
],
|
||||
}],
|
||||
],
|
||||
},
|
||||
],
|
||||
}
|
|
@ -0,0 +1,53 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
# For app bundles built with ASan, copies the runtime lib
|
||||
# (libclang_rt.asan_osx_dynamic.dylib), on which their executables depend, from
|
||||
# the compiler installation path to appname.app/Contents/Resources and fixes the
|
||||
# dylib's install name in the binary to be relative to @executable_path.
|
||||
|
||||
set -e
|
||||
|
||||
BINARY="${BUILT_PRODUCTS_DIR}/${EXECUTABLE_PATH}"
|
||||
BINARY_DIR="$(dirname "${BINARY}")"
|
||||
ASAN_DYLIB_NAME=libclang_rt.asan_osx_dynamic.dylib
|
||||
ASAN_DYLIB=$(find \
|
||||
"${BUILT_PRODUCTS_DIR}/../../third_party/llvm-build/Release+Asserts/lib/clang/" \
|
||||
-type f -path "*${ASAN_DYLIB_NAME}")
|
||||
|
||||
# Find the link to the ASan runtime encoded in the binary.
|
||||
BUILTIN_DYLIB_PATH=$(otool -L "${BINARY}" | \
|
||||
sed -Ene 's/^[[:blank:]]+(.*libclang_rt\.asan_osx_dynamic\.dylib).*$/\1/p')
|
||||
|
||||
if [[ -z "${BUILTIN_DYLIB_PATH}" ]]; then
|
||||
echo "${BINARY} does not depend on the ASan runtime library!" >&2
|
||||
# TODO(glider): make this return 1 when we fully switch to the dynamic
|
||||
# runtime in ASan.
|
||||
exit 0
|
||||
fi
|
||||
|
||||
DYLIB_BASENAME=$(basename "${ASAN_DYLIB}")
|
||||
if [[ "${DYLIB_BASENAME}" != "${ASAN_DYLIB_NAME}" ]]; then
|
||||
echo "basename(${ASAN_DYLIB}) != ${ASAN_DYLIB_NAME}" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
LIBRARIES_DIR="$(dirname "${BINARY_DIR}")/Libraries"
|
||||
mkdir -p "${LIBRARIES_DIR}"
|
||||
cp "${ASAN_DYLIB}" "${LIBRARIES_DIR}"
|
||||
|
||||
NEW_LC_ID_DYLIB="@executable_path/../Libraries/${ASAN_DYLIB_NAME}"
|
||||
|
||||
# Make LC_ID_DYLIB of the runtime copy point to its location.
|
||||
install_name_tool \
|
||||
-id "${NEW_LC_ID_DYLIB}" \
|
||||
"${LIBRARIES_DIR}/${ASAN_DYLIB_NAME}"
|
||||
|
||||
# Fix the rpath to the runtime library recorded in the binary.
|
||||
install_name_tool \
|
||||
-change "${BUILTIN_DYLIB_PATH}" \
|
||||
"${NEW_LC_ID_DYLIB}" \
|
||||
"${BINARY}"
|
Загрузка…
Ссылка в новой задаче