summaryrefslogtreecommitdiffstats
path: root/build/mac
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/mac
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/mac')
-rw-r--r--build/mac/asan.gyp32
-rwxr-xr-xbuild/mac/copy_asan_runtime_dylib.sh53
2 files changed, 85 insertions, 0 deletions
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}"