一. 基本概念

Linux下的.so是基于Linux下的动态链接,其功能和作用类似与windows下.dll文件。

  • 代码编译,链接,最后生成可执行文件;这个可执行文件就可看作是一个静态链接,因为代码里所有的函数变量都在这个可执行文件中。但这样会带来一个问题,就是如果项目的工程过大,写了太多的函数,但在程序的实际运行过程中,这些函数不一定都会用到,就会导致内存的大大的浪费,可能你的可执行文件有10M,但是只用了1M,其余部分都没用。于是动态链接库应运而生。不过windows下文件是.dll,而linux下叫.so。
  • 动态链接库有啥好处呢?参考链接(https://www.cnblogs.com/liuzhenbo/p/11031052.html)

1. 可以实现进程之间的资源共享。

什么概念呢?就是说,某个程序的在运行中要调用某个动态链接库函数的时候,操作系统首先会查看所有正在运行的程序,看在内存里是否已有此库函数的拷贝了。如果有,则让其共享那一个拷贝;只有没有才链接载入。这样的模式虽然会带来一些“动态链接”额外的开销,却大大的节省了系统的内存资源。C的标准库就是动态链接库,也就是说系统中所有运行的程序共享着同一个C标准库的代码段。

2. 将一些程序升级变得简单。用户只需要升级动态链接库,而无需重新编译链接其他原有的代码就可以完成整个程序的升级。Windows 就是一个很好的例子。

3. 甚至可以真正做到链接载入完全由程序员在程序代码中控制。

程序员在编写程序的时候,可以明确的指明什么时候或者什么情况下,链接载入哪个动态链接库函数。你可以有一个相当大的软件,但每次运行的时候,由于不同的操作需求,只有一小部分程序被载入内存。所有的函数本着“有需求才调入”的原则,于是大大节省了系统资源。比如现在的软件通常都能打开若干种不同类型的文件,这些读写操作通常都用动态链接库来实现。在一次运行当中,一般只有一种类型的文件将会被打开。所以直到程序知道文件的类型以后再载入相应的读写函数,而不是一开始就将所有的读写函数都载入,然后才发觉在整个程序中根本没有用到它们。

二 简单示例

参考https://blog.csdn.net/m0_37844072/article/details/112802168,建立好文件工程(makefile可不要),依次执行以下步骤即可看到main.c链接了test1,test2生成的.so文件。并打印出了相关内容。

#step1 : 编译文件生成动态库gcc test1.c test2.c -fPIC -shared -o libtest.so
#将test1.c,test2.c生成libtest.so动态库
#-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code)
#step2:链接.so生成可执行文件maingcc main.c -L. libtest.so -o main
#编译main.c时链接libtest.o 输出名为main的执行文件
#-L.代表libtest.so和main.c在同一位置
#step3 :查看实际调用ldd main
#查看可执行文件main的依赖的动态库有哪些-/main
#执行main文件

.so文件的基本理解,使用。相关推荐

  1. dis反汇编文件的分析理解

    CPU按照内存从前往后,依次取指执行,解析该机器码,该赋值哪儿就赋值,该如何跳转,就跳转,这就是CPU执行过程,然后pc指针依次+4,即依次向后取值,然后继续执行.在内存中存的就是机器码往后排而已.[ ...

  2. c2000 汇编语言指令,C2000系CMD文件的配置理解

    马上注册,结交更多好友,享用更多功能,让你轻松玩转社区. 您需要 登录 才可以下载或查看,没有帐号?注册 x 推荐CMD的专业名称叫链接器配置文件,是存放链接器的配置信息的,我们简称为命令文件,其中比 ...

  3. 在linux下赋予000权限,【linux】对于文件权限的理解

    本篇博文旨在介绍linux下的权限问题:介绍了Linux下,查看权限.修改权限等方法:并通过分别在超级用户(root)和普通用户下进行测试,探索不同等级的用户进入目录需要的权限,以及进入后,显示和创建 ...

  4. linux怎样自动检查link文件_怎样理解和识别 Linux 中的文件类型 | Linux 中国

    众所周知,在 Linux 中一切皆为文件,包括硬盘和显卡等.在 Linux 中导航时,大部分的文件都是普通文件和目录文件.但是也有其他的类型,对应于 5 类不同的作用.因此,理解 Linux 中的文件 ...

  5. android锁屏密码文件夹,深入理解Android M 锁屏密码存储方式

    Android M 之前锁屏密码的存储 在 Android M 之前,锁屏密码的存储格式很简单,其使用了 64 位随机数作为 salt 值,此 salt 值被存储在 sqlite 数据库 /data/ ...

  6. HDFS文件系统的基础理论,HDFS工作者和管理者的分配,HDFS文件存储容量的理解

    1.HDFS的文件系统介绍 HDFS是Hadoop Distribute File System 的简称,意为:Hadoop 分布式文件系统.是 Hadoop 核心组件之一,作为最底层的分布式存储服务 ...

  7. 如何用python查看pyc文件_如何理解.pyc文件内容

    .pyc文件包含一些元数据和一个^{}edcode对象:加载code对象并反汇编使用:import dis, marshal, sys # Header size changed in 3.3. It ...

  8. BT种子的技术原理是什么?就是.torrent文件该如何理解?

    看到很多咨询BT种子原理的问题,在这里整理些资料,希望对需要的朋友有帮助. 可以分两个层面来分析一下: 1.torrent文件的原理:如果这个问题是指torrent文件本身,那么,当你对一个文件(或者 ...

  9. 【云原生】k8s(Kubernetes)中yaml文件快速阅读理解

    简言: k8s yaml中文件内容一般有kind类型之分,每种类型有不同的功能(一般用---符号隔开) 常见的kind类型:         (1)Endpoints:Endpoints可以把外部的链 ...

  10. 【patch】x64dbg_2018_10_11导出的内存补丁文件内容如何理解地址偏移(va内存,Rva相对,Fva文件)

    最近分析了一个程序,导出的一个文件 导出菜单 补丁文件gdul4.5.0.5.1337内容: >gdul_win64.exe 0000000000077D32:7E->EB 使用winhe ...

最新文章

  1. Python字符串的修改以及传参
  2. 昵图网学校计算机教室制度,ClassIn在线教室
  3. 51nod1237 最大公约数之和 V3
  4. Add a All Document Folder
  5. [深圳/广州]微软SQL技术沙龙分享会(MVP)
  6. android新闻客户端发展趋势,基于Android平台的新闻客户端设计与实现
  7. .Net读取rss的两种方法
  8. commit分拆多个 git_Git操作:在多个分支之间,使用git am打patch和同步分支
  9. Windows系统结构
  10. 【POJ 3279】【开关问题】Fliptile【暑期 No.5】
  11. acfun json 弹幕 转换 bilibili xml 弹幕
  12. 线程---同步---快乐影院小案例
  13. 基于DFA算法的敏感词过滤的go语言实现
  14. JAVA实现PDF合并、拆分代码工具类
  15. JAVA Servlet进阶
  16. C语言初学者如何制作一个完整的C语言程序——歌曲排行榜
  17. Android学习笔记(四十):Preference的使用
  18. TI OMAP平台BSP学习笔记之 - UBOOT(1)
  19. python 爬取王者荣耀高清壁纸
  20. 2022国际数维杯C题思路

热门文章

  1. matlab实用教程 答案,含答案《matlab实用教程》.doc
  2. 手游图片素材提取_游戏资源提取工具(ExtractData日本游戏看内涵图)V2.5.38.966官方版下载 - 下载吧...
  3. Qt 3D Opengl学习
  4. windows server2003/R2 安装IIS6(asp.net)
  5. [Android第三方类库]聊一聊Android的第三方开发组件
  6. 软件单元测试及测试用例设计
  7. flash 林度_还记得闪客帝国吗?当年有名的 Flash 作者们,现在都去哪儿了?......
  8. 《Unix网络编程》环境搭建
  9. Java面试题及答案(2021年Java面试题大全带答案)
  10. wacom win10 未连接任何设备 驱动的问题 解决影拓3手绘板等老设备驱动无法在win10使用的问题