GCC编译过程和原理浅析

什么是GCC

  • GCC(GNU C Compiler)编译器的作者是Richard Stallman,也是GNU项目的奠基者。
  • GCC是GNU Compiler Collection的缩写。最初是作为C语言的编译器,现在已经支持多种语言了,如C、C++、Java、Pascal、Ada、COBOL语言等。
  • GCC支持多种硬件平台,甚至对Don Knuth设计的MMIX这类不常见的计算机都提供了完善的支持。

GCC的主要特征

  • GCC是一个可移植的编译器,支持多种硬件平台。
  • GCC不仅仅是本地编译器,它还能跨平台交叉编译。
  • GCC有多种语言前段,用于解析不同的语言。
  • GCC是按模块化设计的,可以加入新的语言和新CPU架构的支持。
  • GCC是自由软件。

GCC编译程序的过程

编译过程
  1. 预处理(Pre-Processing):主要包括宏定义,文件包含,条件编译三部分。预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对其进行响应和替换。预处理过程还会删除程序中的注释和多余空白字符。最后会生成 .i 文件。
  2. 编译器(Compiling):编译器会将预处理完的 .i 文件进行一些列的语法分析,并优化后生成对应的汇编代码。会生成 .s 文件。
  3. 汇编器(Assembling):汇编器会将编译器生成的 .s 汇编程序汇编为机器语言或指令,也就是可以机器可以执行的二进制程序。会生成 .o 文件。
  4. 链接器(Linking):链接器会来链接程序运行的所需要的目标文件,以及依赖的库文件,最后生成可执行文件,以二进制形式存储在磁盘中。

GCC的编译过程

GCC常用选项

  • -o:生成目标( .i 、 .s 、 .o 、可执行文件等)
  • -c:通知 gcc 取消链接步骤,即编译源码并在最后生成目标文件。
  • -E:只运行 C 预编译器
  • -S:告诉编译器产生汇编语言文件后停止编译,产生的汇编语言文件扩展名为 .s
  • -Wall:使 gcc 对源文件的代码有问题的地方发出警告
    • Idir:将dir目录加入搜索头文件的目录路径
  • -Ldir:将dir目录加入搜索库的目录路径
  • -llib:连接lib库
  • -g:在目标文件中嵌入调试信息,以便gdb之类的调试程序调试

预处理过程

我们以 hello.c 程序为例:

#include <stdio.h>

#define HELLOWORLD ("hello world\n")

int main(void)
{
    printf(HELLOWORLD); 
    return 0;
}

使用gcc -E hello.c -o hello.i命令,将 hello.c 文件预处理并且生成 hello.i 目标文件。

之前说道,预处理会将头文件包含进来并且会将宏定义进行替换,因此替换后的 hello.i 文件如下:

# 1 "hello.c"
# 1 "<built-in>"
# 1 "<命令行>"
# 1 "hello.c"
# 1 "/usr/include/stdio.h" 1 3 4
# 28 "/usr/include/stdio.h" 3 4
# 1 "/usr/include/features.h" 1 3 4
# 361 "/usr/include/features.h" 3 4
# 1 "/usr/include/sys/cdefs.h" 1 3 4
# 365 "/usr/include/sys/cdefs.h" 3 4
# 1 "/usr/include/bits/wordsize.h" 1 3 4
# 366 "/usr/include/sys/cdefs.h" 2 3 4
# 362 "/usr/include/features.h" 2 3 4
# 385 "/usr/include/features.h" 3 4
# 1 "/usr/include/gnu/stubs.h" 1 3 4

......

extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__));
# 938 "/usr/include/stdio.h" 3 4

# 2 "hello.c" 2


int main()
{
printf(("hello world!\n"));
return 0;
}

可以看到将 stdio.h 文件包含进来,并且原封不动的将 HELLOWORLD 宏进行了替换。

编译过程

使用gcc -S hello.i -o hello.s,将生成的hello.i文件编译为汇编程序hello.s。

.file   "hello.c"
    .section    .rodata
.LC0:
    .string "hello world!"
    .text
.globl main
    .type   main, @function
main:
    pushl   %ebp
    movl    %esp, %ebp
    andl    $-16, %esp
    subl    $16, %esp
    movl    $.LC0, (%esp)
    call    puts
    movl    $0, %eax
    leave
    ret
    .size   main, .-main
    .ident  "GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-23)"
    .section    .note.GNU-stack,"",@progbits

可以看到hello.s文件中全部都是汇编指令,说明已经生成成功了。

汇编过程

汇编就是要将hello.s文件中的汇编指令全部转换为二进制的机器指令。
执行gcc -c hello.s -o hello.o命令。而生成的hello.o文件是二进制文件,我们用od -b hello.o命令看一下该二进制文件的八进制表示。

0000000 177 105 114 106 001 001 001 000 000 000 000 000 000 000 000 000
0000020 002 000 003 000 001 000 000 000 
......

链接过程

链接hello.o程序运行的所需要的目标文件,以及依赖的库文件,最后生成可执行文件。
执行gcc hello.o -o hello不需要选项,生成hello二进制的可执行文件。同样可以使用od命令来查看。执行hello文件:./hello

hello world

以上编译过程的分步骤进行,还可以直接执行gcc hello.c -o hello直接生成可执行文件。
至此,使用gcc编译程序的过程就介绍完毕。

待更新...

智能网联汽车的安全员高级考试涉及多个方面的专业知识,包括但不限于自动驾驶技术原理、车辆传感器融合、网络安全防护以及法律法规等内容。以下是针对该主题的一些核心知识解析: ### 关于智能网联车安全员高级考试的核心内容 #### 1. 自动驾驶分级标准 国际自动机工程师学会(SAE International)定义了六个级别的自动驾驶等级,从L0到L5[^1]。其中,L3及以上级别需要安全员具备更高的应急处理能力。 #### 2. 车辆感知系统的组成与功能 智能网联车通常配备多种传感器,如激光雷达、毫米波雷达、摄像头和超声波传感器等。这些设备协同工作以实现环境感知、障碍物检测等功能[^2]。 #### 3. 数据通信与网络安全 智能网联车依赖V2X(Vehicle-to-Everything)技术进行数据交换,在此过程中需防范潜在的网络攻击风险,例如中间人攻击或恶意软件入侵[^3]。 #### 4. 法律法规要求 不同国家和地区对于无人驾驶测试及运营有着严格的规定,考生应熟悉当地交通法典中有关自动化驾驶部分的具体条款[^4]。 ```python # 示例代码:模拟简单决策逻辑 def decide_action(sensor_data): if sensor_data['obstacle'] and not sensor_data['emergency']: return 'slow_down' elif sensor_data['pedestrian_crossing']: return 'stop_and_yield' else: return 'continue_driving' example_input = {'obstacle': True, 'emergency': False, 'pedestrian_crossing': False} action = decide_action(example_input) print(f"Action to take: {action}") ``` 需要注意的是,“同学”作为特定平台上的学习资源名称,并不提供官方认证的标准答案集;建议通过正规渠道获取教材并参加培训课程来准备此类资格认证考试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值