当前位置: 首页 > news >正文

Linux:库的制作与原理

文章目录

    • 一、什么是库
    • 二、静态库
        • 1、ar 将.o文件归档
        • 2、静态库的名称
        • 3、gcc -L 找库
        • 4、gcc -I 找头文件
        • 5、ldd 查看可执行程序对应链接库的信息
        • 6、静态库生成
    • 三、动态库
        • 1、动态库的生成
        • 2、file 查看文件详细属性
        • 3、动态库的使用
    • 四、使⽤外部库
    • 五、目标文件
    • 六、ELF文件
    • 七、ELF从形成到加载轮廓
        • 1、ELF形成可执行
        • 2、ELF可执行文件加载
        • 3、readelf 查看可执⾏程序的section
    • 八、静态链接
        • 1、objdump 查看编译后的.o⽬标⽂件
        • 2、查看.o文件符号表
    • 九、ELF加载与进程地址空间
        • 1、逻辑地址
        • 2、虚拟地址
        • 3、重新理解进程虚拟地址空间
    • 十、动态库加载
        • 1、进程如何看到动态库
        • 2、进程间如何共享库的
    • 十一、动态链接
        • 1、我们的可执⾏程序被编译器动了⼿脚
        • 2、动态库中的相对地址
        • 3、程序跟库的映射
        • 4、程序进行库调用
        • 5、全局偏移量表GOT(global offset table)
        • 7、库间依赖
        • 8、总结

一、什么是库

在计算机中库是由高级程序员写好的现有的,成熟的,可以复⽤的代码,现实中每个程序都要依赖很多基础的底层库,不可能
每个⼈的代码都从零开始,因此库的存在意义⾮同寻常。
在生活中也充满了库,比如说想要个手机,直接买就行,不需要自己制作,已经有手机生成商把手机所需要的显示屏内存等等零件组装好后,可直接使用的手机。

在这里插入图片描述

二、静态库

  • 静态库在链接时是把静态库编译的代码拷贝到将要生成可执行的程序里面一起生成可执行程序的
1、ar 将.o文件归档

静态库本质,就是.o打了一个包!!

  • ar 是 gnu 归档工具,rc 表示(replace and create)
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述

  • .a静态库,本质是一种归档文件,不需要使用者解包,而用gcc/g++直接进行链接即可

在这里插入图片描述

2、静态库的名称

静态库的命名规范,由lib开头,.a结尾,去掉lib 和 .a 剩下就是库的名字
在这里插入图片描述

3、gcc -L 找库

在这里插入图片描述
在这里插入图片描述

4、gcc -I 找头文件

在这里插入图片描述

5、ldd 查看可执行程序对应链接库的信息

在这里插入图片描述

6、静态库生成

使用Makefile来生成静态库
在这里插入图片描述

使用方式:在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、动态库

在这里插入图片描述
在这里插入图片描述

1、动态库的生成

在这里插入图片描述
先形成同名.o,跟静态库的区别就是加一个 -fPIC选项
在这里插入图片描述
然后是打包,动态库直接使用gcc -shared选项 来把.o 文件打包成动态库,静态库是使用ar归档
在这里插入图片描述

makefile生成动态库:

在这里插入图片描述

2、file 查看文件详细属性

在这里插入图片描述
动态库也被称为共享文件

3、动态库的使用

在这里插入图片描述
在当前路径下已经有需要的动态库文件和头文件了
然后像使用静态库那样去编译链接形成可执行程序
在这里插入图片描述
然后运行可执行程序
在这里插入图片描述
但是会报错,系统没有找到动态库链接的路径,因为之前形成可执行程序时只告诉了gcc编译器,系统不知道

在这里插入图片描述

  • 解决方案:
  • 1、把动态库拷贝到系统库中
  • 2、建立软连接,把软连接放到系统库中(但这两种都会污染系统库)
  • 3、把动态库路径导入到环境变量 LD_LIBRARY_PATH
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
  • 4、在系统指定目录建立 .conf 的配置文件,文件内容就是要查找动态库的路径
    在这里插入图片描述
    向我们自己创建的.conf文件中写入路径
    最后再执行重新加载配置
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 当一个文件既有动态库又有静态库时默认使用动态库
  • 动静态库同时存在非要使用静态库,加选项-static:
    在这里插入图片描述
    在这里插入图片描述

四、使⽤外部库

在这里插入图片描述

五、目标文件

  • .o(Linux) / .obj(Windows) :可重定位目标文件
    在这里插入图片描述
    在这里插入图片描述
    动静态库,可执行程序,.o文件都是ELF格式的!
    以一定的格式放入到二进制文件中的

六、ELF文件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

七、ELF从形成到加载轮廓

1、ELF形成可执行

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2、ELF可执行文件加载

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、readelf 查看可执⾏程序的section

选项-S:读取的是Section Headers的内容
在这里插入图片描述

  • bss:未初始化全局变量,更好的节省空间,节省形成的可执行程序占据磁盘的空间

-l 选项:查看section合并的segment
在这里插入图片描述
在这里插入图片描述
把原本29个数据节合并为9个数据节


选项-h:查看ELF Header信息

  • 整个ELF格式相关的管理信息
  • 包括每一个区的开始和大小
    在这里插入图片描述

八、静态链接

在这里插入图片描述
在这里插入图片描述

1、objdump 查看编译后的.o⽬标⽂件

在这里插入图片描述


-d选项:将.o⽬标⽂件的代码段进行反汇编
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


选项 -S(大写)对整个文件进行反汇编
在这里插入图片描述
在这里插入图片描述

2、查看.o文件符号表

readelf -s(小写):读取code.o符号表
在这里插入图片描述

  • puts:就是printf的实现
  • UND就是:undefine,表⽰未定义说⽩了就是本.o⽂件找不到
  • FUNC:表⽰run符号类型是个函数
  • 1(Ndx):就是run函数所在的section被合并最终的那⼀个section中了,1就是下标

在这里插入图片描述
在这里插入图片描述

  • 所以,链接过程中会涉及到对.o中外部符号进⾏地址重定位。

九、ELF加载与进程地址空间

1、逻辑地址

一个可执行程序,如果没有被加载到内存中,该可执行程序,有逻辑地址
对可执行程序,完成在磁盘上的编制。
逻辑地址(起始地址 + 偏移量)
在这里插入图片描述

2、虚拟地址

当代计算机⼯作的时候,都采⽤"平坦模式"进⾏⼯作。所以也要求ELF对⾃⼰的代码和数据进⾏统⼀编址,也就是只有一个起始地址就是全0的地址,只记录数据的偏移量,也叫线性地址。
其实虚拟地址在我们的程序还没有加载到内存的时候,就已经把可执⾏程序进⾏统⼀编址了。
在这里插入图片描述

3、重新理解进程虚拟地址空间
  • ELF 在被编译好之后,会把⾃⼰未来程序的⼊⼝地址记录在ELF header的Entry字段中
    在这里插入图片描述
    在这里插入图片描述

十、动态库加载

1、进程如何看到动态库

在这里插入图片描述

2、进程间如何共享库的

在这里插入图片描述

十一、动态链接

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

1、我们的可执⾏程序被编译器动了⼿脚

在这里插入图片描述
在这里插入图片描述
33在这里插入图片描述

2、动态库中的相对地址

在这里插入图片描述

3、程序跟库的映射

在这里插入图片描述
在这里插入图片描述

4、程序进行库调用

在这里插入图片描述
在这里插入图片描述

5、全局偏移量表GOT(global offset table)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7、库间依赖

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8、总结

在这里插入图片描述

相关文章:

  • 第二章:langchain文本向量化(embed)搭建与详细教程-openai接口方式(上)
  • Linux网络编程 深入Linux网络栈:原始套接字链路层实战解析
  • 多语言笔记系列:共享数据
  • 从零开始学Python游戏编程37-精灵4
  • C++中的next_permutation全排列函数
  • Java学习手册:TCP 协议基础
  • C语言教程(十六): C 语言字符串详解
  • 初识Redis · 主从复制(下)
  • Redis 核心应用场景
  • rsync实现内网两台服务器文件同步
  • 【含文档+PPT+源码】基于SpringBoot+Vue的移动台账管理系统
  • 卷积神经网络:视觉炼金术士的数学魔法
  • 【C++】二叉树进阶面试题
  • 【mongodb】系统保留的数据库名
  • CIFAR10图像分类学习笔记(三)---数据加载load_cifar10
  • 从代码学习深度学习 - 图像增广 PyTorch 版
  • AI工程pytorch小白TorchServe部署模型服务
  • Linux 基础命令入门指南
  • Java函数式编程深度解析:从Lambda到流式操作
  • R-CNN,Fast-R-CNN-Faster-R-CNN个人笔记
  • 中国经济“第一省会”广州,从传统商贸中心到直播电商第一城
  • 今年五一,贵州一脸“爆相”
  • 导演汪俊:与孙俪默契合作,还原“蛮好的人生”
  • A股三大股指集体高开,黄金股大幅回调
  • 新华社经济随笔:机器人“摔倒、爬起”的背后
  • 商务部:试点示范已形成9批190多项创新成果向全国推广