diff options
author | glider@chromium.org <glider@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-12 11:56:31 +0000 |
---|---|---|
committer | glider@chromium.org <glider@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-12 11:56:31 +0000 |
commit | 5ec8c9689563cf8662a80175adce3c0a9bcf8e88 (patch) | |
tree | a817a50b68744549368323f00d70da0953deac66 /build | |
parent | 8d36e89241662d4cd05adfdc54d32930de36dd5c (diff) | |
download | chromium_src-5ec8c9689563cf8662a80175adce3c0a9bcf8e88.zip chromium_src-5ec8c9689563cf8662a80175adce3c0a9bcf8e88.tar.gz chromium_src-5ec8c9689563cf8662a80175adce3c0a9bcf8e88.tar.bz2 |
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: svn://svn.chromium.org/chrome/trunk/src@187566 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'build')
-rw-r--r-- | build/common.gypi | 28 | ||||
-rw-r--r-- | build/mac/asan.gyp | 32 | ||||
-rwxr-xr-x | build/mac/copy_asan_runtime_dylib.sh | 53 |
3 files changed, 113 insertions, 0 deletions
diff --git a/build/common.gypi b/build/common.gypi index e58f8c6..988b121 100644 --- a/build/common.gypi +++ b/build/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 diff --git a/build/mac/asan.gyp b/build/mac/asan.gyp new file mode 100644 index 0000000..73e8641 --- /dev/null +++ b/build/mac/asan.gyp @@ -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))', + ], + }, + ], + }], + ], + }, + ], +} diff --git a/build/mac/copy_asan_runtime_dylib.sh b/build/mac/copy_asan_runtime_dylib.sh new file mode 100755 index 0000000..beefe79 --- /dev/null +++ b/build/mac/copy_asan_runtime_dylib.sh @@ -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}" |