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:
glider@chromium.org 2013-03-12 11:56:31 +00:00
Родитель 2d827c22b2
Коммит 3920cdb878
3 изменённых файлов: 113 добавлений и 0 удалений

Просмотреть файл

@ -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

32
mac/asan.gyp Normal file
Просмотреть файл

@ -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))',
],
},
],
}],
],
},
],
}

53
mac/copy_asan_runtime_dylib.sh Executable file
Просмотреть файл

@ -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}"