还在死记硬背软硬链接和动静态库?从零基础到精通,收藏这篇就够了!

一、目录的本质:不仅仅是个文件夹

都说 Linux 下一切皆文件,那目录到底是不是文件? 答案是:必须滴! 因为它也有自己的 inode。不信? 跑个 ls -i 命令看看,inode 编号是不是稳稳地在那儿?

目录的 inode

目录里都藏了些啥秘密? 其实就是一堆文件名和 inode 的映射关系。 操作系统靠这个才能在茫茫“文件海”中找到你要的文件。

每个目录一出生就自带俩“隐藏款”文件:...。 它们是啥? 属性是啥? 别急, 往下看, 保证给你安排得明明白白!

目录的隐藏文件

二、软链接:Windows 快捷方式的 Linux 版?

先来个骚操作, 用 ln -s 给 test 目录整个软链接:

创建软链接

软链接的属性

看到没? 软链接也有自己的 inode, 妥妥的独立文件一枚! 它的数据块里其实存的是指向文件的路径

软链接就像 Windows 里的快捷方式, 对它动手动脚, 原文件也会跟着变。

但是! 如果原文件被咔嚓掉了呢?

软链接失效

Duang! 软链接直接变红, 宣告“已失效”。 所以, 软链接对原文件可是有依赖性的哦! 原文件没了, 它也就凉凉了。

三、硬链接:文件界的“克隆”技术

ln 命令创建硬链接:

创建硬链接

注意看, 硬链接和原文件的 inode 一模一样! 前面我们提到过, 第三列的数字 2 代表硬链接数。 现在是不是瞬间明白了? 硬链接数就是指向同一个 inode 的文件名数量

修改 file 文件, 硬链接也会跟着变, 因为它们压根就是同一个文件

修改原文件

硬链接同步修改

就算把 file 文件删了, 硬链接依然坚挺, 数据也不会丢! 这再次证明了: 操作系统只认 inode, 不认文件名!

inode 结构体里有个引用计数器, 记录着硬链接数。 只要引用计数大于 0, 所有硬链接就都指向同一块存储空间。

inode 引用计数

硬链接原理

但是! Linux 并不允许你随便给目录创建硬链接。 为啥? 原因有四:

  1. 防止文件系统循环引用: 目录 A 硬链接到目录 B, 目录 B 又硬链接回目录 A, 无限循环, 系统直接崩溃!
  2. 保证文件系统一致性: 目录结构必须清晰, 乱搞硬链接会破坏目录的层次关系, 让文件管理变得一团糟。
  3. 简化文件系统管理: 目录的硬链接会让链接计数变得异常复杂, 增加文件系统维护难度。
  4. 安全性考虑: 目录权限管理是基于目录结构的, 乱用硬链接可能绕过权限控制, 造成安全隐患。

四、Linux 目录里的秘密:... 是什么鬼?

1、.:我就是我,不一样的烟火

. 的作用

. 的作用是啥? 定位当前目录! 有了它, 才能用 ./ 搞相对路径定位。 看图, test 目录和 test 目录里的 . 的 inode 是一样的, 这其实就是个硬链接! 虽然 Linux 不让你手动创建目录硬链接, 但为了方便你用相对路径, 它偷偷给你安排了一个。 而且, 这还是个隐藏文件, 默认情况下你看不到它。

2、..:带你回到上一次

.. 的作用

.. 的 inode 和 2_9 目录里的 . 的 inode 相同! 所以, .. 其实就是上级目录 2_9 的硬链接。 现在, 当你在 test 目录下执行 cd .. 命令时, 是不是感觉像坐上了时光机, 嗖地一下回到了 2_9 目录?

五、静态库:编译时的一次性“打包”

1、手把手教你打造静态库

假设我们有两个 .o 文件: 一个负责打印功能, 一个负责加减乘除。 现在要把它们打包成一个静态库。

打印功能的代码

加减乘除的代码

Makefile 文件

目录结构

来解读一下 Makefile:

  • lib=mylib.a: 定义静态库的文件名。
  • $(lib):cal.o print.o: 声明静态库依赖于 cal.oprint.o
  • ar -rc $@ $^核心命令! 把所有依赖文件 ($^) 打包成静态库 ($@)。
  • 后面的规则负责把 .c 文件编译成 .o 文件。
  • output 目标则负责把静态库和头文件整理到特定的目录结构中, 方便发布和管理。

静态库的本质

记住: 静态库 .a 文件其实就是一堆 .o 文件的“压缩包”。

静态库的内容

执行 make 命令生成静态库, 再执行 make output 发布库。 然后把生成的静态库复制到 test 文件夹里, 准备开始测试。

2、静态库的正确打开方式

测试代码

编译错误

What? 报错了! 找不到 cal.h 头文件。 还记得 C 语言包含头文件的两种姿势吗?

  • <>: 去系统指定的目录里找。
  • "": 在当前目录里找。

现在头文件在 lib/include 目录下, 既不在系统目录, 也不在当前目录, 咋办? 三种方案:

  1. 把代码里的路径补全
  2. 把头文件拷贝到系统指定目录/usr/local/include//usr/include)。
  3. -I 选项告诉编译器头文件在哪

这里我们选择第三种:

指定头文件路径

继续报错

头文件的问题是解决了, 但还是编译不过! 因为链接器找不到库文件。 gcc 默认只在 lib64/libc.solib64/libc.a 里找, 我们的库文件藏在其他地方, 必须手动指定。

指定库文件路径

解释一下这行命令:

  • -I ./lib/include: 指定头文件搜索路径。
  • -L ./lib/mylib/: 指定库文件搜索路径。
  • -lmylib: 指定要链接的库名(注意: 这里是 mylib, 不是 libmylib.a)。

除了这种方式, 还有两种“骚操作”:

  1. 安装库: 把头文件复制到 /usr/include, 库文件复制到 /lib64
  2. 建立软链接: 类似于路径补全, 不过需要在代码里写成 #include <mysoftlink/cal.h> 这种形式。

现在, 编译成功了! 但是, 如果把静态库删掉, 程序还能跑吗? 自己试试看!

六、动态库:运行时按需加载的“共享”资源

1、动态库“炼成”记

还是用之前的代码, 这次我们来生成动态库。

生成动态库

注意两个关键选项:

  • -fPIC必须有! 生成与位置无关的代码, 让动态库可以加载到任意内存地址。
  • -shared: 告诉 gcc 我要生成动态库(也叫共享库)。

2、动态库的正确食用方法

把动态库放到 test 文件夹里, 创建 main.c 测试文件。 编译时又遇到了头文件找不到的错误, 解决方法和静态库一样, 这里不再赘述。

链接动态库

按照静态库的方式链接动态库, 发现虽然生成了可执行文件, 但是运行时却找不到动态库

找不到动态库

ldd a.out 命令查看可执行文件 a.out 依赖的库, 发现动态库那里显示 not found

ldd 命令

file a.out 命令可以看到 a.out 确实是 dynamically linked, 依赖于共享库。

file 命令

解决这个问题, 有四种方法:

  1. 拷贝到系统默认的库路径 /usr/lib64/lib64最常用! 因为我们用的库大多是成熟库)。
  2. 在系统默认的库路径下建立软链接
  3. 把库所在的路径添加到环境变量 LD_LIBRARY_PATH
  4. /etc/ld.so.conf.d/ 目录下创建配置文件, 然后执行 ldconfig 命令更新配置

黑客/网络安全学习包

资料目录

  1. 成长路线图&学习规划

  2. 配套视频教程

  3. SRC&黑客文籍

  4. 护网行动资料

  5. 黑客必读书单

  6. 面试题合集

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

*************************************优快云大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*************************************

1.成长路线图&学习规划

要学习一门新的技术,作为新手一定要先学习成长路线图方向不对,努力白费

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。


因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

*************************************优快云大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*************************************

2.视频教程

很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,其中一共有21个章节,每个章节都是当前板块的精华浓缩


因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

*************************************优快云大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*************************************

3.SRC&黑客文籍

大家最喜欢也是最关心的SRC技术文籍&黑客技术也有收录

SRC技术文籍:

黑客资料由于是敏感资源,这里不能直接展示哦!

4.护网行动资料

其中关于HW护网行动,也准备了对应的资料,这些内容可相当于比赛的金手指!

5.黑客必读书单

**

**

6.面试题合集

当你自学到这里,你就要开始思考找工作的事情了,而工作绕不开的就是真题和面试题。

更多内容为防止和谐,可以扫描获取~

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

*************************************优快云大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*********************************

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值