白乐天

道阻且长,行则将至。

编译器调试器等一系列工具合集

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插件

https://github.com/hugsy/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
2
目标: 依赖
命令
  • **目标 (Target)**:需要生成的文件(例如可执行程序)。
  • **依赖 (Dependencies)**:目标生成所需的文件。
  • **命令 (Commands)**:构建目标的具体命令(通常是 shell 命令)。

并行构建

1
2
make -j4
// 同时运行 4 个编译任务
1
2
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++ 应用程序。