以helloworld为例shell
目标文件是什么样的?编辑器
目标文件中的内容至少有编译后的机器指令代码、数据。没错,除了这些内容之外,目标文件中还包括了连接时所需要的一些信息,好比符号表、调试信息、字符串等。函数
ELF:exectable and linkable format.可执行和可连接的格式。工具
它是文件格式的标准,可执行链接格式是UNIX系统实验室(USL)做为应用程序二进制接口(Application Binary Interface(ABI)而开发和发布的。工具接口标准委员会(TIS)选择了正在发展中的ELF标准做为工做在32位INTEL体系上不一样操做系统之间可移植的二进制文件格式。布局
ABI和目标文件格式是怎么回事?操作系统
ABI 又称目标文件,应用程序二进制接口。二进制兼容的问题。复杂来说就是:命令行
- 符号修饰标准、变量内层布局、函数调用方式等这些跟可执行代码二进制兼容性相关的内容称为ABI(Application Binary Interface)。
ELF( ELF: 可执行链接格式 )中的三种目标文件:3d
ELF文件头: 如何查看ELF文件的头部调试
shiyanlou:Code/ $ readelf -h hello
code
段头表
- 目标文件中各节的位置和大小
- 处于目标文件的末尾
- 通常静态连接都会将全部代码放在一个代码段。 - 动态连接的进程会有多个代码段。
装载可执行程序以前的工做。 - 可执行程序的执行环境: - 命令行参数和shell环境,通常咱们执行一个程序的Shell环境,咱们的实验直接使用execve系统调用。 - $ ls -l /usr/bin 列出/usr/bin下的目录信息 - Shell自己不限制命令行参数的个数,命令行参数的个数受限于命令自身 - ---例如,int main(int argc, char *argv[]) - ---又如, int main(int argc, char *argv[], char envp[]) - Shell会调用execve将命令行参数和环境参数传递给可执行程序的main函数 - ---int execve(const char * filename,char * const argv[ ],char * const envp[ ]); - 库函数exec都是execve的封装例程 - - 命令行参数和环境变量是如何保存和传递的? - 命令行参数和环境串都放在用户态堆栈中
- shell程序->>execve->> sys_execve - 而后在初始化新程序堆栈时拷贝进去 - 先函数调用参数传递,在系统调用参数传递
动态连接分为可执行程序装载时动态连接和运行时动态连接。
sysexecve内核处理过程 - sysexecve内部会解析可执行文件格式