C语言.编译过程-Ese .iso

2023-10-29 15:50
文章标签 语言 编译 过程 iso ese

本文主要是介绍C语言.编译过程-Ese .iso,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

gcc 编译过程
从 hello.c 到 hello(或 a.out)文件, 必须历经 hello.i、 hello.s、 hello.o,最后才得到 hello(或
a.out)文件,分别对应着预处理、编译、汇编和链接 4 个步骤,整个过程如图 10.5 所示。
在这里插入图片描述
这 4 步大致的工作内容如下:
(1) 预处理, C 编译器对各种预处理命令进行处理,包括头文件包含、宏定义的扩
展、条件编译的选择等;
(2) 编译,将预处理得到的源代码文件,进行“翻译转换”,产生出机器语言的目标
程序,得到机器语言的汇编文件;
(3) 汇编,将汇编代码翻译成了机器码,但是还不可以运行;
(4) 链接,处理可重定位文件,把各种符号引用和符号定义转换成为可执行文件中
的合适信息,通常是虚拟地址。

================================================== gcc的各种编译 ====================================================
编译过程:
预编译 —》把 头文件 ,宏定义,条件编译。。。进行替换扩展
编译 —》检查语法词法,然后将代码翻译成汇编指令
汇编 —》把汇编指令换成机器指令
链接 —》程序中使用到了某些库文件,在这个时候需要链接上

gcc hello.c -o hello —>将 hello.c 编译生成一个可执行文件 hello ,有时候这个不是我们想要的结果

-E Preprocess only; do not compile, assemble or link 预处理 ,不进行 编译 汇编 链接
-S Compile only; do not assemble or link 预处理 编译 ,不进行 汇编 链接
-c Compile and assemble, but do not link 预处理 编译 汇编,不进行 链接
-o Place the output into
//ESc iso

有时候只需要预编译: —》在编译命令后面加上 -E ,后面生成 .i 文件
gcc hello.c -o hello.i -E
gcc -E hello.c -o hello.i

有时候只需要 编译: —》在编译命令后面加上 -S ,后面生成 .s 文件
gcc hello.c -o hello.s -S
gcc -S hello.c -o hello.s

gcc hello.i -o hello.s -S

有时候只需要 汇编: —》在编译命令后面加上 -c ,后面生成 .o 文件(这个文件看不懂)
gcc hello.s -o hello.o -c
gcc -c hello.s -o hello.o

gcc -c hello.c -o hello.o 		

最后将 .o 文件链接成为可执行文件
gcc hello.o -o hello

gec@ubuntu:/mnt/hgfs/share/day03/code$ gcc hello.c -o hello.i -E
gec@ubuntu:/mnt/hgfs/share/day03/code$ gcc hello.i  -o hello.s -S
gec@ubuntu:/mnt/hgfs/share/day03/code$ gcc -c hello.s -o hello.o
gec@ubuntu:/mnt/hgfs/share/day03/code$ gcc hello.o -o hello
gec@ubuntu:/mnt/hgfs/share/day03/code$ ./hello
hello C:6
gec@ubuntu:/mnt/hgfs/share/day03/code$ 

提示:如果有一天你的程序崩溃,怎么弄都无法解决,就要去研究汇编指令 ,那么我们就需要实现反汇编
gcc 编译器的反汇编指令:objdump ,常用的参数如下:
-d, --disassemble Display assembler contents of executable sections
-D, --disassemble-all Display assembler contents of all sections

0000000000400526 :
400526: 55 push %rbp //压栈
400527: 48 89 e5 mov %rsp,%rbp
40052a: c7 45 f8 05 00 00 00 movl $0x5,-0x8(%rbp)
400531: c7 45 fc 06 00 00 00 movl $0x6,-0x4(%rbp)
400538: 8b 55 f8 mov -0x8(%rbp),%edx
40053b: 8b 45 fc mov -0x4(%rbp),%eax
40053e: 01 d0 add %edx,%eax
400540: 5d pop %rbp //出栈
400541: c3 retq

0000000000400542 :
400542: 55 push %rbp
400543: 48 89 e5 mov %rsp,%rbp
400546: 48 83 ec 20 sub $0x20,%rsp
40054a: 89 7d ec mov %edi,-0x14(%rbp)
40054d: 48 89 75 e0 mov %rsi,-0x20(%rbp)
400551: be 06 00 00 00 mov $0x6,%esi
400556: bf 04 06 40 00 mov $0x400604,%edi
40055b: b8 00 00 00 00 mov $0x0,%eax
400560: e8 9b fe ff ff callq 400400 printf@plt
400565: b8 00 00 00 00 mov $0x0,%eax
40056a: e8 b7 ff ff ff callq 400526
40056f: 89 45 fc mov %eax,-0x4(%rbp)
400572: b8 00 00 00 00 mov $0x0,%eax
400577: c9 leaveq
400578: c3 retq
400579: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)

0000000000400430 <_start>:
400430: 31 ed xor %ebp,%ebp
400432: 49 89 d1 mov %rdx,%r9
400435: 5e pop %rsi
400436: 48 89 e2 mov %rsp,%rdx
400439: 48 83 e4 f0 and $0xfffffffffffffff0,%rsp
40043d: 50 push %rax
40043e: 54 push %rsp
40043f: 49 c7 c0 f0 05 40 00 mov $0x4005f0,%r8
400446: 48 c7 c1 80 05 40 00 mov $0x400580,%rcx
40044d: 48 c7 c7 42 05 40 00 mov $0x400542,%rdi
400454: e8 b7 ff ff ff callq 400410 __libc_start_main@plt
400459: f4 hlt
40045a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1)

这篇关于C语言.编译过程-Ese .iso的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/301690

相关文章

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

Spring boot整合dubbo+zookeeper的详细过程

《Springboot整合dubbo+zookeeper的详细过程》本文讲解SpringBoot整合Dubbo与Zookeeper实现API、Provider、Consumer模式,包含依赖配置、... 目录Spring boot整合dubbo+zookeeper1.创建父工程2.父工程引入依赖3.创建ap

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

SpringBoot整合liteflow的详细过程

《SpringBoot整合liteflow的详细过程》:本文主要介绍SpringBoot整合liteflow的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...  liteflow 是什么? 能做什么?总之一句话:能帮你规范写代码逻辑 ,编排并解耦业务逻辑,代码

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示