| OLD | NEW |
| (Empty) |
| 1 #!/bin/bash -e | |
| 2 #===- lib/asan/scripts/asan_device_setup.py -----------------------------------=
==# | |
| 3 # | |
| 4 # The LLVM Compiler Infrastructure | |
| 5 # | |
| 6 # This file is distributed under the University of Illinois Open Source | |
| 7 # License. See LICENSE.TXT for details. | |
| 8 # | |
| 9 # Prepare Android device to run ASan applications. | |
| 10 # | |
| 11 #===------------------------------------------------------------------------===# | |
| 12 | |
| 13 | |
| 14 HERE="$(cd "$(dirname "$0")" && pwd)" | |
| 15 | |
| 16 revert=no | |
| 17 extra_options= | |
| 18 device= | |
| 19 lib= | |
| 20 | |
| 21 function usage { | |
| 22 echo "usage: $0 [--revert] [--device device-id] [--lib path] [--extra_option
s options]" | |
| 23 echo " --revert: Uninstall ASan from the device." | |
| 24 echo " --lib: Path to ASan runtime library." | |
| 25 echo " --extra_options: Extra ASAN_OPTIONS." | |
| 26 echo " --device: Install to the given device. Use 'adb devices' to find" | |
| 27 echo " device-id." | |
| 28 echo | |
| 29 exit 1 | |
| 30 } | |
| 31 | |
| 32 while [[ $# > 0 ]]; do | |
| 33 case $1 in | |
| 34 --revert) | |
| 35 revert=yes | |
| 36 ;; | |
| 37 --extra-options) | |
| 38 shift | |
| 39 if [[ $# == 0 ]]; then | |
| 40 echo "--extra-options requires an argument." | |
| 41 exit 1 | |
| 42 fi | |
| 43 extra_options="$1" | |
| 44 ;; | |
| 45 --lib) | |
| 46 shift | |
| 47 if [[ $# == 0 ]]; then | |
| 48 echo "--lib requires an argument." | |
| 49 exit 1 | |
| 50 fi | |
| 51 lib="$1" | |
| 52 ;; | |
| 53 --device) | |
| 54 shift | |
| 55 if [[ $# == 0 ]]; then | |
| 56 echo "--device requires an argument." | |
| 57 exit 1 | |
| 58 fi | |
| 59 device="$1" | |
| 60 ;; | |
| 61 *) | |
| 62 usage | |
| 63 ;; | |
| 64 esac | |
| 65 shift | |
| 66 done | |
| 67 | |
| 68 ADB=${ADB:-adb} | |
| 69 if [[ x$device != x ]]; then | |
| 70 ADB="$ADB -s $device" | |
| 71 fi | |
| 72 | |
| 73 ASAN_RT="libclang_rt.asan-arm-android.so" | |
| 74 | |
| 75 if [[ x$revert == xyes ]]; then | |
| 76 echo '>> Uninstalling ASan' | |
| 77 $ADB root | |
| 78 $ADB wait-for-device | |
| 79 $ADB remount | |
| 80 $ADB shell mv /system/bin/app_process.real /system/bin/app_process | |
| 81 $ADB shell rm /system/bin/asanwrapper | |
| 82 $ADB shell rm /system/lib/$ASAN_RT | |
| 83 | |
| 84 echo '>> Restarting shell' | |
| 85 $ADB shell stop | |
| 86 $ADB shell start | |
| 87 | |
| 88 echo '>> Done' | |
| 89 exit 0 | |
| 90 fi | |
| 91 | |
| 92 if [[ -d "$lib" ]]; then | |
| 93 ASAN_RT_PATH="$lib" | |
| 94 elif [[ -f "$lib" && "$lib" == *"$ASAN_RT" ]]; then | |
| 95 ASAN_RT_PATH=$(dirname "$lib") | |
| 96 elif [[ -f "$HERE/$ASAN_RT" ]]; then | |
| 97 ASAN_RT_PATH="$HERE" | |
| 98 elif [[ $(basename "$HERE") == "bin" ]]; then | |
| 99 # We could be in the toolchain's base directory. | |
| 100 # Consider ../lib and ../lib/clang/$VERSION/lib/linux. | |
| 101 P=$(ls "$HERE"/../lib/"$ASAN_RT" "$HERE"/../lib/clang/*/lib/linux/"$ASAN_RT"
2>/dev/null | sort | tail -1) | |
| 102 if [[ -n "$P" ]]; then | |
| 103 ASAN_RT_PATH="$(dirname "$P")" | |
| 104 fi | |
| 105 fi | |
| 106 | |
| 107 if [[ -z "$ASAN_RT_PATH" || ! -f "$ASAN_RT_PATH/$ASAN_RT" ]]; then | |
| 108 echo "ASan runtime library not found" | |
| 109 exit 1 | |
| 110 fi | |
| 111 | |
| 112 TMPDIRBASE=$(mktemp -d) | |
| 113 TMPDIROLD="$TMPDIRBASE/old" | |
| 114 TMPDIR="$TMPDIRBASE/new" | |
| 115 mkdir "$TMPDIROLD" | |
| 116 | |
| 117 echo '>> Remounting /system rw' | |
| 118 $ADB root | |
| 119 $ADB wait-for-device | |
| 120 $ADB remount | |
| 121 | |
| 122 echo '>> Copying files from the device' | |
| 123 $ADB pull /system/bin/app_process "$TMPDIROLD" | |
| 124 $ADB pull /system/bin/app_process.real "$TMPDIROLD" || true | |
| 125 $ADB pull /system/bin/asanwrapper "$TMPDIROLD" || true | |
| 126 $ADB pull /system/lib/libclang_rt.asan-arm-android.so "$TMPDIROLD" || true | |
| 127 cp -r "$TMPDIROLD" "$TMPDIR" | |
| 128 | |
| 129 if ! [[ -f "$TMPDIR/app_process" ]]; then | |
| 130 echo "app_process missing???" | |
| 131 exit 1 | |
| 132 fi | |
| 133 | |
| 134 if [[ -f "$TMPDIR/app_process.real" ]]; then | |
| 135 echo "app_process.real exists, updating the wrapper" | |
| 136 else | |
| 137 echo "app_process.real missing, new installation" | |
| 138 mv "$TMPDIR/app_process" "$TMPDIR/app_process.real" | |
| 139 fi | |
| 140 | |
| 141 echo '>> Generating wrappers' | |
| 142 | |
| 143 cp "$ASAN_RT_PATH/$ASAN_RT" "$TMPDIR/" | |
| 144 | |
| 145 # FIXME: alloc_dealloc_mismatch=0 prevents a failure in libdvm startup, | |
| 146 # which may or may not be a real bug (probably not). | |
| 147 ASAN_OPTIONS=start_deactivated=1,alloc_dealloc_mismatch=0 | |
| 148 if [[ x$extra_options != x ]] ; then | |
| 149 ASAN_OPTIONS="$ASAN_OPTIONS,$extra_options" | |
| 150 fi | |
| 151 | |
| 152 # Zygote wrapper. | |
| 153 cat <<EOF >"$TMPDIR/app_process" | |
| 154 #!/system/bin/sh | |
| 155 ASAN_OPTIONS=$ASAN_OPTIONS \\ | |
| 156 LD_PRELOAD=libclang_rt.asan-arm-android.so \\ | |
| 157 exec /system/bin/app_process.real \$@ | |
| 158 | |
| 159 EOF | |
| 160 | |
| 161 # General command-line tool wrapper (use for anything that's not started as | |
| 162 # zygote). | |
| 163 cat <<EOF >"$TMPDIR/asanwrapper" | |
| 164 #!/system/bin/sh | |
| 165 LD_PRELOAD=libclang_rt.asan-arm-android.so \\ | |
| 166 exec \$@ | |
| 167 | |
| 168 EOF | |
| 169 | |
| 170 if ! ( cd "$TMPDIRBASE" && diff -qr old/ new/ ) ; then | |
| 171 echo '>> Pushing files to the device' | |
| 172 $ADB push "$TMPDIR/$ASAN_RT" /system/lib/ | |
| 173 $ADB push "$TMPDIR/app_process" /system/bin/app_process | |
| 174 $ADB push "$TMPDIR/app_process.real" /system/bin/app_process.real | |
| 175 $ADB push "$TMPDIR/asanwrapper" /system/bin/asanwrapper | |
| 176 $ADB shell chown root.shell \ | |
| 177 /system/bin/app_process \ | |
| 178 /system/bin/app_process.real \ | |
| 179 /system/bin/asanwrapper | |
| 180 $ADB shell chmod 755 \ | |
| 181 /system/bin/app_process \ | |
| 182 /system/bin/app_process.real \ | |
| 183 /system/bin/asanwrapper | |
| 184 | |
| 185 echo '>> Restarting shell (asynchronous)' | |
| 186 $ADB shell stop | |
| 187 $ADB shell start | |
| 188 | |
| 189 echo '>> Please wait until the device restarts' | |
| 190 else | |
| 191 echo '>> Device is up to date' | |
| 192 fi | |
| 193 | |
| 194 rm -r "$TMPDIRBASE" | |
| OLD | NEW |