文章目录

  • 编译器的作用
  • 动态链接和静态链接
    • 动态链接
    • 动态链接的优点
  • 函数库链接的几个小秘密

编译器的作用

通常编译器被氛围六七个小的程序:

  1. C预处理器,得到main.i文件
  2. 前端做语法语义分析,然后后端生成汇编的指令代码main.s文件
  3. 优化器可以放在任何一个地方
  4. 汇编程序会将汇编文件进行处理直接通过ISA指令将汇编代码,生成可重定位的二进制文件main.o,注意这里的二进制文件还不可执行,他的各个段对应汇编文件的各个段。
  5. 然后就到了链接器,他首先载入main函数,然后把符号引用绑定到内存地址,把所有目标文件集中在一起,再加上库文件,最后产生可执行的二进制文件。

动态链接和静态链接

如果函数库的一份副本是可执行文件的物理组成部分,我们称之为静态链接。
如果可执行文件只包含了文件名,让载入器在运行时才寻找所需要的函数,我们称之为动态链接。库在运行时才被映射到进程内存中。

上图比较我们可以看出静态链接和动态链接生成的可执行文件差距非常大。
并且即使是静态链接实际上也并不是将整个库都装入到可执行文件中,而只是将所需要用到的函数装入到可执行文件。

动态链接

一种更为现代和优越的被称作动态链接的方法逐渐被采用。
程序将在运行时去寻找函数库集合中的函数执行,而不是将他们作为自身可执行文件的一部分。
动态链接时一种JIT链接 just in time。
可执行文件必须能找到指定的动态链接路径,函数库不能随便移动,因为可执行文件需要定位到函数库路径。

动态链接库由链接器ld创建。文件扩展名为.so。表示shared object. 每一个链接到该函数库的程序都共享他的一份副本

动态链接的优点

  1. 可执行文件体积可以非常小。
  2. 链接阶段时间也会缩短,因为有些工作被推迟到了载入时。
  3. 将程序和特定的函数库版本进行解耦,使得函数库升级更容易;
  4. 所有可执行文件在运行时共享动态链接函数库的单独副本,更节省内存空间。比如8个基于XView的函数库的程序在运行,只需要把一个XView函数库文本段映射到内存中,其余7个都将共享这个副本。

函数库链接的几个小秘密

  1. 动态库文件.so,静态库文件.a。动态库文件命名规则为libname.so或者后面加上版本号libname.so.1比如线程库函数libthread.so
  2. 通过-lthread选项,告诉编译时链接到某个函数库的名字。比如我要链接libthread.so,那么编译器是如何知道的呢。这时我们需要设定编译选项-lthread,他省略了lib 和.so后缀,然后前面加个-l
  3. 编译器如何确定函数库路径。首先他会查找一些特殊位置/usr/lib中查找函数库。编译选项-Lpathname和-Rpathname来告诉链接器一些其他查找路径的目录。也可以在运行程序时设定环境变量LD_LIBRARY_PATH和LD_RUN_PATH来提供这类信息。但是设定环境变量的方法已经不被提倡了。
  4. 如何确定必须链接哪些库。那就是观察文件包含的头文件 ,需要使用 哪些库。
  5. ldd命令:使用ldd + 可执行文件 命令来显示程序所需要的函数库。

C专家编程 —— 对链接的思考相关推荐

  1. c语言多态性编码图形,C和C++经典著作 C专家编程Expert C Programming Deep C Secrets pdf...

    摘要 <C专家编程>可以帮助有一定经验的C程序员成为C编程方面的专家,对于具备相当的C语言基础的程序员,<C专家编程>可以帮助他们站在C的高度了解和学习C++.书本撷取了几十个 ...

  2. C专家编程 读书笔记

    在ANSI C中,如果要声明空参数表,则必须使用关键字void进行显式声明: CPU,16位地址总线,能够访问2^16也就是64KB的内存:20位地址总线,可以访问2^20也就是1MB的内存:32位地 ...

  3. C专家编程-读书笔记(书本顺序)

    C语言设计哲学:   一切工作程序员自己负责.   语言中的所有特性都不需要隐式的运行时支持.   程序员所做的都是对的.   程序员应该知道自己在干什么,并保证自己的所作所为是正确的. ====== ...

  4. 一篇特别长的总结(C专家编程)

    博客链接: http://codeshold.me/2017/02/expert_c_programming.html 读一本书必输出一篇笔记或者总结!!! <C专家编程>这本书很早看完了 ...

  5. 《C陷阱与缺陷》和《C专家编程》两本书又翻印了

    今天花了几个小时逛书店,偶然让我发现了<C陷阱与缺陷>和<C专家编程>这两本书.这让我很惊喜,喜欢收集书的我当然不会错过,一口气,两本书都收录了. 其实这两本我都已经下载了电子 ...

  6. 《JavaScript专家编程》——第1章 对象和原型 1.1鸟瞰JavaScript

    本节书摘来自异步社区<JavaScript专家编程>一书中的第1章,第1.1节,作者:[美]Mark Daggett(达格特)著,更多章节内容可以访问云栖社区"异步社区" ...

  7. 《C专家编程》随笔1:读者心得

    自己在阅读完<C和指针>和<C陷阱与缺陷>之后,结合实际的项目,对C语言有了一定熟悉. <C和指针>是一本非常不错的C语言基础书,详细介绍了C语言的知识点,相对于谭 ...

  8. C专家编程(Expert C Programming)1

    C专家编程(Expert C Programming) 一基本概念 1.与时间相关的几个函数 char *ctime( const time_t *timer ); Each of these fun ...

  9. 《C专家编程》学习总结2

    <C专家编程>学习总结2   转自 : http://blog.chinaunix.net/u2/87570/showart_2120069.html 编译器做了些什么 图1:编译器通常分 ...

最新文章

  1. TFS 2010 使用手册(二)项目集合与项目
  2. 2020年数据中心值得关注的8大趋势
  3. ajax带来的主要问题有哪些,ajax面试题
  4. python hook_python_理解篇_钩子方法的理解
  5. 信息学奥赛一本通(1169:大整数减法)
  6. Calendar类和GregorianCalendar类
  7. 滴滴出行回应导航崩了;微信支付正式上线「向手机号转账」功能;Guns 6.0 发布 | 极客头条...
  8. glusterfs分布式文件系统初探
  9. Linux时间子系统之六:高精度定时器(HRTIMER)的原理和实现
  10. 《机器学习Python实践》第6章——数据理解
  11. java字符串计数从零还是从一,java – 计数和所有字符相同的最大字符串的起始索引...
  12. android 绕过动态权限,android绕过permission验证及fork进程权限提升
  13. dedecms安装kindeditor编辑器
  14. box-sizing失效的原因
  15. 推荐一大波让你直呼哇塞的Canvas库
  16. 永中office属于职称计算机吗,永中office
  17. ESP32使用滑动变阻器(ADC)控制舵机(PWM)Micropython编程
  18. EDK2编译环境搭建、编译、在模拟器运行、在笔记本运行(带目录版本)
  19. 数据挖掘 - 二手车交易价格预测(阿里天池)
  20. 一个稳定的相对成熟的通用管理软件的底层及后台管理值多少钱?(您积累的成果物有多少艰辛付出)

热门文章

  1. SpringBoot 通过AJAX获取参数的方式 List集合
  2. 聊一款入门级配置的一线大牌游戏本
  3. 二、GitHub使用方法总结
  4. Java基础——王阔
  5. 场景判断方法expected_conditions
  6. 三菱FX系列源码,C#上位机FX系列源码,串口485.232通讯
  7. piwik 访客跟踪(一)
  8. python使用with as 读写文件
  9. Git 多台电脑共用SSH Key
  10. 解谜游戏 MU Complex 的过关图文攻略 (Episode2)(上)