什么是程序?
ELF 概念
程序(Program) 一般是指可执行文件,在Linux系统中它按 ELF 格式进行存储,并没有后缀可标识其文件类型,需要通过 file
命令来查看 ELF 文件的具体类型。
ELF 全称是 Executable Linkable Format (可执行与可链接格式),在计算机科学中,是一种用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件。是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface,ABI)而开发和发布的,也是Linux的主要可执行文件格式。
ELF文件种类:
EXEC 可执行文件
object code 目标代码文件
shared libraries 共享库文件
REL 可重定位文件
在Linux中为 xx.o xx.a,也称为静态库文件,其中 xx.o 称为目标文件,可被链接器链接成为可执行文件,静态库文件,动态库文件。
示例:php扩展中常用的动态库文件如curl,网络框架库如event.so socket扩展库sockets.so
c/c++项目程序员一般引用第三方的库函数都是使用第三方编译好的动态库或是静态库文件 .so, .a。
core dump 核心转储文件
存储进程产生的异常信息。是操作系统在进程收到某些信号而终止运行时,将此时进程地址空间的内容以及有关进程状态的其他信息写入一个磁盘文件。这种信息往往用于调试。
ELF 文件格式
ELF 文件信息是以 section 或 segment 来存储的。
每个 ELF 文件都由一个 ELF 首部和紧跟其后的文件数据部分组成。数据部分可以包含:
程序头表(Program header table):描述 0 个或多个内存段信息
分段头表(Section header table):描述 0 段或多段链接与重定位需要的数据
程序头表与分段头表引用的数据,比如 .text .data
通过 objdump -h zip.so
查看分段头表信息。
魔数 ELF 标识码
通过 readelf -h /usr/local/bin/php
查看 ELF 文件信息,其中的 Magic :
Magic: 7f 45 4c 46 02 01 01
ascii对照 DEL E L F 02=364位/01=32位 字节序:01=小段字节序/02=大段字节序 ELF文件主版本号
相关工具
GNU Binutils 是用来处理许多格式的目标文件(包括elf文件)一整套的编程语言工具程序,包括readelf,objdump,objcopy, nm, strings, strip, as, ar。
readelf 显示 elf 文件
objdump 显示elf 和 object 格式文件,解码 elf 文件中高级语言语句所对应的机器语言语句段落,汇编语言语句段落。
nm显示elf文件中变量名和地址
什么是进程?
概念
进程(Process),一个正被执行的程序就是一个进程,系统会给进程一个唯一的标识符:进程ID。
是指计算机中已执行的程序。进程曾经是分时系统的基本运作单位。在面向进程设计的系统(如早期的UNIX,Linux 2.4及更早的版本)中,进程是程序的基本执行实体;在面向线程设计的系统(如当代多数操作系统、Linux 2.6及更新的版本)中,进程本身不是基本执行单位,而是线程的容器。
程序本身只是指令、数据及其组织形式的描述,相当于一个名词,进程才是程序(那些指令和数据)的真正执行实例,可以想像说是现在进行式。
用户下达执进程式的命令后,就会产生进程。同一程序可产生多个进程(一对多关系),以允许同时有多位用户执行同一程序,却不会相冲突。进程需要一些资源才能完成工作,如CPU使用时间、存储器、文件以及I/O设备,且为依序逐一进行,也就是每个CPU核心任何时间内仅能执行一项进程。
进程与线程的区别:进程是计算机管理运进程序的一种方式,一个进程下可包含一个或者多个线程。线程可以理解为子进程。
Linux 系统如何启动一个程序
strace
是Linux环境下的一款程序调试工具,用来监察一个应用程序所使用的系统调用及它所接收的系统信息。
程序加载器(program loader)调用 exec 系列函数,如 execve 来加载一个可执行文件,同时会给新程序传递命令行参数和环境参数表。
PHP 解释器的工作原理
size
可以用来查看 ELF 文件程序指令,程序的大小。
$size hugo
text data bss dec hex filename
52813565 838408 346040 53998013 337f1bd hugo
通过 strace
查看系统 PHP 解释器的系统调用来分析。
/usr/bin/php demo1.php
PHP 解释器 ELF 可执行文件是经过编译链接之后生成的。
通过 ldd /usr/bin/php
查看 php 可执行文件所依赖的动态库(函数库)。
通过 nm
具体查看 ELF 文件中的函数以及变量的虚拟内存地址。
程序存储空间布局:
进程的终止
运行到最后一行
遇到 exit、return
中断信号产生的异常退出
可以通过 echo $?
查看退出状态码。