1、可执行文件的格式
  在 Linux 平台下主要有以下三种可执行文件格式:
  1、a.out(assembler and link editor output 汇编器和链接编辑器的输出)
  2、COFF(Common Object File Format 通用对象文件格式)
  3、ELF(Executable and Linking Format 可执行和链接格式)。
  在本课程中,主要介绍的是ELF文件。ELF 文件又分为三种类型:共享目标文件(库文件,后缀为.so)、可执行文件、可重定位文件(目标文件,后缀为.o)。
  2、可执行文件的创建过程
  从 C/C++ 源文件生成一个可被系统加载和启动的可执行文件,需要经过预处理、编译和链接这几个过程。
  预处理:把include 的文件包含进来,进行宏替换等。
  编译:编译器将预处理文件编译成汇编代码;汇编器将汇编代码编译成目标代码
  链接:将目标代码链接为可执行文件。根据链接方式的不同,可分为静态链接与动态链接。动态链接又可分为可执行程序装载时动态链接与运行时动态链接。
  3、可执行文件(ELF文件)的装载与启动过程
  一个可执行文件是由 shell 程序启动的。在 shell 环境下,用户输入可执行程序名及其参数后,shell 程序会调用 execve 将命令行参数和环境参数传递给可执行程序的main函数。通过以下层层调用,最终完成可执行程序的启动过程:
do_execve-->do_execve_common-->exec_binprm-->search_binary_handler-->load_elf_binary-->start_thread
 
在实验楼虚拟机下,键入以下指令更新 MenuOS
cd LinuxKernel
rm menu -rf
git config --global user.name "Scott Chacon"
git config --global user.mail "schacon@gmail.com"
git clone https://github.com/mengning/menu.git
cd menu
mv test_exec.c test.c
make rootfs
  待 MenuOS 系统完毕,在 MenuOS 中运行 help 指令与 exec 指令
 
按“Ctrl +C", 让 gdb 处于 gdb 命令行模式,设置断点
在 MenuOS 命令行执行 exec 指令,gdb 自动捕捉到 1#断点。
 
 
 
 
总结:
 首先创建新进程,然后新进程调用execve()系统调用执行指定的ELF文件,之后再调用内核的入口函数sys_execve(),sys_execve()服务例程修改当前进程的执行上下文;以上系统调用终止后,新进程开始执行放在可执行文件中的代码,也就是执行在当前目录下显示文件的功能。当ELF被load_elf_binary()装载完成后,函数返回至do_execve(),再返回至sys_execve()。ELF可执行文件的入口点取决于程序的链接方式,对于静态链接的可执行文件,,elf_entry就是指向可执行文件里边规定的那个头部,即main函数对应的位置,若这个可执行文件是需要依赖其它动态链接库的话,则elf_entry就是指向动态链接器的起点。
 
 
 
 
李海空原创作品转载注明出《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
 

Linux内核分析作业7:Linux内核如何装载和启动一个可执行程序的更多相关文章

  1. 作业七:Linux内核如何装载和启动一个可执行程序

    作业七:Linux内核如何装载和启动一个可执行程序 一.编译链接的过程和ELF可执行文件格式 可执行文件的创建——预处理.编译和链接 在object文件中有三种主要的类型. 一个可重定位(reloca ...

  2. linux内核分析 第七周 Linux内核如何装载和启动一个可执行程序

    一.编译链接的过程和ELF可执行文件格式 vi hello.c gcc -E -o hello.cpp hello.c -m32 //预处理.c文件,预处理包括把include的文件包含进来以及宏替换 ...

  3. Linux内核分析第七周学习笔记——Linux内核如何装载和启动一个可执行程序

    Linux内核分析第七周学习笔记--Linux内核如何装载和启动一个可执行程序 zl + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study. ...

  4. 实验七:Linux内核如何装载和启动一个可执行程序

    原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 题目自拟,内容围绕对Linu ...

  5. 20135323符运锦----第七周:Linux内核如何装载和启动一个可执行程序

    可执行程序的装载 一.预处理.编译.链接和目标文件的格式 1.可执行程序是怎么得来的 ①编译器预处理 gcc -E -o XX.cpp XX.c (-m32)// 注:把include的文件包含进来, ...

  6. Linux内核如何装载和启动一个可执行程序(转)

    原文:http://www.cnblogs.com/petede/p/5351696.html 实验七:Linux内核如何装载和启动一个可执行程序 姓名:李冬辉 学号:20133201 注: 原创作品 ...

  7. Linux内核设计第七周学习总结 Linux内核如何装载和启动一个可执行程序

    陈巧然原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002900 实验目的 使用gdb跟踪s ...

  8. 20135202闫佳歆--week 7 Linux内核如何装载和启动一个可执行程序--实验及总结

    week 7 实验:Linux内核如何装载和启动一个可执行程序 1.环境搭建: rm menu -rf git clone https://github.com/megnning/menu.git c ...

  9. 通过分析exevc系统调用处理过程来理解Linux内核如何装载和启动一个可执行程序

    前言说明 本篇为网易云课堂Linux内核分析课程的第七周作业,本次作业我们将具体来分析exec*函数对应的系统调用处理过程,来分析Linux内核如何来执行一个可执行程序,由于有一个在网易云课堂共同学习 ...

随机推荐

  1. MongoVue中Collections无法显示的问题

    问题描述: 通过Python向MongoDB写入数据后,MongoVue中Collections无法显示的问题 原因: Mongodb 3.0之后默认的 storageEngine为wiredTige ...

  2. 多Linux系统如何复用/home目录

    Brief: 1./home单独分区:2.不同系统/home建立不同的用户名:3.不同系统/home对其他用户授权 Linux下/home文件夹可以通用吗?例如我机器上同时装了两个Linux系统,可以 ...

  3. RedHat Enterprise Linux 6.4 使用 Centos 6 的yum(转)

    概述 redhat的yum源需注册付费,费时费力,整理RedHat yum 安装CentOS的方法. 安装系统文件 系统:RedHat Enterprise Linux 6.4-x86_64 md5: ...

  4. Python-面向对象(类)二

    一.成员修饰符 • 共有成员 • 私有成员 __+字段 __:成员修饰符 无法直接访问,只能通过该成员所属类的方法简介访问 class Foo: def __init__(self, name, ag ...

  5. 【原创】内核ShellCode注入的一种方法

    标 题: [原创]内核ShellCode注入的一种方法 作 者: organic 时 间: 2013-05-04,04:34:08 链 接: http://bbs.pediy.com/showthre ...

  6. CSS3简单的栅格系统

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. SSH框架整合(全注解)

    全部jar包    目录结构  配置案例 package cn.yzu.Tbook.action; import javax.annotation.Resource; import org.apach ...

  8. android中接口和抽象类的区别

    最近发现很多基础有点生疏了,特地写一点博客来巩固一下.今天主要来谈谈接口和抽象类的区别,我们在项目的很多地方都会用到接口或者抽象类,但是它们之间的一些区别和相同点不知道大家有没有注意到,还有就是,什么 ...

  9. 关于linux服务器上搭建ftp服务的流程

    小龙最近折腾了一个阿里云的服务器,买完了就要开始做那么多那么多的功课,小龙对ssh也是一知半解的状态,做个小笔记,发布下整个ftp服务的搭建过程,大神勿喷:) 一.aliyun Linux(Redha ...

  10. Hibernate 非常见异常集合

    异常一:org.hibernate.AnnotationException: Collection has neither generic type or OneToMany.targetEntity ...