详解库和程序运行过程

在这里插入图片描述

  • 我最近开了几个专栏,诚信互三!
    ====> |||《算法专栏》::刷题教程来自网站《代码随想录》。|||
    ====> |||《C++专栏》::记录我学习C++的经历,看完你一定会有收获。|||
    ====> |||《Linux专栏》::记录我学习Linux的经历,看完你一定会有收获。|||
    ====> |||《C#专栏》::记录我复习C#的经历,深度理解查漏补缺,不定期更新。|||
    ====> |||《计算机网络专栏》::记录我学习计算机网络,看完你一定会有收获。|||

详解库和程序运行过程

  • 库的原理
  • 如何分装一个库
    • 静态库
    • 动态库
  • 可执行文件的编址
  • 程序调用库的原理

库的原理

库分为动态库静态库它们都是.o文件的集合,linux系统中,静态库以lib为前缀.a为后缀动态库以lib为前缀.so为后缀。

如何分装一个库

我们可以使用一个指令分装静态库。

ar -rc [分装成库的名字] [要分装的.o文件]

分装动态库使用以下指令。

gcc/g++ -shared [分装成库的名字] [要分装的.o文件]
分装动态库,编译生成.o文件时需要加入-fPIC选项。
gcc -fPIC -c [.c]

静态库

静态库的运行原理是将库内的所有内容拷贝到运行的程序中,静态库的运行与库的位置无关
gcc运行静态库需要使用选项-static。

动态库

动态库的运行原理是执行程序调用加载到内存中的公共库,动态库的运行与库的位置有关系
gcc默认运行文件运行动态库。
为了链接动态库,需要了解一些选项。

-l:链接动态库,只需要去掉lib和.so。
-L:链接库所在的路径。
-I:头文件所在目录

链接动态库是有固定路径的,我们直接运行一个程序,调用动态库去/usr/lib目录下寻找,我们链接我们自己写的库,我们有3个方法。

1.直接在/usr/lib目录下创建一个库的同名软连接。
2.环境变量中存在LD_LIBRARY_PATH,可以将库所在的目录改入环境变量中。
3.ldconfig 配置/etc/ld.so.conf.d/,ldconfig更新。

可执行文件的编址

文件在内存中其实是会被编址的,其中的所有地址都是虚拟地址,在当今的计算机中,我们的编址是平坦模式。
在可执行文件的头部存在很多信息,如main函数的入口地址,和该程序所引用的库的名字。
在这里插入图片描述

上图为平坦模式编址。

在可执行文件加载到内存中时,可执行文件中的虚拟地址就是进程地址空间中的虚拟地址,可执行文件被加载到内存中时,操作系统也可以知道可执行文件加载到内存中的物理地址,这样我们就知道了虚拟地址和物理地址,这样页表中的映射内容也被填满了。
在cpu中存在pc指针和IR指针,pc指针指向当前指令的下一行指令,IR寄存器中存储的当前执行的指令内容。
实际上,pc指针中取出的地址也是虚拟地址,随后通过页表映射为物理地址,形成一个循环,这样整个程序就运行起来了。
整个程序的运行其实是由操作系统,编译器,计算机体系结构三者配合完成的。
在这里插入图片描述

程序调用库的原理

静态链接直接将静态库加载到可执行文件中,没有特殊的情况。
但是当可执行文件中要使用动态库的内容,则需要将动态库也加载到内存中,而动态库中的内容也会被映射到进程地址空间的共享区中。
在这里插入图片描述

动态库在磁盘中,也会被编址,并且操作系统会对库进行管理,而在可执行文件中,调用库函数是使用库函数名+库函数中该函数的偏移量,来标识该函数,在加载到内中时,库函数名就会被解释为库函数的虚拟地址,随后就通过页表找到物理地址,从而调用函数。
在这里插入图片描述

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

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

相关文章

lvgl 窗口 windows lv_port_win_visual_studio 版本 已解决

不知道的东西,不知道lvgl窗口。一切从未知开始 lv_port_win_visual_studio 主分支 对应的分支 v7版本更新git submodule update --init --recursive同步 lvgl代码随后打开 visualSudio 打开.sln 文件 编译 release模式 允许 一切正常代码部分

考研数学基础差,跟宋浩?

宋浩老师的课程我大一的时候听过,是我大一高数的救命恩人! 不过,考研的针对性很强,基础差听宋浩老师的课程不如直接听汤家凤老师的课程,因为汤家凤老师的课程是专门为考研数学设计的,针对性很强。 汤家凤老…

K8S之DaemonSet控制器

DaemonSet控制器 概念、原理解读、应用场景概述工作原理典型的应用场景介绍DaemonSet 与 Deployment 的区别 解读资源清单文件实践案例 概念、原理解读、应用场景 概述 DaemonSet控制器能够确保K8S集群所有的节点都分别运行一个相同的pod副本; 当集群中增加node节…

Django之Celery篇(一)

一、介绍 Celery是由Python开发、简单、灵活、可靠的分布式任务队列,是一个处理异步任务的框架,其本质是生产者消费者模型,生产者发送任务到消息队列,消费者负责处理任务。 Celery侧重于实时操作,但对调度支持也很好,其每天可以处理数以百万计的任务。特点: 简单:熟悉…

监控系统Prometheus--入门

文章目录 Prometheus特点易于管理监控服务的内部运行状态强大的数据模型强大的查询语言PromQL高效可扩展易于集成可视化开放性 Prometheus架构Prometheus 生态圈组件架构理解 Prometheus的安装安装Prometheus Server上传安装包解压安装包修改配置文件 prometheus.yml 安装Pushg…

Halcon 3D 平面拟合(区域采样、Z值过滤、平面拟合、平面移动)

Halcon 3D 平面拟合(区域采样、Z值过滤、平面拟合、平面移动) 链接:https://pan.baidu.com/s/1UfFyZ6y-EFq9jy0T_DTJGA 提取码:ewdi * 1.读取图片 ****************

数组三(冒泡排序、二分查找)

目录 冒泡排序算法 冒泡排序的基础算法 冒泡排序的优化算法 二分法查找 冒泡排序算法 冒泡排序是最常用的排序算法,在笔试中也非常常见,能手写出冒泡排序算法可以说是 基本的素养。 冒泡排序的基础算法 冒泡排序算法重复地走访过要排序的数列&#…

2024-03-22 问AI: 介绍一下深度学习中的 sigmoid函数

文心一言 Sigmoid函数是深度学习中常用的一种激活函数,主要用于将神经元的输出值压缩到0和1之间。这种特性使得sigmoid函数在二分类问题中特别有用,因为输出值可以被解释为属于某个类别的概率。 sigmoid函数的数学表达式为: σ(x) 1 / (1…

Pytorch CUDA Reflect Padding 算子实现详解

CUDA 简介 CUDA(Compute Unified Device Architecture)是由NVIDIA开发的一种并行计算平台和应用编程接口(API),允许软件开发者和软件工程师使用NVIDIA的图形处理单元(GPU)进行通用计算。自2007…

NodeJS 集群模块: 为App创建集群实例

NodeJS 集群模块: 为App创建集群实例 目录 NodeJS 集群模块: 为App创建集群实例Node.js 集群介绍:终极扩展策略使用集群模块开始扩展 Node.js扩展 Node.js 的两种集群策略使用集群受益的 Node.js 应用程序示例没有集群的 Node.js:不可伸缩的原则集群操作:一个扩展的 Node.js…

Redis 配置与优化

目录 一、Redis 介绍 1.1、关系数据库与非关系型数据库 1)关系型数据库 2)非关系型数据库 3)非关系型数据库产生背景 1.2、Redis 基础 1)Redis 简介 2)Redis 安装部署 3)配置参数 1.3、Redi…

【聊一聊】三种工厂模式的创建

三种工厂模式的创建 今天终于星期五了,最近由于碰上一个需求,中间涉及Oracle改国产数据库的改造,好家伙,差点没把我忙坏了 不过今天终于有空啦!~哈哈哈 这篇本应该是上周就结束的,但是拖到今天,我们就今天进行结束 (还有一件快乐的事情,就是我遇见自己喜欢的人啦!嘻嘻) 好啦!~话…

【AI】发现一款运行成本较低的SelfHosting语言模型

【背景】 作为一个想构建局域网AI服务的屌丝,一直苦恼的自然是有限的资源下有没有对Spec要求低一点的SelfHosting的AI服务框架了。今天给大家介绍这款听起来有点希望,但是我也还没试验过,感兴趣的可以去尝试看看。 【介绍】 大模型生成式AI与别的技术不同,由于资源要求高…

Linux第83步_采用“Linux内核定时器”点灯以及相关API函数

“Linux内核定时器”是采用“系统时钟”来实现的。它不是周期性运行的,一旦发生超时就会自动关闭。如果想要实现周期性定时,那么就需要在定时处理函数中重新开启定时器。 Limux内核使用全局变量jiffies来记录“系统从启动以来的系统节拍数”&#xff0c…

路由器的端口映射能实现什么?

路由器的端口映射是一项重要的网络配置功能,它可以帮助实现局域网内外的设备之间的通信。通过端口映射,我们可以在公网上访问局域网内的设备,方便的进行远程访问、共享文件和资源等操作。 什么是端口映射? 在介绍端口映射之前&am…

【springcloud开发教程】spring cloud config——分布式配置

什么是SpringCloud config分布式配置中心? spring cloud config 为微服务架构中的微服务提供集中化的外部支持,配置服务器为各个不同微服务应用的所有环节提供了一个中心化的外部配置。 spring cloud config 分为服务端和客户端两部分。 服务端也称为 …

MySQL 查询性能优化

优质博文:IT-BLOG-CN​ 如果把查询看作是一个任务,那么它由一些列子任务组成,每个子任务都会消耗一定的时间。如果要优化查询,实际上要优化其子任务,要么消除其中一些子任务,要么减少子任务的执行次数。通常…

【prometheus-operator】k8s监控redis

1、准备exporter https://github.com/oliver006/redis_exporter oliver006-redis_exporter-amd64.tar # 安装镜像 docker load -i oliver006-redis_exporter-amd64.tar # 上传镜像 docker tag oliver006/redis_exporter ip/monitor/redis_exporter:latest docker push ip/mo…

DevEco Profiler性能调优工具简介

一、概述 应用或服务运行期间可能出现响应速度慢、动画播放不流畅、列表拖动卡顿、应用崩溃或耗电量过高、发烫、交互延迟等现象,这些现象表明应用或服务可能存在性能问题。造成性能问题的原因可能是业务逻辑、应用代码对系统API的误用、对ArkTS对象的不合理持有导致内存泄露…

记录开发STM32遇到的卡死问题-串口

背景:以STM32作为主控,广州大彩显示屏显示,主控实时采集数据,串口波特率115200.设置收发频率为50Hz,即单片机每秒发送50帧数据,每秒接收50帧数据,每帧数据大概14字节。 问题:系统长…