Linux基础IO(十一)之动态库(基础IO的最后一篇啦!)

news2025/4/26 4:28:27

文章目录

  • 动态库
    • 生成动态库
    • 使用动态库
    • 现象事实
    • 使用外部库
    • 动态库怎么被加载的
    • 进程地址空间的第二讲
      • 关于地址
        • 1.程序没有加载前的地址(程序)
        • 2.程序加载后的地址(进程)
        • 3.动态库的地址

动态库

生成动态库

shared: 表示生成共享库格式

fPIC:产生位置无关码(position independent code)

库名规则:libxxx.so

image-20250405155951292

myprintf.h

#pragma once  
#include <stdio.h>  
void print();  

myprintf.c

#include "myprintf.h"

void print()  
{  
    printf("hello print!\n");  
    printf("hello print!\n");  
    printf("hello print!\n");
}

mylog.h

#pragma once
#include <stdio.h>

void log(const char*);  

mylog.c

#include "mylog.h"  
  
void log(const char*msg)  
{  
    printf("hello %s\n",msg);
}

动静态库都要先形成.o文件,gcc -c不指定名字,默认生成同名 .o 文件。

可执行权限x,本质就是该文件是否会以可执行文件的形式加载到内存里。静态库不需要加载。

image-20250405170805770

image-20250405170847292

main.c

#include "myprintf.h"
#include "mylog.h"
  
  int main()
  {
      print();
      Log("linux");
      return 0;                                               
  }

使用动态库

编译选项

l:链接动态库,只要库名即可(去掉lib以及版本号)
L:链接库所在的路径.

image-20250405171728502

命令行上的路径是告诉编译器的,

动态库的路径也得告诉系统–加载器

加载也需要路径,系统会去特定的路径下寻找

解决加载找不到路径的方法:

  1. 拷贝到系统默认的库路径下 /lib64 /usr/lib64 (最常用)【直接安装到系统里】
  2. 在系统默认的库路径下 /lib64 /usr/lib64 建立软链接

image-20250405173551278

  1. 将自己的库所在的路径,添加到系统的环境变量 LD_LIBRARY_PATH

    重启 XShell 对应配置的环境变量就没了(可以加到环境变量的配置文件中)

image-20250405174324326

  1. /etc/ld.so.conf.d 建立自己动态库路径的配置文件,然后重新 ldconfig 即可

这个方法是永久有效的。重启XShell也会存在。

findway.conf

/home/lll/linux_code/lesson24/test/mylib/lib

image-20250405175543724

现象事实

1.动态库在进程运行的时候是要被加载的。(静态库不用)

2.常见的动态库被所有的(动态链接的)可执行程序都要使用。

动态库–共享库

所以,动态库在系统中加载之后,会被所有进程共享。

main.c

#include "mymath.h"
#include "myprintf.h"
#include "mylog.h"
  
int main()
{
  int n=div(10,0);
  printf("10/0=%d,myerror=%d\n",n,myerrno);

  print();
  Log("linux");
  return 0;
}

image-20250405203033076

所需要的代码已经拷贝到可执行程序了,所以静态库删了也不影响程序运行。

image-20250405203232303

动态库删除了 两份代码都跑不了了

main.ctest.c

#include "myprintf.h"
#include "mylog.h"
  
int main()
{
  print();
  Log("linux");
  return 0;
}

image-20250405204828429

一个共享库会被两个不相关的代码使用。

一个共享库挂了,那么和这个共享库相关的代码都跑不了了。

使用外部库

系统中其实有很多库,它们通常由一组互相关联的用来完成某项常见工作的函数构成。

比如用来处理屏幕显示情况的函数(ncurses库)

-lm表示要链接libm.so或者libm.a库文件

动态库怎么被加载的

动态库加载

进程地址空间的第二讲

什么是虚拟地址?什么是物理地址?

CPU读到的指令里面用的是什么地址?

gcc -fPIC --与位置无关码


关于地址

1.程序没有加载前的地址(程序)

程序编译好之后,内部有地址的概念吗? 有!!!

可执行程序分成很多段!(代码段、数据段)

平坦模式–编译器也要考虑操作系统!!!

已经是虚拟地址了!-- 逻辑地址!(段地址+偏移量)

image-20250405221313424

image-20250406204834649

2.程序加载后的地址(进程)

test.c

#include <stdio.h>

int a=10;
int b=20;
int main()
{
    printf("Hello linux\n");
    int x=30;
    int y=40;
    int z=x+y;
    printf("ret=%d\n",z);
    return 0;
}

把二进制程序反汇编出来了。

左边一列就是地址。每条指令都有自己的长度。

地址可以不出现。

程序入口+每条指令的长度就可以让代码运行了,

call指令可以计算出偏移量来找到对应的代码。

在运行之前,CPU中的寄存器提前内置了指令集(精简指令集|复杂指令集)

image-20250406203213671

image-20250406203431418

image-20250406213207062

3.动态库的地址

image-20250406214611856

image-20250406221720728

静态库为什么不谈加载?不谈与位置无关?

1.静态库会直接把对应的方法程序拷贝到可执行程序里,所以不需要加载。

2.静态库与位置有关!

因为静态库程序是直接拷贝到可执行文件里的,

可执行文件在程序地址空间中是直接绝对编址,有绝对地址,

所以地址在虚拟地址中是确定的!

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

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

相关文章

【前端】CSS 基础

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解 CSS 基础语法。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! > 专栏选自&#xff1a;前端基础…

【金仓数据库征文】——选择金仓,选择胜利

目录 第一部分&#xff1a;金仓数据库——开创数据库技术的新时代 1.1 金仓数据库的技术底蕴 1.2 高可用架构与灾备能力 1.3 分布式架构与弹性扩展能力 第二部分&#xff1a;金仓数据库助力行业数字化转型 2.1 电信行业&#xff1a;核心系统国产化替代 2.2 医疗行业&…

跟着尚硅谷学vue-day5

计算属性和watch监视 一.姓名案例 1.姓名案例-插值语法 <div id"root">姓&#xff1a;<input type"text" value"张" v-model"firstname"><br/><br/>名&#xff1a;<input type"text" value&q…

运维打铁:Centos 7 使用yum安装 mysql5.7

文章目录 一、安装前信息说明二、安装步骤1. 下载并安装官网 RPM 安装包2. 修改配置文件 /etc/my.cnf3. 创建 MySQL 数据相关目录并授权4. 启动 MySQL 服务 三、修改数据库访问密码1. 修改配置文件 /etc/my.cnf2. 重启 MySQL 服务3. 登录数据库并修改密码4. 恢复配置文件并重启…

网络原理初始

基础概念 组建局域网方式&#xff1a;路由器或者交换机。 IP确定主机&#xff0c;端口号确定使用的应用程序。 端口号&#xff1a;每个程序在进行网络通信中&#xff0c;都需要一个端口号。 协议&#xff1a;通信过程中的约定。 TCP/IP五层网络协议 从上到下 1、应用层&a…

基于SpringBoot3实现MyBatis-Plus(SSMP)整合快速入门CURD(增删改查)

目录 一、快速搭建SpringBoot-Web工程脚手架。 1.1 Spring Initializr 初始化工程。(官方提供) 1.2 工程脚手架初始化详细步骤。(IDEA2024.1.1) 二、MyBatis-Plus的特性与快速上手。 2.1 官网地址与基本特性。 2.2 快速上手技术栈基础。 2.3 Spring Boot2 的 MyBatis-Plus Star…

主题模型三大基石:Unigram、LSA、PLSA详解与对比

&#x1f31f; 主题模型演进图谱 文本建模三阶段&#xff1a; 词袋模型 → 潜在语义 → 概率生成 Unigram → LSA → PLSA → LDA &#x1f4e6; 基础模型&#xff1a;Unigram模型 核心假设 文档中每个词独立生成&#xff08;词袋假设&#xff09; 忽略词语顺序和语义关联 …

基准指数选股策略思路

一种基于Python和聚宽平台的量化交易策略&#xff0c;主要包含以下内容&#xff1a; 1. 导入必要的库 - 导入jqdata和jqfactor库用于数据获取和因子计算。 - 导入numpy和pandas库用于数据处理。 2. 初始化函数 - 设置基准指数为沪深300指数。 - 配置交易参数&#xff0c;如使用…

SAP接口超时:对 FOR ALL ENTRIES IN 的优化

SAP接口超时 经分析要10多分钟以上才出结果&#xff0c;且是这个语句耗时较长&#xff1a; SELECTaufnrmatnrbdmnglgortmeinschargFROM resbINTO CORRESPONDING FIELDS OF TABLE lt_lylcddxhFOR ALL ENTRIES IN lt_lylcddWHERE aufnr IN r_aufnr发现RESB有420万条记录&#xf…

Shell 脚本入门:从零开始写自动化脚本

目录 一、Shell 、Shell 命令、Shell 脚本 二、常用 Shell 命令与注释写法 三、echo 命令的使用 四、Shell 变量类型 五、变量与参数使用 六、读取用户输入 七、算术运算 八、条件判断与流程控制 九、循环结构 十、函数定义与调用 一、Shell 、Shell 命令、Shell 脚本…

【最新版】西陆健身系统源码全开源+uniapp前端

一.系统介绍 一款基于UniappThinkPHP开发健身系统&#xff0c;支持多城市、多门店&#xff0c;包含用户端、教练端、门店端、平台端四个身份。有团课、私教、训练营三种课程类型&#xff0c;支持在线排课。私教可以通过上课获得收益&#xff0c;在线申请提现功能&#xff0c;无…

常见移动机器人底盘模型对比(附图)

1. 概述 底盘模型驱动场景优势劣势双轮差速两轮驱动室内AGV结构简单、成本低转弯半径大&#xff0c;易打滑四轮差速四轮独立驱动复杂地形无人车全方位转向&#xff0c;机动性强控制复杂&#xff0c;能耗高阿克曼模型前轮转向后驱户外无人驾驶车高速稳定性好转弯半径大&#xf…

【MongoDB】windows安装、配置、启动

&#x1fa9f; 一、下载 MongoDB 安装包 打开官方地址&#xff1a; &#x1f449; https://www.mongodb.com/try/download/community 配置下载选项&#xff1a; 选项设置Version最新&#xff08;默认就好&#xff09;OSWindowsPackageMSI&#xff08;推荐&#xff09; 点击【D…

GitLab_密钥生成(SSH-key)

目录 1.密钥命令 2.自定义路径 3.输2次密码 4.查看公钥&#xff1a;&#xff08;打开文件&#xff09; 5. 把公钥&#xff0c;放到GitLab上面 6.填写公钥标题 7.点击 Add key 按钮 8. 验证添加是否成功 9. 测试 SSH 连接 10.彩蛋&#xff08;把ssh-key添加到python文…

【视频时刻检索】Text-Video Retrieval via Multi-Modal Hypergraph Networks 论文阅读

Text-Video Retrieval via Multi-Modal Hypergraph Networks 论文阅读 ABSTRACT1 INTRODUCTION2 PRELIMINARIES3 OUR FRAMEWORK3.1 Multi-Modal Hypergraph Networks3.2 Variational Inference 4 EXPERIMENT6 CONCLUSION 文章信息&#xff1a; 发表于&#xff1a;WSDM 24 原文…

BUUCTF-[GWCTF 2019]re3

[GWCTF 2019]re3 查壳&#xff0c;64位无壳 然后进去发现主函数也比较简单&#xff0c;主要是一个长度校验&#xff0c;然后有一个mprotect函数&#xff0c;说明应该又是Smc&#xff0c;然后我们用脚本还原sub_402219函数处的代码 import idc addr0x00402219 size224 for …

C++入侵检测与网络攻防之暴力破解

目录 1.nessus扫描任务 2.漏洞信息共享平台 3.nessus扫描结果 4.漏扫报告的查看 5.暴力破解以及hydra的使用 6.crunch命令生成字典 7.其他方式获取字典 8.复习 9.关于暴力破解的防御的讨论 10.pam配置的讲解 11.pam弱密码保护 12.pam锁定账户 13.shadow文件的解析 …

管理100个小程序-很难吗

20公里的徒步-真难 群里的伙伴发起了一场天目山20公里徒步的活动&#xff0c;想着14公里都轻松拿捏了&#xff0c;思考了30秒后&#xff0c;就借着春风带着老婆孩子就出发了。一开始溪流清澈见底&#xff0c;小桥流水没有人家&#xff1b;青山郁郁葱葱&#xff0c;枯藤老树没有…

如何在Linux用libevent写一个聊天服务器

废话少说&#xff0c;先看看思路 因为libevent的回调机制&#xff0c;我们可以借助这个机制来创建bufferevent来实现用户和用户进行通信 如果成功连接后我们可以直接在listener回调函数里创建一个bufferevent缓冲区&#xff0c;并为每个缓冲区设置相应的读回调和事件回调&…

马浩棋:产通链CT-Chain 破局不动产 RWA,引领数智金融新变革

全球不动产 RWA 数智金融高峰论坛上马浩棋先生致辞 在全球不动产 RWA 数智金融高峰论坛暨产通链 CT-Chain 上链首发会的现场&#xff0c;犀牛世纪集团&#xff08;香港&#xff09;有限公司董事会主席马浩棋成为众人瞩目的焦点。此次盛会汇聚了全球金融、区块链及不动产领域的…