详解库和程序运行过程

在这里插入图片描述

  • 我最近开了几个专栏,诚信互三!
    ====> |||《算法专栏》::刷题教程来自网站《代码随想录》。|||
    ====> |||《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模式 允许 一切正常代码部分

perl:获取同花顺数据--业绩预告,送股派息

perldoc LWP::UserAgent 如果没有安装,则安装模块,运行 cpanm LWP::UserAgent 。 编写 get_yjyg_10jqka.pl 如下 #!/usr/bin/perl # perl 获取同花顺数据--业绩预告 use LWP::UserAgent; use Encode qw(decode encode); use POSIX; use Data::Dump…

JavaWeb——Servlet

请求转发是一次转发请求转发URL地址不会发生变化,会保留当前Servlet的资源访问路径共享同一个Request作用域,可用于多页面之间传递数据 getServletContext() 返回一个ServletContext()对象 获取请求头信息 getHeader(String key)根据key获取value 例如 r…

Element UI el-dialog自由拖动功能

1.创建drag .js文件 /*** 拖拽移动* param {elementObjct} bar 鼠标点击控制拖拽的元素* param {elementObjct} target 移动的元素* param {function} callback 移动后的回调*/ export function startDrag(bar, target, callback) {var params {top: 0,left: 0,currentX: …

学习资料记录

http://interview.wzcu.com/Golang/%E4%BB%A3%E7%A0%81%E8%80%83%E9%A2%98.html map底层 https://zhuanlan.zhihu.com/p/616979764 go修养 https://www.yuque.com/aceld/golang/ga6pb1#4b19dba5 https://golang.dbwu.tech/performance/map_pre_alloc/ https://juejin.cn/pos…

C++11新特性:sizeof... 运算符

在 C11 及其后续版本中,引入了一项新的语言特性——sizeof...运算符,这是一个与模板编程紧密相关的特性。 你没看错,sizeof 后面是三个点:sizeof... sizeof...运算符用于计算变参模板(variadic template)…

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

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

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.读取图片 ****************

ThreadLocal的主要特点:

ThreadLocal的主要特点: ThreadLocal是Java中的一个类,它提供了线程局部变量的实现机制。ThreadLocal的实例可以为每个使用该变量的线程提供单独的变量副本,每个线程可以独立地改变自己的副本,而不会影响其他线程的副本。这种机制…

面试问答:能聊一聊MySQL聚簇索引和非聚簇索引吗?

文章目录 🐒个人主页:信计2102罗铠威🏅JavaEE系列专栏📖前言:🎀啥叫聚簇索引和非聚簇索引?🐕如果按特点来说:🐕如果按存储引擎来说: &#x1f415…

【CSS】实现文字描边

通过 -webkit-text-stroke 即可实现文字描边&#xff0c;这个复合属性接收两个参数&#xff0c;分别为描边宽度&#xff0c;以及描边颜色。 需要注意的是&#xff0c;-webkit-text-stroke是一个非标准属性&#xff0c;兼容性会出现问题。 <!DOCTYPE html> <html lang…

安卓Java面试题 196- 200

196. 简述Android Window的更新过程 ?说到Window的更新过程,个人认为其实也就是Window里面View的更新过程了,和创建/删除过程一样,最后照样也是到了WindowManagerGlobal里 面执行具体的操作了,具体来讲的话就是执行updateViewLayout方法了, 这个方法里面做了以下几件事:…

What is case-based reasoning (CBR)? 基于案例的推理

这个方向其实挺小众的&#xff0c;然后其实也很直觉&#xff0c;所以你可能其实一直在用这个技术&#xff0c;只不过你不知道这个技术有一个专业的名字《基于案例的推理》而已。 有人说&#xff0c;不知道名字有啥的&#xff0c;反正大家都会用&#xff0c;不需要学它叫什么名…

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

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

eUICC鉴权的一般步骤

eUICC&#xff08;嵌入式通用集成电路卡&#xff09;的鉴权过程涉及多个步骤&#xff0c;主要目的是确保eUICC的安全操作和用户的身份验证。以下是eUICC鉴权过程的一般步骤&#xff1a; 1. **初始化**&#xff1a;当用户启动设备或尝试连接到移动网络时&#xff0c;eUICC会开始…

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

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

Pytorch CUDA Reflect Padding 算子实现详解

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