C专家编程 —— 链接的思考

news2024/9/21 22:42:06

文章目录

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

编译器的作用

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

  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 + 可执行文件 命令来显示程序所需要的函数库。

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

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

相关文章

Java-API简析_java.lang.SecurityManager类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/131346082 出自【进步*于辰的博客】 其实我的【Java-API】专栏内的博文对大家来说意义是不大的。…

【Python 基础篇】Python学生管理系统

文章目录 引言一、系统设计与功能分析二、系统设计与实现三、系统应用示例四、总结 引言 学生管理系统是一个常见的应用程序,它可以帮助学校、教育机构或教师管理学生的信息。本文将介绍如何使用面向对象编程思想,利用Python开发一个学生管理系统。系统…

源码编译 DolphinScheduler 1.3.9 海豚调度,修改Hadoop、Hive组件版本兼容

大前提&#xff1a; maven3 jdk8 环境 maven 私服换成国内镜像&#xff0c;推荐阿里云 maven 镜像 maven-3.6.3\conf\settings.xml <mirrors><mirror><id>aliyunmaven</id><mirrorOf>*</mirrorOf><name>阿里云公共仓库</name&g…

Android 13(T) - binder阅读(1)- binder driver

1 总览 想要使用binder完成进程间通信&#xff08;IPC&#xff09;或者完成远程过程调用&#xff08;RPC&#xff09;&#xff0c;那么我们需要有如下三个要素&#xff1a; 源&#xff1a;即调用者&#xff08;Client&#xff09;目的&#xff1a;即服务提供者&#xff08;Se…

win10 64位系统下载、安装nodejs(图文教程)

windows电脑下载、安装nodejs是很容易的&#xff0c;参考下面的图文教程&#xff0c;很快就能搞定下载安装. 1&#xff0c;下载nodejs 下载地址&#xff1a;https://nodejs.org/en/download/ 2&#xff0c;安装nodejs 点击安装包&#xff0c;一路下一步 3&#xff0c;验证…

设计模式—责任链模式

一、待解决问题&#xff1a; 减少代码中 if else 语句&#xff0c;降低代码圈复杂度或深度&#xff0c;增强可读性。 1、需求背景&#xff1a; 采购订单创建&#xff0c;需要验证采购员、物料、供应商、供应商的银行账号等信息。如采购员权限到期、或供应商失效等问题&#xff…

python机器学习——机器学习相关概念 特征工程

目录 机器学习特征工程1.特征抽取2.特征处理2.1 归一化&#xff1a;传统精确小数据2.2 标准化&#xff1a;大多数情况 3.数据降维3.1特征选择3.2主成分分析PCA 案例&#xff1a;超市订单分析 机器学习 监督学习&#xff1a;输入数据有特征有标签&#xff0c;即有标准答案 分类&…

chatgpt赋能python:Python求累加求和指南

Python求累加求和指南 Python是一种简单而强大的编程语言&#xff0c;从事编程工作的人大多都对它有一定的了解。它具有开发复杂应用程序的强大功能&#xff0c;同时也可以被用作数据处理和分析等用途。其中一个最常见的任务就是累加求和&#xff0c;今天我们将介绍如何在Pyth…

Redis 集合相关命令

Redis 支持多种数据结构&#xff0c;比如 字符串、列表、集合、有序集合 和 哈希 等数据结构。本次我整理了关于 集合 相关的命令&#xff0c;也就是关于 Sets 相关的命令&#xff0c;如下图。 上图中用红色圈中的部分&#xff0c;就是关于 集合 相关的命令。如果想要在 Redis …

JDBC小记——基础入门

目录 JDBC概念 JDBC入门 1. 导入数据库的驱动jar包 2. 加载驱动jar包 3. 获取连接对象 4. 获取操作对象 5.执行SQL语句 6.释放资源 IDEA连接数据库 结果集对象 登录练习 JDBC概念 Java DataBase Connectivity 即 Java数据库连接 JDBC&#xff0c;其实就是Java定义…

第7章 Scala集合

第7章 Scala集合 7.1 简介 ​ ​ scala.collection.immutable ​ scala.collection.mutable ​ 7.2 数组 ​ 不可变数组 package chapter07object Test01_ImmutableArray {def main(args: Array[String]): Unit {// 1. 创建数组val arr: Array[Int] new Array[Int](10…

【AUTOSAR】AUTOSAR开发工具链(二)----TASKING库的封装

1、集成工程 步骤&#xff1a; 拷贝模块代码&#xff1a; 将源工程的所有模块代码拷贝到库工程&#xff0c;将源工程拷贝一份&#xff0c;并删除不必要的文件作为释放工程&#xff0c;完成结果如下图&#xff1a; 源工程&#xff08;左&#xff09;VS库工程&#xff08;中&am…

[CUDA][Ubuntu]如何卸载cuda和cudnn和nvidia driver

百度有很多牛鬼蛇神的办法&#xff0c;试了一晚上&#xff0c;都不行。 包括&#xff1a;通过安装方式卸载&#xff0c;我tm根本不知道当初这个机器是怎么安装的cuda&#xff0c;我怎么卸载&#xff1f;&#xff1f;&#xff1f; 通过删除文件夹和自带uninstall程序&#xff…

安卓蓝牙协议数据包格式

本文解析蓝牙传输的数据包格式&#xff0c;目的是对蓝牙的各个层次的协议有更深的理解。 bit数据流格式 在讲数据报文之前&#xff0c;必须了解协议中对数据的BIT排序的规定&#xff0c;在协议中规定数据包或者PDU都是以Little Endian format(小端模式)存放&#xff0c;也就是…

数据库信息速递 - 将可观测性带到现代数据堆栈 (译)

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

Layui基础入门

一、引言 1.1 介绍 官网&#xff1a;<https://www.layui.com/ > 这个不维护了 看下面这个 https://www.layuiweb.com/ 在官网首页&#xff0c;可以很方便的下载LayUI LayUI 是一款经典模块化前端 UI 框架&#xff0c;我们只需要定义简单的HTML、CSS、JS即可实现很复杂的前…

小鲜肉语录

马上端午放假了&#xff0c;今天不聊技术&#xff0c;聊点轻松的。 一、 和老公、小鲜肉周末出去玩&#xff0c;路上闲聊。老公提到小鲜肉在他们班成绩大概是第四名。 我说&#xff1a;我小学五年级的时候我们我们班60个人我排第四。你们班不到30个人。这么算你成绩不如我小时候…

Qt编写跨平台的推流工具(支持win/linux/mac/嵌入式linux/安卓等)

一、前言 跨平台的推流工具当属OBS最牛逼&#xff0c;功能也是最强大的&#xff0c;唯一的遗憾就是多路推流需要用到插件&#xff0c;而且CPU占用比较高&#xff0c;默认OBS的规则是将对应画布中的视频画面和设定的音频一起重新编码再推流&#xff0c;意味着肯定占用不少CPU资…

【解决】笔记本电脑wifi无法访问网站的各种情况

本文适用于 mac 以及 windows 等操作系统 场景 手机可以连接wifi&#xff0c;电脑连接却无法访问左下角wifi图标为小地球可以使用app&#xff0c;无法访问网站其他 方式一 Win10任务栏中的网络变成小地球&#xff0c;无WIFI列表显示&#xff0c;应该&#xff1a; winR , 输入…

MATLAB计算程序运行所需的时间

在使用MATLAB进行计算时&#xff0c;用户有时需要了解程序运行所花费的四件&#xff0c;以此来评价程序的执行效率&#xff0c;从而对代码进行优化 可以使用3种方法来得到程序运行所需要的时间 1.使用tic和toc命令 将tic和toc命令相结合来得到程序的运行时间 ①tic命令&…