当前位置:网站首页>C专家编程 第5章 对链接的思考 5.1 函数库、链接和载入
C专家编程 第5章 对链接的思考 5.1 函数库、链接和载入
2022-08-04 04:44:00 【weixin_客子光阴】
链接器(linker)的基础知识:编译器创建一个输出文件,这个文件包含了可重定位的对象。这些对象就是与源程序对应的数据和机器指令。
链接器位于编译过程的那一阶段
SRV4系统中的复杂链接形式。
C预处理器--->(阶段p)前端(语法和语义分析)---->(阶段o)后端(代码生成器)---->
(阶段c)优化器---->(阶段2)汇编程序---->(阶段a)链接-载入器
绝大多数编译器并不是一个单一的庞大程序。他们通常有多达六七个稍小的程序所组成,这些程序由一个叫作“编译器驱动器”(compiler driver)的控制程序来调用。这些方便从编译器中分离出来的单独程序包括预处理区(preprocessor)、词法和词义检查器(syntactic and semantic checker)、 代码生成器(code generator)、汇编程序(assembler)、优化器(optimizer)、链接器(linker)、当然包括一个调用所有这些程序并向各个程序传递正确选项的驱动器程序(driver program) 。优化器几乎可以加上上述所有阶段的后面。当前的SPARC在编译器的前端和后端之间的中间表示层执行绝大部分的优化措施。
独立的程序更容易设计和维护。
控制预处理过程的规则是预处理阶段所独有的,它跟C语言的其他部分并没有多少共同之处。
C预处理器经常(但并不总是)是一个独立的程序。如果代码生成器(又称为“后端”)被编写
成一个独立的程序,它很可能被其他语言共享。这种设计方法的代价是运行几个更小的程序比
运行一个大型程序所花费的时间要长(因为存在初始化进程以及在各个阶段之间传递信息的开销)。
-#选项查看编译过程的各个独立阶段。-V选项能提供版本信息。
通过给编译器驱动器一个特殊的-W选项(表示传递这个选项到那个阶段)向各个阶段传递选项信息。
“W”后面跟一个字符(提示那个阶段),一个逗号,然后就是具体的选项。
编译器驱动器向链接器传递任何选项,必须在具体的选项前面加上-W1前缀,告诉编译器驱动器这个选项是想传给链接器。
cc -W1, -m main.c > main.linker.map
将-m选项传递给链接-载入器,要求它产生链接器映像。
目标文件并不能直接执行,它首先需要载入到链接器中。链接确认main函数为初始进入点(程序开始执行的地方),把符号引用(symbolic reference)绑定到内存地址,把所有的目标文件集中在一起,再加上库文件,从而产生可执行文件。
PC的链接机制与那些更大系统的链接机制有着巨大的区别。PC的链接器一般只提供几个基本的I/O服务,就是被称为BIOS的程序。他们存在于内存中固定的地点,并不是每个可执行文件的一部分。如果PC程序或程序套件需要更高级的服务,可以通过库函数提供,但编译器必须把库函数链接到每个可执行文件中。
在MS-DOS中,没有办法推断出函数库对其中哪些程序较为常用,从而只在PC上安装一次。
UNIX系统以前也是如此。当链接程序时,需要使用的每个库函数的一份副本被加入到可执行文件中。
近几年,一种更为现代和优越的被称为动态链接的方法逐渐被采用。
动态链接允许系统提供一个庞大的函数库集合,可以提供许多有用的服务。但是,程序将在运行时寻找它们,而不是把这些函数库的二进制代码作为自身可执行文件的一部分。
如果函数库的一份副本是可执行文件的物理组成部分,那么我们称之为静态链接:如果可执行文件只是包含了文件名,让载入器在运行时能够寻找程序所需要的函数库,那么我们称之为动态链接。
收集模块准备执行的3个阶段的规范名称是链接-编辑(link-editing)、载入(loading)和运行时链接(runtime linking)。静态链接的模块被链接编辑并载入以便运行。动态链接的模块被链接编辑后载入,并在运行时进行链接以便运行。程序执行时,在mian()函数被调用前,运行时载入器把共享的数据对象载入到进程的地址空间。外部函数被真正调用之前,运行时载入器并不解析他们。所以链接了函数库,如果并没有实际调用,也不会带来额外的开销。
即使在静态链接中,整个libc.a文件也没有被全部装入到可执行文件中,所装入的只是所需要的函数。
边栏推荐
- 转:管理是对可能性的热爱,管理者要有闯进未知的勇气
- FFmpeg —— 通过修改yuv,将视频转为黑白并输出(附源码)
- 图像处理之Bolb分析(一)
- 看DevExpress丰富图表样式,如何为基金公司业务创新赋能
- 7. The principle description of LVS load balancing cluster
- Use serve to build a local server
- Implementing a server-side message active push solution based on SSE
- [Skill] Using Sentinel to achieve priority processing of requests
- 附加:对于“与数据表对应的实体类“,【面对MongoDB时,使用的@Id等注解】和【以前面对MySQL时,使用的@Id等注解】,是不同的;
- mysql index notes
猜你喜欢

获取单选框选中内容

7-1 LVS+NAT 负载均衡群集,NAT模式部署

某母婴小程序加密参数解密

Towards Real-Time Multi-Object Tracking(JDE)

企业直播风起:目睹聚焦产品,微赞拥抱生态

PL/SQL Some Advanced Fundamental

Basic characteristics of TL431 and oscillator circuit

Introduction to mq application scenarios

2022 Hangzhou Electric Power Multi-School League Game 5 Solution

How to keep the source code confidential in the development under the burning scenario
随机推荐
SQL query String field less than 10 how to check
For Qixi Festival, I made a confession envelope with code
A Preliminary Study of RSS Subscription to WeChat Official Account-feed43
docker安装mysql与宿主机相差8小时的问题。
manipulation of file contents
QT 如何识别文件的编码格式
7-1 LVS+NAT load balancing cluster, NAT mode deployment
转:管理是对可能性的热爱,管理者要有闯进未知的勇气
Deep learning -- CNN clothing image classification, for example, discussed how to evaluate neural network model
Jenkins export and import Job Pipeline
【C语言进阶】程序环境和预处理
震惊,99.9% 的同学没有真正理解字符串的不可变性
结构体指针知识要点总结
FFmpeg —— 录制麦克风声音(附源码)
Enterprise live broadcast is on the rise: Witnessing focused products, micro-like embracing ecology
大型连锁百货运维审计用什么软件好?有哪些功能?
Metaverse "Drummer" Unity: Crazy expansion, suspense still exists
mysql索引笔记
The Shell function
【id类型和NSObject指针 ObjectIve-C中】