2-1程序与进程

[[GCC 编译过程]]

程序

一般指可执行文件,可以使用 file 命令查看文件类型, 在 Linux 中,按 ELF 格式进行存储,并没有后缀

而对于 PHP/c/python/go 等源代码,都只是 ASCII/Unicode TEXT 文本文件

ELF Executable Linkable Format
ELF 文件种类
  1. exec 可执行文件

  2. REL 可重定位文件 xx.o xx.a 也成为静态库文件

    xx.o 称为目标文件可被链接器链接生成为可执行文件,静态库文件,动态库文件

  3. Shared Object File 共享目标文件 ,比如 PHP 的一些扩展 .so

  4. core dump 接收到中断信号才会产生的文件

查看 ELF 文件属性

######## readelf 的安装

1
apk add binutils

使用 readelf 命令 -h 参数 查看头

ELF 文件属性解释

参考 https://zhuanlan.zhihu.com/p/358951580

**magic 魔数 (EFL 标识码) **

7f 45 4c 46 : 对应的是 ACSII 码

02 : 表示 64 位机器,01 32 位

01 : 字节序 01 表示小端序 02 大端序

01: 主版本号

段 /节

ELF 文件的信息是以 节 Section 或 段 segment 来存储的

1
2
3
4
程序指令 或是正文段 代码段 : .text
程序数据,数据段 : .data
.bss : 存储未初始化的变量
.rodata : 存储只读数据
使用命令查看段的信息

objdump -h 参数 必须是 elf 文件类型 上面那几种

进程

一个正在被执行的程序就是一个进程,系统会给进程一个唯一的进程标识符, 进程 ID

一个正在使用的终端就是一个进程. 可以使用 echo $$ 打印当前终端进程号 参考 shell 变量 https://www.cnblogs.com/barrychiao/archive/2012/10/22/2733210.html

如何启动一个程序

strace 系统调用

程序加载器 program load 会 使用 execve 方法来加载一个可执行文件,同时会给新程序传递 命令行参数 和 环境参数表

PHP 解释器的工作原理

使用 strace 跟踪 PHP 脚本执行过程

strace -f -s 65500 -o test.txt /usr/local/bin/php test.php

进程退出

  1. 运行到最后一行
  2. 遇到 exit ,return
  3. 中断信号
查看上次命令执行后的退出状态码

echo $?