summaryrefslogtreecommitdiffstats
path: root/build
diff options
context:
space:
mode:
authorglider@chromium.org <glider@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-12 11:56:31 +0000
committerglider@chromium.org <glider@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-12 11:56:31 +0000
commit5ec8c9689563cf8662a80175adce3c0a9bcf8e88 (patch)
treea817a50b68744549368323f00d70da0953deac66 /build
parent8d36e89241662d4cd05adfdc54d32930de36dd5c (diff)
downloadchromium_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.gypi28
-rw-r--r--build/mac/asan.gyp32
-rwxr-xr-xbuild/mac/copy_asan_runtime_dylib.sh53
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}"