要想了解底层,链接是一个不得不过的一关,我总结了下学习的心得,首先要了解链接器到底是如何工作的,链接器分为两类,一个是静态链接,一个是动态链接,先来讲解静态链接,静态链接要干两件事:

  1. 符号解析 目标文件定义和引用符号 符号解析的目的是将每个符号引用和一个符号定义联系起来
  2. 重定位 编译器和汇编器生成从地址零开始的代码和数据节。链接器通过把每个符号定义与一个存储器位置联系起来,然后修改所有对这些符号的引用,使得它们指向这个存储器位置,从而重定位这些节。
    静态链接的输入文件是一系列的目标文件,输出是可执行的目标文件。这些目标文件都可以统称为ELF文件:executable and linkable format(可执行和可链接格式)。
    从而引入了一个重要的知识点:ELF文件格式。
    首先是可重定位目标文件的ELF文件:从上到下依次是:
可重定位目标文件的ELF文件
ELF头部
.text
.rodata
.data
.bss
.symtab
rel.text
rel.data
.debug
.line
.strtab
节头部表

注意上面的除了节头部表,其余都可以叫做节,这就是一个很核心的点,节是和链接相关的,每一个节经过链接会变成段,段对应的是执行相关的,而且段对应的是可执行目标文件的ELF文件,现在就来看看经过静态链接生成的可执行目标文件的ELF文件格式,这里面都是以段作为术语的:

可执行目标文件的ELF文件
ELF头部
段头表
.init
.text
.rodata
.data
.bss
.symtab
.debug
.line
.strtab
节头表

随即这些段就会被加载到存储器地址中,也就是大名鼎鼎的存储器结构,包含栈堆,内核等等的结构。
这就是一个静态链接器如何将一个可重定位文建变成可执行目标文件从而运行到平台上。
动态链接有是怎么回事呢?
在了解之前,我们要知道静态库,刚才我们所说的都仅仅是将一系列的可重定位目标文件变成一个可执行目标文件,实际上,所有的编译系统都提供了一种机制,将所有的目标模块打包成一个单独的文件,称为静态库,他也可以作为静态链接器的输入,当链接器构造一个输出文件时,它只需要拷贝静态库里被应用程序引用的目标模块。
像一些glibc提供的函数,我们可能随时随处都会用上,如果我们每次把函数的代码复制到每个进程的文本段中,这无疑是一种浪费资源,所以出来了共享库的概念,在运行时,可以加载到任意的存储器地址,并在存储器中和一个程序链接起来,这个过程就叫做动态链接。共享库也叫共享目标,以.so为结尾,像linux系统提供了dlopen这样函数去加载和链接共享库。
其实.symtab这个存放符号的地方也是值得研究的,有机会再记录。

链接 动态链接 静态链接相关推荐

  1. CMake 添加头文件目录,链接动态、静态库(添加子文件夹)

    CMake支持大写.小写.混合大小写的命令. 当编译一个需要第三方库的项目时,需要知道: 去哪找头文件(.h),-I(GCC) INCLUDE_DIRECTORIES() 去哪找库文件(.so/.dl ...

  2. cmake中添加引用动态链接_CMake 添加头文件目录,链接动态、静态库(添加子文件夹)...

    CMake支持大写.小写.混合大小写的命令. 当编译一个需要第三方库的项目时,需要知道: 去哪找头文件(.h),-I(GCC) INCLUDE_DIRECTORIES() 去哪找库文件(.so/.dl ...

  3. c语言makecode头文件,cmake 添加头文件目录,链接动态、静态库

    罗列一下cmake常用的命令. CMake支持大写.小写.混合大小写的命令. 1. 添加头文件目录INCLUDE_DIRECTORIES 语法: include_directories([AFTER| ...

  4. cmake 添加头文件目录,链接动态、静态库

    罗列一下cmake常用的命令. CMake支持大写.小写.混合大小写的命令. 1. 添加头文件目录INCLUDE_DIRECTORIES 语法: include_directories([AFTER| ...

  5. Linux 链接详解----静态链接实例分析

    由Linux链接详解(1)中我们简单的分析了静态库的引用解析和重定位的内容, 下面我们结合实例来看一下静态链接重定位过程. /* * a.c */ int a = 1000; void add(int ...

  6. 一文彻底搞懂静态库和动态库,显示链接和隐式链接

    定义:运行时库 静态库 动态库 运行时库:Unix中一个典型的运行时库例子就是libc,它包含标准的C函数,如,print(),exit()等等,用户能创建他们自己的运行库(在Windows中是DLL ...

  7. 装入归档文件时出现了一个错误linux_静态链接与动态链接(Linux)

    前言 上一篇分享了静态链接与动态链接的实验(Windows下).这一篇分享Linux下的笔记,同时对上一篇笔记做一个补充. 首先,我们把静态链接与动态链接做一个这样子的比喻: 把链接过程看做我们平时学 ...

  8. 动态链接库(.dll) 动态导入库(.lib) 静态链接库(.lib)

    这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一本书<程序员的自 ...

  9. C语言 | Linux下的静态链接与动态链接

    1024G 嵌入式资源大放送!包括但不限于C/C++.单片机.Linux等.关注微信公众号[嵌入式大杂烩],回复1024,即可免费获取! 前言 上一篇分享了静态链接与动态链接的实验(Windows): ...

  10. 动态连接库和静态链接库

    文章出处:http://www.cnblogs.com/gaoyihan/p/4723332.html 本文参考了以下博客:      1. http://blog.csdn.net/gamecrea ...

最新文章

  1. Centos7 安装Mini后相关配置
  2. mongoDB研究笔记:复制集概述
  3. Jenkins遇到问题一:jenkins配置权限不对导致无法登陆或者空白页面解决办法
  4. Linux服务笔记之二:SSH远程登录
  5. 全球主要城市经纬度api
  6. python中运行错误: 'utf-8' codec can't decode byte 0xc8'
  7. sql语句or与union all的执行效率比较
  8. html元素data属性设置变量,HTML5 自定义属性 data-* 和 jQuery.data 详解
  9. jQuery ajax 和 普通js ajax 笔记
  10. 微服务技术栈:流量整形算法,服务熔断与降级
  11. 在Linux下安装bind服务,在Linux系统下安装DNS服务器BIND
  12. 【分享】计算机ers,读博、国企、互联网公司该如何选择?
  13. 查看使用yum安装的软件路径
  14. 你为什么当不了高管?几张图看懂高级经理人与普通管理者的区别
  15. matlab 保存变量
  16. OTSU算法/大津法/最大类间方差法 python实现
  17. vue根据表格字段不同的状态显示不同的颜色。
  18. 如何安装R语言以及Rstudio的安装
  19. 数据分析师未来发展前景如何?
  20. C++ 程序编译过程:从代码到程序

热门文章

  1. Java黑皮书课后题第5章:*5.1(统计正数和负数的个数然后计算这些数的平均值)编写程序,读入未指定个数的整数,判断读入的正数有多少个、负数有多少个,然后计算输入值的总和和平均值(不记0,浮点表示)
  2. OpenCV C++ 06 - Histogram Equalization of a Grayscale image with OpenCV
  3. tombstone问题分析
  4. html+css+javascript之间的关系与作用
  5. sql判断字段是否为空
  6. zabbix如何选择适合的监控类型(107)
  7. 直播技术初体验,简单实现直播不同阶段
  8. 安装laravel5.1项目命令
  9. hdu 2709 递推
  10. MPEG原理分析及MPEG音频编码器的调试