【问题标题】:build gdb and gdbserver for android为 android 构建 gdb 和 gdbserver
【发布时间】:2020-04-01 14:52:33
【问题描述】:

我正在开发 64 位 linux,需要为我的 aarch64 Android 手机构建 gdbserver。NDK 中有预构建的 gdbserver,但它使用的是 NDK 中的 python包,没有使用我的系统python,我无法安装其他python插件。

如何查找./configure 需要哪个--target--host 参数?我尝试了--help,并用谷歌搜索了“build gdbserver aarch64”或“gdbserver configure android”,但没有找到 aarch64 Android 的任何答案。

对于 gdb 我可以使用 ./configure --enable-targets=all,但是对于 gdbserver 呢?是否有所有可用参数的“列表”?

这是我尝试构建 gdbserver

的方法
  1. 下载gcc-arm-none-eabi-9-2019-q4-major-x86_64-linux包,解压并添加到PATH,添加环境变量CC=arm-none-eabi-gccCXX=arm-none-eabi-g++,使可执行文件在PATH中可用
  2. 我尝试了所有这些:
    ../configure  
    ../configure --host=aarch64-linux             --target=aarch64-linux-androideabi
    ../configure --host=aarch64-linux-androideabi --target=aarch64-linux
    ../configure --host=aarch64-linux-androideabi --target=aarch64-linux-androideabi
  1. make,结果:
    ...
    make[3]: Nothing to be done for 'all'.
    make[3]: Leaving directory '/opt/gdb-9.1/gdb/gdbserver/build/build-libiberty-gdbserver/testsuite'
    make[2]: Leaving directory '/opt/gdb-9.1/gdb/gdbserver/build/build-libiberty-gdbserver'
    make[1]: Leaving directory '/opt/gdb-9.1/gdb/gdbserver/build'
    make: *** No rule to make target '../alloc.c'.  Stop.
also tried:
    make CC=arm-none-eabi-gcc CXX=arm-none-eabi-g++
    or CC=aarch64-linux-android28-clang CXX=aarch64-linux-android28-clang++
But same result.

【问题讨论】:

  • 你明白gdbserver在目标平台上运行,并且必须使用针对Android / aarch64的编译器来构建,对吧?使用CC=... CXX=... ./configure && make 就足够了。
  • @EmployedRussian 您好,我尝试了您的提示,但仍然没有成功,请更新帖子。

标签: gdb gdbserver android-debugging


【解决方案1】:

从其他地方得到答案,放在这里以防万一。

  1. 下载gdb源代码:
   wget ftp://sourceware.org/pub/gdb/releases/gdb-9.1.tar.gz
  1. 解压文件:
 tar xzvf gdb-9.1.tar.gz
  1. 移至源文件夹
 cd gdb-9.1
  1. 编辑文件 gdb/gdbserver/linux-low.c:
  • 4.1。添加两行:第 107 行和第 122 行,内容如下
#define HAVE_ELF32_AUXV_T  //  Line 107 (Added)
#ifndef HAVE_ELF32_AUXV_T

#define HAVE_ELF64_AUXV_T // Line 122 (Added)
#ifndef HAVE_ELF64_AUXV_T

此修改是构建 Android 所必需的,因为 Android 系统库已经定义了 struct Elf32_auxv_t 和 Elf64_auxv_t 。(详情请参阅:https://github.com/android/ndk/issues/1008

  • 4.2。修改函数linux_request_interrupt
static void
linux_request_interrupt (void)
 {
   /* .... */
-  kill (-signal_pid, SIGINT); // replace this line with next 3 lines
+  int r = kill (-signal_pid, SIGINT);
+  if (r != 0)
+      kill (signal_pid, SIGINT);
 }

这修复了错误“gdbserver not handling Ctrl+C”,详情在:https://sourceware.org/bugzilla/show_bug.cgi?id=18772

  1. 为 linux 构建 gdb:
sudo apt-get install build-essential \
  gcc g++ make autogen m4 \
  bison gettext libpython-dev

mkdir build-linux

cd build-linux/

../configure --enable-targets=all --with-python=/usr/bin/python

make -j4

sudo make install
  1. 为 android 构建 gdbserver:
  • 6.1.下载android-sdk
cd ~

mkdir android

cd android

wget https://dl.google.com/android/repository/commandlinetools-linux-6200805_latest.zip

unzip commandlinetools-linux-6200805_latest.zip

export PATH=$PATH:~/android/tools/bin
  • 6.2。安装 Ndk
sdkmanager --install "ndk;21.0.6113669" --sdk_root=.
  • 6.3。为 NDK 创建独立工具链
cd ~/android/ndk/21.0.6113669/

./build/tools/make-standalone-toolchain.sh \ 
--toolchain=aarch64-linux-android-4.9 \
--install-dir=~/android/ndk_21

这一步创建独立工具链:~/android/ndk_21

  • 6.4。为 android 配置和构建 gdbserver
cd ~/gdb-9.1

mkdir build-android

cd build-android

export PATH=$PATH:~/android/ndk_21/bin

CC=aarch64-linux-android-gcc ../configure \
    --target=aarch64-linux-android \
    --host=aarch64-linux-android \
     LDFLAGS="-static-libstdc++"

make -j4

如果遇到与“source-highlight”相关的错误,请将--disable-source-highlight 添加到configure 标志。

构建完成后,gdbserver 位于:gdb/gdbserver/gdbserver

【讨论】:

  • 酷!如果我将来需要自己构建 gdbserver,我知道在哪里可以找到方法:-)
【解决方案2】:

最简单的方法是通过 Android SDK 附带的 NDK,例如 Android Studio。进入 Android SDK 中的 NDK 并导航到 ndk-bundle/prebuilt/android-arm64/gdbserver/gdbserver ;这将为您提供 aarch64 (arm64) 的预构建 gdbserver 可执行文件。除了 aarch64 之外,您还可以在 ndk-bundle/prebuilt 中找到其他预构建的 gdbserver 可执行文件。

【讨论】:

  • 谢谢。我错过了帖子中的 why,NDK 的预构建使用它自己的 python,而不是系统 pthon。我无法安装带有pip 的插件。
  • 感谢您的澄清。我想如果你想修改 gdbserver 源代码..
【解决方案3】:

要在 termux 中安装 gdb,您只需运行:

pkg install gdb

这将安装 gdb 和 gdbserver

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-05
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多