blob: 5474bbbe5b2de5e44bf687d4bce9291dd315f607 [file] [log] [blame]
#!/bin/bash
#
# honggfuzz capstone build help script
# -----------------------------------------
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
if [ -z "$NDK" ]; then
# Search in $PATH
if [[ $(which ndk-build) != "" ]]; then
$NDK=$(dirname $(which ndk-build))
else
echo "[-] Could not detect Android NDK dir"
exit 1
fi
fi
if [ $# -ne 2 ]; then
echo "[-] Invalid arguments"
echo "[!] $0 <CAPSTONE_DIR> <ARCH>"
echo " ARCH: arm arm64 x86 x86_64"
exit 1
fi
readonly CAPSTONE_DIR=$1
# Fetch if not already there
if [ ! -d $CAPSTONE_DIR ]; then
echo "[!] capstone not found. Fetching a fresh copy"
git clone https://github.com/aquynh/capstone $CAPSTONE_DIR
fi
case "$2" in
arm|arm64|x86|x86_64)
readonly ARCH=$2
if [ ! -d $CAPSTONE_DIR/$ARCH ] ; then mkdir -p $CAPSTONE_DIR/$ARCH; fi
;;
*)
echo "[-] Invalid CPU architecture"
exit 1
;;
esac
case "$ARCH" in
arm)
CS_ARCH=arm
CS_BUILD_BIN="./make.sh cross-android $ARCH"
;;
arm64)
CS_ARCH=aarch64
CS_BUILD_BIN="./make.sh cross-android $ARCH"
;;
x86)
CS_ARCH=x86
CS_BUILD_BIN="make"
TOOLCHAIN=i686-linux-android
TOOLCHAIN_S=x86-4.9
;;
x86_64)
CS_ARCH=x86
CS_BUILD_BIN="make"
TOOLCHAIN=x86_64-linux-android
TOOLCHAIN_S=x86_64-4.9
;;
esac
# Capstone handles internally only Android ARM cross builds not Intel x86/x86_x64
# We need to prepare the Android NDK toolchains manually for these builds
if [[ "$ARCH" == "x86" || "$ARCH" == "x86_64" ]]; then
if [ -z "$NDK" ]; then
# Search in $PATH
if [[ $(which ndk-build) != "" ]]; then
$NDK=$(dirname $(which ndk-build))
else
echo "[-] Could not detect Android NDK dir"
exit 1
fi
fi
# Support both Linux & Darwin
HOST_OS=$(uname -s | tr '[:upper:]' '[:lower:]')
HOST_ARCH=$(uname -m)
SYSROOT="$NDK/platforms/android-21/arch-$ARCH"
export CC="$NDK/toolchains/$TOOLCHAIN_S/prebuilt/$HOST_OS-$HOST_ARCH/bin/$TOOLCHAIN-gcc --sysroot=$SYSROOT"
export CXX="$NDK/toolchains/$TOOLCHAIN_S/prebuilt/$HOST_OS-$HOST_ARCH/bin/$TOOLCHAIN-g++ --sysroot=$SYSROOT"
export PATH="$NDK/toolchains/$TOOLCHAIN_S/prebuilt/$HOST_OS-$HOST_ARCH/bin":$PATH
# We need to construct a cross variable that capstone Makefile can pick ar, strip & ranlib from
export CROSS="$NDK/toolchains/$TOOLCHAIN_S/prebuilt/$HOST_OS-$HOST_ARCH/bin/$TOOLCHAIN-" CFLAGS="--sysroot=$SYSROOT" LDFLAGS="--sysroot=$SYSROOT"
fi
# Change workdir to simplify args
cd $CAPSTONE_DIR
# Build it
make clean
NDK=$NDK CAPSTONE_BUILD_CORE_ONLY=yes CAPSTONE_ARCHS=$CS_ARCH \
CAPSTONE_SHARED=no CAPSTONE_STATIC=yes \
eval $CS_BUILD_BIN
if [ $? -ne 0 ]; then
echo "[-] Compilation failed"
exit 1
else
echo "[*] '$ARCH' libcapstone available at '$CAPSTONE_DIR/$ARCH'"
fi
cp libcapstone.a $ARCH/
# Revert workdir to caller
cd -