返回介绍

编译 GCC

发布于 2024-10-12 21:58:10 字数 4080 浏览 0 评论 0 收藏 0

编译器套装(GNU Compiler Collection)。

编译步骤:

  1. 预处理,生成 .i 文件。( gcc -E
  2. 汇编,生成 .s 文件。( gcc -S
  3. 编译,生成 .o 文件。( gcc -c ,汇编器 as)
  4. 链接,生成可执行文件。(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 : 输出详细信息。

Using the GNU Compiler Collection (GCC)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文