OLD | NEW |
(Empty) | |
| 1 #!/bin/bash -e |
| 2 # Copyright (c) 2014 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. |
| 5 |
| 6 # Prepare Android device to run ASan application. |
| 7 |
| 8 |
| 9 HERE="$(cd "$(dirname "$0")" && pwd)" |
| 10 |
| 11 revert=no |
| 12 extra_options= |
| 13 device= |
| 14 |
| 15 function usage { |
| 16 echo "usage: $0 [--revert] [--device device-id]" |
| 17 echo " --revert: Uninstall ASan from the device." |
| 18 echo " --extra_options: Extra ASAN_OPTIONS." |
| 19 echo " --device: Install to the given device. Use 'adb devices' to find" |
| 20 echo " device-id." |
| 21 echo |
| 22 exit 1 |
| 23 } |
| 24 |
| 25 while [[ $# > 0 ]]; do |
| 26 case $1 in |
| 27 --revert) |
| 28 revert=yes |
| 29 ;; |
| 30 --extra-options) |
| 31 shift |
| 32 if [[ $# == 0 ]]; then |
| 33 echo "--extra-options requires an argument." |
| 34 exit 1 |
| 35 fi |
| 36 extra_options="$1" |
| 37 ;; |
| 38 --device) |
| 39 shift |
| 40 if [[ $# == 0 ]]; then |
| 41 echo "--device requires an argument." |
| 42 exit 1 |
| 43 fi |
| 44 device="$1" |
| 45 ;; |
| 46 *) |
| 47 usage |
| 48 ;; |
| 49 esac |
| 50 shift |
| 51 done |
| 52 |
| 53 ADB="adb" |
| 54 if [[ x$device != x ]]; then |
| 55 ADB="adb -s $device" |
| 56 fi |
| 57 |
| 58 ASAN_RT_PATH="$HERE" |
| 59 ASAN_RT="libclang_rt.asan-arm-android.so" |
| 60 |
| 61 if [[ x$revert == xyes ]]; then |
| 62 echo '>> Uninstalling ASan' |
| 63 $ADB remount |
| 64 $ADB shell mv /system/bin/app_process.real /system/bin/app_process |
| 65 $ADB shell rm /system/bin/asanwrapper |
| 66 $ADB shell rm /system/lib/$ASAN_RT |
| 67 |
| 68 echo '>> Restarting shell' |
| 69 $ADB shell stop |
| 70 $ADB shell start |
| 71 |
| 72 echo '>> Done' |
| 73 exit 0 |
| 74 fi |
| 75 |
| 76 if ! [[ -f "$ASAN_RT_PATH/$ASAN_RT" ]]; then |
| 77 echo "ASan runtime library not found at $ASAN_RT" |
| 78 exit 1 |
| 79 fi |
| 80 |
| 81 TMPDIRBASE=$(mktemp -d) |
| 82 echo $TMPDIRBASE |
| 83 TMPDIROLD="$TMPDIRBASE/old" |
| 84 TMPDIR="$TMPDIRBASE/new" |
| 85 mkdir "$TMPDIROLD" |
| 86 |
| 87 echo '>> Remounting /system rw' |
| 88 $ADB remount |
| 89 |
| 90 echo '>> Copying files from the device' |
| 91 $ADB pull /system/bin/app_process "$TMPDIROLD" |
| 92 $ADB pull /system/bin/app_process.real "$TMPDIROLD" || true |
| 93 $ADB pull /system/bin/asanwrapper "$TMPDIROLD" || true |
| 94 $ADB pull /system/lib/libclang_rt.asan-arm-android.so "$TMPDIROLD" || true |
| 95 cp -r "$TMPDIROLD" "$TMPDIR" |
| 96 |
| 97 if ! [[ -f "$TMPDIR/app_process" ]]; then |
| 98 echo "app_process missing???" |
| 99 exit 1 |
| 100 fi |
| 101 |
| 102 if [[ -f "$TMPDIR/app_process.real" ]]; then |
| 103 echo "app_process.real exists, updating the wrapper" |
| 104 else |
| 105 echo "app_process.real missing, new installation" |
| 106 mv "$TMPDIR/app_process" "$TMPDIR/app_process.real" |
| 107 fi |
| 108 |
| 109 echo '>> Generating wrappers' |
| 110 |
| 111 cp "$ASAN_RT_PATH/$ASAN_RT" "$TMPDIR/" |
| 112 |
| 113 # FIXME: alloc_dealloc_mismatch=0 prevents a failure in libdvm startup, |
| 114 # which may or may not be a real bug (probably not). |
| 115 ASAN_OPTIONS=start_deactivated=1,alloc_dealloc_mismatch=0 |
| 116 if [[ x$extra_options != x ]] ; then |
| 117 ASAN_OPTIONS="$ASAN_OPTIONS,$extra_options" |
| 118 fi |
| 119 |
| 120 # Zygote wrapper. |
| 121 cat <<EOF >"$TMPDIR/app_process" |
| 122 #!/system/bin/sh |
| 123 ASAN_OPTIONS=$ASAN_OPTIONS \\ |
| 124 LD_PRELOAD=libclang_rt.asan-arm-android.so \\ |
| 125 exec /system/bin/app_process.real \$@ |
| 126 |
| 127 EOF |
| 128 |
| 129 # General command-line tool wrapper (use for anything that's not started as |
| 130 # zygote). |
| 131 cat <<EOF >"$TMPDIR/asanwrapper" |
| 132 #!/system/bin/sh |
| 133 LD_PRELOAD=libclang_rt.asan-arm-android.so \\ |
| 134 exec \$@ |
| 135 |
| 136 EOF |
| 137 |
| 138 if ! ( cd "$TMPDIRBASE" && diff -qr old/ new/ ) ; then |
| 139 echo '>> Pushing files to the device' |
| 140 $ADB push "$TMPDIR/$ASAN_RT" /system/lib/ |
| 141 $ADB push "$TMPDIR/app_process" /system/bin/app_process |
| 142 $ADB push "$TMPDIR/app_process.real" /system/bin/app_process.real |
| 143 $ADB push "$TMPDIR/asanwrapper" /system/bin/asanwrapper |
| 144 $ADB shell chown root.shell \ |
| 145 /system/bin/app_process \ |
| 146 /system/bin/app_process.real \ |
| 147 /system/bin/asanwrapper |
| 148 $ADB shell chmod 755 \ |
| 149 /system/bin/app_process \ |
| 150 /system/bin/app_process.real \ |
| 151 /system/bin/asanwrapper |
| 152 |
| 153 echo '>> Restarting shell (asynchronous)' |
| 154 $ADB shell stop |
| 155 $ADB shell start |
| 156 |
| 157 echo '>> Please wait until the device restarts' |
| 158 else |
| 159 echo '>> Device is up to date' |
| 160 fi |
| 161 |
| 162 rm -r "$TMPDIRBASE" |
OLD | NEW |