2020-2021-1 20209307 《Linux内核原理与分析》第八周作业
这个作业属于哪个课程 | <2020-2021-1Linux内核原理与分析)> |
---|---|
这个作业要求在哪里 | <2020-2021-1Linux内核原理与分析第八周作业> |
这个作业的目标 | <Linux内核如何装载和启动一个可执行程序> |
作业正文 | https://www.cnblogs.com/wzyxiaowang/p/14057173.html |
一、知识点: | |
1、预处理、编译、链接和目标文件的格式 | |
(1)预处理阶段 :编译器将C源代码中包含的头文件编译进来和执行宏替换等工作。 | |
gcc -E -o XX.cpp XX.c -m32 (XX.cpp是预处理文件) | |
(2)编译器生成汇编代码阶段:gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc把代码翻译成汇编语言。gcc -x cpp-output -S -o hello.s hello.cpp -m32 (XX.s是汇编代码) | |
(3)汇编器生成目标代码阶段:把编译阶段生成的XX.S文件转成二进制目标代码。 | |
gcc -x assembler -c hello.s -o hello.o -m32 (XX.o是目标代码) | |
(4)链接器生成可执行文件阶段(将编译输出XX.o文件链接成最终的可执行文件)。gcc -o hello.static hello.c -m32 -static | |
(5)运行(若链接没有-o指明,则生成可执行文件默认为a.out)./a.out | |
2、ELF目标文件格式 | |
(1)概述:ELF文件全称是Executable Linking Format(可执行连接格式),最初由unix系统实验室发布,它是应用程序二进制接口(Application Binary Interface,ABI)的一部分。在linux下,它是可执行文件的格式,由System V Release 4在COFF的基础上引入的,与之相对应的就是大家所熟悉的windows下的exe文件,exe文件是由microsoft基于COFF格式改变而成。 | |
(2)分类:可重定位文件:一般是中间文件,还需要继续处理。由编译器和汇编器创建,一个源代码文件会生成一个可重定位文件。 |
可执行文件:一般由多个可重定位文件结合生成,是完成了所有重定位工作和符号解析的文件。
共享目标文件:共享库,指可以被可执行文件或其他库文件使用的目标文件,例如标准C的库文件libc.so。
(3)目标文件结构
(4)相关操作指令
man elf:查看elf详细的格式定义
readelf:用于显示一个或多个elf格式的目标文件的信息,可以通过它的选项来控制显示哪些信息。
objdump:显示二进制文件信息,用于查看目标文件或者可执行的目标文件的构成的gcc工具。
二、实验七:Linux内核如何装载和启动一个可执行程
将menu目录删除,利用git命令克隆一个新的menu目录,然后用test_exec.c将test.c覆盖
rm -rf menu
git clone https://github.com/mengning/menu.git
test_exec.c将test.c覆盖,重新编译
mv test_exec.c test.c
查看添加的Exec函数
make rootfs
QEMU中利用help命令查看,并执行exec命令
启动gdb,通过端口1234建立连接,在sys_exec、load_elf_binary、start_thread处设置断点
按c继续执行
第三个断点start_thread处,可以看到修改了eip的值
出调试状态后,查看hello的ELF头部信息