初识Linux

初识Linux

基本指令

这一章指令大多需要实操背诵,用于变换路径、修改文件、安装工具、查看文件属性、使用手册,是Linux的基础。

  • 修改白名单

    sudoers 文件通常位于 /etc/sudoers 路径下。

  • 软件更新以及安装、删除

    apt为使用Ubuntu系统软件包,centos系统将apt转为yum即可(有小部分情况下会不适配)

    sudo apt update # 更新系统中已安装的软件包的索引列表,并不会直接更新软件本身
    sudo apt upgrade # 自动更新
    sudo apt install sudoku # sudoku是软件包名
    sudo apt purge sudoku # 把sudoku包的依赖和所有都删除
    sudo apt autopurge # 自动看是否有没用的依赖
    sudo apt autoremove # 删除没用的配置文件
    
  • 用户登录以及用户创建(xshell为例)

    ssh lpx@123.123.123.123 # lpx是用户名,123.123.123.123是ip
    # 输入用户密码即可
    adduser wangwu # 创建wangwu用户
    # 提示输入密码,输入即可
    userdel -r wangwu # 删除wangwu 
    
    ls /home # 显示用户
    whoami # 显示当前会话登录的用户是谁
    

用户指令

Linux许多指令后会有对应的参数,不同参数要表达的功能不同,通常参数可以叠加,意思也是叠加的。而且参数顺序可以变换,保证意思不变

要注意的是空格

路径表示文件唯一性和定位目标文件

ls 和 cd
pwd # 显示当前处于哪个路径
ls # 显示当前文件路径下的文件
ls -l  # 显示当前文件路径下的文件的详细属性(不包含隐藏文件)
ls -a  # 显示当前文件路径下的所有文件
ls -d # 只查看目录本身,默认查看当前目录
ls -la # 参数叠加,显示当前文件路径下的所有文件的详细属性
ll # ls -la --color=auto的别名,显示当前文件路径下的所有文件的详细属性
# ls后可以跟相对路径或绝对路径查看相应路径下的信息。如ls -l /home。

cd # 回到
cd . # 回到当前目录 .表示当前路径
cd .. # 回到上级目录 ..表示相对路径中的上级目录
cd ~ # 回到当前用户家目录 ~表示当前用户家目录
cd - # 回到上一次所在的路径 -表示上一次所在的路径
cd /home/lpx # 去/home/lpx路径下
cd ./home # 去当前路径下的home文件夹内

touch test.c #创建test.c文件
  • 文件属性

    • 文件所占空间 = 文件的属性 + 文件的大小

    请添加图片描述

    • 1表示当前文件下一共有多少个文件;
    • 2表示文件权限以及是否是目录,d表示文件是目录,rwx分别表示文件可读、可写、可执行。
      -表示对应权限是非,即没有对应属性。要注意的是,文件的属性一共10位,第一位表示文件类型,后面每三位,分别表示文件所属关系对应的rwx权限。文件所属关系分三种:文件所有者(User)、文件所属组(Group)、其他用户(Others);
    • 3表示文件的硬链接数,后续有详细介绍;
    • 4表示文件所有者和文件所属组是谁
    • 5表示文件大小
    • 6表示文件的最后一次修改时间
    • 7表示文件名,颜色变化表示文件是*.o可执行文件,或者目录
pwd

显示当前在哪个路径下

touch + 文件名

注意touch和文件名之间有空格

创建文件。文件 = 文件内容 + 文件属性,所以创建空文件也会占硬盘空间

touch file{1..100}.txt可创建file1.txt file2.txt file3.txt ……file100.txt

rm file{1..100}.txt可删除file1.txt file2.txt file3.txt ……file100.txt

stat + 文件名

注意stat和文件名之间有空格

查看文件属性。文件属性ACMAccess(访问时间)、Modify(文件内容最后一次修改时间)、Change(文件权限、所属组、文件名、文件内容修改的最后时间)

访问文件指的是读取文件的内容,但不一定会修改它。比如执行命令 cat 或者打开文件进行读取时,atime 会更新。

mkdir rmdir rm

mkdir新建目录 mkdir -p d1/d2/d3/d4 递归新建目录

rmdir只能删除空目录

rm可直接删,无论是文件、目录,都可以直接用rm + 文件名来删除。

在使用rm时,系统会再次询问是否删除。可以通过加参数-f表示强制删除,对于递归目录,可以用参数-r来删除,(resursion 递归)rm -rf d1

*

*表示填充的意思。如:ls -al *.c表示显示所有.c后缀文件的详细信息,rm -rf *表示删除当前路径下所有文件

tree

将当前目录以树状结构展示

sudo apt install -y treeUbuntu系统下下载tree

man

sudo apt-get install glibc-doc manpages-posix-dev

用于查看系统中各种命令、函数、配置文件等的帮助文档。man 是 “manual”(手册)的缩写。

man [选项] <命令或文件>来使用,如:man ls && man 2 open

选项:

  • 1: 用户命令(如 ls, cp
  • 2: 系统调用(如 open, read
  • 3: 库函数(如 printf, malloc
  • 4: 设备文件(如 tty, null
  • 5: 文件格式(如 passwd, fstab
  • 6: 游戏(如 fortune
  • 7: 杂项(如 man, intro
  • 8: 系统管理命令(如 mount, useradd

可以使用 -k 选项搜索包含关键字的手册页。这会列出所有包含该关键字的手册页。

  • 退出 man 页面: 按 q 键。
  • 跳到顶部: 按 g 键。
  • 跳到底部: 按 G 键。
  • 搜索文本: 按 / 键,然后输入搜索的关键字。
which

查找给定命令的 可执行文件 的路径,如:which ls查找ls的文件路径,出/usr/bin/ls

所谓的命令,就是在Linux的/user/bin目录下的可执行文件。你输入ls\rm等指令时,系统默认从/user/bin目录下寻找指令

若自己设置一个可执行程序:lpx.o在执行时,输入lpx.o并不会执行成果。因为系统默认从/user/bin目录下寻找指令,没找到就不会执行。可以通过把自己的可执行文件复制到/user/bin目录下,就可以直接通过输入lpx.o执行。(通常情况下不推荐,会污染系统命令)在环境变量方面会着重讲原理。

工作原理:

  • which 会遍历 $PATH 中列出的目录,并查找给定命令的可执行文件。如果找到了该命令,它会返回文件的完整路径。
  • 如果没有找到该命令,它不会返回任何内容。

which 默认只返回第一个找到的路径。可以使用 which -a 可以列出所有找到的命令路径。

file

通过检查文件的内容来判断文件类型,而不仅仅是根据文件的扩展名。这个命令可以识别文本文件、二进制文件、压缩文件、可执行文件等不同类型的文件。

file <文件>来使用。

批量检查文件类型: 如果你有一系列文件,需要检查它们的类型,可以将文件列表提供给 file 命令:file -f filelist.txtfilelist.txt写明文件

  • file 命令通过读取文件的魔术数字文件头信息来判断文件类型。魔术数字是文件开头的一些特定字节,用于标识文件格式。
  • 如果文件是纯文本,file 会输出类似于 ASCII textUTF-8 Unicode text
  • 如果文件是二进制格式(例如一个编译后的程序),file 会输出类似于 ELF 64-bit LSB executableMach-O 64-bit executable
  • 对于图像文件,file 会显示文件格式(例如 PNG, JPEG, GIF)。
  • 对于压缩文件,file 会指出文件是压缩格式,例如 .zip.tar.gz 等。
  • 对于音频或视频文件,file 会显示类似于 AudioVideo 的信息。
alias

取别名,如:alias ll='ls -l –color=auto',以后输入ll就默认执行ls -l –color=auto

  • 使用 alias 创建的别名仅在当前终端会话中有效。如果你关闭终端或重新启动计算机,别名会消失。若要在每次登录时都能使用别名,你需要将别名添加到你的 配置文件 中(例如 .bashrc.bash_profile)。
  • 也可以使用 unalias 命令来删除别名:unalias ll
cp

复制文件到另一个路径下

cp log.txt ../lpx/mylog.txtmylog.txt表示新文件的文件名。默认情况下就是同名文件(ACM不会复制)

-r可以进行递归复制

echo

向显示器写入后续内容。如:echo ‘hello’可以在显示器回显hello

重定向

我们知道,Linux操作系统下,有一切皆文件的理念。所以,对于OS,显示器也是一个文件,在使用cat ls echo等等指令后,显示器会回显出对应指令的结果。其原理就是把结果cp到显示器文件来让我们看到。而所谓的重定向,就是改变其默认的cp路径。

  • >符号:使用echo ‘hello’ > log.txt可以把hello打印到log.txt文件中(若没有log.txt文件,会自动进行创建,然后cp hellolog.txt中。把本来要cp到显示器的内容修改到log.txt文件中,这一过程就是重定向。

  • >>符号:与>不同的是,>会清空文件内容,再将内容cp到指定文件中,而>>表示追加重定向。再文件现有的内容下增加内容,并不会清空。

  • 前面提到显示器也是文件,对于xshell软件,==ls /dev/pts==可以查看当前用户不同会话下的显示器文件

  • <符号:输入重定向。

  • <<符号:对照<,追加重定向。

mv
  • 对照cpmv是移动、剪切的操作。
  • mv可以进行文件重命名。mv text.c log.ctext.c重命名成log.c
cat tac

接文件名,表示打印文件内容。不同的是,cat从第一行打印到最后一行,tac从最后一行打印到第一行,倒着打印

more less也可以查看文件,并提供搜索选项

wc

用于统计文件中字符、单词、行数等信息。它可以处理一个或多个文件,并输出这些文件的各种统计数据。

如果没有提供选项,wc 会分别对应输出:行数、单词数、字符数

输入:wc file.txt 输出: 10 50 300 file.txt

head
  • 配合管道|使用,如:cat log.txt | head - 5表示查看log.txt前五行的内容

  • head -5 log.txt也可以查看前五行内容

  • 查看指定行的数据,以[5050,5010]为例

    •   head -5051 mylog.txt >tmp
        tail -11 tmp
      
    •   head -5010 mylog.txt | tail -11
      
date

时间戳(Timestamp)是表示时间的方式,表示为从 1970年1月1日00:00:00 UTC 到某一时刻的秒数。Linux 提供了 date 命令,允许用户轻松地进行时间戳与日期之间的转换。(北京时间 = UTC + 8)

  • date查看当前的日期和时间
  • date +%s查看当前时间戳
  • date -d @1686544560将时间戳转换为日期
  • date -d "2025-06-12 12:00:00" +%s将特定日期转换为 Unix 时间戳
  • date +%Y_%m_%d-%H:%M:%S -d@1637600831 时间戳1637600831转变成自定义类型时间
  • %Y:四位年份(例如:2025)
  • %m:月份(01 到 12)
  • %d:日期(01 到 31)
  • %H:小时(00 到 23)
  • %M:分钟(00 到 59)
  • %S:秒钟(00 到 59)

cal可以来查看日历 cal 2025生成2025年日历

find
find /root -name test.c # 当前路径下遍历查找`test.c`文件
find /root -size -10M # 查找小于10M的文件
find /root -size +10M # 查找大于10M的文件
whereis

对比which,会显示出对应指令的手册页位置

nano

nano <文件名> 进行文本编辑,vim更好用,后文会着重讲解vim的使用

grep

grep "pattern" file1 file2 file3在多个文件中查找 "pattern",并显示匹配的行。

  1. 不区分大小写
Copy Codegrep -i "pattern" file

-i忽略大小写进行匹配。

  1. 显示匹配行的行号
Copy Codegrep -n "pattern" file

-n显示文件中匹配 "pattern" 的行及其行号。

  1. 反向查找(不匹配)
Copy Codegrep -v "pattern" file

-v查找文件中不包含 "pattern" 的行。

top

top -d 1每1s,刷新一次运行情况

top -n 1显示1次后退出

zip unzip

需要安装软件包使用apt install -y zip unzip

zip mylog.zip mylog.txt # 压缩mylog.txt成mylog.zip
unzip mylog.zip # 解压myloog.zip
zip -r test/115.zip 115 # 递归压缩115目录到./test/115.zip
unzip -d test # 解压到test目录
lrzsz

不同操作系统间传文件

apt install -y lrzsz
sz 111.zip # Linux->Windows(在本机的不同系统)
rz # Windows->Linux(在本机的不同系统)
scp 111.zip lpx@123.123.123.123:/home/lpx/code # 跨机进行传文件
tar

用于解压和压缩成为*.tgz文件

tar -xzvf test.tgz -C ../lesson # 解压到../lesson路径
tar -czvf test.tgz test.txt # 压缩成为test.tgz
bc

配合管道进行数字运算

echo "1+2+3+4"输出1+2+3+4

echo "1+2+3+4" | bc输出15

uname lsb_release

uname lsb_release 查看本机OS信息,-a 查看全部信息

history

查看历史指令

gcc1

gcc code.c -o code code.c编译形成code二进制可执行文件,-o后接编译形成新文件的文件名,gcc -o code code.c一样可以有相同的效果

LinuxOS不以文件后缀决定文件类型,mv code b.txt一样可以运行./b.txt

前面提到过,Linux会从/user/bin下寻找你输入的指令,如果你想运行code 要指明文件路径./code 或者把他放到/user/bin路径下(不推荐)。

gcc code.c会自动把code.c编译形成a.out文件

ldd

ldd a.out查看a.out用了什么库

shutdown

用来关闭系统或重启系统的命令

  1. -h:关闭系统(halt),使系统关机。
  2. -r:重启系统(reboot)。
  3. -P:关闭电源(Power Off),类似于 -h
  4. -c:取消当前计划的关机或重启。
  5. +m:在指定的延迟时间后关机或重启,其中 m 是以分钟为单位的时间。sudo shutdown -h +5 "System will shut down in 5 minutes for maintenance"带注释的关机
  6. hh:mm:指定一个具体的时间来进行关机或重启,例如 22:00 表示晚上10点。
快捷键
ctrl + c # 对前台进程发起终止信号
ctrl + d # 退出登录
上下键 # 快捷查找历史指令
ctrl + r # 搜索历史命令
! + a # 执行最近的a开头的指令,换成其他字母也一样

初识Linux OS

这一章意义在于理解什么是操作系统,什么是内核,我们常用的Windows和安卓到底是什么,Linux又是什么

OS(Operator System)就是操作系统。狭义上的OS就是内核(kernel),广义上,OS包括kernel和外壳程序。

请添加图片描述

  • 操作系统是软硬件资源管理(内存、文件、进程、驱动管理)的软件,向上有一个外壳层,外壳层上就是用户。向下是驱动程序(网卡驱动、硬盘驱动等),在向下是底层硬件(网卡、硬盘等)。

  • OS提供了高效安全的运行环境

  • Linux OS不以文件后缀区分文件类型,用文件属性来区分的

    d:文件夹 -:普通文件 l:软连接 b:块设备文件 p:管道文件 s:套接口文件

  • shell就是终端的解释器,用于解释命令。而图形化的点击操作是由图形化服务框架来实现交互的。图形化界面、shell都是外壳程序的一部分

权限

在我们在以用户身份修改/etc/sudoers,或者输入apt install -y zip时会出现Permission denied(权限拒绝)信号,这是因为你没有相应的权限,需要提升权限在完成指令,怎么提升权限呢?就是我们常见的sudo+指令格式,然后输入自己用户的密码以提高权限

  • 白名单

    sudoers 配置中,“白名单” 是一种访问控制策略,只有特定用户或用户组被列在白名单中,才有权限使用 sudo 执行特定命令。白名单存储在/etc/sudoers路径下

  • 普通用户->root

    在执行sudo指令时,本质是提升权限到root(管理员),来执行相应的指令。那么,如何直接成为root身份呢?

    su root # su是切换身份的意思,后面接想要成为的对象。要注意的是,su默认参数就是root
    # 然后输入root密码即可切换
    
  • root->普通用户

    root切换普通用户不用输入密码即可切换

    su lpx
    
  • 权限的理论理解

    • 权限 = 人 + 事物属性 —> 文件权限 = 角色 + 文件属性

      • 访问一个文件,要看你是什么角色,你的角色是否有对应的权限来访问
    • 请添加图片描述

      • 上文也提到过,图中2表示文件的类型和权限。第一位表示文件类型,后面每三位,分别表示文件所属关系对应的rwx权限。文件所属关系分三种:文件所有者(User)、文件所属组(Group)、其他用户(Others);对应“权限的理论理解”中的文件属性。而4中两列分别表示文件拥有者和文件所属组,除这两个意外的用户都是其他用户。
  • 修改权限

    • 我们首先要知道,只有文件的user才能修改权限

    • 文件属性修改:chmod

      我们知道,文件所属关系分三种:文件所有者(User)、文件所属组(Group)、其他用户(Others)。在修改对应权限时,其三者缩写为u,g,o,而文件属性有rwx分别表示可读可写可执行,想要对应的用户添加/减少相应的权限,用+ -符号即可,代码如下:

      chmod u+x text.txt # 给user运行的权限
      chmod u+r text.txt # 给user可读的权限
      chmod u-x text.txt # 不允许user运行
      chmod u-rw text.txt
      chmod g+x text.txt
      chmod g+rwx text.txt
      chmod o-rwx text.txt
      

      除了上文的操作外,有更方便操作的数字方式进行权限修改。我们把十位中的后九位可以分成三个区域,每三位对应一个八进制数字表示权限即可

      权限

      如图,我们把非-的视为二进制的1,-视为二进制的0,前三个,对应的权限分别是750 755 600

      那我们加入代码来修改权限试试看

      chmod 666 lpx.txt # 修改lpx.txt所有的所属关系都是可读可写不可运行
      
    • 身份修改:chown chgrp

      从上文,我们能知道文件有三种所属关系,那么怎么设置/修改文件的user group呢?

      要注意的是,身份修改要使用root权限

      sudo chown wangwu text.txt #修改user
      sudo chown zhangsan text.txt # 修改user
      sudo chgrp lpx text.txt # 修改所属组
      
  • 身份匹配

    仔细观察上文,就会发现lpxuser 和 group那么到底该遵守哪一个权限呢?

    在身份匹配时,只会从user–>group–>other顺序,匹配成功一次,实验如下:

    身份匹配
  • dir权限

    • r:是否可以ls读取目录文件内容
    • w:是否可以修改目录路径下的文件名字,删除、创建文件。(文件权限可以修改)
    • x:是否可以进入dir
  • umask权限掩码

    • 最终权限 = 起始权限 & (~umask

    • touch生成文件的其实权限是666,但是为什么我们在touch lpx.txt的时候,会发现生成的文件默认权限是664,这是因为权限掩码(umask)过滤掉出现的权限

    • 输入umask可以查看权限掩码,一般都是0002第一个0表示八进制

  • 粘滞位

    粘滞位在特定目录下限制文件的删除和重命名操作。它通常用于公共目录中,尤其是在多用户环境下,比如 /tmp 目录(系统自己设置的共享文件目录)。

    通过修改目录的w权限,可以保护目录不再创建、删除文件。在多用户共享目录的情况下,也会导致other不能创建、删除文件。通过粘滞位可以解决这个问题——添加粘滞位的目录中,只有文件的所有者、根用户(root)或者目录的所有者才能删除或重命名该目录下的文件。

    粘滞位是一种保护机制,通常应用于公共目录,确保只有文件的所有者和 root 用户能够删除或修改文件。它通过减少误操作和恶意删除,增强了多用户系统的安全性和稳定性。

    • 限制删除权限: 粘滞位使得只有文件的所有者、根用户(root)或者目录的所有者才能删除或重命名该目录下的文件。即使其他用户在这个目录中具有写权限,也不能随意删除或修改别人创建的文件。

    • 常见应用场景: 粘滞位通常用于公共目录,如 /tmp。在这些目录中,多个用户可能会创建和删除文件。启用粘滞位后,只有文件的创建者或 root 才能删除或修改文件,避免了其他用户删除或篡改文件的风险。

    • 设置粘滞位: 使用 chmod 命令可以为目录设置粘滞位。粘滞位的权限标志是 t。例如,给 /tmp 目录设置粘滞位:sudo chmod +t /tmp设置后,/tmp 目录会获得粘滞位,只有文件的所有者、root 或该目录的所有者才能删除该目录中的文件。

    • 任何用户,在设置了粘滞位的目录下,只能删除自己的文件,而不能和删除其他人的文件

    • 粘滞位表现在第十位。 rwxrwxrwt 中的最后一个 t 就表示 /tmp 目录启用了粘滞位。

yum/apt 工具级别安装

  • OS生态

    OS生态由社区论坛、官方文档、软件体系、维护更新速度、OS自身、富有针对性的客户群体决定。

    一个好的社区论坛和更新速度可以提高用户数量,比如Ubuntu。好的社区会方便用户寻找自己出现的问题的解决方法、更好使用其OS。

    而Windows针对全民、有着不错的更新速度、外加起步早,所以也导致用户数量巨大

  • 什么是yum/apt

    yum/apt就是应用商店,找到就下载。在使用yum/apt时,操作系统向软件包服务器请求软件包,服务器返回软件包,就可以下载了。

为什么不能直接移植windows程序到Linux中使用呢?

​ 操作系统架构不同,二者在文件系统管理、进程管理、内存管理等方面有着根本性的区别,Windows和Linux提供的系统调用接口(API)不兼容;文件系统也不同,在文件存取方式、权限管理等方面存在差异。此外,图形界面支持不同、 二进制格式差异、依赖库和驱动问题也是其原因。

​ 从API方面分析:我们首先要知道,C标准库对于windows和linux各有一套编译方法(目的在于适应不同操作系统)。例如printf函数,他本质是封装了操作系统的系统调用接口,而windows和linux是不同的操作系统,那么这个系统调用接口也是不同的,所以生成的二进制也一定不同。

​ 面对这个问题,可以设计一个软件兼容层:Wine、虚拟机都是例子。这里对Wine进行了解——Wine 是一个兼容层,允许 Linux 用户运行许多 Windows 应用程序。它并不直接“移植”程序,而是通过实现 Windows API 来让 Windows 程序在 Linux 上运行。

能直接移植Centos程序到Ubuntu中使用吗?在其内核版本一样的情况下

一个可执行程序,运行起来需要动态库的依赖,这个涉及了可执行程序链接的库版本、路径(版本和路径不一样也是不可以的)。除非二进制程序的所有动态库(版本+路径)在目标系统存在且兼容,才能运行

在使用中常常感受不到不同OS下差异,因为C语言帮我们封装了每个操作系统的系统调用,然后C语言给我们提供了一样的函数,屏蔽了底层的差异,上文printf就是例子。

vim

vim作为一种高度可定制的文本编辑器,使用比nano方便,在此对快捷键,和三种模式详细介绍,也是除vscode外主要linux程序文本编译器。vim支持自定制,可交给大模型生成定制文件,修改/.vimrc文件即可

  • 基础指令

    • vim + 文件名 + 7,进入命令模式,光标在第七行,不写7默认在第一行(可通过修改/.vimrc修改默认)。
    • i:进入插入模式——进行文本写入
    • ESC:回到命令模式——所有快捷键都是在命令模式下运行的
    • ::底行模式
      • :w保存 :q退出 :set nu显行数,指令最后加!表强制,如:wq!表强制保存退出。
      • :!command
      • 此外,底行模式可以执行shell的命令
  • 快捷键:

    • shift zz保存并退出

    • 10 yy从当前行开始复制10行,不写10默认当前行

    • 10 dd剪切10行,不写10默认当前行

    • 10 p粘贴10次,不写默认1次

    • gg最开始行

    • 10 shift g跳转到第10行,不写10,默认最末尾行

    • shift 6到当前行最开始

    • shift 4到当前行最末尾

    • w向前一个单词

    • b回退一个单词

    • hjkl上下左右

    • ~对光标处字母大小写切换

    • u撤销上一步

    • ctrl r对u撤销

    • 5 d删除光标后5个内容,默认一个,x也可以完成

    • shift x删除光标前

    • r修改光标所在字符

    • shift r进入replace模式

    • shift #选中一个单词,按n进入上一个位置

    • ctrl v批量化处理,选中单位。shift i进入插入模式,esc回命令模式,批量操作完成。此外,在选中后,也支持其他快捷键叠加

    • vs text.c完成分屏,另一边是text.c

    • ctrl ww切屏光标

  • .vimrcvim识别,进行初始化操作,这就是vim环境配置

gcc

程序在从*.c文件变成可运行的二进制文件需要经过以下几步:预处理、编译、汇编、链接,下文着重讲解这四步内容

  • 前文提到过,Linux OS不已文件后缀识别文件类型,但是编译器要求源代码使用特定后缀来识别为C语言源文件。所以,我们文件名后缀要有所要求。

  • 预处理:进行宏替换、去注释、条件编译、头文件展开等,将.c文件预处理形成.i文件

    • 代码:

      gcc -E code.c -o code.i
      
  • 编译:编译.i文件形成.s文件。是将C语言编译形成汇编语言的过程

    • 代码:

      gcc -S code.i -o code.s
      
  • 汇编:将汇编语言翻译成机器码的过程,是汇编文件生成重定位目标二进制文件的步骤(这里的重定位,表明其需要重新填写目标函数在库中的地址)。把.s文件形成.o文件

    • 代码:

      gcc -c code.S -o code.o
      
  • 链接:把生成的重定位目标二进制文件进行链接,填写目标函数在库中的地址。把多个.o文件链接形成一个可执行的二进制文件

    • 代码:

      gcc code.o code1.o -o code
      
  • 如何理解库?

    • 平常看到的stdio.h iostream.h就是C语言提供的库,目的在于让程序员直接使用,提高开发效率,程序员不用自己造轮子。

    • 库的分类:

      • 静态库:Windows下.lib为后缀的文件,Linux下.a为后缀的文件
      • 动态库:Windows下.dll为后缀的文件,Linux下libXXXX.so格式的文件
    • 链接方式:

      我们先生成一个lpx.c文件,包含stdio头文件,和main函数。方便后续实验

      • 动态链接

        gcc lpx.c -o a.out生成a.out文件

        查询.a.out的文件类型——file a.out指令,发现其有dynamically linked字样,表明是动态链接
        我们再使用ldd a.out指令查询其使用的动态库,回显libc.so.6->/lib64/libc.so.6(不同版本表达样式可能不同,格式基本如此),不难看出,这是使用了c的动态库

        我们再ls libc.so.6->/lib64/libc.so.6 -l可以发现,这是一个文件

      • 静态链接

        gcc lpx.c -o b.out -static生成b.out文件

        查询b.out的文件类型——file b.out指令,发现其有statically linked字样,表明是静态链接

        我们再使用ldd b.out指令查询其使用的动态库,回显not a ddynamic executable,表明没有使用动态库

      • 差异

        我们使用ll,查看a.outb.out的属性——发现两者文件大小差别很大。这是因为,静态链接将所有需要的库代码直接嵌入到最终的可执行文件中,而动态链接是通过运行时加载共享库2来使用库中的代码。

        动态库优点:节省资源。缺点:一旦丢失使用的任何一个动态库,所有程序无法直接运行,无法直接移动可执行文件交给其他机器运行,其他机器可能没有相应的动态库。(后文讲虚拟地址空间会着重讲动态库)

        静态库优点:不依赖任何库,自己独立就能运行。缺点:体积大,占内存、磁盘空间;加载到内存速度受影响。


  1. 本章节着重讲指令的使用,后文会讲解gcc编译的逻辑,是怎么一步步把文本文件编译成可执行文件的,包括为什么可运行、权限的管理,以及静态链接、动态链接 等内容。
    ↩︎

  2. 运行时,OS会将程序使用的动态库加载到内存的共享区,当程序用到库的函数,会根据地址来是同共享区的函数。在此只是粗略解释,后文讲虚拟地址空间会详细解释多个可执行程序怎么共享动态库来节省内存资源,代码段怎么调用动态区的函数。 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值