标签:
以helloworld为例
目标文件是什么样的?
目标文件中的内容至少有编译后的机器指令代码、数据。没错,除了这些内容以外,目标文件中还包括了链接时所须要的一些信息,比如符号表、调试信息、字符串等。
ELF:exectable and linkable format.可执行和可链接的格式。
它是文件格式的标准,可执行连接格式是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface(ABI)而开发和发布的。工具接口标准委员会(TIS)选择了正在发展中的ELF标准作为工作在32位INTEL体系上不同操作系统之间可移植的二进制文件格式。
ABI和目标文件格式是怎么回事?
ABI 又称目标文件,应用程序二进制接口。二进制兼容的问题。复杂来讲就是:
- 符号修饰标准、变量内层布局、函数调用方式等这些跟可执行代码二进制兼容性相关的内容称为ABI(Application Binary Interface)。
ELF( ELF: 可执行连接格式 )中的三种目标文件:
ELF文件头: 如何查看ELF文件的头部
shiyanlou:Code/ $ readelf -h hello
段头表
- 目标文件中各节的位置和大小
- 处于目标文件的末尾
- 一般静态链接都会将所有代码放在一个代码段。 - 动态链接的进程会有多个代码段。
装载可执行程序之前的工作。 - 可执行程序的执行环境: - 命令行参数和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内部会解析可执行文件格式
20135239 益西拉姆 linux内核分析 可执行程序的装载
标签:
原文地址:http://www.cnblogs.com/20135239-yxlm/p/5372208.html