动态库加载【Linux】

news2024/9/20 18:34:09

从此往后,建立映射,我们执行的任何代码,都是在我们的进程地址空间中进行执行
例如:将动态库映射到共享区,进程在CPU调度时,是在进程的进程地址空间处运行

程序在编译好之后,在加载到内存之前,程序内部是有逻辑地址(虚拟地址)

可执行程序在最开始有表头,可执行程序的入口地址就在表中,这个入口地址是虚拟地址

程序加载到内存中,CPU内读取到的指令,内部可能有数据,可能也有地址(虚拟地址

静态库不需要加载,在加载程序也就是编译链接时,系统就会将静态库的代码拷贝到可执行程序的代码段里面

程序加载到内存之前:
在这里插入图片描述

此时页表没有建立与物理内存的映射,发生缺页中断,缺页中断后 ,程序就被加载到物理内存中,一旦程序加载到物理内存之后,就天然的具备了物理地址

程序加载到内存后:
动态库只将可执行程序用到的库函数的偏移地址拷贝到可执行程序里面,动态库中所有库函数的编址方案都采用start:偏移地址的方式来进行相对编址
在这里插入图片描述

CPU执行代码时,发现物理内存中有外部地址,这个外部地址就是编译链接阶段动态库中函数的偏移地址,此时操作系统先将这个外部地址对应的动态库加载到物理内存中,再执行相关代码,然后通过页表将物理内存中动态库的位置映射到虚拟地址空间中的共享区,一旦动态库被映射到共享区,此时这个库的起始地址立马被确定,完成映射之后

利用虚拟地址空间的库函数的偏移量 ,在虚拟地址空间的上下文中进行跳转,跳转到共享区中,利用库的起始地址和具体库函数的偏移量,在共享区中找到库函数的二进制代码并将其执行,执行完毕之后,再跳转到代相对地址码段中,继续向后执行剩余的代码

共享库是一个非常大的空间,具体映射到哪里?

动态库被加载到固定地址空间中的位置是不可能的,但是需要保证库在虚拟内存中,是任意位置加载的

让库的内部函数不要采用绝对编址,编址方案都采用start:直接用偏移量进行对库中函数进行编址,将每个函数的start地址记录,通过start地址加上偏移量,操作系统就能找到具体地址,找到地址,通过地址,进过映射,找到对应的代码

这也就能解释,在动态生成.o文件时,gcc编译加 -fPIC 选项(产生位置无关码),
位置无关码可以理解为,编址时,库可以在虚拟内存的任意位置加载

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

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

相关文章

设计循环队列---力扣622

1、题目 1.1基础设置与讲解 循环队列,即固定长度的队列,可以想象成一个环形队列 就类似于这种队列,队尾指针后会有一个空位,用于控制判断队列为空还是为满; typedef int MyDataType;typedef struct {MyDataType fron…

美团发布2024年一季度财报:营收733亿元,同比增长25%

6月6日,美团(股票代码:3690.HK)发布2024年第一季度业绩报告。受益于经济持续回暖和消费复苏,公司各项业务继续取得稳健增长,营收733亿元(人民币,下同),同比增长25%。 财报显示,一季度,美团继续…

vue-cl-service不同环境运行/build配置

概述 在项目开发过程中,同一个项目在开发、测试、灰度、生产可能需要不同的配置信息,所以如果能根据环境的不同来设置参数很重要。 vue项目的vue-cl-service插件也支持不同环境的不同参数配置和打包。 实现 新建不同环境配置文件 vue项目中的配置文件以…

Spring 的自动装配方式你都答的出来吗?

引言:Sprin g框架作为 Java 企业级应用开发的主流选择,其自动装配功能大大简化了开发人员的工作。自动装配能够帮助开发者减少手动配置的繁琐过程,提高了代码的可维护性和灵活性。在本文中,我们将深入探讨 Spring 的自动装配方式&…

六、Docker Swarm、Docker Stack和Portainer的使用

六、Docker swarm和Docker stack的使用 系列文章目录1.Docker swarm1.简介2.docker swarm常用命令3.docker node常用命令4.docker service常用命令5.实战案例6.参考文章 2.Docker stack1.简介3.Docker stack常用命令4.实战案例5.常见问题及调错方式1.查看报错信息并尝试解决&am…

Shell脚本文本处理三剑客(grep、awk、sed)和正则表达式

一、正则表达式 1.正则表达式基础 正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串,将匹配的子串替换或者从某个串中取出符号某个条件的子串等&…

【Mybatis】INSERT INTO 遇到NULL怎么处理?

目录标题 背景-使用Mybatis手写批量插入Insert方法测试核心代码,author字段为null,插入条件怎么写? MybatisPlus解决方案自动填充字段 Mybatis解决方案if标签处理 问题:如果不在工程里面设置默认值?如何直接使用数据库…

c语言速成系列指针上篇

那么这一篇文章带大家学习一下c语言的指针的概念、使用、以及一些注意事项。 指针的概念 指针也就是内存地址,指针变量是用来存放内存地址的变量。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。 大白话讲解…

【Python报错】已解决ValueError: cannot reindex from a duplicate axis

成功解决“ValueError: cannot reindex from a duplicate axis”错误的全面指南 在数据处理和分析的过程中,尤其是在使用Pandas这样的强大工具时,我们有时会遇到一些错误信息。其中,“ValueError: cannot reindex from a duplicate axis”错误…

RabbitMQ启动报错:Error during startup: {error, {schema_integrity_check_failed,

报错信息如下: Error during startup: {error,{schema_integrity_check_failed,[{table_attributes_mismatch,rabbit_user,[username,password_hash,tags,hashing_algorithm,limits],[username,password_hash,tags,hashing_algorithm]},{table_attributes_mismatch…

【LeetCode】二叉树oj专题

如有不懂的地方,可查阅往期相关文章! 个人主页:小八哥向前冲~ 所属专栏:数据结构【c语言】 目录 单值二叉树 对称二叉树 计算二叉树的深度 二叉树的前序遍历 相同二叉树 另一棵树的子树 二叉树的构建和遍历 翻转二叉树 判…

使用python优雅的将PDF转为Word

使用python优雅的将PDF转为Word 先装这个优雅的库 pip install pdf2docx然后运行下面优雅的代码,将pdf路径和docx路径修改 from pdf2docx import Converter # path pdf_file C:\\Users\\phl\\Desktop\\软件工程期末\\软件工程模拟试题5.pdf docx_file C:\\User…

UML交互图-序列图

概述 序列图又称为时序图、活动序列图,它是一种详细表示对象之间及对象与参与者实例之间交互的图,它由一组协作的对象(或参与者实例)及它们之间可发送的消息组成,它强调消息之间的时间顺序。 序列图主要用于按照交互发生的一系列顺序,显示对…

查看Linux端口占用和开启端口命令

查看端口的使用的情况 lsof 命令 比如查看80端口的使用的情况 lsof -i tcp:80列出所有的端口 netstat -ntlp查看端口的状态 /etc/init.d/iptables status开启端口以开启端口80为例。 1 用命令开启端口 iptables -I INPUT -p tcp --dport 80 -j accpet --写入要开放的端口/…

力扣 503. 下一个更大元素 II

题目来源:https://leetcode.cn/problems/next-greater-element-ii/description/ C题解:因为是循环数组,所以对数组进行了两次遍历,相当于循环。使用了栈,一个存放元素,一个存放索引,用来更新res…

微服务学习Day8-Sentinel

文章目录 Sentinel雪崩问题服务保护框架Sentinel配置 限流规则快速入门流控模式流控效果热点参数限流 隔离和降级FeignClient整合Sentinel线程隔离(舱壁模式)熔断降级 授权规则及规则持久化授权规则自定义异常结果持久化 Sentinel 雪崩问题 服务保护框架…

【大学物理】波动光学速成

考点1 光的干涉条件 考点2 杨氏双缝干涉 s1为单峰屏,s2为双缝屏 s为点光源,s1,s2为波阵面上两点,为新的子波波源 p的坐标为x 劳埃德镜实验:半波损失 菲涅耳双镜实验 考点3 光程 考点4 等倾干涉

在vue项目中使用markdown-it回显markdown文本

前言 其实有很多插件都是可以用来回显markdown文本的,这个插件也是其中之一。 文档地址:markdown-it | markdown-it 中文文档 这个文档在vue2和vue3里面都可以使用,所以还是比较推荐的 使用 安装 npm install markdown-it --save 应用 <template><div><…

Django的PATH路径转换器

本书1-7章样章及配套资源下载链接: https://pan.baidu.com/s/1OGmhHxEMf2ZdozkUnDkAkA?pwdnanc 源码、PPT课件、教学视频等&#xff0c;可以从前言给出的下载信息下载&#xff0c;大家可以评估一下。 在Django框架中&#xff0c;默认内置了一组PATH路径转换器&#xff0c;具…

win10下,python3.7安装xlrd和xlwt

win10下&#xff0c;执行import xlwt&#xff0c;结果报错 No module named xlwt。 原因&#xff1a;使用的python没有安装xlwt包。 解决方法&#xff1a; 1&#xff09;打开一个命令窗口&#xff0c;执行&#xff1a;where python&#xff0c;可以看到使用的python路径及版…