您的位置:首页 > 产品设计 > UI/UE

Build gdbserver for x86 Android

2014-01-15 21:37 316 查看
http://blog.csdn.net/yuleslie/article/details/7226767
http://omappedia.org/wiki/Android_-_How-to_Rebuild_gdbserver

The reference links are for ARM target and old Andriod version, when I tried to build gdbserver for x86 target with Android JB 4.2.2_r1, I got some differences:

Environment

Ubuntu 12.04

gdb-7.3.x

Android JB 4.2.2_r1

It seems the modification(Makefile.in and linux-arm-lower.c) in gdb server is not required for me.

Modification of build scripts

diff --git a/build/tools/build-gdbserver.sh b/build/tools/build-gdbserver.sh
index 2b6c1aa..b1ff8a5 100755
--- a/build/tools/build-gdbserver.sh
+++ b/build/tools/build-gdbserver.sh
@@ -143,30 +143,6 @@ BUILD_SYSROOT="$BUILD_OUT/sysroot"
run mkdir -p "$BUILD_SYSROOT"
run cp -RHL "$SYSROOT"/* "$BUILD_SYSROOT"

-# Remove libthread_db to ensure we use exactly the one we want.
-rm -f $BUILD_SYSROOT/usr/lib/libthread_db*
-rm -f $BUILD_SYSROOT/usr/include/thread_db.h
-
-if [ "$NOTHREADS" != "yes" ] ; then
- # We're going to rebuild libthread_db.o from its source
- # that is under sources/android/libthread_db and place its header
- # and object file into the build sysroot.
- LIBTHREAD_DB_DIR=$ANDROID_NDK_ROOT/sources/android/libthread_db/gdb-$GDB_VERSION
- if [ ! -d "$LIBTHREAD_DB_DIR" ] ; then
- dump "ERROR: Missing directory: $LIBTHREAD_DB_DIR"
- exit 1
- fi
- # Small trick, to avoid calling ar, we store the single object file
- # with an .a suffix. The linker will handle that seamlessly.
- run cp $LIBTHREAD_DB_DIR/thread_db.h $BUILD_SYSROOT/usr/include/
- run $TOOLCHAIN_PREFIX-gcc --sysroot=$BUILD_SYSROOT -o $BUILD_SYSROOT/usr/lib/libthread_db.o -c $LIBTHREAD_DB_DIR/libthread_db.c
- run $TOOLCHAIN_PREFIX-ar -r $BUILD_SYSROOT/usr/lib/libthread_db.a $BUILD_SYSROOT/usr/lib/libthread_db.o
- if [ $? != 0 ] ; then
- dump "ERROR: Could not compile libthread_db.c!"
- exit 1
- fi
-fi
-
log "Using build sysroot: $BUILD_SYSROOT"

# configure the gdbserver build now
diff --git a/build/tools/prebuilt-common.sh b/build/tools/prebuilt-common.sh
index 9a13d29..9b111a6 100644
--- a/build/tools/prebuilt-common.sh
+++ b/build/tools/prebuilt-common.sh
@@ -1127,7 +1127,7 @@ get_toolchain_install ()
get_toolchain_install_subdir ()
{
local SYSTEM=${2:-$(get_prebuilt_host_tag)}
- echo "toolchains/$1/prebuilt/$SYSTEM"
+ echo "prebuilts/gcc/$SYSTEM/x86/i686-linux-android-4.6"
}

# Return the relative install prefix for prebuilt host

Compiling errors and solutions

conflicting types

error

/home/peter/workspace/android_4.2.2_r1/prebuilts/gcc/linux-x86/x86/i686-linux-android-4.6/bin/i686-linux-android-gcc --sysroot=/home/peter/workspace/gdb_build/install/sysroot -o memmem.o -c -O2 -nostdlib -D__ANDROID__ -DANDROID -DSTDC_HEADERS -I/home/peter/workspace/android_4.2.2_r1/prebuilts/gcc/linux-x86/x86/i686-linux-android-4.6/lib/gcc/i686-linux-android//include -I/home/peter/workspace/gdb_build/install/sysroot/usr/include -I. -I/home/peter/workspace/gdb_build/gdb/gdb-7.3.x/gdb/gdbserver -I/home/peter/workspace/gdb_build/gdb/gdb-7.3.x/gdb/gdbserver/../common -I/home/peter/workspace/gdb_build/gdb/gdb-7.3.x/gdb/gdbserver/../regformats -I/home/peter/workspace/gdb_build/gdb/gdb-7.3.x/gdb/gdbserver/../../include -Wall -Wdeclaration-after-statement -Wpointer-arith -Wformat-nonliteral -Wno-char-subscripts /home/peter/workspace/gdb_build/gdb/gdb-7.3.x/gdb/gdbserver/../gnulib/memmem.c
In file included from /home/peter/workspace/gdb_build/install/sysroot/usr/include/sys/_types.h:40:0,
from /home/peter/workspace/gdb_build/install/sysroot/usr/include/stdint.h:32,
from /home/peter/workspace/android_4.2.2_r1/prebuilts/gcc/linux-x86/x86/i686-linux-android-4.6/bin/../lib/gcc/i686-linux-android/4.6/include/stdint.h:3,
from /home/peter/workspace/gdb_build/gdb/gdb-7.3.x/gdb/gdbserver/../gnulib/str-two-way.h:45,
from /home/peter/workspace/gdb_build/gdb/gdb-7.3.x/gdb/gdbserver/../gnulib/memmem.c:34:
/home/peter/workspace/gdb_build/install/sysroot/usr/include/machine/_types.h:44:24: error: conflicting types for 'size_t'
/home/peter/workspace/android_4.2.2_r1/prebuilts/gcc/linux-x86/x86/i686-linux-android-4.6/bin/../lib/gcc/i686-linux-android/4.6/include/stddef.h:212:23: note: previous declaration of 'size_t' was here
/home/peter/workspace/gdb_build/install/sysroot/usr/include/machine/_types.h:46:24: error: conflicting types for 'ptrdiff_t'
/home/peter/workspace/android_4.2.2_r1/prebuilts/gcc/linux-x86/x86/i686-linux-android-4.6/bin/../lib/gcc/i686-linux-android/4.6/include/stddef.h:150:26: note: previous declaration of 'ptrdiff_t' was here
/home/peter/workspace/gdb_build/gdb/gdb-7.3.x/gdb/gdbserver/../gnulib/memmem.c:40:1: error: conflicting types for 'memmem'
/home/peter/workspace/gdb_build/install/sysroot/usr/include/string.h:44:15: note: previous declaration of 'memmem' was here

solution
sysroot/usr/include/machine/_types.h:

#if 0//!defined(__ARM_EABI__)
/* the kernel defines size_t as unsigned int, but g++ wants it to be unsigned long */
#define _SIZE_T
#define _SSIZE_T
#define _PTRDIFF_T
typedef unsigned long size_t;
typedef long ssize_t;
typedef long ptrdiff_t;
#endif

no such instruction

error

/home/peter/workspace/gdb_build/gdb/gdb-7.3.x/gdb/gdbserver/gdbreplay.c: Assembler messages:
/home/peter/workspace/gdb_build/gdb/gdb-7.3.x/gdb/gdbserver/gdbreplay.c:232: Error: no such instruction: `rev16 %ax,%ax'
make: *** [gdbreplay.o] Error 1
make: *** Waiting for unfinished jobs....
/home/peter/workspace/gdb_build/gdb/gdb-7.3.x/gdb/gdbserver/remote-utils.c: Assembler messages:
/home/peter/workspace/gdb_build/gdb/gdb-7.3.x/gdb/gdbserver/remote-utils.c:410: Error: no such instruction: `rev16 %ax,%ax'
/home/peter/workspace/gdb_build/gdb/gdb-7.3.x/gdb/gdbserver/remote-utils.c:426: Error: no such instruction: `rev16 %si,%si'

solution
copy following files from host /usr/include/bits
sysroot/usr/include/bits/
├── byteswap.h
└── wordsize.h
--- /usr/include/bits/byteswap.h 2013-09-30 23:03:21.000000000 +0800
+++ sysroot/usr/include/bits/byteswap.h 2014-01-05 14:07:28.222628058 +0800
@@ -19,7 +19,7 @@
02111-1307 USA. */

#if !defined _BYTESWAP_H && !defined _NETINET_IN_H && !defined _ENDIAN_H
-# error "Never use <bits/byteswap.h> directly; include <byteswap.h> instead."
+//# error "Never use <bits/byteswap.h> directly; include <byteswap.h> instead."
#endif

#ifndef _BITS_BYTESWAP_H
@@ -134,4 +134,9 @@
# endif
#endif

+# define ntohl(x) __bswap_32 (x)
+# define ntohs(x) __bswap_16 (x)
+# define htonl(x) __bswap_32 (x)
+# define htons(x) __bswap_16 (x)
+
#endif /* _BITS_BYTESWAP_H */
gdb-7.3.x/gdb/gdbserver/remote-utils.c
gdb-7.3.x/gdb/gdbserver/gdbreplay.c
#ifdef HAVE_NETINET_IN_H
+#include <bits/byteswap.h>
#include <netinet/in.h>
#endif

'EAX' undeclared here (not in a function)
copy reg.h from /usr/include/sys/reg.h
--- a/gdb-7.3.x/gdb/gdbserver/linux-x86-low.c
+++ b/gdb-7.3.x/gdb/gdbserver/linux-x86-low.c
@@ -57,7 +57,7 @@ static const char *xmltarget_amd64_linux_no_xml = "@<target>\
</target>";
#endif

-#ifdef HAVE_SYS_REG_H
+#if 1 //def HAVE_SYS_REG_H
#include <sys/reg.h>
#endif
#ifdef HAVE_SYS_PROCFS_H
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android debug