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 24 PROGRAM_PARAMETERS="<src-dir> <ndk-dir> <toolchain>" 25 26 PROGRAM_DESCRIPTION=\ 27 "Rebuild the gdbserver prebuilt binary for the Android NDK toolchain. 28 29 Where <src-dir> is the location of the gdbserver sources, 30 <ndk-dir> is the top-level NDK installation path and <toolchain> 31 is the name of the toolchain to use (e.g. arm-linux-androideabi-4.4.3). 32 33 The final binary is placed under: 34 35 <ndk-dir>/toolchains <toolchain>/prebuilt/gdbserver 36 37 NOTE: The --platform option is ignored if --sysroot is used." 38 39 VERBOSE=no 40 41 OPTION_BUILD_OUT= 42 BUILD_OUT=/tmp/ndk-$USER/build/gdbserver 43 register_option "--build-out=<path>" do_build_out "Set temporary build directory" 44 do_build_out () { OPTION_BUILD_OUT="$1"; } 45 46 PLATFORM=$DEFAULT_PLATFORM 47 register_var_option "--platform=<name>" PLATFORM "Target specific platform" 48 49 SYSROOT= 50 if [ -d $TOOLCHAIN_PATH/sysroot ] ; then 51 SYSROOT=$TOOLCHAIN_PATH/sysroot 52 fi 53 register_var_option "--sysroot=<path>" SYSROOT "Specify sysroot directory directly" 54 55 NOTHREADS=no 56 register_var_option "--disable-threads" NOTHREADS "Disable threads support" 57 58 GDB_VERSION=$DEFAULT_GDB_VERSION 59 register_var_option "--gdb-version=<name>" GDB_VERSION "Use specific gdb version." 60 61 register_jobs_option 62 63 extract_parameters "$@" 64 65 setup_default_log_file 66 67 set_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 115 set_parameters $PARAMETERS 116 117 prepare_target_build 118 119 parse_toolchain_name 120 check_toolchain_install $NDK_DIR $TOOLCHAIN 121 122 # Check build directory 123 # 124 fix_sysroot "$SYSROOT" 125 log "Using sysroot: $SYSROOT" 126 127 if [ -n "$OPTION_BUILD_OUT" ] ; then 128 BUILD_OUT="$OPTION_BUILD_OUT" 129 fi 130 log "Using build directory: $BUILD_OUT" 131 run mkdir -p "$BUILD_OUT" 132 133 # Copy the sysroot to a temporary build directory 134 BUILD_SYSROOT="$BUILD_OUT/sysroot" 135 run mkdir -p "$BUILD_SYSROOT" 136 run cp -rp "$SYSROOT/*" "$BUILD_SYSROOT" 137 138 # Remove libthread_db to ensure we use exactly the one we want. 139 rm -f $BUILD_SYSROOT/usr/lib/libthread_db* 140 rm -f $BUILD_SYSROOT/usr/include/thread_db.h 141 142 if [ "$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 160 fi 161 162 log "Using build sysroot: $BUILD_SYSROOT" 163 164 # configure the gdbserver build now 165 dump "Configure: $TOOLCHAIN gdbserver-$GDB_VERSION build." 166 OLD_CC="$CC" 167 OLD_CFLAGS="$CFLAGS" 168 OLD_LDFLAGS="$LDFLAGS" 169 170 INCLUDE_DIRS=\ 171 "-I$TOOLCHAIN_PATH/lib/gcc/$ABI_CONFIGURE_TARGET/$GCC_VERSION/include \ 172 -I$BUILD_SYSROOT/usr/include" 173 CRTBEGIN="$BUILD_SYSROOT/usr/lib/crtbegin_static.o" 174 CRTEND="$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 # 181 LIBRARY_LDFLAGS="$CRTBEGIN -lc -lm -lgcc -lc $CRTEND " 182 183 case "$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="" 196 esac 197 198 cd $BUILD_OUT && 199 export CC="$TOOLCHAIN_PREFIX-gcc --sysroot=$BUILD_SYSROOT" && 200 export CFLAGS="-O2 -nostdinc -nostdlib -D__ANDROID__ -DANDROID -DSTDC_HEADERS $INCLUDE_DIRS $GDBSERVER_CFLAGS" && 201 export LDFLAGS="-static -Wl,-z,nocopyreloc -Wl,--no-undefined $LIBRARY_LDFLAGS" && 202 run $SRC_DIR/configure \ 203 --host=$GDBSERVER_HOST \ 204 $CONFIGURE_FLAGS 205 if [ $? != 0 ] ; then 206 dump "Could not configure gdbserver build. See $TMPLOG" 207 exit 1 208 fi 209 CC="$OLD_CC" 210 CFLAGS="$OLD_CFLAGS" 211 LDFLAGS="$OLD_LDFLAGS" 212 213 # build gdbserver 214 dump "Building : $TOOLCHAIN gdbserver." 215 cd $BUILD_OUT && 216 run make -j$NUM_JOBS 217 if [ $? != 0 ] ; then 218 dump "Could not build $TOOLCHAIN gdbserver. Use --verbose to see why." 219 exit 1 220 fi 221 222 # install gdbserver 223 # 224 # note that we install it in the toolchain bin directory 225 # not in $SYSROOT/usr/bin 226 # 227 if [ "$NOTHREADS" = "yes" ] ; then 228 DSTFILE="gdbserver-nothreads" 229 else 230 DSTFILE="gdbserver" 231 fi 232 dump "Install : $TOOLCHAIN $DSTFILE." 233 DEST=`dirname $TOOLCHAIN_PATH` 234 mkdir -p $DEST && 235 run $TOOLCHAIN_PREFIX-objcopy --strip-unneeded $BUILD_OUT/gdbserver $DEST/$DSTFILE 236 if [ $? != 0 ] ; then 237 dump "Could not install $DSTFILE. See $TMPLOG" 238 exit 1 239 fi 240 241 log "Cleaning up." 242 if [ -z "$OPTION_BUILD_OUT" ] ; then 243 run rm -rf $BUILD_OUT 244 fi 245 246 dump "Done." 247