前面转载了一篇 如何编译android gdbserver的博文
原文地址如下:
http://sunzeduo.blog.51cto.com/2758509/1381519
本身这篇文章没有什么问题,按部就班的操作可以生成 gdbserver,但是存在的问题如下:
1 本文编写时间比较早,实用的arm交叉编译版本以及gdb版本都比较老了,arm交叉编译版本是arm-eabi-4.4.3 gdb使用的版本是 7.1.x 。
2 从文章来看是使用下载后android源码中的ndk来编译的,这个可以通过其修改了 $MYDROID/ndk/build/tools/prebuilt-common.sh 这个脚本可以看出来,对于没有下载android源码的童鞋造成障碍。
3 文中的
git clone git://android.git.kernel.org/toolchain/gdb.git git clone git://android.git.kernel.org/toolchain/build.git
这两个地址早已经无法下载了,又对想自己动手编译android gdbserver的童鞋造成障碍。
4 在中文搜索引擎里面搜索 android gdb调试等,绝大多数均出自
Android - How-to Rebuild gdbserver 这篇文章的翻译,同样会存在上面的三个问题。
基于以上的问题,笔者自己动手重新简化思路,编译了android gdbserver,降低编译门槛,供更多的童鞋来了解这方面的知识。
一 需要的前置条件
1 下载 Android NDK 直接从 http://developer.android.com/tools/sdk/ndk/index.html 这个地址下载即可,下载下来就是一个压缩包,方便使用。 2 下载 gdb源码 https://github.com/crystax/android-toolchain-gdb 这个下载地址即可
二 添加了两个脚本 (脚本可以从附件下载)
添加目录 你下载解压缩的目录下的 build/tools 这个目录下
build-gdbserver_7.3.x.sh prebuilt-common_7.3.x.sh
三 对应规则
root@ubuntu:~/android/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin# ./arm-linux-androideabi-gdb GNU gdb (GDB) 7.3.1-gg2 root@ubuntu:~/android/android-ndk-r9c/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin# ./arm-linux-androideabi-gdb GNU gdb (GDB) 7.3.1-gg2 arm-linux-androideabi-4.6 GNU gdb (GDB) 7.3.1-gg2 arm-linux-androideabi-4.8 GNU gdb (GDB) 7.3.1-gg2
网上流传的大部分博文,都是gdb 7.1.x的 对应的是 arm交叉编译的 4.4.3
四 编译命令
/root/android/android-ndk-r9c/build/tools/build-gdbserver_7.3.x.sh /Disk/CyanogenMod/androidgdb/gdb_build/ /root/android/android-ndk-r9c/ arm-linux-androideabi-4.6 --verbose --build-out=/Disk/CyanogenMod/androidgdb/gdb_build/install --gdb-version=7.3.x --sysroot=/root/android/android-ndk-r9c/platforms/android-19/arch-arm
命令解释
1 /root/android/android-ndk-r9c/build/tools/build-gdbserver_7.
3
.x.sh
复制过去的脚本
2
/Disk/CyanogenMod/androidgdb/gdb_build/
下载的gdb的路径
要以下图的形式组织gdb的目录,否则脚本执行的时候会报错
3 /root/android/android-ndk-r9c/
下载的ndk解压缩的路径
4 arm-linux-androideabi-4.6 使用ndk中带的arm-linux交叉编译工具,详见ndk根目录下的toolchains目录
5 --verbose
6 --build-out=/Disk/CyanogenMod/androidgdb/gdb_build/install
gdbserver生成的目录,如果编译成功了,则在这个目录下生成gdbserver
7
--gdb-version=7.3.x
要编译的gdb版本,对应你下载的gdb源码包,参考上面的图
8 --sysroot=/root/android/android-ndk-r9c/platforms/android-19/arch-arm
在编译gdbserver的时候需要用的头文件和库文件
五 编译错误修改
笔者在编译 gdb 7.3.x的时候出现了编译错误,主要是关于elf头文件的问题。
在linux_low.c 中
#ifndef ELFMAG0 /* Don‘t include <linux/elf.h> here. If it got included by gdb_proc_service.h then ELFMAG0 will have been defined. If it didn‘t get included by gdb_proc_service.h then including it will likely introduce a duplicate definition of elf_fpregset_t. */ #include <elf.h> #endif
的后面添加下面的代码
typedef struct { uint32_t a_type; union { uint32_t a_val; } a_un; } Elf32_auxv_t; typedef struct { uint64_t a_type; union { uint64_t a_val; } a_un; } Elf64_auxv_t;
注意,这个仅仅是7.3.x编译的时候出错的修改方法,当7.1.x或者其他版本的时候可能也会报错,需要找到相应的错误修改即可
六 编译成功
七 手机测试
将编译好的gdbserver 上传到手机中,赋予可执行的权限,然后运行测试,效果如下图
八 附件说明
1 build-gdbserver_7.3.x.sh 和 prebuilt-common_7.3.x.sh需要拷贝到 /root/android/android-ndk-r9c/build/tools/ 这个目录下
2 linux_low.c 需要拷贝到 /Disk/CyanogenMod/androidgdb/gdb_build/gdb/gdb-7.3.x/gdb/gdbserver 这个目录下