[华为云在线课程][Linux平台软件包安装与管理][第一章软件运行和编译][学习笔记]
软件相关概念
ABI
ABI:Application Binary Interface
Windows与Linux不兼容
- ELF(Executable and Linkable Format)
- PE(Portable Executable)
库级别的虚拟化:
- Linux:Wine
- Windows:Cygwin
API
API即Application Programming Interface,API可以在各种不同的操作系统上实现给应用程序提供完全相同的接口,而它们本身在这些系统上的实现却可能不同,主流的操作系统有两种,一种是Windows系统,另一种是Linux系统。由于操作系统的不同,API又分为Windows API和Linux API。在Windows平台开发出来的软件在Linux上无法运行,在Linux上开发的软件在Windows上又无法运行,这就导致了软件移植困难,POSIX标准的出现就是为了解决这个问题。
POSIX:Portable Operating System Interface,可移植操作系统接口,定义了操作系统应该为应用程序提供的接口标准,是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称。Linux和Windows都要实现基本的POSIX标准,程序就在源代码级别可移植了。
开发语言
系统级别开发
- 汇编语言
- C语言
- C++语言
应用级别开发
- Java语言
- Python语言
- Go语言
- PHP语言
- CSharp语言
- Perl语言
- Delphi语言
- Basic语言
- Ruby语言
- Bash语言
C语言程序的实现过程
C程序源代码->预处理->编译->汇编->链接
C语言的程序编译主要经过四个过程:
- 预处理(Pre-Processing)
- 将所有的#define删除,并且展开所有的宏定义
- 处理所有的条件预编译指令,比如#if #ifdef #elif #else #endif等
- 处理#include预编译指令,将被包含的文件插入到该预编译指令的位置
- 删除所有注释"//“和”/**/"
- 添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号
- 保留所有的#pragma编译器指令,因为编译器需要使用它们
- 编译(Compiling)
编译过程就是把预处理完的文件进行一系列的词法分析,语法分析,语义分析及优化后,最后生成相应的汇编代码 - 汇编(Assembling)
汇编器是将汇编代码转变成机器可以执行的命令,每一个汇编语句几乎都对应一条机器指令。汇编相对于编译过程比较简单,根据汇编指令和机器指令的对照表-翻译即可。 - 链接(Linking)
通过调用链接器id来链接程序运行需要的一大堆目标文件,以及所依赖的其他库文件,最后生成可执行文件
例子:gcc编译过程
#分步骤编译运行
gcc -E hello.c -o hello.i 对hello.c文件进行预处理,生成了hello.i文件
gcc -S hello.i -o hello.s 对预处理文件进行编译,生成了汇编文件
gcc -c hello.s -o hello.o 对汇编文件进行编译,生成了目标文件
gcc hello.o -o hello 对目标文件进行链接,生成可执行文件
#一步实现编译过程
gcc hello.c -o hello 直接编译链接成可执行目标文件
软件模块的静态和动态链接
链接主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确地链接,分为静态和动态链接
静态链接
- 把程序对应的依赖库复制一份到包
- 生成模块文件libxxx.a
- 嵌入程序包
- 升级难,需要重新编译
- 占用较多空间,迁移容易
动态链接
- 只把依赖加做一个动态链接
- 生成模块文件libxxx.so
- 连接指向
- 占用较少空间,升级方便
模块(库)文件
查看二进制程序所依赖地库文件
ldd /PATH/TO/BINARY_FILE
管理及查看本机装载地库文件
#加载配置文件中指定的库文件
ldconfig
#显示本机已经缓存的所有可用库文件名及文件路径映射关系
/sbin/ldconfig -p
配置文件:
/etc/ld.so.conf
/etc/ld.so.conf.d/*.conf
缓存文件:
/etc/ld.so.cache
例子:库文件破坏后,将导致依赖的程序无法正常运行
ldd /bin/ls
ldd /bin/cat
mv /lib64/libc.so.6 /bak
ls
cat
Java程序编译运行过程
- 点赞
- 收藏
- 关注作者
评论(0)