zoukankan      html  css  js  c++  java
  • 2019-2020-1 20199308《Linux内核原理与分析》第八周作业

    《Linux内核分析》

    第七章 可执行程序工作原理

    7.1 知识点

    1、目标文件:编译器生成的文件,“目标”指平台,它决定了编译器使用的机器指令集。
    2、目标文件格式:a.out(最古老的)→COFE →PE(Windows)→ELF(Linux)
    3、ELF: Executable and Linkable Format,可执行的和可链接的格式,是一个目标文件格式的标准。此格式的文件用于存储Linux程序。
    4、ELF文件的3种类型:

    • 可重定位文件(中间文件)
    • 可执行文件(一般由多个可重定位文件结合生成)
    • 共享目标文件(共享库,Linux下共享库后缀为.so的文件)
      5、ELF文件的作用:
    • 用于编译和连接(可重定位文件)
    • 用于加载执行(可执行文件)
    • 共享文件两者都有
      6、一个可重定位文件保存着代码和适当的数据,用来和其他的object文件一起来创建一个可执行文件或者是一个共享文件。一个可执行文件保存着一个用来执行的程序;该文件指出了exec(BA_OS)如何来创建程序进程映象。一个共享object文件保存着代码和合适的数据,用来被下面的两个链接器链接。第一个是连接编辑器[请参看ld(SD_CMD)],可以和其他的可重定位和共享object文件来创建其他的object。第二个是动态链接器,联合一个可执行文件和其他的共享object文件来创建一个进程映象。

    7、ELF头描述了该文件的组织情况,程序投标告诉系统如何创建一个进程的内存映像,section头表包含了描述文件sections的信息。当系统要执行一个文件的时候,理论上讲,他会把程序段拷贝到虚拟内存中某个段。

    8、程序从0x804800开始,可执行文件加载到内存中开始执行的第一行代码,一般静态链接将会把所有代码放在同一个代码段,动态连接的进程会有多个代码段。

    9、程序编译

    • ①编译器预处理
      gcc -E -o XX.cpp XX.c (-m32)//
      注:把include的文件包含进来,并且完成宏的替换
    • ②汇编器编译成汇编代码
      gcc -x cpp-output -S -o hello.s hello.cpp (-m32)
    • ③汇编代码编译成二进制目标文件
      gcc -x assembler -c hello.s -o hello.o (-m32)
      注:不可读,含有部分机器代码但不可执行
    • ④链接成可执行文件
      gcc -o hello.static hello.c (-m32) -static
    • ⑤hello和hello.o都是ELF文件
    • ⑥.static文件会将所有用到C库文件都放到这一个可执行程序中

    7.2 实验过程

    • 实验内容:Linux内核如何装载和启动一个可执行程
    • 更新menu内核
    • 查看test.c文件,可以看到新增加了exec系统调用

    • 启动内核并验证execv函数

    • 冻结内核,启动GDB调试

    • 先停在sys_execve处,再设置其它断点;按c一路运行下去直到断点sys_execve


    • 退出调试状态,输入readelf -h hello可以查看hello的EIF头部

    *struct pt_regs regs就是内核堆栈栈底的部分,发生中断的时候,esp和ip都进行压栈。通过修改内核堆栈中EIP的值(也就是把压入栈中的值用new_ip替换)作为新程序的起点。

  • 相关阅读:
    2017蓝桥杯最大公共子串(C++B组)
    C++ memset函数用法
    2017蓝桥杯取位数(C++B组)
    2017蓝桥杯承压计算(C++ B组)
    安卓动画(Animation使用)
    2017蓝桥杯等差素数(C++B组)
    JSON取值前判断
    jstl
    centos到底下载哪个版本?
    HTML页面定时跳转方法
  • 原文地址:https://www.cnblogs.com/hsj910/p/11815285.html
Copyright © 2011-2022 走看看