blob: 5474bbbe5b2de5e44bf687d4bce9291dd315f607 [file] [log] [blame]
Anestis Bechtsoudiscfc39fb2015-08-06 10:31:36 +03001#!/bin/bash
2#
3# honggfuzz capstone build help script
4# -----------------------------------------
5#
6# Licensed under the Apache License, Version 2.0 (the "License");
7# you may not use this file except in compliance with the License.
8# You may obtain a copy of the License at
9#
10# http://www.apache.org/licenses/LICENSE-2.0
11#
12# Unless required by applicable law or agreed to in writing, software
13# distributed under the License is distributed on an "AS IS" BASIS,
14# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15# See the License for the specific language governing permissions and
16# limitations under the License.
17
18if [ -z "$NDK" ]; then
19 # Search in $PATH
20 if [[ $(which ndk-build) != "" ]]; then
21 $NDK=$(dirname $(which ndk-build))
22 else
23 echo "[-] Could not detect Android NDK dir"
24 exit 1
25 fi
26fi
27
28if [ $# -ne 2 ]; then
29 echo "[-] Invalid arguments"
30 echo "[!] $0 <CAPSTONE_DIR> <ARCH>"
31 echo " ARCH: arm arm64 x86 x86_64"
32 exit 1
33fi
34
35readonly CAPSTONE_DIR=$1
36
37# Fetch if not already there
38if [ ! -d $CAPSTONE_DIR ]; then
39 echo "[!] capstone not found. Fetching a fresh copy"
40 git clone https://github.com/aquynh/capstone $CAPSTONE_DIR
41fi
42
43case "$2" in
44 arm|arm64|x86|x86_64)
45 readonly ARCH=$2
46 if [ ! -d $CAPSTONE_DIR/$ARCH ] ; then mkdir -p $CAPSTONE_DIR/$ARCH; fi
47 ;;
48 *)
49 echo "[-] Invalid CPU architecture"
50 exit 1
51 ;;
52esac
53
54case "$ARCH" in
55 arm)
56 CS_ARCH=arm
57 CS_BUILD_BIN="./make.sh cross-android $ARCH"
58 ;;
59 arm64)
60 CS_ARCH=aarch64
61 CS_BUILD_BIN="./make.sh cross-android $ARCH"
62 ;;
63 x86)
64 CS_ARCH=x86
65 CS_BUILD_BIN="make"
66 TOOLCHAIN=i686-linux-android
67 TOOLCHAIN_S=x86-4.9
68 ;;
69 x86_64)
70 CS_ARCH=x86
71 CS_BUILD_BIN="make"
72 TOOLCHAIN=x86_64-linux-android
73 TOOLCHAIN_S=x86_64-4.9
74 ;;
75esac
76
77# Capstone handles internally only Android ARM cross builds not Intel x86/x86_x64
78# We need to prepare the Android NDK toolchains manually for these builds
79if [[ "$ARCH" == "x86" || "$ARCH" == "x86_64" ]]; then
80 if [ -z "$NDK" ]; then
81 # Search in $PATH
82 if [[ $(which ndk-build) != "" ]]; then
83 $NDK=$(dirname $(which ndk-build))
84 else
85 echo "[-] Could not detect Android NDK dir"
86 exit 1
87 fi
88 fi
89
90 # Support both Linux & Darwin
91 HOST_OS=$(uname -s | tr '[:upper:]' '[:lower:]')
92 HOST_ARCH=$(uname -m)
93
94 SYSROOT="$NDK/platforms/android-21/arch-$ARCH"
95 export CC="$NDK/toolchains/$TOOLCHAIN_S/prebuilt/$HOST_OS-$HOST_ARCH/bin/$TOOLCHAIN-gcc --sysroot=$SYSROOT"
96 export CXX="$NDK/toolchains/$TOOLCHAIN_S/prebuilt/$HOST_OS-$HOST_ARCH/bin/$TOOLCHAIN-g++ --sysroot=$SYSROOT"
97 export PATH="$NDK/toolchains/$TOOLCHAIN_S/prebuilt/$HOST_OS-$HOST_ARCH/bin":$PATH
98 # We need to construct a cross variable that capstone Makefile can pick ar, strip & ranlib from
99 export CROSS="$NDK/toolchains/$TOOLCHAIN_S/prebuilt/$HOST_OS-$HOST_ARCH/bin/$TOOLCHAIN-" CFLAGS="--sysroot=$SYSROOT" LDFLAGS="--sysroot=$SYSROOT"
100fi
101
102# Change workdir to simplify args
103cd $CAPSTONE_DIR
104
105# Build it
106make clean
107
108NDK=$NDK CAPSTONE_BUILD_CORE_ONLY=yes CAPSTONE_ARCHS=$CS_ARCH \
109CAPSTONE_SHARED=no CAPSTONE_STATIC=yes \
110eval $CS_BUILD_BIN
111if [ $? -ne 0 ]; then
112 echo "[-] Compilation failed"
113 exit 1
114else
115 echo "[*] '$ARCH' libcapstone available at '$CAPSTONE_DIR/$ARCH'"
116fi
117
118cp libcapstone.a $ARCH/
119
120# Revert workdir to caller
121cd -