[华为云在线课程][Linux平台软件包安装与管理][第一章软件运行和编译][学习笔记]

举报
John2021 发表于 2022/03/27 16:04:27 2022/03/27
【摘要】 软件相关概念 ABIABI:Application Binary InterfaceWindows与Linux不兼容ELF(Executable and Linkable Format)PE(Portable Executable)库级别的虚拟化:Linux:WineWindows:Cygwin APIAPI即Application Programming Interface,API可以在...

软件相关概念

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)
    1. 将所有的#define删除,并且展开所有的宏定义
    2. 处理所有的条件预编译指令,比如#if #ifdef #elif #else #endif等
    3. 处理#include预编译指令,将被包含的文件插入到该预编译指令的位置
    4. 删除所有注释"//“和”/**/"
    5. 添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号
    6. 保留所有的#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
  • 嵌入程序包
  • 升级难,需要重新编译
  • 占用较多空间,迁移容易

动态链接

模块(库)文件

查看二进制程序所依赖地库文件

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程序编译运行过程

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。