一 概述
二 类型
三 语句
四 函数
五 数据
六 内存
七 代码
附录
编译 GCC
编译器套装(GNU Compiler Collection)。
编译步骤:
- 预处理,生成 .i 文件。(
gcc -E
) - 汇编,生成 .s 文件。(
gcc -S
) - 编译,生成 .o 文件。(
gcc -c
,汇编器 as) - 链接,生成可执行文件。(gcc,链接器 ld)
编译参数:
$ gcc [options] file...
默认 cc 链接到 gcc。
-E
: 输出预处理结果。-S
: 生成汇编文件。(.s)-c
: 编译成目标文件。(.o)-C
: 预处理时保留注释。-o
: 生成目标文件名。(.i, .s, .o, a.out)
-I
: 指定 include 搜索路径列表。-iquote
: 新增专用于#include "..."
的搜索目录。-L
: 指定库搜索路径列表。-l
: 链接库。(-lpthread
链接 libpthread.so 或 .a)-share
: 创建动态链接库。-static
: 静态链接。-Wa,<options>
: 传递参数给汇编器。-Wp,<options>
: 传递参数给预处理起。-Wl,<options>
: 传递参数给链接器。-Wl,-rpath=dir:dir...
: 添加动态库搜索路径。
无论静态还是动态链接,链接参数应该放在输入文件(*.c, *.o)后面。
链接器按顺序处理命令行参数,先扫描提取目标文件符号信息,然后再与链接库匹配。
反过来,会导致 “undefined reference” 错误。
gcc
-g -O0 -I./lib
-o test
*.c
-L./lib -Wl,-rpath=./:./lib -ldemo
如果在 docker alpine 内运行,建议 -static 静态链接。
因为 alpine 使用 musl,而非 glibc。
-g
: 生成调试信息。
默认 -g2,可使用 -g3 包含宏调试信息。
参数 -ggdb 尽可能生成 GDB 可用信息
参数 -gdwarf 生成 DWARF 格式。
-s
: 删除符号表。(strip)-O
: 优化等级。(-O0, -O1, -O2, -O3, -Os)
O0, 关闭所有优化选项。
O1, 简单优化。在不过度增加编译时间的前提下,生成更小更快的可执行文件。
O2, 常规优化。
O3, 深度优化。在常规优化的基础上,尝试内联、寄存器分配和并发执行。
Os, 尺寸优化。在常规优化的基础上,排除使代码大小增加的选项,相当于 O2.5 级别。
-D<macro>=[value]
: 定义宏。-U<macro>
: 取消宏定义。
-Dname
相当于#define name
;-Dname=value
相当于#define name value
-U
只能取消命令行中-D
定义的宏,对代码中定义的宏无效。(难道是我理解错误)
-w
: 阻止警告信息。-W
: 输出警告信息。(-Wall
输出所有警告信息)-Werror
: 将警告信息转换为错误。-Wno-xxx
: 忽略名字为 xxx 的警告。(如-Wno-unused-variable
)-pedantic
: 警告不符合 ISO 标准的语法。-pedantic-errors
: 禁用非标准扩展。
-M
: 输出关联信息,所依赖的源码文件名。-MM
: 所依赖的头文件。
-std
: 语言标准。(c99
,c11
,c17
,gnu99
,gnu11
,gnu17
)
C17, a bug-fix version of the C11.
GNU17, Conform to C17 with the GNU extensions.
在代码里可用
__STDC_VERSION__
判断编译器开启的语言版本。
-no-pie
: 禁止生成地址无关代码。
生成 EXEC(executable file),而非 DYN(shared object file)。
地址无关代码 (position-independent code, PIC),又称地址无关可执行文件 (position-independent executable, PIE) ,是指可在主存储器中任意位置正确地运行,而不受其绝对地址影响的一种机器码。广泛使用于共享库,使得同一个库中的代码能够被加载到不同进程的地址空间中。
PIE 程序装载时使用随机位置,可提升通过绝对地址实施攻击的难度。
通常 PIC 用于动态库,PIE 用于可执行程序。
-save-temps
: 保留临时文件。(.i, .s, .o)-m
: 生成不同架构可执行文件。(生成 16,32,64 位可执行文件)。-march
: 按特定 CPU 架构生成指令。-v
: 输出详细信息。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论