zoukankan      html  css  js  c++  java
  • 2020-2021-1 20209302毕慧敏《Linux内核原理与分析》第八周作业

    可执行程序工作原理

    作业信息

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)>
    这个作业要求在哪里 <[2020-2021-1Linux内核原理与分析第八周作业](https://www.cnblogs.com/rocedu/p/11511045.html>
    这个作业的目标 <围绕编译链接的过程和ELF可执行文件格式,对Linux内核装载和启动一个可执行程序>
    作业正文 https://www.cnblogs.com/augusts/p/14028083.html#第八周

    实验楼实验七

    使用gdb跟踪分析一个execve系统调用内核处理函数sys_execve

      cd LinuxKernel
      rm menu -rf      //将menu目录删除
      git clone http://github.com/mengning/menu.git      //利用git命令克隆一个新的menu目录
      cd menu
      mv test_exec.c test.c      //用test_exec.c覆盖test.c
      make rootfs      //重新编译
    

    可以看到test.c中增加了exec函数,执行exec指令,显示如下:

    返回LinuxKernel目录下,使用qemu命令冻结系统执行,进行调试

      cd ..
      qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
    


    水平分割一个窗口,启动gdb加载内核,连接到target 1234,并添加断点在sys_execve和load_elf_binary和start_thread处:

      gdb
      (gdb) file linux-3.18.6/vmlinux
      (gdb) target remote:1234
      b sys_execve
      b load_elf_binary
      b start_thread
    


    继续执行

    第三个断点start_thread处,可以看到修改了eip的值

    知识点

    1.ELF概述:

    目标平台:它决定了编译器使用的机器命令集。
    ABI(目标文件)
    目标文件和目标平台是二进制兼容的,即该目标文件已经是适应某一种CPU体系结构的二进制指令。
    ELF即可执行的和可链接的格式,是一个目标文件格式的标准。

    2.ELF文件

    可重定位文件:保存代码和适当数据,用来和其他object文件一起创建可执行文件或者共享文件,即.o文件。
    可执行文件:保存用来执行的程序,该文件指出了exec(BA_OS)如何来创建程序进程映像。
    共享目标文件:共享库,是指可以被可执行文件或其他库文件使用的目标文件,如标准C的库文件libc.so,只有一堆函数可供其他可执行文件调用。

    3.ELF文件的作用

    ELF文件参与程序链接(建立一个程序)和程序的执行(运行一个文件)。
    如果用于编译和链接(可重定位文件),则编译器和链接器将把elf文件看作是节头表描述的节的集合,程序头表可选。
    如果用于加载执行(可执行文件),则加载器则将把elf文件看作是程序头表描述的段的集合,一个段可能包含多个节,节头表可选。
    如果是共享文件,则两者都含有。

    4.ELF文件程序编译

    程序经过的四个步骤:
    预处理:编译器将C程序的头文件编译进来,还有宏的替换,可以用gcc的参数-E来参看。
    gcc -E bihuimin.c -o bihuimin.i
    编译:这个阶段编译器主要做词法分析、语法分析、语义分析等,在检查无错误后后,把代码翻译成汇编语言。可用gcc的参数-S来参看。
    gcc -S bihuimin.i -o bihuimin.s
    汇编:汇编器as将louhao.s 翻译成机器语言保存在louhao.o 中(二进制文本形式)。
    gcc -c bihuimin.s -o bihuimin.o
    链接:链接器负责处理多个.o文件的并入,结果得到louhao文件,它就是一个可执行的目标文件。
    gcc bihuimin.o -o bihuimin

    5.静态链接和动态链接

    静态链接:在编译时直接将需要的执行代码复制到最终可执行的文件中,优点是代码的装载速度快,执行速度也比较快,对外部环境依赖度低。编译时会把所有需要的代码都链接进去,应用程序相对比较大。缺点是如果多个应用程序使用同一库函数,会被装载多次,浪费内存。
    动态链接:在编译时不直接复制可执行代码,而是通过一系列符号和参数,在程序运行或加载时将这些信息传递给操作系统。操作系统负责将需要的动态库加载到内存中,然后程序在运行到指定的代码时,去共享执行内存中已经加载的动态库去执行代码,最终达到运行时链接的目的。优点是多个程序可以共享同一段代码,而不需要在磁盘上存储多个复制。缺点时在运行时加载,可能会影响程序的前期执行性能,而且对库的依赖度极高。

    总结

    本周主要学习了编译链接的过程和ELF可执行文件格式,对Linux内核装载和启动一个可执行程序。可执行文件开始执行的起点在修改调用execve系统调用时压入内核堆栈的EIP寄存器的值,此时标志着当前进程的可执行文件已经被完全替换为新的可执行文件,但实际上开始执行可执行文件中的指令还需要等到执行可执行文件中定义的入口地址的位置。如果是静态链接的可执行文件,那么eip指向该elf文件的文件头e_entry所指的入口地址;如果是动态链接,eip指向动态链接器。

  • 相关阅读:
    前三次复利计算程序的总结
    Compound Interest Calculator3.0
    Compound Interest Calculator2.0
    Compound Interest Calculator1.0
    操作系统第一次作业
    学习进度条
    0302感想和问题回答
    1231递归下降语法分析程序设计
    1211有限自动机构造与识别
    5份Java面经
  • 原文地址:https://www.cnblogs.com/augusts/p/14028083.html
Copyright © 2011-2022 走看看