2019-2020-1 20199329《Linux内核原理与分析》第八周作业
《Linux内核原理与分析》第八周作业
一.本周内容概述:
- 理解编译链接的过程和ELF可执行文件格式
- 编程练习动态链接库的两种使用方式
- 使用gdb跟踪分析一个execve系统调用内核处理函数sys_execve
二.本周学习内容:
1.理解编译链接的过程和ELF可执行文件格式
ELF(Executable and Linking Format)是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了什么东西、以及都以什么样的格式去放这些东西。它自最早在 System V 系统上出现后,被 xNIX 世界所广泛接受,作为缺省的二进制文件格式来使用。
所谓对象文件(Object files)有三个种类:
- 可重定位的对象文件(Relocatable file)
- 可执行的对象文件(Executable file)
- 可被共享的对象文件(Shared object file)
ELF文件格式如图所示:
ELF文件由4部分组成,分别是ELF头(ELF header)、程序头表(Program header table)、节(Section)和节头表(Section header table)。实际上,一个文件中不一定包含全部内容,而且他们的位置也未必如同所示这样安排,只有ELF头的位置是固定的,其余各部分的位置、大小等信息有ELF头中的各项值来决定。
ELF文件:ELF(Excutable and Linking Format)是一个文件格式的标准。通过readelf-h hello查看可执行文件hello的头部(-a查看全部信息,-h只查看头部信息),头部里面注明了目标文件类型ELF32。Entry point address是程序入口,地址为0x400440
2.实验楼实验内容:使用gdb跟踪分析一个execve系统调用内核处理函数
exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。这里的可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件,如果不是可以执行的文件,那么就解释成为一个shell文件,shell执行。
- 更新linux/kernel下的menu,并将test_exec变成test.c
实践截图如下:
- 进入内核,查看exec命令是否添加进入内核
实践截图如下:
- 横屏打开另一个终端,进行gdb追踪
remote target:1234
实践截图如下:
- 在sys_execve处和其他的地方设置断点,并进行单步执行
实践截图如下:
- 最后退出调试状态后输入redelf -h hello可以查看hello的EIF头部
实践截图如下:
- elf头部分析
可见elf头大小为52字节,用dump命令16进制读取前52个字节进行分析
实践截图如下:
分析:
第一行,对应e_ident[EI_NIDENT]。小端法实际表示内容为7f454c46010101000000000000000000,前四个字节为elf固定开头7f454c46(0x45,0x4c,0x46是'e','l','f'对应的ascii编码),表示这是一个ELF对象。接下来的一个字节01表示是一个32位对象,接下来的一个字节01表示是小端法表示,再接下来的一个字节01表示文件头版本。剩下的默认都设置为0.
第二行,e_type值为0x0002,表示是一个可执行文件。e_machine值为0x0003,表示是intel80386处理器体系结构。e_version值为0x00000001,表示是当前版本。e_entry值为0x04080a8d,表示入口点。e_phoff值为0x00000034,表示程序头表的偏移量为0x34即52个字节刚好是elf头大小。
第三行,e_shoff值为0x000a20f0,表示节头表的偏移地址。e_flags值为0x00000000,表示未知处理器特定标志。e_ehsize值为0x0034,表示elf文件头大小52个字节。e_phentsize表示一个程序头表中的入口(程序头)的长度,值为0x0020即32字节。e_phnum的值为0x0006,给出程序头表中的入口数目。e_shentsize值为0x0028表示节头表入口(节头)大小为40字节。
第四行,e_shnum值为0x001f,表示节头表入口有31个。e_shstrndx值为0x001c,表示节名串表的在节表中的索引号。
三.总结与疑难
上一周的学习实验中,我了解到了fork()数的单步执行过程,并且看到了fork()函数的结构。而对于本周学习的exec()函数的结构,我也进行了查看和分析:do_ execve调用了do_ execve_ common,而do_ execve_ common又主要依靠了exec_ binprm,在exec_ binprm中又有一个至关重要的函数,叫做search_binary_ handler。这就是sys_execve的内部处理过程。
文件处理的过程包括:
- 预处理:gcc –E –o hello.cpp hello.c -m32 (负责把include的文件包含进来,宏替换);
- 编 译:gcc -x cpp-output –S hello.s –o hello.cpp -m32(gcc –S调用ccl,编译成汇编代码);
- 汇 编:gcc -x assembler –c hello.s –o hello.o; (gcc -c 调用as,得到二进制文件);
- 链 接:gcc –o hello hello.o ;gcc -o (调用ld形成目标可执行文件)
四.下周计划
- [ ] 完成书本上的课后习题
- [ ] 继续使用虚拟机环境研究内核
2019 年 11 月 8 日
2019-2020-1 20199329《Linux内核原理与分析》第八周作业的更多相关文章
- 2019-2020-1 20199329《Linux内核原理与分析》第九周作业
<Linux内核原理与分析>第九周作业 一.本周内容概述: 阐释linux操作系统的整体构架 理解linux系统的一般执行过程和进程调度的时机 理解linux系统的中断和进程上下文切换 二 ...
- 2019-2020-1 20199329《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 一.上周问题总结: 未能及时整理笔记 Linux还需要多用 markdown格式不熟练 发布博客时间超过规定期限 二.本周学习内容: <庖丁解 ...
- 20169212《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...
- 20169210《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 本周作业分为两部分:第一部分为观看学习视频并完成实验楼实验一:第二部分为看<Linux内核设计与实现>1.2.18章并安装配置内核. 第 ...
- 2018-2019-1 20189221 《Linux内核原理与分析》第九周作业
2018-2019-1 20189221 <Linux内核原理与分析>第九周作业 实验八 理理解进程调度时机跟踪分析进程调度与进程切换的过程 进程调度 进度调度时机: 1.中断处理过程(包 ...
- 2017-2018-1 20179215《Linux内核原理与分析》第二周作业
20179215<Linux内核原理与分析>第二周作业 这一周主要了解了计算机是如何工作的,包括现在存储程序计算机的工作模型.X86汇编指令包括几种内存地址的寻址方式和push.pop.c ...
- 2019-2020-1 20209313《Linux内核原理与分析》第二周作业
2019-2020-1 20209313<Linux内核原理与分析>第二周作业 零.总结 阐明自己对"计算机是如何工作的"理解. 一.myod 步骤 复习c文件处理内容 ...
- 2018-2019-1 20189221《Linux内核原理与分析》第一周作业
Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...
- 《Linux内核原理与分析》第一周作业 20189210
实验一 Linux系统简介 这一节主要学习了Linux的历史,Linux有关的重要人物以及学习Linux的方法,Linux和Windows的区别.其中学到了LInux中的应用程序大都为开源自由的软件, ...
- 2018-2019-1 20189221《Linux内核原理与分析》第二周作业
读书报告 <庖丁解牛Linux内核分析> 第 1 章 计算工作原理 1.1 存储程序计算机工作模型 1.2 x86-32汇编基础 1.3汇编一个简单的C语言程序并分析其汇编指令执行过程 因 ...
随机推荐
- 如何在Linux下优雅的查询日志
做为一名合格的Java后台开发 经常需要查询线上的日志,定位线上问题 所以熟练掌握日志查询的命令 可以使你更加迅速的定位错误日志位置,及时解决问题 在此,我将介绍几个自己工作中经常使用到的日志查询命令 ...
- CentOS 7 Docker安装
1. uname -a 查询机器信息,确保CPU为64位,且Linux内核在3.10版本以上 2. 更新yum包: yum update 3. 在 /etc/yum.repos.d下创建 docker ...
- Python中判断输入字符串是否为数字的方法
在写物理实验图像处理的脚本时,遇到了一个判断输入的字符串是否为数字的方法 最开始我的思路是这个 test = input() while test.isdigit(): # do something ...
- 真没想到,Springboot能这样做全局日期格式化,有点香!
最近面了一些公司,有一些 Java方面的架构.面试资料,有需要的小伙伴可以在公众号[程序员内点事]里,无套路自行领取 说在前边 最近部门几位同事受了一些委屈相继离职,共事三年临别之际颇有不舍,待一切手 ...
- 操作系统-2-存储管理之LRU页面置换算法(LeetCode146)
LRU缓存机制 题目:运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制. 它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - ...
- Linux网络安全篇,配置Yum源(一),本地Yum源
1.创建挂载目录 mkdir /mnt/cdrom 2.挂载软件源cdrom mount /dev/cdrom /mnt/cdrom/ 3.建立本地yum源资源文件夹 mkdir /usr/local ...
- java jdk 中HashMap的源码解读
HashMap是我们在日常写代码时最常用到的一个数据结构,它为我们提供key-value形式的数据存储.同时,它的查询,插入效率都非常高. 在之前的排序算法总结里面里,我大致学习了HashMap的实现 ...
- AJ学IOS(10)UI之_NSTimer_ios计时器
AJ分享,必须精品 先看效果 代码 #import "NYViewController.h" @interface NYViewController () <UIAlertV ...
- 从CentOS 7.0升级到7.7版本
我平时都在VirtualBox上装虚拟机,方法是导入ova镜像文件,比如导入从网上下载的CentOS7-base.ova,该ova为CentOS 7.0版本,而现在最新版本为7.7,为此进入系统后第一 ...
- Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(九)之Interfaces
Interfaces and abstract classes provide more structured way to separate interface from implementatio ...