gcc后续——链接时的静态库和动态库

news2024/12/23 4:36:46

本篇文章是链接阶段静动态库的理解,点击查看gcc四个阶段

文章目录

    • 1 . 库
      • 检测linux所用库
      • 查找库的位置
    • 2. 动静态库的感性理解
      • 1. 动态库的理解
      • 2. 静态库的理解
    • 3. 静动态库整体理解
      • 1. 静态库和静态链接
      • 2. 动态库和动态链接
      • 3. 静动态库对比
        • 1.查询当前linux所用库
        • 2. 查看动态库体积
        • 3. 静态库安装
        • 4. 查看静态库体积

1 . 库

库:
分为静态库和动态库(本质也是文件)
静态库:libXXXX.a
动态库:libXXXX.so

检测linux所用库

ldd 可执行程序检测可执行程序被形成的时候依赖那些库

[yzq@VM-8-8-centos my]$ gcc -o testc test.c
[yzq@VM-8-8-centos my]$ ldd testc
linux-vdso.so.1 =>  (0x00007ffe309cd000)
libc.so.6 => /lib64/libc.so.6 (0x00007f42b7c37000)
/lib64/ld-linux-x86-64.so.2 (0x00007f42b8005000)

使用gcc 编译一个可执行程序 testc,并检测出testc所依赖的库
libc.so.6 => /lib64/libc.so.6 (0x00007f42b7c37000)

查找库的位置

[yzq@VM-8-8-centos my]$ ldd testc
linux-vdso.so.1 =>  (0x00007ffd62f34000)
libc.so.6 => /lib64/libc.so.6 (0x00007f0db8e70000)
/lib64/ld-linux-x86-64.so.2 (0x00007f0db923e000)
[yzq@VM-8-8-centos my]$ ls /lib64/libc.so.6 
/lib64/libc.so.6
[yzq@VM-8-8-centos my]$ ls /lib64/libc.so.6 -l
lrwxrwxrwx 1 root root 12 Jul 25 16:58 /lib64/libc.so.6 -> libc-2.17.so

使用 ls 指令找到库的位置,
实际上是一个软链接,指向c-.217
以后缀.so为例
前缀lib.XXXX后缀.so,在是识别库时,一般去掉前缀和后缀,只剩下XXXX
所以c语言的c标准库为 c-2.17

2. 动静态库的感性理解

1. 动态库的理解

在这里插入图片描述

  • 假设你为准高中学生,刚进行完中考,你就提前问了学长学校附近的网吧在哪里,学长告诉你在学校北门200米的地方
  • 等到开学某一天,你先写了一上午的作业,有些累了,所以想去上网放松一下,到了网吧,你选了个靠窗户的座位happy了一会后,回到了学校,继续完成了剩下的作业
  • 我们想好要做什么的清单,可以看作一个程序,在清单中我们可以自己实现如:数学作业、语文作业等价于代码实现for循环、while循环
  • 但总有一些我们无法完成,所以只能跳转过去由库中执行如:上网这个操作,我们无法在学校内执行,只能去网吧
    ,网吧就相当于动态库的存在,进入网吧需要跟网管说开那台机器,就好比库的查找方式,帮你快速找到你想要的方法,
    上网happy这个过程,就相当于调用库函数,上完网后,回到程序中继续执行程序

在这里插入图片描述

  • 假设学校南门有一个派出所,已查明北门的网吧是一个黑网吧,所以小太阳网吧就被查封了,学校内的学生除了我之外,还有很多人也问过学长,学长也都给他们建立了链接

  • 说明网吧提供的上网的能力是被所有人共享的等价于
    动态库可以被共享,而共享的库只需要一个就够了
    好比网吧在附近只有一个存在此时包括我在内的学校的学生就无法通过北门去网吧上网了共享库被取缔,所有依赖于这个库的程序都无法运行了

  • 动态链接:将你所需要的库中的代码的地址拷贝到你的程序中

2. 静态库的理解

在这里插入图片描述

  • 假设你在期末考试考的比较好,你爸问你要什么奖励,你说你想要一台电脑,于是等到开学时你爸就去了网吧,在网吧中购置了一台,并给你买到了宿舍中,当放假你的舍友喊你去上网,你说你有电脑了不去网吧了
  • 你爸就充当了链接器,程序中要用printf函数等时,就在库中寻找到,并将代码拷贝一份到程序
  • 静态链接:将你所需要的库中的代码拷贝到你的程序中

在这里插入图片描述
假设南门有个派出所,将黑网吧取缔了,此时我因为自己有电脑,所以依旧可以上网
一旦静态链接成功,就不会依赖于库

3. 静动态库整体理解

动态库为专门让编译器,对用户的程序进行动态链接
静态库为专门让编译器,对用户的程序进行静态链接

1. 静态库和静态链接

  • 链接的时候,如果是静态链接,找到静态库,拷贝静态库中的我所需要的代码到自己的可执行程序中
  • 静态链接成功:我们的程序,不依赖任何库,自己就可以独立运行

2. 动态库和动态链接

  • 链接的时候,如果是动态链接,找到动态库,拷贝动态库中的我所需要的代码地址到自己的可执行程序中
  • 静态链接成功:我们的程序,还是依赖动态库,一旦动态库缺失,我们的程序就无法运行

3. 静动态库对比

  • 静态库:因为自身拷贝问题,比较浪费空间
  • 动态库:因为可以被共享,所以真正的实现永远都是在库中,程序内部只有地址,比较节省空间

1.查询当前linux所用库

使用 file+可执行程序 查询动/静态库

[yzq@VM-8-8-centos me]$ file mytest
mytest: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0f75ec79d4816fd89e85de04b8bb48f9897dcc6f, not stripped

dynamically linked (uses shared libs)
说明 mytest 可执行程序,动态链接使用动态库
说明linux默认使用动态库和动态链接

2. 查看动态库体积

[yzq@VM-8-8-centos me]$ ls -l
total 20
-rw-rw-r-- 1 yzq yzq   73 Jan 10 12:47 makefile
-rwxrwxr-x 1 yzq yzq 8560 Jan 10 15:41 mytest
-rw-rw-r-- 1 yzq yzq  245 Jan 10 12:59 test.c

说明mytest可执行程序的动态库下的体积为8000多

3. 静态库安装

云服务器默认只会安装动态库,静态库需要自己下载

[yzq@VM-8-8-centos me]$ sudo yum install -y glibc-static

4. 查看静态库体积

gcc -o mytest-static test.c -static

使用后缀为 -static ,切换成静态库

[yzq@VM-8-8-centos me]$ ls -l
total 864
-rw-rw-r-- 1 yzq yzq     73 Jan 10 12:47 makefile
-rwxrwxr-x 1 yzq yzq   8560 Jan 10 15:41 mytest
-rwxrwxr-x 1 yzq yzq 861752 Jan 10 15:57 mytest-static
-rw-rw-r-- 1 yzq yzq    245 Jan 10 12:59 test.c

  • 动态库体积只有8000多,而动态库体积80多万
  • 说明静态库所需的体积远比动态库的体积多得多

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/155062.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【洛谷】P1966 [NOIP2013 提高组] 火柴排队

其实这题本身并不难,考的知识点就是归并排序和逆序对;那么难点在哪呢?就在如何发现这题是个逆序对:至少读到这里我们可以知道,虽然火柴高度是唯一的,但我们不可能直接开一个 max long int 大小的数组&#…

数据库分片

文章目录一、为什么要分片二、什么是数据分片1、垂直分片2、水平分片三、常用分片策略1、Range2、Hash四、相关中间件1、Sharding-Sphere2、Sharding-jdbc一、为什么要分片 从性能方面来说,由于关系型数据库大多采用B树类型的索引,在数据量超过阈(yu)值…

【python】re解析和re模块

目录 正则 RE概念 常见的元字符 量词 贪婪&惰性 修饰符 re模块 findall finditer search match 预加载正则式 内容提取 正则 RE概念 常见的元字符 量词 贪婪&惰性 贪婪匹配.* 惰性匹配.*? 修饰符 修饰符描述re.I使匹配对大小写不敏感re.L做本地化识别&…

接口测试框架实战 | 流程封装与基于加密接口的测试用例设计

接口测试仅仅掌握 Requests 或者其他一些功能强大的库的用法,是远远不够的,还需要具备能根据公司的业务流程以及需求去定制化一个接口自动化测试框架的能力。所以,接下来,我们主要介绍下接口测试用例分析以及通用的流程封装是如何…

GO语言基础-06-匿名函数和闭包

文章目录1. 匿名函数概念语法示例2. 闭包概念语法语法示例1. 匿名函数 概念 如其名,匿名函数不声明函数名。因此要调用匿名函数只能定义一个变量等于该匿名函数。 语法 func(参数 参数类型)(返回值 返回值类型){函数体 }示例 代码 package mainimport "fm…

Jenkins操作文档

前言 jenkins概述 持续集成是一种实践,而jenkins可以帮助团队去尽量好的去完成这种实践 jenkins是⼀个开源软件项⽬,是基于Java开发的⼀种持续集成⼯具,⽤于监控持续重复的⼯作,旨在提供⼀个开放易⽤的软件平台,使软…

“锂”想护航|深耕重点工段,用AI为锂电池安全生产加倍提速!

行业发展DEVELOPMENT -受益于新能源汽车市场的爆发增长、“双碳”政策影响下的储能市场扩大等影响,中国锂电行业现已进入高度产业化、规模化发展时期。锂电池生产工艺较长,生产设备庞杂,专用性强,而当前已迈入国际化竞争的锂电行业…

【Vue】032-尚硅谷-尚品汇-mockjs模拟数据---20230111

032-尚硅谷-尚品汇-mockjs模拟数据 官网链接 第一步:安装依赖包mockjs 安装mockjs npm install --save mockjs第二步:在src文件夹下创建一个文件夹mock。 第三步:准备模拟的数据。! mock/banner.json [{"id": "1","imgUrl": &q…

哪种蓝牙耳机音质好?2023公认音质最好的蓝牙耳机推荐

现如今,蓝牙耳机的使用频率越来越高,其在音质上的表现也越来越好。那么,在众多的蓝牙耳机当中,哪种蓝牙耳机音质好?下面,我来给大家推荐几款公认音质最好的蓝牙耳机,一起来看看吧。 一、南卡小…

(十七)Java的时间与日期(1)

目录 前言: ①Date类 ②SimpleDateFormat类 ③Calendar 前言: 时间和日期. 在系统开发中,日期与时间作为重要的业务因素,起到十分关键的作用,例如同一个时间节点下的数据生成,基于时间范围的各种数据统计和分析,集群节…

深入浅出变长结构体

1、 问题的引出 项目中用到数据包的处理,但包的大小是不固定的,其长度由包头的2字节决定。比如如下的包头:88 0f 0a ob cd ef 23 00 。长度由头2个字节880f决定,考虑字节序,转为0f88,转为10进制3976个字节的…

汽车零部件行业追溯系统的应用

汽车行业正处于一个蓬勃发展的阶段,随着客户需求的不断变化,生产厂商推出新款商品的速度也越来越快,新项目和变更的不断出现,就可能导致在交付的产品质量方面遇到各种各样的问题。如果这些质量问题得不到及时有效地追溯和控制&…

知识点滴 - PLC培训笔记

如上图所示,这个设备就是PLC的应用场景,对外控制很多接口电路,交流直流,不同大小电流、电压的电路。在工业上使用很多。 而开发PLC程序时,是在相应的集成开发环境中,画出如下的梯形图: 什么是PL…

Vue使用Element-UI生成并展示表头序号

前言 序号算是在展示数据的时候,一种很普遍的属性了,我们可以自己写生成序号的规则,也可以借助第三方。 这里我选择后者,使用Element-UI自带的一个table属性,去生成并展示需要 首先看下我的页面,是没有序…

Apache Sling App CMS <1.1.4 存在反射型XSS漏洞(CVE-2022-46769)

漏洞描述 Apache Sling 是一个基于可扩展内容树(extensible content tree)的 RESTful Web 应用框架。 1.1.4 之前版本的 Apache Sling 中的 cms.js#confirmMessage 方法未对用户可控的 title 和 message 参数进行过滤,攻击者可将精心构造的…

dubbo源码实践-总结

自己大概花了一个月的时间,断断续续的看了一遍dubbo源码,之前的文章从实践出发搭建了dubbo各层的例子!Dubbo源码的学习也暂时告一段落。这篇就谈谈自己对dubbo源码学习个人感受!1 dubbo是什么?dubbo是一个RPC框架&…

网站优化包括对什么优化(网站优化有哪些方面)

互联网时代下,各行各业都想在在互联网中占据市场,目前网站优化成为时代的潮流,很多站长,在对网站进行优化时,稍不注意就会造成网站优化过度,这也是各位最头疼的事情,网站优化能急于求成&#xf…

KubePi <1.6.4 存在会话固定漏洞(CVE-2023-22479)

漏洞描述 KubePi 是一个 K8s 面板,允许管理员导入多个 Kubernetes 集群,并且通过权限控制将不同 cluster、namespace 的权限分配给指定用户。 1.6.4 之前版本的 KubePi 在用户登录后未刷新用户 cookie,攻击者可通过诱导用户点击恶意链接等劫…

maven创建web工程,使用模板方式(二)

一,选择webapp模板 二,填写完信息后,创建后是如下的结构: 可以看到只有web目录,没有其他的java,resources,test目录等。 三,创建Java,resources,test目录 右键-> ma…

【C语言进阶】 指针强化练习

目录题目一题目二题目三题目四题目五题目六题目七题目八题目一 下面这段代码的执行结果是? int main() {int a[5] { 1, 2, 3, 4, 5 };int* ptr (int*)(&a 1);printf("%d,%d\n", *(a 1), *(ptr - 1));return 0; }解决这种数组与指针相结合的问题…