Linux 下 so 的符号链接机制是为什么

作者&投稿:乾戚 (若有异议请与网页底部的电邮联系)
linux下运行ldconfig命令后,提示“XX不是符号链接“是什么意思~

这是因为提示的文件并不通过符号链接生成的(即没有链接到某个文件),你需要将这个文件用ln -s 命令链接成符号链接。
例如:
libabc.so 15M
libabc.so.15 ---> libabc.so 4k
libabc.so.15.1 ---> libabc.so.15 4k
在拷贝这些文件时如果直接用cp命令会导致符号链接丢失,使得三个文件均为15M;
而在用 cp -s命令时,文件的符号链接是保存的(或拷贝完文件后再通过ln -s 命令重新链接)。此时ldconfig命令就不会出现“XX不是符号链接”。

连接分为硬链接和软连接:
1 软链接文件
  软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。
链接文件甚至可以链接不存在的文件,这就产生一般称之为"断链"的问题(或曰“现象"),链接文件甚至可以循环链接自己。类似于编程语言中的递归。
  用ln -s 命令可以生成一个软连接,如下:
  [root@linux236 test]# ln -s source_file softlink_file
  在对符号文件进行读或写操作的时候,系统会自动把该操作转换为对源文件的操作,但删除链接文件时,系统仅仅删除链接文件,而不删除源文件本身。
  2 硬链接文件
  info ln 命令告诉您,硬链接是已存在文件的另一个名字(A "hard link" is another name for an existing file),这多少有些令人困惑。硬连接的命令是
  ln -d existfile newfile
  硬链接文件有两个限制
  1)、不允许给目录创建硬链接;
  2)、只有在同一文件系统中的文件之间才能创建链接。
  对硬链接文件进行读写和删除操作时候,结果和软链接相同。但如果我们删除硬链接文件的源文件,硬链接文件仍然存在,而且保留了愿有的内容。
这时,系统就“忘记”了它曾经是硬链接文件。而把他当成一个普通文件。

两者之间的区别
硬连接指通过索引节点来进行的连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。
在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要
文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个
连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件才会被真正删除。
软链接文件有点类似于Windows的快捷方式。它实际上是特殊文件的一种。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。

个人体会
软链接是另一个文件,作用可以理解为一个指针,作用在这个文件上的操作除了删除都直接转向实际指向文件,由于是一个真实的文件所以占用磁盘空间
硬链接可以认为不是一个文件,它只是实际文件的一个别名,它的作用是防止真实文件被误操作,给一个文件建立硬链接后,他们互为别名,删除其中任意一个,
只会删除该别名,实际文件并不会被删除。由于只是别名没有任何其他信息,所以并不占用原始文件大小的磁盘空间。

为了升级方便,举个例子来说,有个共享库的文件名字叫作libfoo.so.1,某客户程序使用该库的功能,编写代码后编译成功了。在连接生成二进制文件的客户程序时,正规的做法是建立一个libfoo.so.1文件的符号链接,名字通常会叫做libfoo.so,于是客户程序的连接参数应该写成-lfoo,连接生成二进制文件后我们使用ldd命令可以看到客户程序依赖于libfoo.so.1这个库文件。
此后,libfoo.so的开发者决定升级该库,但是发布文件的时候文件名改成了libfoo.so.2,并且重新生成符号链接文件libfoo.so指向libfoo.so.2这个新版的共享库。这样做的好处是客户程序在重新编译的时候无需更改Makefile文件,仍然使用-lfoo这个连接参数即可。


汉南区19384182982: Linux 下 so 的符号链接机制是为什么 -
邴逸海凌: 为了升级方便,举个例子来说,有个共享库的文件名字叫作libfoo.so.1,某客户程序使用该库的功能,编写代码后编译成功了.在连接生成二进制文件的客户程序时,正规的做法是建立一个libfoo.so.1文件的符号链接,名字通常会叫做libfoo.so,...

汉南区19384182982: Linux下如何查看动态链接库so文件的依赖 -
邴逸海凌: ldd 查看可执行文件链接了哪些 系统动态链接库 nm 查看可执行文件里面有哪些符号 strip 去除符号表可以给可执行文件瘦身 如果我们想从可执行程序里面提取出来一点什么文本信息的话,还可以用strings命令 strings Linux操作系统

汉南区19384182982: linux下的动态链接库和静态链接库到底是个什么鬼 -
邴逸海凌: Linux中动态链接库是.so为后缀的文件,静态链接库是.a为后缀的文件,.a和.so文件都叫做函数库文件.库是一组预先编译好的函数的集合,库文件的名字以lib开头,随后的部分指明这是什么库(例如libc代表C语言库,libm.a的m代表数学库)..a静态函数库:当同时运行多个程序并且都使用到同一个函数库的函数时,内存中就会有同一函数的多份副本,会消耗大量宝贵的内存..so共享函数库:可以克服.a函数库的不足.当一个程序使用共享函数库时,程序本身不再包含函数代码,而只是引用共享代码,当实际调用时,共享库才被加载到内存中..a文件类似于Windows下的.lib文件,.so文件类似于Windows下面的.dll文件,这样就好理解了.

汉南区19384182982: linux的C编程,怎么使用so文件 -
邴逸海凌: linux下的.so文件为共享库,相当于windows下的dll文件,使用方法如下: 在你的工程源代码里包含.h头文件,然后可以调用动态库里的函数,在链接的时候加上如下编译器参数: -l xx.so 如果你的so文件是以lib开头的,还可以直接这样使用: -lxx xx是你的.so文件名 其实使用方法和你使用数学库函数是一样的,源代码中添加#include ,编译的时候,加上-lm参数.

汉南区19384182982: linux中.so后缀的文件怎么使用啊
邴逸海凌: so是动态库,你这个是flash啲动态库,扔到firefox啲plugins里面,如果是自己下啲火非常中国版到火非常中国版啲目录找就行了,系统自带啲火非常全球通用版应该是/usr/lib/firefox/,找找.如果是chrome浏览器ln1个连接就行,如果是konqueror在选项里面去火非常啲库查找,如果扔到火非常目录里了konqueror也能够找到,直接用就行了.至于seamonkey和火非常1个样,opera没用过...

汉南区19384182982: 什么是linux中的SO动态库
邴逸海凌: so动态链接库是对它有依赖关系的程序运行时需要调用的,可以通过命令: ldd “程序名字”来查看程序调用了哪些动态链接库,系统默认会自动加载/usr/lib/ 等目录下的动态链接库,如果是源码安装的库,它的动态链接库文件会存在你自定义安装的目录的lib下,这时你需要修改/etc/ld.so.conf文件来指定动态链接库的加载路径,然后运行ldconfig命令来加载动态链接库,ldconfig -v是查看那些动态链接库已经被加载了

汉南区19384182982: Linux软件缺少动态链接库.so怎么办 -
邴逸海凌: 几种办法1. 从别的相同版本的系统中把这个so文件copy到相同路径下就可以了2. 查看这个so文件属于哪个软件包,安装这个软件包

汉南区19384182982: linux下的so,o,lo,a,la文件有什么区别 -
邴逸海凌: o: 编译的目标文件 a: 静态库,其实就是把若干o文件打了个包 so: 动态链接库(共享库) lo: 使用libtool编译出的目标文件,其实就是在o文件中添加了一些信息 la: 使用libtool编译出的库文件,其实是个文本文件,记录同名动态库和静态库的相关信息

汉南区19384182982: linux下怎么卸载自带的JDK和安装想要的JDK -
邴逸海凌: 如果您准备从 Linux 盒中完全删除 Java,请参阅下面介绍的符号链接删除过程.打开终端窗口 以超级用户身份登录 键入: rm /usr/lib/mozilla/plugins/libnpjp2.so 将提示您删除符号链接:rm: /usr/lib/mozilla/plugins/libnpjp2.so ?键入:Y linux下安装...

汉南区19384182982: 什么是linux下的符号链接文件 -
邴逸海凌: 一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link,也叫做软链接).

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网