![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++
文章平均质量分 80
vivi
这个作者很懒,什么都没留下…
展开
-
《程序员的自我修养》笔记--静态链接
在通过编译和汇编后,就生成了目标文件,链接就是把这些目标文件加工后合并成一个输出文件的过程。链接过程可以分为两步:第一步 空间与地址分配。扫描所有的输入目标文件,获得它们每个各个段的长度、属性和位置,并且将输入目标文件中的符号表中所有的符号定义和符号引用收集起来,统一放到一个全局符号表。这一步中,链接器将能够获得所有输入目标文件的段长度,并且将它们合并(相同的段互相合并,如.text和.text段合并、.data段和.data段合并),计算出输出文件中各个段合并后的长度和位置,并建立映射关系。通过这一步,输原创 2011-05-25 20:44:00 · 1416 阅读 · 1 评论 -
gcc编译过程+Makefile反思
看了一段时间的《程序员自我修养》了,也算对程序的编译,链接,装载的原理有了初步的了解。十分惭愧的是,今天想自己写一个简单的Makefile,竟然很模糊,无法十分自如的写出(平时都用一个已经写好的样板改),这里做一个反思。 假设有a.c文件,要把它编译成可执行文件a。 编译+汇编: 试了一下,以下三种写法都行:gcc -c a.c -o a.ogcc -c -o a.o原创 2011-06-05 17:24:00 · 1764 阅读 · 1 评论 -
《程序员的自我修养》笔记--目标文件详解
从源程序到目标文件的生成过程最简单的编译命令是gcc helloworld.c,它包含了以下几个步骤:预处理、编译、汇编、链接,下面分别简介。预处理:处理#define宏定义、#if #ifdef等条件编译指令、#include预编译指令,删除注释,添加行号和文件名标识,保留所有的#pargma编译器指令,经过预编译后的文件为.i文件。预编译命令为:gcc -E hello.c -o hello.i或者cpp hello.c > hello.i编译:把预处理完得文件进行一系列的词法分析、语法分析、语意分析及原创 2011-05-06 12:42:00 · 2506 阅读 · 0 评论 -
《程序员的自我修养》笔记--可执行文件的装载
程序执行时所需要的指令和数据必须都在内存中才能正常运行,最简单的办法就是将程序运行时所需要的指令和数据全部都装入内存,这样程序就能顺利执行,这就是最简单的静态装入的方法。但是程序所需要的内存数量可能大于物理内存,静态装入就不太现实。后来研究发现,程序运行时具有局部性原理,所以我们可以将程序最常用的部分驻留在内存中,而将一些不太常用的数据存放在磁盘上,这就是动态装载的原理。覆盖装入和页映射是两种典型的动态装入方法。覆盖装入就是如果两个模块不会同时运行,则可以使这两个模块共用一块内存,需要哪个模块的时候就装入。原创 2011-05-06 15:21:00 · 2074 阅读 · 0 评论 -
编程之美-重建二叉树扩展问题1 2
编程之美3.9:重建二叉树 扩展问题1:如果前序和中序遍历的字母有重复的,那么怎么构造所有可能的解呢? 扩展问题2:如何判断给定的前序遍历和中序遍历的结果是合理的? 思路: 问题1:搜索所有可能的情况,并调用扩展问题2的解决方案,判断此情况是否合理(剪枝操作),如原创 2011-08-15 14:43:25 · 5078 阅读 · 0 评论