计算机操作系统-链接

编译系统

再Unix系统上,以下命令由编译器把源文件转换为目标文件。
gcc -o hello hello.c
这个过程大致如下:
在这里插入图片描述
预处理阶段:处理以#开头的预处理命令
编译阶段:翻译成汇编文件
汇编阶段:将汇编文件翻译成可重定位目标文件
链接阶段:将可重定位目标文件和printf.o等单独预编译好的目标文件进行合并,得到最终的可执行目标文件。

静态链接

静态链接器以一组可重定位目标文件为输入,生成一个完全链接的可执行目标文件作为输出。链接器主要完成以下两个任务:
符号解析:每个符号对应于一个函数、一个全局变了或一个静态变量,符号解析的目的是将每个符号引用与一个符号定义关联起来。
重定位:链接器通过把每个符号定义与一个内存位置关联起来,然后修改所有对这些符号的引用,使得它们指向这个内存位置。

目标文件

**可执行目标文件:**可以在内存中执行
**可重定位目标文件:**可与其它可重定位目标文件在链接阶段合并,创建一个可执行目标文件
**共享目标文件:**这是一种特殊的可重定位目标文件,可以在运行时被动态加载进内存并链接

动态链接

静态库有以下两个问题:
1、当静态库更新时整个程序都需要重新进行链接
2、对于printf这种标准函数库,如果每个程序都要有代码,这会极大的浪费资源

共享库是为了解决静态库的着两个问题而设计的,在Linux系统中通常用.so后缀来表示,Windows系统上它们被称为DLL。它具有以下特点:
在给定的文件系统中一个库只有一个文件,所有引用该库的可执行目标文件都共享这个文件,它不会被复制到引用它的可执行文件中;
在内存中,一个共享库的.text节(已编译程序的机器代码)的一个副本可以被不同的正在运行的共享。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值