Linux内核如何装载和启动一个可执行程序

摘要: mqy + 原创做品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000shell

可执行文件的格式
  在 Linux 平台下主要有如下三种可执行文件格式:
  一、a.out(assembler and link editor output 汇编器和连接编辑器的输出)
  二、COFF(Common Object File Format 通用对象文件格式)
  三、ELF(Executable and Linking Format 可执行和连接格式)。
  在本课程中,主要介绍的是ELF文件。ELF 文件又分为三种类型:共享目标文件(库文件,后缀为.so)、可执行文件、可重定位文件(目标文件,后缀为.o)。
可执行文件的建立过程
  从 C/C++ 源文件生成一个可被系统加载和启动的可执行文件,须要通过预处理、编译和连接这几个过程。
  预处理:把include 的文件包含进来,进行宏替换等。
  编译:编译器将预处理文件编译成汇编代码;汇编器将汇编代码编译成目标代码
  连接:将目标代码连接为可执行文件。根据连接方式的不一样,可分为静态连接与动态连接。动态连接又可分为可执行程序装载时动态连接与运行时动态连接。

  预处理:加入头文件执行宏替换等操做 gcc -E hello.c -o hello.i编辑器

  编译:检查无误后转为汇编语言 gcc –S hello.i –o hello.s函数

  汇编:转为二进制 gcc –c hello.s –o hello.opost

  连接:生成可执行文件 gcc hello.o –o hellospa

  一步完成的命令为:gcc hello.c -o hello 命令行

  elf文件分为可重定位文件、可执行文件、共享文件等调试

    查看elf文件的文件头能够用readelform

    程序的入口地址是0x8048000对象

可执行文件(ELF文件)的装载与启动过程
  一个可执行文件是由 shell 程序启动的。在 shell 环境下,用户输入可执行程序名及其参数后,shell 程序会调用 execve 将命令行参数和环境参数传递给可执行程序的main函数。经过如下层层调用,最终完成可执行程序的启动过程:
do_execve-->do_execve_common-->exec_binprm-->search_binary_handler-->load_elf_binary-->start_thread

实验:blog

gdb跟踪内核函数sys_execve处理过程

内核准备

执行exec

gdb调试

 

执行结果

单步运行,能够看到do_execv函数

执行到start_thread查看入口地址

与readelf的结果一致

相关文章
相关标签/搜索