为 android 构建 gdb 和 gdbserver
build gdb and gdbserver for android
我正在使用 64 位 linux,需要为我的 aarch64 构建 gdbserver Android phone.There 是预构建的 gdbserver在NDK中,但是它使用了NDK包中的python,没有使用我的系统python,我无法安装其他python插件。
如何找到 ./configure
需要哪个 --target
和 --host
参数?我尝试了 --help
和 google,例如 "build gdbserver aarch64" 或 "gdbserver configure android",但没有找到 aarch64 Android.
的任何答案
对于 gdb 我可以使用 ./configure --enable-targets=all
,但是对于 gdbserver
呢?是否有所有可用参数的"List"?
这是我尝试构建 gdbserver
的方式
- 下载了gcc-arm-none-eabi-9-2019-q4-major-x86_64-linux包,解压并添加到PATH,添加环境变量
CC=arm-none-eabi-gcc
,CXX=arm-none-eabi-g++
,使可执行文件在PATH 中可用
- 这些我都试过了:
../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.
最简单的方法是通过 Android SDK 附带的 NDK,例如 Android Studio。进入 Android SDK 中的 NDK 并导航至 ndk-bundle/prebuilt/android-arm64/gdbserver/gdbserver
;这将为您提供 aarch64 (arm64) 的预构建 gdbserver 可执行文件。除了 aarch64,您还会在 ndk-bundle/prebuilt 中找到其他预构建的 gdbserver 可执行文件。
从其他地方得到答案,放在这里以防谁想要做同样的事情。
- 下载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 not handling 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
要在 termux 中安装 gdb,您只需 运行:
pkg install gdb
这将安装 gdb 和 gdbserver
我正在使用 64 位 linux,需要为我的 aarch64 构建 gdbserver Android phone.There 是预构建的 gdbserver在NDK中,但是它使用了NDK包中的python,没有使用我的系统python,我无法安装其他python插件。
如何找到 ./configure
需要哪个 --target
和 --host
参数?我尝试了 --help
和 google,例如 "build gdbserver aarch64" 或 "gdbserver configure android",但没有找到 aarch64 Android.
对于 gdb 我可以使用 ./configure --enable-targets=all
,但是对于 gdbserver
呢?是否有所有可用参数的"List"?
这是我尝试构建 gdbserver
的方式- 下载了gcc-arm-none-eabi-9-2019-q4-major-x86_64-linux包,解压并添加到PATH,添加环境变量
CC=arm-none-eabi-gcc
,CXX=arm-none-eabi-g++
,使可执行文件在PATH 中可用
- 这些我都试过了:
../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.
最简单的方法是通过 Android SDK 附带的 NDK,例如 Android Studio。进入 Android SDK 中的 NDK 并导航至 ndk-bundle/prebuilt/android-arm64/gdbserver/gdbserver
;这将为您提供 aarch64 (arm64) 的预构建 gdbserver 可执行文件。除了 aarch64,您还会在 ndk-bundle/prebuilt 中找到其他预构建的 gdbserver 可执行文件。
从其他地方得到答案,放在这里以防谁想要做同样的事情。
- 下载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 not handling 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
要在 termux 中安装 gdb,您只需 运行:
pkg install gdb
这将安装 gdb 和 gdbserver