GCC 13.2 编译 C 程序实战:4 步拆解预处理、编译、汇编、链接生成 a.out

GCC 13.2 编译 C 程序全流程拆解:从源代码到可执行文件的深度实践指南

1. 理解编译流程的核心价值

当我们按下回车键执行 gcc main.c 命令时,背后隐藏着一系列精密的转换过程。这些看似自动化的步骤实际上决定了程序能否正确运行、性能如何优化,甚至关系到安全漏洞的防范。对于中高级开发者而言,掌握GCC编译的完整流程意味着:

  • 精准调试 :能够定位到预处理、编译、汇编或链接阶段的特定错误
  • 性能调优 :理解每个阶段对最终代码质量的影响
  • 构建控制 :灵活控制大型项目的编译过程和依赖关系
  • 安全防护 :识别编译过程中的潜在风险点

现代C项目的构建系统(如CMake、Makefile)本质上都是对这些基础步骤的自动化封装。让我们通过GCC 13.2的最新特性,深入剖析这个将人类可读代码转化为机器指令的精密过程。

2. 实验环境准备

2.1 工具链配置

推荐使用最新版本的GCC工具链以获得最佳性能和特性支持:

# Ubuntu/Debian系统安装命令
sudo apt update && sudo apt install build-essential gcc-13 -y

# 验证安装
gcc-13 --version | head -n1

典型输出应显示:

gcc-13 (Ubuntu 13.2.0-4ubuntu3) 13.2.0

2.2 示例代码准备

创建具有典型特征的测试文件 demo.c

// demo.c
#include <stdio.h>
#define PI 3.1415926
#define CIRCLE_AREA(r) (PI*(r)*(r))

int main() {
    // 计算半径为5的圆面积
    float area = CIRCLE_AREA(5);
    printf("Area: %.2f\n", area);
    return 0;
}

3. 编译四阶段深度解析

3.1 预处理阶段:代码的第一次变形

执行预处理命令:

gcc-13 -E demo.c -o demo.i

关键变化观察:

  1. 宏完全展开 :所有 #define 被替换为实际值
  2. 头文件注入 #include <stdio.h> 被替换为数百行声明
  3. 源码净化 :注释被移除,添加行号标记

提示:使用 -dM 参数可查看所有宏定义

gcc-13 -E -dM demo.c | grep -i '^#define'

3.2 编译阶段:从C到汇编的跨越

生成汇编代码:

gcc-13 -S demo.i -o demo.s

现代GCC 13.2的编译过程包含多个优化阶段:

优化阶段 作用描述 对应GCC参数
语法树构建 构建抽象语法树(AST) -fdump-tree-all
RTL生成 生成寄存器传输语言 -fdump-rtl-all
指令选择 选择目标架构指令 -fdump-ipa-all
寄存器分配 优化寄存器使用 -fopt-info

查看优化报告:

gcc-13 -S -fopt-info demo.i -o demo.s

3.3 汇编阶段:生成机器码的奥秘

生成目标文件:

gcc-13 -c demo.s -o demo.o

使用 objdump 分析目标文件结构:

objdump -drwCS demo.o

关键信息解读:

  • 节区(Sections) :.text(代码)、.data(初始化数据)、.bss(未初始化数据)
  • 重定位信息 :标记需要链接器处理的符号引用
  • 调试信息 :DWARF格式的调试数据(如有-g参数)

3.4 链接阶段:构建最终可执行体

静态链接示例:

gcc-13 demo.o -o demo -static

动态链接分析工具:

ldd ./demo

GCC 13.2的链接器改进:

  • 更智能的符号冲突检测
  • 改进的调试信息合并
  • 增强的LTO(链接时优化)支持

4. 高级技巧与实战应用

4.1 多文件编译管理

项目结构示例:

project/
├── src/
│   ├── math_utils.c
│   └── math_utils.h
└── main.c

高效编译方法:

# 并行编译(利用多核CPU)
gcc-13 -c src/math_utils.c -o obj/math_utils.o &
gcc-13 -c main.c -o obj/main.o &
wait

# 最终链接
gcc-13 obj/*.o -o project

4.2 调试信息生成

生成带调试信息的可执行文件:

gcc-13 -g3 -Og demo.c -o demo_debug

调试信息等级说明:

  • -g1 :最小调试信息(仅堆栈展开)
  • -g2 :标准调试信息(GDB基本支持)
  • -g3 :包含宏定义等额外信息

4.3 优化级别对比

不同优化级别对比实验:

优化级别 编译参数 代码大小 运行速度 编译时间
O0 -O0 最大 最慢 最短
O1 -O1 中等 较快 中等
O2 -O2 较小 较长
O3 -O3 最小 最快 最长
Os -Os 极小 中等 中等

测试命令:

for level in O0 O1 O2 O3 Os; do
    gcc-13 -$level demo.c -o demo_$level
    size demo_$level
done

5. 现代编译技术前沿

5.1 链接时优化(LTO)

启用LTO编译:

gcc-13 -flto -O2 demo.c -o demo_lto

LTO工作流程:

  1. 编译阶段生成GIMPLE中间表示
  2. 链接阶段进行跨模块优化
  3. 生成最终机器码

5.2 静态分析集成

使用GCC静态分析器:

gcc-13 -fanalyzer demo.c

可检测的常见问题:

  • 内存泄漏
  • 空指针解引用
  • 数组越界
  • 未初始化变量

5.3 交叉编译实战

ARM64交叉编译示例:

aarch64-linux-gnu-gcc-13 -mcpu=cortex-a72 demo.c -o demo_arm

关键参数说明:

  • -march :指定目标架构
  • -mtune :优化特定CPU型号
  • -mfloat-abi :浮点运算约定

6. 性能调优实战案例

6.1 热点函数分析

编译带性能分析信息的代码:

gcc-13 -pg -O2 demo.c -o demo_profile

生成分析报告:

./demo_profile
gprof demo_profile gmon.out > analysis.txt

6.2 向量化优化

检查自动向量化效果:

gcc-13 -O3 -fopt-info-vec demo.c -o demo_vec

手动向量化提示:

// 使用GCC向量扩展
typedef float v4sf __attribute__((vector_size(16)));

6.3 分支预测优化

帮助编译器优化分支:

#define likely(x)   __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)

if (unlikely(error_condition)) {
    handle_error();
}

7. 安全加固实践

7.1 内存保护机制

启用安全编译选项:

gcc-13 -fstack-protector-strong -D_FORTIFY_SOURCE=2 demo.c -o demo_secure

安全功能说明:

  • 栈保护 :检测栈溢出攻击
  • 格式化字符串保护 :检查printf系列函数
  • 立即绑定 :减少PLT劫持风险

7.2 漏洞缓解技术

现代缓解技术启用:

gcc-13 -fcf-protection=full -fstack-clash-protection demo.c -o demo_hardened

7.3 静态漏洞扫描

使用GCC静态分析:

gcc-13 -fanalyzer -Wformat-security demo.c

常见安全警告选项:

  • -Wformat=2 :格式化字符串检查
  • -Wstringop-overflow :缓冲区溢出检测
  • -Warray-bounds :数组边界检查

8. 构建系统集成

8.1 Makefile最佳实践

高效构建模板:

CC = gcc-13
CFLAGS = -O2 -g3 -Wall
LDFLAGS = -flto

SRCS = $(wildcard src/*.c)
OBJS = $(SRCS:.c=.o)

demo: $(OBJS)
    $(CC) $(LDFLAGS) -o $@ $^

%.o: %.c
    $(CC) $(CFLAGS) -c -o $@ $<

clean:
    rm -f demo $(OBJS)

8.2 CMake集成示例

现代CMake配置:

cmake_minimum_required(VERSION 3.20)
project(Demo LANGUAGES C)

set(CMAKE_C_COMPILER gcc-13)
set(CMAKE_C_STANDARD 17)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3 -flto")

add_executable(demo src/main.c src/math.c)
target_include_directories(demo PRIVATE include)

9. 疑难问题排查指南

9.1 常见错误解析

错误类型 典型表现 解决方案
链接错误 undefined reference 检查库路径和链接顺序
预处理错误 macro redefined 使用 -dM 检查宏定义冲突
优化引发问题 -O2下行为异常 使用 -Og 调试,逐步提高优化
兼容性问题 不同GCC版本行为差异 指定 -std= 标准版本

9.2 调试技巧汇编

  1. 预处理问题

    gcc-13 -E -dD -v demo.c > preprocess.log
    
  2. 汇编检查

    gcc-13 -S -fverbose-asm demo.c
    
  3. 内存布局分析

    readelf -S demo
    
  4. 依赖检查

    gcc-13 -M demo.c
    

10. 性能分析工具链

10.1 编译耗时分析

使用 time -ftime-report

time gcc-13 -O2 -ftime-report demo.c -o demo

10.2 代码大小优化

分析各段大小:

size -A demo

缩减代码尺寸技巧:

  • -Os 优化
  • -ffunction-sections -fdata-sections 配合链接器 --gc-sections
  • 去除调试信息 strip

10.3 反汇编分析

生成带源码的反汇编:

gcc-13 -g -O2 demo.c -o demo
objdump -d -S demo > disassembly.s

11. 跨平台编译策略

11.1 多架构支持

查看目标支持:

gcc-13 -print-multi-lib

编译32位版本:

gcc-13 -m32 demo.c -o demo32

11.2 特性检测宏

检查CPU特性支持:

#if defined(__AVX2__)
// AVX2指令集优化代码
#endif

11.3 兼容性构建

确保最大兼容性:

gcc-13 -mtune=generic -march=x86-64 -O2 demo.c

12. 编译器内部探索

12.1 中间表示转储

查看GIMPLE表示:

gcc-13 -fdump-tree-gimple demo.c

12.2 优化过程跟踪

观察优化步骤:

gcc-13 -O2 -fdump-tree-optimized demo.c

12.3 插件开发基础

示例插件编译:

gcc-13 -fplugin=./my_plugin.so demo.c

13. 工具链生态整合

13.1 与Clang交互

混合使用工具链:

clang -emit-llvm -S demo.c -o demo.ll
llc -march=x86-64 demo.ll -o demo.s
gcc-13 demo.s -o demo

13.2 静态分析器集成

使用scan-build:

scan-build-13 gcc-13 -O2 demo.c -o demo

13.3 性能剖析工具

perf集成示例:

perf record ./demo
perf report

14. 现代C标准支持

14.1 C17特性应用

启用最新标准:

gcc-13 -std=c17 demo.c

14.2 特性测试宏

安全使用新特性:

#if __has_include(<stdatomic.h>)
#include <stdatomic.h>
#endif

14.3 兼容性考虑

确保向后兼容:

gcc-13 -std=gnu11 -D_DEFAULT_SOURCE demo.c

15. 嵌入式开发特别考量

15.1 裸机编译配置

指定链接脚本:

gcc-13 -T linker.ld -nostdlib demo.c -o demo.elf

15.2 大小优化技巧

关键参数组合:

gcc-13 -Os -ffunction-sections -fdata-sections -Wl,--gc-sections demo.c

15.3 交叉调试支持

生成带调试信息的ELF:

arm-none-eabi-gcc -g -specs=nano.specs demo.c -o demo.elf

16. 编译器行为定制

16.1 自定义优化

特定函数优化级别:

__attribute__((optimize("O3"))) void hot_function() {
    // 热点代码
}

16.2 节区控制

指定变量存储位置:

__attribute__((section(".mysection"))) int my_var;

16.3 内联策略

控制内联行为:

gcc-13 --param max-inline-insns-auto=100 demo.c

17. 性能关键型代码优化

17.1 循环优化

检查向量化报告:

gcc-13 -O3 -fopt-info-vec-missed demo.c

17.2 分支预测

使用likely/unlikely:

if (__builtin_expect(ptr != NULL, 1)) {
    // 大概率路径
}

17.3 内存访问优化

强制对齐:

__attribute__((aligned(64))) float array[1024];

18. 安全编程实践

18.1 缓冲区保护

安全字符串函数:

#define _GNU_SOURCE
#include <string.h>

char buf[100];
strlcpy(buf, src, sizeof(buf));

18.2 整数溢出防护

安全算术运算:

#include <stdckdint.h>

if (ckd_add(&result, a, b)) {
    // 处理溢出
}

18.3 静态分析集成

编译时检查:

gcc-13 -Wformat -Wformat-security demo.c

19. 调试技巧进阶

19.1 核心转储分析

生成和分析核心转储:

ulimit -c unlimited
./demo
gdb ./demo core

19.2 反向调试

使用rr工具:

rr record ./demo
rr replay

19.3 内存错误检测

AddressSanitizer集成:

gcc-13 -fsanitize=address -g demo.c -o demo_asan

20. 构建系统高级话题

20.1 增量构建优化

CCache配置:

export CCACHE_PREFIX="distcc"
export CC="ccache gcc-13"

20.2 分布式编译

使用distcc:

distcc gcc-13 -O2 demo.c -o demo

20.3 构建缓存

sccache集成:

export RUSTC_WRAPPER=sccache

21. 编译器开发前瞻

21.1 GCC最新特性

13.2版本亮点:

  • 改进的静态分析器
  • 增强的C2X支持
  • 新的优化passes

21.2 插件系统

示例插件开发:

#include <gcc-plugin.h>
// 插件实现代码...

21.3 自定义pass

开发流程:

  1. 获取GCC源码
  2. 在gcc/passes.c注册新pass
  3. 实现优化逻辑

22. 行业应用案例

22.1 高频交易系统

关键编译参数:

gcc-13 -O3 -march=native -flto -fno-exceptions -fno-rtti trade.c

22.2 嵌入式实时系统

实时性保障配置:

gcc-13 -Os -fno-common -fno-short-enums -mthumb -mcpu=cortex-m4 firmware.c

22.3 科学计算应用

数值计算优化:

gcc-13 -O3 -mavx2 -mfma -ffast-math simulation.c

23. 工具链深度集成

23.1 与GDB协作

优化调试体验:

gcc-13 -g3 -Og -fvar-tracking demo.c -o demo

23.2 性能剖析支持

生成剖析信息:

gcc-13 -pg -O2 demo.c -o demo_profile

23.3 覆盖率分析

生成覆盖率数据:

gcc-13 -fprofile-arcs -ftest-coverage demo.c -o demo_coverage

24. 编译原理实践

24.1 词法分析观察

生成lexer输出:

gcc-13 -dD -E -P demo.c > demo.lex

24.2 语法树可视化

生成AST图形:

gcc-13 -fdump-tree-original-graph demo.c

24.3 中间码优化

观察GIMPLE变化:

gcc-13 -O2 -fdump-tree-optimized demo.c

25. 持续集成集成

25.1 自动化构建

典型CI脚本:

#!/bin/bash
set -e

export CC=gcc-13
export CFLAGS="-Wall -Werror -O2"

mkdir -p build && cd build
cmake ..
make -j$(nproc)
ctest --output-on-failure

25.2 静态分析流水线

集成scan-build:

scan-build-13 --status-bugs make

25.3 性能基准测试

编译期性能检测:

time gcc-13 -O2 -ftime-report demo.c -o demo

26. 跨语言交互

26.1 C与汇编混合

内联汇编示例:

asm volatile ("movl %%eax, %0" : "=r"(result));

26.2 C++互操作

extern "C"用法:

extern "C" {
    #include "c_lib.h"
}

26.3 Rust FFI

C兼容接口:

#[no_mangle]
pub extern "C" fn rust_function() -> i32 {
    42
}

27. 安全编译基准

27.1 硬化检查清单

安全编译选项:

gcc-13 -fstack-protector-strong -D_FORTIFY_SOURCE=2 -fPIE -pie -Wformat=2

27.2 认证合规

MISRA-C检查:

gcc-13 -fplugin=/path/to/misra_plugin.so demo.c

27.3 漏洞模式识别

常见危险模式:

  • 未检查的用户输入
  • 不安全的字符串操作
  • 整数溢出风险

28. 编译器性能调优

28.1 并行编译优化

多核利用:

gcc-13 -flto=auto -O2 -pipe -march=native -j$(nproc) demo.c

28.2 内存使用控制

限制资源:

ulimit -v 4000000
gcc-13 -O3 large_project.c

28.3 缓存友好构建

优化构建顺序:

gcc-13 -frepo -O2 demo.c

29. 调试信息管理

29.1 分离调试信息

生成独立调试文件:

objcopy --only-keep-debug demo demo.debug
strip --strip-debug --strip-unneeded demo

29.2 压缩调试信息

减小体积:

gcc-13 -g -gz=zlib demo.c -o demo

29.3 调试信息级别

控制详细程度:

gcc-13 -g1 demo.c -o demo_minimal
gcc-13 -g3 demo.c -o demo_full

30. 编译器内部机制

30.1 前端处理流程

词法分析 → 语法分析 → 语义分析

30.2 中间表示转换

AST → GENERIC → GIMPLE → RTL

30.3 后端代码生成

指令选择 → 寄存器分配 → 指令调度

31. 优化技术深度

31.1 循环优化技术

  • 循环展开
  • 循环向量化
  • 循环分块

31.2 内联策略

成本模型分析:

gcc-13 -O2 -fopt-info-inline demo.c

31.3 链接时优化

全程序分析优势:

  • 跨模块常量传播
  • 冗余代码消除
  • 更精确的过程间分析

32. 异常处理机制

32.1 C++异常开销

分析异常成本:

gcc-13 -fno-exceptions -DNO_EXCEPTIONS benchmark.cpp

32.2 安全异常处理

资源清理保障:

__attribute__((cleanup)) void guard_func(void* arg) {
    // 资源释放代码
}

32.3 错误返回优化

错误码模式:

typedef struct {
    int value;
    int error;
} result_t;

result_t safe_operation() {
    // 实现
}

33. 模板元编程支持

33.1 C++模板实例化

观察实例化过程:

gcc-13 -fdump-tree-original -O2 template.cpp

33.2 编译期计算

constexpr应用:

constexpr int factorial(int n) {
    return n <= 1 ? 1 : n * factorial(n-1);
}

33.3 概念约束

C++20概念检查:

template<typename T>
concept Numeric = std::is_arithmetic_v<T>;

34. 多线程编程支持

34.1 内存模型保障

原子操作支持:

#include <stdatomic.h>
atomic_int counter = ATOMIC_VAR_INIT(0);

34.2 线程局部存储

TLS使用:

__thread int thread_specific_var;

34.3 同步原语优化

高效自旋锁:

typedef atomic_int spinlock_t;
#define SPIN_INIT() 0
#define SPIN_LOCK(l) while(atomic_exchange(l, 1)) {}
#define SPIN_UNLOCK(l) atomic_store(l, 0)

35. 向量化编程实践

35.1 自动向量化

检查向量化报告:

gcc-13 -O3 -fopt-info-vec demo.c

35.2 手动向量化

使用向量扩展:

typedef float v4sf __attribute__((vector_size(16)));
v4sf a = {1.0f, 2.0f, 3.0f, 4.0f};
v4sf b = a + a;

35.3 SIMD指令优化

特定指令集使用:

#include <immintrin.h>
__m256d va = _mm256_load_pd(a);
__m256d vb = _mm256_load_pd(b);
__m256d vc = _mm256_add_pd(va, vb);

36. 浮点运算控制

36.1 精度控制

严格浮点模型:

gcc-13 -O2 -ffloat-store demo.c

36.2 快速数学

放宽精度要求:

gcc-13 -O2 -ffast-math demo.c

36.3 异常处理

浮点异常检查:

gcc-13 -fnon-call-exceptions demo.c

37. 嵌入式特定优化

37.1 空间优化

节区压缩:

gcc-13 -Os -ffunction-sections -fdata-sections demo.c

37.2 延迟敏感代码

优化中断处理:

__attribute__((interrupt)) void isr() {
    // 关键中断代码
}

37.3 低功耗模式

电源管理提示:

__attribute__((optimize("Os"))) void low_power_func() {
    // 低功耗代码
}

38. 调试符号高级用法

38.1 条件调试

选择性调试信息:

gcc-13 -g -feliminate-unused-debug-symbols demo.c

38.2 符号压缩

减小调试大小:

gcc-13 -g -fdebug-prefix-map=$(pwd)=. demo.c

38.3 源码映射

容器内调试支持:

gcc-13 -g -fdebug-prefix-map=/build=/usr/src demo.c

39. 编译器扩展应用

39.1 属性语法

函数属性示例:

__attribute__((always_inline)) void critical_func() {
    // 强制内联函数
}

39.2 内置函数

编译器内置函数:

int leading_zeros = __builtin_clz(x);

39.3 向量扩展

SIMD向量类型:

typedef int v4si __attribute__((vector_size(16)));

40. 构建时代码生成

40.1 编译时计算

常量表达式:

#define ARRAY_SIZE (sizeof(data)/sizeof(data[0]))

40.2 X宏技术

减少重复代码:

#define LIST_OF_VARS \
    X(int, count)    \
    X(float, total)

#define X(type, name) type name;
LIST_OF_VARS
#undef X

40.3 代码生成器

集成构建流程:

%.c: %.gen
    generator $< > $@

41. 安全编码强制

41.1 静态断言

编译时检查:

_Static_assert(sizeof(int) == 4, "int must be 4 bytes");

41.2 边界检查

数组安全访问:

#define SAFE_ACCESS(arr, idx) \
    ((idx) < sizeof(arr)/sizeof(arr[0]) ? arr[idx] : (abort(),0))

41.3 类型安全

强类型定义:

typedef struct { int value; } meter_t;
typedef struct { int value; } second_t;

42. 性能分析集成

42.1 时间测量

高精度计时:

#include <time.h>
struct timespec start, end;
clock_gettime(CLOCK_MONOTONIC, &start);
// 被测代码
clock_gettime(CLOCK_MONOTONIC, &end);

42.2 性能计数器

硬件事件采样:

perf stat -e cycles,instructions,cache-references ./demo

42.3 代码热图

识别热点:

perf record -g ./demo
perf report -g 'graph,0.5,caller'

43. 异常处理优化

43.1 零成本异常

C++异常开销分析:

gcc-13 -fno-exceptions -DNO_EXCEPTIONS benchmark.cpp

43.2 错误码模式

高效错误传递:

typedef struct {
    int value;
    int error;
} result_t;

43.3 资源安全

RAII风格管理:

__attribute__((cleanup)) void guard(void* p) {
    free(*(void**)p);
}

#define AUTO_FREE __attribute__((cleanup(guard))) void*

44. 内存管理进阶

44.1 自定义分配器

内存池实现:

typedef struct {
    char* pool;
    size_t pos;
} mem_pool;

void* pool_alloc(mem_pool* p, size_t size) {
    void* ptr = p->pool + p->pos;
    p->pos += size;
    return ptr;
}

44.2 安全释放模式

双重释放防护:

#define SAFE_FREE(p) do { free(p); (p) = NULL; } while(0)

44.3 内存布局控制

结构体打包:

struct __attribute__((packed)) sensor_data {
    uint8_t id;
    uint32_t value;
};

45. 多平台兼容技巧

45.1 字节序处理

安全转换函数:

#include <endian.h>
uint32_t net_order = htobe32(host_order);

45.2 对齐要求

跨平台对齐:

#include <stdalign.h>
alignas(64) char cache_line[64];

45.3 特性检测

条件编译:

#if defined(__GNUC__) && __GNUC__ >= 5
// GCC特有特性
#endif

46. 编译器诊断增强

46.1 静态检查

强化警告:

gcc-13 -Wall -Wextra -Wpedantic demo.c

46.2 错误预防

可能错误检测:

__attribute__((warn_unused_result)) int critical_op();

46.3 代码风格

格式化提示:

__attribute__((format(printf, 1, 2)))
void log_message(const char* fmt, ...);

47. 链接脚本魔法

47.1 内存布局控制

自定义段分配:

MEMORY {
    FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 256K
    RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 64K
}

SECTIONS {
    .text : { *(.text*) } > FLASH
    .data : { *(.data*) } > RAM AT> FLASH
}

47.2 变量定位

绝对地址变量:

extern uint32_t __stack_top[];
__attribute__((section(".stack"))) 
uint32_t stack[1024] = { (uint32_t)__stack_top };

47.3 启动代码

自定义初始化:

.section .init
.global _start
_start:
    ldr sp, =__stack_top
    bl main

48. 调试信息优化

48.1 最小调试

基础调试信息:

gcc-13 -g1 demo.c -o demo

48.2 符号压缩

减小调试大小:

gcc-13 -g -fdebug-prefix-map=$(pwd)=. demo.c

48.3 源码映射

容器调试支持:

gcc-13 -g -fdebug-prefix-map=/build=/usr/src demo.c

49. 构建缓存技术

49.1 ccache配置

加速重复构建:

export CCACHE_DIR="/tmp/ccache"
export CC="ccache gcc-13"

49.2 分布式编译

使用distcc:

export DISTCC_HOSTS="localhost host2 host3"
make -j$(distcc -j)

49.3 预编译头

加速编译:

gcc-13 -xc-header stdafx.h -o stdafx.h.gch

50. 编译器内部探索

50.1 中间表示转储

查看GIMPLE:

gcc-13 -fdump-tree-gimple demo.c

50.2 优化过程跟踪

观察pass应用:

gcc-13 -O2 -fdump-tree-optimized demo.c

50.3 汇编输出

生成带注释汇编:

gcc-13 -S -fverbose-asm demo.c
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值