1#!/bin/sh 2# 3# Copyright (C) 2010 The Android Open Source Project 4# 5# Licensed under the Apache License, Version 2.0 (the "License"); 6# you may not use this file except in compliance with the License. 7# You may obtain a copy of the License at 8# 9# http://www.apache.org/licenses/LICENSE-2.0 10# 11# Unless required by applicable law or agreed to in writing, software 12# distributed under the License is distributed on an "AS IS" BASIS, 13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14# See the License for the specific language governing permissions and 15# limitations under the License. 16# 17# This shell script is used to rebuild the gdbserver binary from 18# the Android NDK's prebuilt binaries. 19# 20 21# include common function and variable definitions 22. `dirname $0`/prebuilt-common.sh 23 24PROGRAM_PARAMETERS="<src-dir> <ndk-dir> <toolchain>" 25 26PROGRAM_DESCRIPTION=\ 27"Rebuild the gdbserver prebuilt binary for the Android NDK toolchain. 28 29Where <src-dir> is the location of the gdbserver sources, 30<ndk-dir> is the top-level NDK installation path and <toolchain> 31is the name of the toolchain to use (e.g. arm-linux-androideabi-4.4.3). 32 33The final binary is placed under: 34 35 <ndk-dir>/toolchains <toolchain>/prebuilt/gdbserver 36 37NOTE: The --platform option is ignored if --sysroot is used." 38 39VERBOSE=no 40 41OPTION_BUILD_OUT= 42BUILD_OUT=/tmp/ndk-$USER/build/gdbserver 43register_option "--build-out=<path>" do_build_out "Set temporary build directory" 44do_build_out () { OPTION_BUILD_OUT="$1"; } 45 46PLATFORM=$DEFAULT_PLATFORM 47register_var_option "--platform=<name>" PLATFORM "Target specific platform" 48 49SYSROOT= 50if [ -d $TOOLCHAIN_PATH/sysroot ] ; then 51 SYSROOT=$TOOLCHAIN_PATH/sysroot 52fi 53register_var_option "--sysroot=<path>" SYSROOT "Specify sysroot directory directly" 54 55NOTHREADS=no 56register_var_option "--disable-threads" NOTHREADS "Disable threads support" 57 58GDB_VERSION=$DEFAULT_GDB_VERSION 59register_var_option "--gdb-version=<name>" GDB_VERSION "Use specific gdb version." 60 61register_jobs_option 62 63extract_parameters "$@" 64 65setup_default_log_file 66 67set_parameters () 68{ 69 SRC_DIR="$1" 70 NDK_DIR="$2" 71 TOOLCHAIN="$3" 72 73 # Check source directory 74 # 75 if [ -z "$SRC_DIR" ] ; then 76 echo "ERROR: Missing source directory parameter. See --help for details." 77 exit 1 78 fi 79 80 SRC_DIR2="$SRC_DIR/gdb/gdb-$GDB_VERSION/gdb/gdbserver" 81 if [ -d "$SRC_DIR2" ] ; then 82 SRC_DIR="$SRC_DIR2" 83 log "Found gdbserver source directory: $SRC_DIR" 84 fi 85 86 if [ ! -f "$SRC_DIR/gdbreplay.c" ] ; then 87 echo "ERROR: Source directory does not contain gdbserver sources: $SRC_DIR" 88 exit 1 89 fi 90 91 log "Using source directory: $SRC_DIR" 92 93 # Check NDK installation directory 94 # 95 if [ -z "$NDK_DIR" ] ; then 96 echo "ERROR: Missing NDK directory parameter. See --help for details." 97 exit 1 98 fi 99 100 if [ ! -d "$NDK_DIR" ] ; then 101 echo "ERROR: NDK directory does not exist: $NDK_DIR" 102 exit 1 103 fi 104 105 log "Using NDK directory: $NDK_DIR" 106 107 # Check toolchain name 108 # 109 if [ -z "$TOOLCHAIN" ] ; then 110 echo "ERROR: Missing toolchain name parameter. See --help for details." 111 exit 1 112 fi 113} 114 115set_parameters $PARAMETERS 116 117prepare_target_build 118 119parse_toolchain_name 120check_toolchain_install $NDK_DIR $TOOLCHAIN 121 122# Check build directory 123# 124fix_sysroot "$SYSROOT" 125log "Using sysroot: $SYSROOT" 126 127if [ -n "$OPTION_BUILD_OUT" ] ; then 128 BUILD_OUT="$OPTION_BUILD_OUT" 129fi 130log "Using build directory: $BUILD_OUT" 131run mkdir -p "$BUILD_OUT" 132 133# Copy the sysroot to a temporary build directory 134BUILD_SYSROOT="$BUILD_OUT/sysroot" 135run mkdir -p "$BUILD_SYSROOT" 136run cp -rp "$SYSROOT/*" "$BUILD_SYSROOT" 137 138# Remove libthread_db to ensure we use exactly the one we want. 139rm -f $BUILD_SYSROOT/usr/lib/libthread_db* 140rm -f $BUILD_SYSROOT/usr/include/thread_db.h 141 142if [ "$NOTHREADS" != "yes" ] ; then 143 # We're going to rebuild libthread_db.o from its source 144 # that is under sources/android/libthread_db and place its header 145 # and object file into the build sysroot. 146 LIBTHREAD_DB_DIR=$ANDROID_NDK_ROOT/sources/android/libthread_db/gdb-$GDB_VERSION 147 if [ ! -d "$LIBTHREAD_DB_DIR" ] ; then 148 dump "ERROR: Missing directory: $LIBTHREAD_DB_DIR" 149 exit 1 150 fi 151 # Small trick, to avoid calling ar, we store the single object file 152 # with an .a suffix. The linker will handle that seamlessly. 153 run cp $LIBTHREAD_DB_DIR/thread_db.h $BUILD_SYSROOT/usr/include/ 154 run $TOOLCHAIN_PREFIX-gcc --sysroot=$BUILD_SYSROOT -o $BUILD_SYSROOT/usr/lib/libthread_db.o -c $LIBTHREAD_DB_DIR/libthread_db.c 155 run $TOOLCHAIN_PREFIX-ar -r $BUILD_SYSROOT/usr/lib/libthread_db.a $BUILD_SYSROOT/usr/lib/libthread_db.o 156 if [ $? != 0 ] ; then 157 dump "ERROR: Could not compile libthread_db.c!" 158 exit 1 159 fi 160fi 161 162log "Using build sysroot: $BUILD_SYSROOT" 163 164# configure the gdbserver build now 165dump "Configure: $TOOLCHAIN gdbserver-$GDB_VERSION build." 166OLD_CC="$CC" 167OLD_CFLAGS="$CFLAGS" 168OLD_LDFLAGS="$LDFLAGS" 169 170INCLUDE_DIRS=\ 171"-I$TOOLCHAIN_PATH/lib/gcc/$ABI_CONFIGURE_TARGET/$GCC_VERSION/include \ 172-I$BUILD_SYSROOT/usr/include" 173CRTBEGIN="$BUILD_SYSROOT/usr/lib/crtbegin_static.o" 174CRTEND="$BUILD_SYSROOT/usr/lib/crtend_android.o" 175 176# Note: we must put a second -lc after -lgcc to resolve a cyclical 177# dependency on arm-linux-androideabi, where libgcc.a contains 178# a function (__div0) which depends on raise(), implemented 179# in the C library. 180# 181LIBRARY_LDFLAGS="$CRTBEGIN -lc -lm -lgcc -lc $CRTEND " 182 183case "$GDB_VERSION" in 184 6.6) 185 CONFIGURE_FLAGS="--with-sysroot=$BUILD_SYSROOT" 186 ;; 187 7.1.x) 188 # This flag is required to link libthread_db statically to our 189 # gdbserver binary. Otherwise, the program will try to dlopen() 190 # the threads binary, which is not possible since we build a 191 # static executable. 192 CONFIGURE_FLAGS="--with-libthread-db=$BUILD_SYSROOT/usr/lib/libthread_db.a" 193 ;; 194 *) 195 CONFIGURE_FLAGS="" 196esac 197 198cd $BUILD_OUT && 199export CC="$TOOLCHAIN_PREFIX-gcc --sysroot=$BUILD_SYSROOT" && 200export CFLAGS="-O2 -nostdinc -nostdlib -D__ANDROID__ -DANDROID -DSTDC_HEADERS $INCLUDE_DIRS $GDBSERVER_CFLAGS" && 201export LDFLAGS="-static -Wl,-z,nocopyreloc -Wl,--no-undefined $LIBRARY_LDFLAGS" && 202run $SRC_DIR/configure \ 203--host=$GDBSERVER_HOST \ 204$CONFIGURE_FLAGS 205if [ $? != 0 ] ; then 206 dump "Could not configure gdbserver build. See $TMPLOG" 207 exit 1 208fi 209CC="$OLD_CC" 210CFLAGS="$OLD_CFLAGS" 211LDFLAGS="$OLD_LDFLAGS" 212 213# build gdbserver 214dump "Building : $TOOLCHAIN gdbserver." 215cd $BUILD_OUT && 216run make -j$NUM_JOBS 217if [ $? != 0 ] ; then 218 dump "Could not build $TOOLCHAIN gdbserver. Use --verbose to see why." 219 exit 1 220fi 221 222# install gdbserver 223# 224# note that we install it in the toolchain bin directory 225# not in $SYSROOT/usr/bin 226# 227if [ "$NOTHREADS" = "yes" ] ; then 228 DSTFILE="gdbserver-nothreads" 229else 230 DSTFILE="gdbserver" 231fi 232dump "Install : $TOOLCHAIN $DSTFILE." 233DEST=`dirname $TOOLCHAIN_PATH` 234mkdir -p $DEST && 235run $TOOLCHAIN_PREFIX-objcopy --strip-unneeded $BUILD_OUT/gdbserver $DEST/$DSTFILE 236if [ $? != 0 ] ; then 237 dump "Could not install $DSTFILE. See $TMPLOG" 238 exit 1 239fi 240 241log "Cleaning up." 242if [ -z "$OPTION_BUILD_OUT" ] ; then 243 run rm -rf $BUILD_OUT 244fi 245 246dump "Done." 247