Linux 第七周实验 及总结
姬梦馨
原创作品
《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 第七周实验 及总结的更多相关文章
- 20135302魏静静——linux课程第七周实验及总结
linux课程第七周实验及总结 实验及学习总结 1. 编译链接的过程和ELF可执行文件格式(以hello为例) GNU编译系统编译源码: 首先,运行C预处理器(cpp),将.c文件翻译成.i文件——g ...
- Linux第七周学习总结——可执行程序的装载
Linux第七周学习总结--可执行程序的装载 作者:刘浩晨 [原创作品转载请注明出处] <Linux内核分析>MOOC课程http://mooc.study.163.com/course/ ...
- linux 第七周 总结及实验
姬梦馨 原创作品 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 第七周 Linux内核如何装载和启动一 ...
- 20135337朱荟潼 Linux第七周学习总结——可执行程序的装载
朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 第七周 Linu ...
- 第七周&实验报告五
实验四 类的继承 •实验目的 •理解抽象类与接口的使用: •了解包的作用,掌握包的设计方法. •实验要求 •掌握使用抽象类的方法. •掌握使用系统接口的技术和创建自定义接口的方法. •了解 Java ...
- 20135316王剑桥 linux第七周课实验笔记
第十章.程序间的交互和通信 输入/输出(I/O)是在主存和外部设备之间拷贝数据的过程.输入操作是从I/O设备拷贝数据到主存,而输出操作是从主存拷贝数据到I/O设备. 输入:从I/O拷贝到主存,输出:从 ...
- 201771010126 王燕《面向对象程序设计(Java)》第七周实验总结
实验七 继承附加实验 实验时间 2018-10-11 1.实验目的与要求 (1)进一步理解4个成员访问权限修饰符的用途: private--私有域或私有方法:只能在定义它的类中使用 public--公 ...
- 20135320赵瀚青LINUX第七周学习笔记
赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 概述 本周学习的内容主要是讨 ...
- Linux第七次实验笔记
#期中总结 习题总结与分析 填空:Linux Bash中,Ctrl+a快捷键的作用是(将光标移至输入行头,相当于Home键). [ctrl]+u 从游标处向前删除指令串 [ctrl]+k 从游标处向后 ...
随机推荐
- lvm管理卷之缩减卷大小
最近刚刚装好了一个系统,但是因为没有分好区,导致home分区过大,所以想把home分区的一大半移动到根分区里面. 1.先说一下我的环境. 安装的是centos6版本的系统,使用的默认文件系统是ext4 ...
- ccf-20160903--炉石传说
本题思路如下图: 题目和代码如下: 问题描述 试题编号: 201609-3 试题名称: 炉石传说 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 <炉石传说:魔兽英雄传& ...
- Django view 视图
request.method 判断请求方式 8种 GET : 获取一个页面 POST: 提交数据 PUT : 上传 HEAD: 不用上传就获取数据 DELETE: 删除 Request-URL 标识的 ...
- c++11の异步方法 及线程间通信
1. std::promise 可以用来在线程间提供数据传递. std::future = std::promise.get_future(). 线程中可以对promise赋值std::promise ...
- bzoj5093:[Lydsy1711月赛]图的价值
题目 首先考虑到这是一张有标号的图,每一个点的地位是相等的,因此我们只需要求出一个点的价值和乘上\(n\)就好了 考虑一个点有多少种情况下度数为\(i\) 显然我们可以让除了这个点的剩下的\(n-1\ ...
- Ubuntu 14.04服务器配置 (1) 安装和配置
http://jingyan.baidu.com/article/9c69d48fb9fd7b13c8024e6b.html ssh是一种安全协议,主要用于给远程登录会话数据进行加密,保证数据传输的安 ...
- [TPYBoard - Micropython之会python就能做硬件 开篇]会python就能做硬件!
转载请注明:@小五义http://www.cnblogs.com/xiaowuyiQQ群:64770604 会python就能做硬件! 在写这套教程之前,首先感觉山东萝卜电子科技有限公司(turnip ...
- Attention[Content]
0. 引言 神经网络中的注意机制就是参考人类的视觉注意机制原理.即人眼在聚焦视野区域中某个小区域时,会投入更多的注意力到这个区域,即以"高分辨率"聚焦于图像的某个区域,同时以&qu ...
- b/s程序真的很方便部署吗
公共应用当然是web系统,这个不说,我说的是企业应用. 最近一些年在企业开发中都提倡web应用,仿佛winform可以结束了,但真的这样吗?最近几天的真实经历如下: 我们部门新开发了一套系统要上线,由 ...
- BootStrap学习(6)_模态框
一.模态框 模态框(Modal)是覆盖在父窗体上的子窗体.通常,目的是显示来自一个单独的源的内容,可以在不离开父窗体的情况下有一些互动.子窗体可提供信息.交互等. 如果只使用该功能,只引入BootSt ...