软件运行和编译过程及库调用机制(以及删除库的恢复方法)

1.ldd是个外部命令

[root@centos7 ~]# type ldd
ldd is /usr/bin/ldd

 

 

2.ldd:是用来打印共享对象(库)依赖关系

 

 

3.1)来查查ls调用的二进制库有哪些

[root@centos7 ~]# which ls
alias ls='ls --color=auto'
        /usr/bin/ls
[root@centos7 ~]# ldd /usr/bin/ls
        linux-vdso.so.1 =>  (0x00007ffffa79e000)
        libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fb9680ab000)
        libcap.so.2 => /lib64/libcap.so.2 (0x00007fb967ea6000)
        libacl.so.1 => /lib64/libacl.so.1 (0x00007fb967c9d000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fb9678cf000)
        libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fb96766d000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fb967469000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fb9682d2000)
        libattr.so.1 => /lib64/libattr.so.1 (0x00007fb967264000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fb967048000)

2)再查查hostname

[root@centos7 ~]# type hostname
hostname is /usr/bin/hostname
[root@centos7 ~]# ldd /usr/bin/hostname
        linux-vdso.so.1 =>  (0x00007ffc605fd000)
        libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f9bd182a000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f9bd145c000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f9bd1a44000)

 

 

 

4.我们假如把ls或者hostname的某一个库移走:

[root@centos7 ~]# mv /lib64/ld-linux-x86-64.so.2 /opt

再来运行ls和hostname等

[root@centos7 ~]# ls
-bash: /usr/bin/ls: /lib64/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory
[root@centos7 ~]# hostname
-bash: /usr/bin/hostname: /lib64/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory

发现ls和hostname均不能运行,你破坏影响的范围是:谁依赖调用这个库全部影响。所以库的重要性,甚至会比这个程序还重要.

 

 

5.那我们尝试把这个库再移回去:

[root@centos7 ~]# mv /opt/ld-linux-x86-64.so.2 /lib64
-bash: /usr/bin/mv: /lib64/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory

发现,也移不回去了,因为mv也依赖他

 

 

6.除了重启和快照恢复,我们还可以这样

1)第一步在开机的时候,按ctrl+alt+insert,进度条出现的时候再按esc进入

软件运行和编译过程及库调用机制(以及删除库的恢复方法)

 

 2)选3,进入到这个界面选第三个:

软件运行和编译过程及库调用机制(以及删除库的恢复方法)

 

 3)然后进入下图界面选第二个:

软件运行和编译过程及库调用机制(以及删除库的恢复方法)

 

 4)选择第一个继续输入1:

软件运行和编译过程及库调用机制(以及删除库的恢复方法)

 

 5)按c继续

软件运行和编译过程及库调用机制(以及删除库的恢复方法)

 

 6)这里的return键就是enter,敲enter继续

软件运行和编译过程及库调用机制(以及删除库的恢复方法)

 

 7)然后我们就进入到了这个界面这个就是救援版的或者光盘版的小linux:

软件运行和编译过程及库调用机制(以及删除库的恢复方法)

 

 8)注意你现在看到的根不是你原来目录的根,原来的硬盘的根已经放在/mnt/sysroot下去了,这个根是救援光盘加载的虚拟根,但是我这个却是在/mnt/sysimage中,可能版本不一样,但是不影响

软件运行和编译过程及库调用机制(以及删除库的恢复方法)

 

 9)你在救援光盘的Linux中你用ls可以查看你移动在/opt下的库文件

软件运行和编译过程及库调用机制(以及删除库的恢复方法)

 

 10)现在就很明朗了,用mv再将其移动过去就可以了,有人会问刚才为什么不能移动回去,因为你现在用的是救援光盘版的小Linux,不是硬盘的Linux,救援光盘的Linux当然没问题了,所以我们可以正常敲命令。这里因为我考虑到万一库被删的情况,就没用mv,懒得再弄一遍了哈哈,不过弄好效果如下图.

软件运行和编译过程及库调用机制(以及删除库的恢复方法)

 

 

 

 

7.万一我们将上述库给删了怎么办

1)按照6的步骤最后一步不用mv,用cp将救援光盘的/lib64/ld-linux-x86-64.so.2复制到你的硬盘Linux中:

软件运行和编译过程及库调用机制(以及删除库的恢复方法)

 

 2)在其页面按ctrl+alt+insert重启,效果如下图:

软件运行和编译过程及库调用机制(以及删除库的恢复方法)

 

 可以发现已经正常了.

 

 

2022-2-4 21:37

上一篇:BFS,DFS,以及图(Graph),树(Tree)的思考(4)


下一篇:MATLAB中的graph对象