Clang
Clang是一个由LLVM项目开发的开源编译器前端,支持C、C++、Objective-C等编程语言的编译。
编译命令
生成可执行文件
1 | clang -o output_program source_file.c |
预处理
预处理阶段是源代码中所有宏定义、头文件包含以及条件编译指令的处理阶段。在预处理阶段会将源代码中的宏替换为相应的内容,展开头文件,并生成一个预处理结果文件。
1 | clang -E source_file.c -o output_file.i |
-E
:表示只执行预处理,并生成预处理后的输出。source_file.c
:输入的源代码文件。output_file.i
:输出的预处理文件(扩展名通常为.i
)。
编译
编译阶段将预处理过的源代码转化为汇编代码。
1 | clang -S source_file.c -o output_file.s |
-S
:表示只进行编译,将源代码编译为汇编代码。source_file.c
:输入的源代码文件。output_file.s
:输出的汇编代码文件(扩展名通常为.s
)。
汇编
汇编阶段将汇编代码转化为机器码,并生成一个目标文件(通常是.o
文件)。该目标文件包含了机器可执行的代码,但还没有完成链接过程。
1 | clang -c source_file.c -o output_file.o |
-c
:表示只进行汇编,将源代码编译为目标文件(.o
文件)。source_file.c
:输入的源代码文件。output_file.o
:输出的目标文件(.o
文件)。
链接
链接阶段将一个或多个目标文件(.o
文件)与库文件(静态库、动态库)合并,生成最终的可执行文件。此过程包括符号解析和重定位。
1 | clang source_file.o -o output_program |
source_file.o
:输入的目标文件(.o
文件)。output_program
:输出的最终可执行文件。
指定目标平台交叉编译
可以在一个平台上编译出适用于另一个平台的二进制文件。
1 | clang --target=xxx -o output_program source_file.c |
GDB
GDB(GNU Debugger) 是 GNU 项目提供的一款强大的调试工具,主要用于调试 C、C++ 和其他支持的编程语言编写的程序。
gdb-multiarch
gdb-multiarch 是 GDB(GNU Debugger) 的一个变体,专门设计用于调试多种体系结构(architecture)的程序,特别是在交叉编译和嵌入式开发场景中非常有用。
1 | sudo apt install gdb-multiarch |
gef插件
安装完成效果如下
常用命令
gef remote
gef-remote
是对 GDB target remote
命令的增强版。该命令会使用远程目标的 /proc
文件系统,在本地临时目录(默认值存储在 gef.config.tempdir
中)中创建一个远程执行环境的副本,包括目标程序及其加载的所有库。此外,它会获取远程 /proc/PID/maps
的全部信息并加载到本地环境中。如果远程目标不支持 /proc
文件系统,该命令可能会失败。但在这种情况下,仍然可以使用 GDB 原生的 target remote
命令(功能有限)。
1 | gef-remote localhost 1234 |
远程调试
使用gdbserver,在ndk目录下,push到手机data/local/tmp
目录下
在目标设备上运行程序并启动 gdbserver
:
1 | gdbserver :1234 ./example |
端口转发
gdb调试命令
b(break)
设置断点
设置函数断点
1
b main
设置地址断点(地址前要加*号)
1
b *0xaaaabbbb
c(continue)
继续执行。
当程序在断点处停止时,使用 c
命令可以让程序继续执行,直到遇到下一个断点或者程序运行完毕。
n
n
(next):单步执行当前行,不进入函数内部。
ni
ni
命令会 单步执行当前行的机器指令,如果当前行有函数调用,ni
不会进入函数内部,而是直接跳到下一个机器指令。
s
s
(step):单步执行当前行,如果有函数调用,会进入函数内部。
finish
继续执行直到当前函数返回。
quit
退出gdb调试器。
make
make
是一个经典的自动化构建工具,主要用于编译和管理项目中的代码文件。它根据 Makefile
中定义的规则,自动检测文件依赖关系并生成目标文件,帮助开发者简化和自动化编译工作。
Makefile 基本结构
make 主要基于“目标-依赖-命令”三要素的概念
Makefile 是 make
的核心文件,通常用于定义构建目标、依赖关系以及执行命令。
1 | 目标: 依赖 |
- **目标 (Target)**:需要生成的文件(例如可执行程序)。
- **依赖 (Dependencies)**:目标生成所需的文件。
- **命令 (Commands)**:构建目标的具体命令(通常是 shell 命令)。
并行构建
1 | make -j4 |
1 | make clean |
常用命令
**make
**:执行默认目标(通常是第一个目标)。
**make <目标>
**:执行指定的目标。
**make -f <文件>
**:指定 Makefile 文件。
**make clean
**:清理文件(运行 clean
伪目标)。
cmake
CMake
是一个跨平台的开源构建系统生成工具,主要用于管理复杂项目的构建过程。它通过编写 CMakeLists.txt 文件,生成适合不同平台和编译器的构建系统文件,从而简化跨平台项目的构建。
CMake 不直接编译代码,而是生成构建系统(例如 Makefile),然后使用生成的构建系统(如 make
)进行实际的编译和构建。
w64devkit
GitHub - skeeto/w64devkit: Portable C and C++ Development Kit for x64 (and x86) Windows
w64devkit 是一个 Dockerfile,用于从源代码构建一个小型、便携的开发套件,旨在为 x86 和 x64 Windows 平台创建 C 和 C++ 应用程序。