前面转载了一篇 如何编译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的目录,否则脚本执行的时候会报错

wKiom1MtXdnCvJ4OAAE2V8SD_BA439.jpg


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或者其他版本的时候可能也会报错,需要找到相应的错误修改即可



六 编译成功

wKioL1MtYMDxIYz_AAbEEUoWa_8842.jpg


wKiom1MtYWzTiyY-AAJYBz4wx74426.jpg


七  手机测试

将编译好的gdbserver 上传到手机中,赋予可执行的权限,然后运行测试,效果如下图


wKiom1MtYnKDmqjoAAF-h9X5QbU450.jpg


八 附件说明

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 这个目录下