目录

  • /dev 目录是干什么的?
  • /proc 和 /sys 目录是干什么的?
  • udev 这个软件是干什么用的?
  • 目录映射是临时性的,还是永久性的?
  • 命令行里大括号 “{}” 的作用是什么?
  • 设置目录权限为 “1777” 表示什么?
  • ls -l 后,第一列第一个字符表示什么?第三列和第四列又表示什么?
  • exec 命令的特点是什么?
  • 其他函数库文件都已 lib 开头,那么 ld 开头的函数库文件有什么不同呢?
  • ldd /bin/cat 的结果如何解析?
  • 是 ldd 命令表示共享库文件,还是 ld-linux.so.2 显示出来?
  • ld-linux.so.2 是哪个平台的名称?其他平台也叫这个?
  • ldd 命令的本质是什么?

/dev 目录是干什么的?

该目录用于存放各种设备文件。

Linux 下都是通过文件的形式来进行设备访问的,设备文件的类型包括块设备、字节设备、虚拟设备等。

/proc 和 /sys 目录是干什么的?

这两个目录是用于存放和内核数据相关的内容,通过内核自身的虚拟文件系统将内核中的信息以文件的形式体现出来,可以通过这些文件与内核进行交互。

udev 这个软件是干什么用的?

udev 软件包中含有一组用于动态创建设备文件的程序,可以将这些程序一并称为 Udev 系统。

大多数 Linux 系统会使用 Udev 系统来管理 /dev 目录中的设备文件,Udev 系统会自动检测计算机丙且生成设备文件,Udev 系统还具有热插拔设备的管理能力,能够根据设备的实际使用情况来进行动态的创建和删除设备文件,几大的节省管理设备文件的难度。

目录映射是临时性的,还是永久性的?

被映射的源目录和映射目录内容上保持一致,对他们中的任何一方目录内的改动将直接导致另一方同样的修改。

与链接文件处理方式不同,源目录和映射目录都必须是实际的目录而不是链接文件,目录映射并不依赖源目录的存在位置,即使在简历好目录映射后,改变源目录的名称或者位置都不会影响到映射目录的内容。

命令行里大括号 "{}" 的作用是什么?

表示将需要处理的字幕中相同部分进行合并,不同的内容和大括号内的字符组合,类似数学上的合并同类项。

例如: mkdir -pv /var/{lock, log, mail, run, spool}

等于:mkdir -pv /var/lock /var/log /var/mail /var/run /var/spool

还有一种使用方法

例如:mkdir -pv /usr/{, local/}share/man/man{1..8}

这个命令会创建如下的目录:

/usr/share/man/man1
/usr/share/man/man2
一直到 /usr/share/man/man8
然后
/usr/local/share/man/man1
/usr/local/share/man/man2
一直到 /usr/share/man/man8

设置目录权限为 "1777" 表示什么?

后三位是权限模式,第一位是粘贴位,设置为 1 后,可以使用户不能从中删除其他用户创建的文件或者目录。

ls -l 后,第一列第一个字符表示什么?第三列和第四列又表示什么?

第一列用 10 个自负来表示文件的类型以及访问权限。

其中第一个自负代表这个文件的类型。

-: 表示一般文件
d:表示目录
l:表示链接文件
c:表示字符设备文件
b:表示块设备文件
p:表示管道文件

第三列表示文件的所属用户,第四列表示的则是该文件所属组的名称。

exec 命令的特点是什么?

与直接运行程序的方式不同,exec 将使运行的程序覆盖调用他的程序,即在 bash 下运行 exec,bash 将推出运行。

而 exec 所执行的程序将替代 bash 执行。

具体过程如下:

当前运行了一个 bash ,称为 bash1 ,运行状态如下:

bash1

然后在其上直接运行 bash 命令,刚运行的 bash 称为 bash2 ,这时实际上是有两个bash 在运行的,而当前是由 bash2 来与用户交互,运行状态如下:

bash1 -> bash2

这时使用 ls 命令:

bash1 -> bash2 -> ls

而如果使用 exec ls 来运行 ls 命令,将会使用 ls 命令来替代 bash2 运行,此时的运行状态如下:

bash1 -> ls

ls 命令执行完成后,将会退回到 bash1 上:

bash1

需要注意的,如果你直接就在 bash1 下使用 exec 来执行命令,那么执行完毕后,终端会自动关闭,因为已经没有 shell 了。

其他函数库文件都已 lib 开头,那么 ld 开头的函数库文件有什么不同呢?

Glibc 只能黄的文件中,有一个特殊的函数库文件,就是 ld-linux.so.2,这个文件在不同的平台上会有不一样的名字,但是名字都以 ld 开头,这一点非常特别。

这以 ld 开头的共享函数库文件的特别之处在于,他是用来寻找其他函数库文件的函数库。

使用 ldd 明林过去查看一个动态链接的文件,其链接的共享函数库中一定会有一个 ld 开头的文件,这个函数库文件的作用就是用来帮助该文件在运行期间想寻找其他函数库文件。

ldd /bin/cat 的结果如何解析?

使用这个命令后,显示的结果如下:

linux-gate.so.1 => (0xb77d800)
libc.so.6 => /lib/libc.so.6 (0xb7662000)
/lib/ld-linux.so.2 (0xb77d9000)

对于每行最后十六进制的地址我们可以不用理会,它代表的是各个函数库文件的入口地址。

其中 linux-gate.so.1 不是实际的函数库文件,它是虚拟的函数库文件,用于和 Linux 内核进行接口。

libc.so.6 => /lib/libc.so.6

表达的含义就是 cat 命令在运行的时候需要使用 libc.so.6 这个共享函数库,而这个函数库文件就位于 /lib/libc.so.6

那么 libc.so.6 这个文件是如何被系统找到,在 ldd /bin/cat 命令运行的时候又是如何发现该文件的存放位置的呢?

要回答这个问题,要先来看ldd 命令显示内容的最后一行:/lib/ld-linux.so.2 这个函数库并没有和 libc.so.6 使用一样的表示方式,而是直接就定位到 /lib/ld-linux.so.2 上,而正是这个函数库,帮 cat 命令找到所需要的其他函数库文件,比如 libc.so.6

是 ldd 命令表示共享库文件,还是 ld-linux.so.2 显示出来?

如果 ld-linux.so.2 寻找运行时需要的函数库文件,但是谁来查找 ld-linux.so.2 这个文件呢?

答案是只要直接将该文件的路径写在程序中,就可以不用寻找了,这也是为什么 GCC 的配置文件中会专门处理该文件的原因。只要为程序提供了 ld=linux.so.2 的路径,那么其他的共享函数库文件如何寻找就由该函数库的功能来决定了。

这样卡莱 cat 命令需要用到其他函数库时,首先会将需要的函数库名称告诉给 ld-linux.so.2 听,如果需要 libc.so.6 就由该函数库根据相关的设置来进行查询,这些设置包括 lD_LIBRAY_PATH 环境变量的设置,/etc/ld.so.conf 中的配置和 ld-linux.so.2 自己的默认搜索路径等。

所以并非 ldd 命令将 cat 明林龟缩依赖的函数库显示出来,而是 cat 命令自己显示的结果,cat 命令也是因为使用 ld-linux.so.2 才能显示需要的函数库所存放的目录为止,可以使用如下命令来验证:

/lib/ld-linux.so.2 --list /bin/cat

其显示的效果将和使用 ldd /bin/cat 是一样的。

所以,cat 命令功能上只依赖于 libc.so.6 这个函数库,而实际上,要正常的运行 ld-linux.so.2 也是不能缺少的,但是如果静态编译的程序,就不需要 ld-linux.so.2 来参与运行了。

ld-linux.so.2 是哪个平台的名称?其他平台也叫这个?

ld-linux.so.2 是 x86 平台上的名称,在不同的平台上名称会有所不同,如在 MIPS 平台上就是 ld.so.1 但是都是以 ld 开头的名字。

ldd 命令的本质是什么?

ldd 命令用于将指定命令所依赖的共享函数库显示出来。

ldd 命令本身是一个脚本文件,以办事hi用 bash 来解释执行。

该命令虽然功能上表现为 显示指定的想和程序所依赖的共享函数库,但是实际上该命令是通过设置环境变量的方式来使得程序运行在一种特殊的状态下面的,该状态将不会运行命令的实际功能,而是显示其所依赖的函数库,通过下面的命令来验证:

LD_TRACE_LOADED_OBJECTS=1 /bin/cat

运行结果和 ldd /bincat 命令结果是一致的。

依赖 Glibc 的任何程序在环境变量 LD_TRACE_LOADED_OBJECTS 不为空的情况下,都会显示其所依赖的函数库文件以及函数库锁在目录,所以该环境变量设置为 0 也一样是显示依赖库的结果。

想再进一步了解为何设置该环境变量就会显示依赖函数库,就需要去了解机遇 Glibc 的 ld-linux.so.2 函数库,使用下面的命令也可以显示命令依赖的函数库。

/lib/ld-linux.so.2 --list /bin/cat

动态链接的程序会使用该函数库来查找依赖的其他函数库文件,该函数库中的函数在检测到有 LD_TRACE_LOADED_OBJECTS 不为空的时候将显示依赖的函数库以及存放为止,而不运行程序,这点可以通过下面的命令来验证:

LD_TRACE_LOADED_OBJECTS=1 /sbin/insmod.static

该命令的执行结果与直接运行 /sbin/insmod.static 一样,不受环境变量设置的影响,因为 /sbin/insmod.static 是一个静态编译的程序文件,运行时没有 ld-linux.so.2 参与,因此不会对环境变量 LD_TRACE_LOADED_OBJECTS 做出响应。

换句话说,如果想对这个环境变量做出响应,就需要该程序是利用共享函数库进行动态编译的程序,静态编译的程序是不会对该环境变量产生反应的。

《手把手教你构建自己的 Linux 系统》学习笔记(6)的更多相关文章

  1. 《手把手教你构建自己的 Linux 系统》学习笔记(10)

    目录 /etc/fstab 文件的作用是什么? Linux 内核的图形化启动是怎么回事? Linux 系统中的文件名是否以大小写来进行区别? 「GRUB 中无法找到硬盘」怎么解决? 「GRUB 及配置 ...

  2. 《手把手教你构建自己的 Linux 系统》学习笔记(9)

    目录 autoreconf 命令的作用是什么? aclocal automake -a autoconf 一条命令搞完三面三步 既然有其他的「编译控制软件」为何还是使用 make 来进行编译控制? M ...

  3. 《手把手教你构建自己的 Linux 系统》学习笔记(8)

    目录 Binutils 软件包有什么用? make -k 的作用是什么? man-pages 里有几种文档?分别表示什么意思? 如何查询指定目录的 man-pages ? 如何使用 make 命令的同 ...

  4. 《手把手教你构建自己的 Linux 系统》学习笔记(5)

    交叉编译是什么? 交叉编译就是在一个系统上,编译生成另外一个系统运行的程序文件. 「硬件体系结构」和「操作系统」的关系是什么? 硬件体系结构也可以称为架构,主要是通过 CPU 的指令集来进行区分的,操 ...

  5. 《手把手教你构建自己的 Linux 系统》学习笔记(2)

    Linux 系统定制原理 虚拟根目录 我们的目标是为了完成目标系统(也就是我们要做的系统),他是一个可以独立运行的系统,不依赖雨主系统和临时系统,根据 Linux 系统的特点它需要存放在根目录下面,但 ...

  6. 《手把手教你构建自己的 Linux 系统》学习笔记(1)

    第二章.基础准备--Linux 系统定制原理 Linux 系统的组成及架构 共享库和静态库 在 Linux 系统中,函数库包含两种形式:共享库和静态库. 共享库 共享库在程序运行时,为其提供所需要的函 ...

  7. 《手把手教你构建自己的 Linux 系统》学习笔记(7)

    目录 tee 命令的缺陷是什么?如何解决这个缺陷? /etc/ld.so.conf 文件的作用是什么? 动态链接和静态链接有什么不同? 动态编译 静态编译 共享库为什么会有版本?共享库的版本升级原理是 ...

  8. 《手把手教你构建自己的 Linux 系统》学习笔记(4)

    汇编链接器(Binutils) 这是一个软件包,这个软件包其实是一个工具集,里面含有了大量的用于汇编程序活着读取二进制文件相关的程序. CC 它是一条命令的别名,这条命令的作用是使用 GCC 的 C ...

  9. 《手把手教你构建自己的 Linux 系统》学习笔记(3)

    需要注意的是,制作操作系统权限全程都要用 root pushd 和 popd 为了方便目录管理,所以出现了这种两个命令,他们的原理就是利用堆栈来实现目录管理. 这两个命令,pushd 负责将指定的目录 ...

随机推荐

  1. keras模型可视化

    #keras.utils.vis_utils模块提供了画出Keras模型的函数(keras版本2.0.2以上)pip install graphviz pip install pydotplus im ...

  2. ios--->ios == 和 isEqual的用法区别

    ios == 和 isEqual的用法区别 首先要理解指针和指针值的却别 存放变量地址的变量我们称之为"指针变量",简单的说变量p中存储的是变量a的地址,那么p就可以称为是指针变量 ...

  3. Matlab 与 c++对txt 文档的读写格式

    学习g++能够读取什么格式的txt文件. 读基本指令: >sprintf(filename, "doc_%d.txt", d); >fileptr = fopen(fi ...

  4. 注册并加入dn42网络的方法

    简介 https://dn42.net/howto/Getting-started 注册要求: 一个24小时运行的linux/BSD设备 该设备必须支持创建隧道,例如GRE,OpenVpn,IPSec ...

  5. asp.net core 3.x 身份验证-1涉及到的概念

    前言 从本篇开始将围绕asp.net core身份验证写个小系列,希望你看完本系列后,脑子里对asp.net core的身份验证原理有个大致印象.至于身份验证是啥?与授权有啥联系?就不介绍了,太啰嗦. ...

  6. POJ_2342_树状dp

    http://poj.org/problem?id=2342 第一道树状dp,入门题,用vector构建有向图. #include<iostream> #include<cstrin ...

  7. Python应用——多变量的灵活处理

    本文始发于个人公众号:TechFlow,原创不易,求个关注 我们都知道Python是一个非常灵活的语言,以至于如果它不是你的第一门语言,你会发现它总能给你各种各样的惊喜,让你忍不住惊叹:woc,还有这 ...

  8. 《C# 爬虫 破境之道》:第二境 爬虫应用 — 第五节:小总结带来的优化与重构

    在上一节中,我们完成了一个简单的采集示例.本节呢,我们先来小结一下,这个示例可能存在的问题: 没有做异常处理 没有做反爬应对策略 没有做重试机制 没有做并发限制 …… 呃,看似平静的表面下还是隐藏着不 ...

  9. Golang import具体使用

    使用gopath的时候,一般引用是从src下一层开始,比如src/github.com/…,引用github.com…,我的工程src/xxx.com/go-qb/…,引用xxx.com/go-qb/ ...

  10. Qt中字符串和数值之间的转换

    来自<Qt5.9 C++开发指南> 普通数值和字符串之间的转换 一.从字符串转换为数值 QString类从字符串转换为整数的函数有: int QString::toInt(bool *ok ...