姬梦馨

原创作品

《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

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

一:1.可执行程序如何产生的?

linux系统中,可执行程序一般要经过预处理、编译、汇编、链接、执行等步骤。

编译过程
预处理:gcc –E hello.c –o hello.i; gcc –E调用cpp 生成中间文件
编 译:gcc –S hello.i –o hello.s; gcc –S调用ccl 翻译成汇编文件
汇 编:gcc –c hello.s –o hello.o; gcc -c 调用as 翻译成可重定位目标文件
链 接:gcc hello.o –o hello ; gcc -o 调用ld** 创建可执行目标文件
64位机可用参数-m32
cpp是指预处理编译文件

  

2.目标文件格式ELF

ELF文件已经是适应到某一种CPU体系结构的二进制兼容文件了。

默认的ELF头加载地址是0x8048000,头部大概要到0x48100处或者0x483000处,也就是可执行文件加载到内存之后

执行的第一条代码地址

查看一个可执行文件头部内容:readelf -h;头部后是代码和数据。

.o文件,可执行文件,都是目标文件,一般使用相同的文件格式。
常用文件格式:

a.out     COFF    PE - WINDOWS上     ELF - LINUX上

ABI:应用程序二进制接口

ELF文件格式中有三种主要的文件格式:

1:可重定位文件
主要是.o文件,保存有代码和适当数据,和其他的object文件一起来创建一个可执行文件或者共享文件
2:可执行文件
保存着一个用来执行的程序,指出exec(BA_OS)如何创建程序进程映象。
3:共享目标文件
保存代码和合适的数据,用来和链接器链接。 链接器分为动态和静态:
链接编辑器,静态链接,和其他的可重定位、共享目标文件创建其他的目标文件
动态链接器,连喝一个可执行文件和其他的共享目标文件来创建一个进程映像

文件格式

Object文件参与程序的联接(创建一个程序)和程序的执行(运行一个程序)。
object 文件格式提供了一个方便有效的方法并行的视角看待文件的内容。

3 静态链接的ELF可执行文件与进程的地址空间

32位x86进程地址空间共4G,1G是内核空间。

一般静态链接会将所有代码放在一个代码段;动态链接的进程会有多个代码段。

二、可执行程序、共享库和动态链接

1:新的可执行程序起点:

  地址空间为0x8048000或0x8048300。

    装载可执行程序之前的工作:
Shell本身不限制命令行参数的个数,命令行参数的个数受限于命令自身。
Shell会调用execve将命令行参数和环境参数传递给可执行程序的main函数,传递和保存命令行参数
和环境变量。

2:命令行参数和环境变量是如何进入新程序的堆栈的?

execve:
main函数需要构造他的执行环境,执行可执行程序;令行参数和环境变量通过系统调用传递到内核处理函数,然后内核处理函数构造新的可执行文件,来初始化新的可执行程序的堆栈,返回到新的可执行程序。

  

3:静态链接的可执行程序和动态链接的可执行程序execve系统调用返回时不同

 静态链接:elf_entry指向可执行文件的头部,一般是main函数;

  动态链接:elf_entry指向ld的起点。

4:sys_execve内部处理过程

      int do_execve(struct filename *filename,       在函数返回中做一个do_execve
const char __user *const __user *__argv,
{
struct user_arg_ptr argv = { .ptr.native = __argv };
struct user_arg_ptr envp = { .ptr.native = __envp };
return do_execve_common(filename, argv, envp);
} SYSCALL_DEFINE3(execve,
const char __user *, filename,
const char __user *const __user *, argv,
const char __user *const __user *, envp)
{
return do_execve(getname(filename), argv, envp); 转到do _ execve _ common函数
}
#ifdef CONFIG_COMPAT
COMPAT_SYSCALL_DEFINE3(execve, const char __user *, filename,
const compat_uptr_t __user *, argv,
const compat_uptr_t __user *, envp)
{
return compat_do_execve(getname(filename), argv, envp);
}
#endif if (!try_module_get(fmt->module))
continue;
read_unlock(&binfmt_lock);
bprm->recursion_depth++;
retval = fmt->load_binary(bprm);
read_lock(&binfmt_lock);
put_binfmt(fmt);
bprm->recursion_depth--;
在这个循环里寻找能够解析这个当前可执行文件

  

三:实验  GDB跟踪sys_execve内核函数处理过程

1:  内核启动   环境搭建   更新命令

2:在exec函数中执行了动态链接代码


3:hello.c

4:GDB 内核跟踪及设置断点  


实验总结

动态链接的过程主要是动态链接器在起作用,而不是内核.

动态链接分为可执行程序装载时动态链接和运行时动态链接

新的程序开始执行,ELF可执行文件装载完成。


												

linux 第七周 总结及实验的更多相关文章

  1. Linux第七周学习总结——可执行程序的装载

    Linux第七周学习总结--可执行程序的装载 作者:刘浩晨 [原创作品转载请注明出处] <Linux内核分析>MOOC课程http://mooc.study.163.com/course/ ...

  2. 第七周课程总结&实验报考(五)

    第七周课程总结&实验报考(五) 实验四 类的继承 实验目的: 1.理解抽象类与接口的使用: 2.了解包的作用,掌握包的设计方法. 实验要求: 1.掌握使用抽象类的方法. 2.掌握使用系统接口的 ...

  3. Linux 第七周实验 及总结

    姬梦馨 原创作品 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 第七周 Linux内核如何装载和启动一 ...

  4. 20135337朱荟潼 Linux第七周学习总结——可执行程序的装载

    朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 第七周 Linu ...

  5. 第七周课程总结 & 实验报告(五)

    第七周课程总结 一.抽象类与接口的应用 1.实例化 2.实际应用 ---模板设计(抽象类) ---制定标准(接口) 3.设计模式 ---工厂设计 ---代理设计 ---适配器设计 二.抽象类与接口之间 ...

  6. 20135316王剑桥 linux第七周课实验笔记

    第十章.程序间的交互和通信 输入/输出(I/O)是在主存和外部设备之间拷贝数据的过程.输入操作是从I/O设备拷贝数据到主存,而输出操作是从主存拷贝数据到I/O设备. 输入:从I/O拷贝到主存,输出:从 ...

  7. 20135320赵瀚青LINUX第七周学习笔记

    赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 概述 本周学习的内容主要是讨 ...

  8. linux第七周

    可执行程序的装载 一.预处理.编译.链接和目标文件的格式 可执行文件的创建——预处理.编译和链接 cd Code vi hello.c gcc -E -o hello.cpp hello.c -m32 ...

  9. 第七周课程总结&实验报告(五)

    实验四 类的继承 实验目的 理解抽象类与接口的使用: 了解包的作用,掌握包的设计方法. 实验要求 掌握使用抽象类的方法. 掌握使用系统接口的技术和创建自定义接口的方法. 了解 Java 系统包的结构. ...

随机推荐

  1. Vim和Vi的常用命令

    Vim 文本编辑器 1.Vim 和 Vi: 两者都是多模式编辑器: Vim 是 Vi 升级版,再兼容 Vi 所有指令的同时增加了一些新功能支持: 特点: 语法加亮:使用不同的颜色加亮代码: 多级撤销: ...

  2. 如何快速搭建&配置本地服务器-前端技能

    废话不多说,上图: 首先登录http://www.phpstudy.net/download.html 下载安装phpstudy,特别简单不详解: 创建一个本机项目并且与本机域名进行绑定主要分为两步; ...

  3. SWFUpload多文件上传使用指南

    SWFUpload是一个flash和js相结合而成的文件上传插件,其功能非常强大.以前在项目中用过几次,但它的配置参数太多了,用过后就忘记怎么用了,到以后要用时又得到官网上看它的文档,真是太烦了.所以 ...

  4. 一个CSS值转REM的Sublime Text插件

    CSSREM 一个CSS的px值转rem值的Sublime Text 3自动完成插件. 插件效果如下: 安装 下载本项目,比如:git clone https://github.com/flashli ...

  5. DP E - Cheapest Palindrome

    Keeping track of all the cows can be a tricky task so Farmer John has installed a system to automate ...

  6. centos7下安装docker(9容器对资源的使用限制-内存)

                  一个docker Host上面会运行若干容器,每个容器都需要CPU,内存和IO资源.容器提供了控制分配多少CPU,内存给每个容器的机制,避免摸个容器因占用太多资源而影响其他 ...

  7. 1192:放苹果(dp + 搜索)

    这道题先用搜索写的,因为我需要先打表来寻找规律. 因为数据量小所以收搜也会过 #include<iostream> #include<cstdio> #include<c ...

  8. M100 组装教程

    http://bbs.dji.com/thread-37868-1-1.html

  9. Python虚拟环境和包管理工具Pipenv的使用详解--看完这一篇就够了

    前言 Python虚拟环境是一个虚拟化,从电脑独立开辟出来的环境.在这个虚拟环境中,我们可以pip安装各个项目不同的依赖包,从全局中隔离出来,利于管理. 传统的Python虚拟环境有virtualen ...

  10. android.view.WindowManager$BadTokenException: Unable to add window

    这是在加载dialog时出现的一个异常.转载地址:http://hi.baidu.com/fbdfp/item/7dea2d0ade9121813d42e23d 扔了好久的android又开始断断续续 ...