ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Gcc 编译过程

2022-04-05 19:03:28  阅读:159  来源: 互联网

标签:Gcc cfi gcc 编译 指令 main 过程 hello


gcc编译

gcc hello.c -o hello

hello.c 预处理——>hello.i 编译——>hello.s 汇编——>hello.o 链接——>hello

示例

hello.c

#include<stdio.h>

#define TEST_STRING "hello world!"

int main()
{
    printf("%s\n", TEST_STRING);
    return 0;
}

预处理

gcc -E hello.c -o hello.i

预编译过程主要处理那些源代码文件中以“#”开始的预编译指令,比如“#include”、“#define”等。

主要处理规则有:

  1. 将所有的“#define”删除,并且展开所有的宏定义。
  2. 处理所有的条件预编译指令,比如:“#if”、“#ifdef”、“#elif”、“#else”、“#endif”
  3. 处理“include”预编译指令,将被包含的文件插入到该预编译指令的位置,该过程是递归进行的。
  4. 删除所有的注释“//”和“/**/”。
  5. 添加行号和文件名标识,以便于编译时编译器产生调试用的行号信息及用于编译时产出错误或警告时能够显示行号。
  6. 保留所有的#pragma编译器指令,因为编译器需要使用它们。

hello.i 文件末尾内容如下,头文件已展开,并将 TEST_STRING 替换为 hello world

/**
 * bala bala 省略部分
 */
# 940 "/usr/include/stdio.h" 3 4

# 9 "hello.c" 2

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

编译

编译过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后生成相应的汇编代码文件。

gcc -S hello.i -o hello.s

编译生成汇编代码 hello.s

	.file	"hello.c"
	.section	.rodata
.LC0:
	.string	"hello world!"
	.text
	.globl	main
	.type	main, @function
main:
.LFB0:
	.cfi_startproc
	pushl	%ebp
	.cfi_def_cfa_offset 8
	.cfi_offset 5, -8
	movl	%esp, %ebp
	.cfi_def_cfa_register 5
	andl	$-16, %esp
	subl	$16, %esp
	movl	$.LC0, (%esp)
	call	puts
	movl	$0, %eax
	leave
	.cfi_restore 5
	.cfi_def_cfa 4, 4
	ret
	.cfi_endproc
.LFE0:
	.size	main, .-main
	.ident	"GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
	.section	.note.GNU-stack,"",@progbits

汇编

汇编器是将汇编代码转变成机器可以执行的指令,每一个汇编语句几乎都对应一条机器指令。

汇编后输出 目标文件,还不可执行!

gcc -c hello.s -o hello.o

链接

链接的过程主要包括:地址和空间分配、符号决议和重定位

主要工作是把一些指令对其它符号地址的引用加以修正,把各个模块之间的相互引用的部分处理好。
比如 A 模块用到 B 模块的某个函数,但是在编译 A 模块时,并不知道 B 模块中的函数的地址,所以需要链接器来处理。

符号决议:

确保所有目标文件中的符号引用都有唯一的定义

重定位:

链接时,确定变量或函数的地址后,把指令的目标地址修改成确定后的地址,这个过程就是重定位

gcc hello.o -o hello

标签:Gcc,cfi,gcc,编译,指令,main,过程,hello
来源: https://www.cnblogs.com/shelmean/p/16103309.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有