gdb - 为 Android 构建 gdb 和 gdbserver

标签 gdb gdbserver android-debugging

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

如何查找 ./configure 需要哪个 --target--host 参数?我尝试了 --help,并在 google 上搜索“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++,使可执行文件可用在路径中
  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
  • 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.
    

    最佳答案

    从其他地方得到答案,放在这里以防有人想做同样的事情。

    1. 下载gdb源代码:
       wget ftp://sourceware.org/pub/gdb/releases/gdb-9.1.tar.gz
    
  • 提取文件:
  •  tar xzvf gdb-9.1.tar.gz
    
  • 移至源文件夹
  •  cd gdb-9.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 不处理 Ctrl+C”,详细信息位于:https://sourceware.org/bugzilla/show_bug.cgi?id=18772

  • 为 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
    
  • 为 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

    关于gdb - 为 Android 构建 gdb 和 gdbserver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60973768/

    相关文章:

    linux - 如何使用 --add-gnu-debuglink 将 gdb 符号文件保存在挂载文件夹中

    android - 在 Android Studio 中附加调试器的快捷方式

    java - 如何在调试应用程序时检查当前正在运行哪个 Activity

    C程序似乎跳过了while循环

    c++ - 在 Mac OS X 上使用 Eclipse CDT 调试远程 Linux 应用程序

    debugging - 如何让gdb每次启动时都运行用户定义的函数(在.gdbinit中定义)?

    linux - linux命令访问连接到嵌入式PC的USB内存棒?

    linux - 如何使用 gdbserver 进行远程调试?

    Android Studio 3.0 Logcat 不断显示消息并且不会停止

    c++ - 从 vscode C++ 调试步骤中排除文件?