磁盘文件怎样描述程序
二进制可执行文件通常不只是连续机器指令,还带有系统解释内容所需的信息。ELF头部标明文件类别、目标机器、入口与其他表的位置;程序头进一步描述怎样建立运行映像。这些结构帮助系统区分代码、数据及其他元信息。
不同系统和工具可以使用不同格式,因此不能把所有可执行文件等同于ELF。在Linux上,可执行路径还可以是以#!指定解释器的脚本;这类文件的文本由指定程序解释,并不是处理器把脚本字符直接当机器指令执行。
文件布局与内存映像不同
ELF的可加载段给出文件偏移、虚拟地址、文件大小及内存大小等信息。若内存大小大于文件中对应数据,额外部分按规则填零,未必需要在磁盘上逐字节保存相同数量的零;文件偏移也不能直接当作程序运行地址。
动态链接的ELF程序还可能通过PT_INTERP指定启动所需的解释器,由它加载相关共享对象。这个解释器与脚本首行的约定属于不同格式层次。程序映像怎样组织,要按相应平台与ABI规则判断,而不是仅从文件总长度推断。
能识别、能加载与能成功运行
Linux的execve成功时替换调用进程的程序映像,并不因此自动创建另一个进程;成功也不会像普通函数那样返回原来的程序。命令行参数与环境按接口传给新程序,相关资源是否保留另有规则。
文件即使有执行权限,也可能因架构不符、格式无效或解释器缺失而无法加载;成功加载也不保证业务计算正确。可执行资格、加载成功和程序完成,是需要分别核实的状态,不能用一个文件扩展名或权限位代替全部检查。