博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
程序员的自我修养-链接、装载与库-2 静态链接的过程
阅读量:5371 次
发布时间:2019-06-15

本文共 1019 字,大约阅读时间需要 3 分钟。

第二部分 静态链接(主要讲了链接过程中的静态链接)

被隐藏了的过程:预处理、编译、汇编、链接(Build过程 在IDE中)

预编译:

  源代码hello.cpp和相关头文件(stdio.h)被预编译器cppp预编译成一个.i文件。

  预编译命令:

gcc -E hello.c -o hello.i或者cpp hello.c > hello.i

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

  包括: 展开宏定义;

      处理所有条件预编译指令:"#if" "#ifdef" "#elif" "#else" "#endif";  

      将被包含的文件插入到预编译指令的位置 比如头文件(递归);  

      删除所有的注释;  

        添加行号和文件名标志,方便调式;  

      保留所有的#pragma编译器指令

编译:

   预编译过程就是进行一系列的词法分析、语法分析、语义分析以及优化后产生相应的汇编代码文件,是核心部分也是最复杂的部分。

gcc -S hello.i -o hello.s

    现在的版本的GCC吧预编译和编译合并成一个步骤,cc1程序来完成。

  gcc知识这些后台程序的包装,他会根据不同的参数要求去调用 预编译编译程序cc1、汇编器as、链接器ld

汇编:

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

as hello.s -o hello.oorgcc -c hello.s -o hello.o

或者使用gcc从源代码开始经过预编译、编译 汇编直接输出 目标文件。

gcc -c hello.c -o hello.o

链接:

  将一堆文件链接起来才可以得到最终的可执行文件。

ld -static x.o xx.o xxx.o

  链接是一个十分重要的过程,在编译的时候举例子:main模块会用到其他模块的fun函数,但是编译的时候并不知道其地址。这件事情就由链接器来完成。当编译完包含fun函数的模块后,

链接器负责修正该地址。这就是静态链接的基本过程和作用。这个修正的动作叫做重定位 每一个要修正的地方叫做重定位入口

  简直就是在程序里面打补丁嘛

 

转载于:https://www.cnblogs.com/luntai/p/6286705.html

你可能感兴趣的文章
【iOS开发-68】APP下载案例:利用tableView自带的cell布局+缓存池cell复用时注意button状态的检查...
查看>>
《Genesis-3D开源游戏引擎-FQA常见问题解答》2014年01月10号版本
查看>>
Java 编程下实现随机无重复数字功能
查看>>
Android 编程下的代码混淆
查看>>
animation属性
查看>>
页内的模块和组件抽象规划经验
查看>>
安全-分析深圳电信的新型HTTP劫持方式
查看>>
将Centos的yum源更换为国内的阿里云源
查看>>
git diff 的用法
查看>>
一段sql的优化
查看>>
十进制与十六进制的相互转换
查看>>
在Flex中用Validator检测数字、字符串、Email.
查看>>
[leetcode]4Sum
查看>>
POJ1062 昂贵的聘礼
查看>>
【零基础学习iOS开发】【02-C语言】08-基本运算
查看>>
Java 将指定字符串连接到此字符串的结尾 concat()
查看>>
Hibernate Criterion
查看>>
Python知识
查看>>
我们为什么要搞长沙.NET技术社区(三)
查看>>
杭电acm Cake
查看>>