| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> 笔记24-1(C语言进阶 程序环境和预处理) -> 正文阅读 |
|
[C++知识库]笔记24-1(C语言进阶 程序环境和预处理) |
目录 ?注:??????? 本笔记参考:B站up 鹏哥C语言 推荐书籍
程序的翻译环境和执行环境在ANSI C的任何一种实现中,存在两个不同的环境:
编译和链接翻译环境
翻译环境包含了两大步骤:
在Linux系统下的编译过程展示(test.c): gcc test.c — 默认生成一个 a.out(可执行程序),这个可执行程序(a.out)可以通过输入 .\a.out 的方式执行它。 编译预处理接下来首先解析预处理步骤,在预处理阶段,编译器完成的工作有:
例如:
?通过上面的例子我们可以发现,在预处理阶段,完成了头文件的包含。 接下来再在源代码 test.c 中增加 宏 和 定义: 再次编译:gcc test.c -E > test.i 再次打开 test.i ,观察: 发现
所以预处理阶段完成的第二件事情就是对#define定义的符号和宏的替换。 而如果再在 test.c 中写入注释: 再次编译至预处理步骤,会发现 原本注释所在的地方,注释不见了。所以预处理阶段完成的第三件事情就是删除注释。 编译在编译阶段,完成的工作有:
也就是把C语言代码转换成汇编代码。(涉及 编译原理) 在Linux系统下,编译 test.c 对应的命令是
(接下来的说明使用的例子也是 test.c ) 在执行完编译后,写入 test.s 内的是汇编代码: 汇编在Linux系统下对 test.c 进行汇编的命令是
生成的是目标文件 test.o 。 打开文件 发现出现的是无法看懂的乱码,其实这些乱码就是二进制信息。 从上面可以得出,在汇编中进行的工作是:
注意:test.o 这个文件是有格式的,这个格式就是 elf格式 。在这种格式下, test.o 被划分成了一个一个的“段”,每个段内存放的内容是不同的。(注:可执行文件 .out 也是elf格式的) 既然有格式,那么理所当然就可以使用工具看懂这个文件,比如:readelf 。接下来就使用 readelf 打开 test.o 。 使用命令:
生成了: 其中,红框内的符号可以和 test.c 内的全局变量、ADD函数、主函数和printf函数对应起来。 注意:编译阶段,符号汇总也是对上述这些变量和函数进行的汇总。
?那么生成的符号表有什么用吗?这就要进入下一个阶段 —— 链接 了。 链接链接 — 把多个目标文件和链接库进行链接。 在该阶段完成的任务是:
假如删除拥有有效地址的ADD②,最后生成的表就会是这样: ADD拥有的就是无效的地址,这时候如果继续编译,会发现无法通过。 这个报错就是因为ADD没有意义导致的。 注:只有当地址有效时,链接器才可以通过地址找到函数。 所以编译阶段的符号汇总、汇编阶段的生成符号表和链接阶段的合并符号表和重定位都是在为链接时跨文件链接做准备。 运行环境/执行环境程序运行的过程:
|
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 15:43:11- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |