Android Toolchain编译与GDB调试
在进行linux主机上进行arm跨平台进行pure c++开发时,可能混有Neon intrinsic或者ARM assembly代码,此时进行代码编译和调试,可以使用standalone toolchain进行编译,使用gdb+gdbserver进行调试。
首先需要在NDK website上下载一个NDK工具包并解压,本人使用的是r14b版本,链接:https://dl.google.com/android/repository/android-ndk-r14b-linux-x86_64.zip
Standalone Toolchain的编译
1
2
3cd android-ndk-r14b/build/tools/
./make-standalone-toolchain.sh --platform=android-21 --install-dir=./android-aarch64 --arch=arm64
./make-standalone-toolchain.sh --platform=android-21 --install-dir=./android-armv7 --arch=arm通过以上命令,会生成android-aarch64,android-armv7两个目录,可以将生成的standalone toolchain拷贝至固定目录
1
2sudo cp -r android-ndk-r14b/build/tools/android-aarch64 /opt
sudo cp -r android-ndk-r14b/build/tools/android-armv7 /opt以上完成standalone toolchain生成
Linux主机编译arm跨平台pure c++程序
- 在Linux主机上准备main.cpp源代码文件
1
2
3
4
5
6#include <iostream>
int main() {
std::cout << "hello world" << std::endl;
return 0;
}- 编写CMakeLists.txt文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29cmake_minimum_required(VERSION 3.17)
project(ARM)
enable_language(ASM)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_definitions(-w)
SET(CMAKE_BUILD_TYPE "Debug")
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
set(TARGET_CPU aarch64)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static -fPIE -flax-vector-conversions")
if(TARGET_CPU STREQUAL "aarch64")
include_directories(/opt/android-ndk-r14b/android-aarch64/lib64/clang/7.0.2/include)
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfloat-abi=softfp -mfpu=neon")
include_directories(/opt/android-ndk-r14b/android-armv7/lib64/clang/7.0.2/include)
endif()
set(SOURCES
main.cpp
# main.s
)
add_executable(main ${SOURCES})- 编译ARM平台可执行文件
1
2
3
4CXX_COMPILER=/opt/android-ndk-r14b/android-aarch64/bin/aarch64-linux-android-g++
CC_COMPILER=/opt/android-ndk-r14b/android-aarch64/bin/aarch64-linux-android-gcc
cd cmake-build-debug
cmake .. -DCMAKE_C_COMPILER=$CC_COMPILER -DCMAKE_CXX_COMPILER=$CXX_COMPILER- ARM平台程序的执行
1
2adb push main /data/local/tmp
adb shell ./data/local/tmp/mainGDB+GDBServer调试
- 准备GDBServer
测试手机一般出厂不会自带gdbserver,可以将NDK工具包中对应平台gdbserver推入手机
1
adb push android-ndk-r14b/prebuilt/android-arm64/gdbserver/gdbserver /data/local/tmp
- 启动GDBServer
1
2
3
4
5
6
7
8
9adb shell # 进入手机shell命令行
cd /data/local/tmp
./gdbserver tcp:9090 main
# 正常输出如下:
Process main created; pid = 7201
gdbserver: Unable to determine the number of hardware watchpoints available.
gdbserver: Unable to determine the number of hardware breakpoints available.
Listening on port 9090- 在主机平台启动gdb调试程序
1
2
3
4
5
6cd android-ndk-r14b/prebuilt/linux-x86_64/bin # 进入ndk gdb程序目录
adb forward tcp:9090 tcp:9090 # 端口转发
./gdb # 进入gdb程序
target remote localhost:9090 # 开始获取信息并开始调试
b main # 设置断点
# 后续与普通GDB调试相同1
2
3
4n # 下一步,不进入函数内部
s # 下一步,进入函数内部
l # 代码列表
info r # 查看寄存器