• 2020-2021-1 20209315《Linux内核原理与分析》第八周作业


    作业信息

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)>
    这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第八周作业>
    这个作业的目标 <通过ELF文件和exec函数了解可执行程序工作原理>
    作业正文 <本博客链接>
    • ELF目标文件格式
      • 目标文件:编译器生成的文件。
      • 目标文件的格式:out格式、COFF格式、PE(windows)格式、ELF(Linux)格式。
      • ELF(Executable and Linkable Format)即可执行和可链接的格式,是一个目标文件格式的标准。ELF格式的文件用于存储Linux程序。
      • ELF文件的3钟类型:可重定位文件、可执行文件、共享目标文件。
        • 可重定位文件:这种一般是中间文件,还需要继续处理。由汇编器和编译器创建,一个源代码文件会生成一个可重定位文件。文件中保存着代码和适当的数据,用来和其他的目标文件一起来创建一个可执行文件、静态库文件或者共享目标文件(即动态库文件)。如Linux下.c文件都会生成一个同名的.o文件,这就是可重定位目标文件。
        • 可执行文件:一般由多个可重定位文件结合生成,是完成了所有重定位工作和符号解析(除了运行时解析的共享库符号)的文件,文件中保存着一个用来执行的程序。
        • 共享目标文件:共享库,是指可以被可执行文件或其他库文件使用的目标文件,例如标准C的库文件libc.so。可以简单理解为没有主函数main的“可执行”文件,只有一堆函数可供其他可执行文件调用。Linux下共享库后缀为.so文件,代表shard object。
      • ELF文件作用:ELF文件参与程序的链接和程序的执行。
        • 如果用于编译和链接(可重定位文件),编译器和链接器将把ELF文件看作节的集合,所有节由节头表描述,程序头表可选。
        • 如果用于加载执行(可执行文件),加载器将把ELF文件看作程序头表描述的段的集合,一个段可能包含多个节和节头表可选。
        • 如果是共享文件,则两者都含有。
      • 对ELF进行研究的相关操作指令
        • man elf:详细格式定义。
        • readelf:用于显示一个或多个elf格式的目标文件的信息,后面可以使用多个参数,如-a、-h、-S、-l等。
        • objdump:显示二进制文件信息,有-f、-h、-r等一系列参数。
        • hexdump:用十六进制的数字来显示elf的内容。
      • 程序编译
        • 预处理:gcc -E hello.c -o hello.i
        • 编译:gcc -S hello.i -o hello.s -m32
        • 汇编:gcc -c hello.s -o hello.o -m32
          链接:gcc hello.o -o hello -m32 -static

    Linux内核如何装载和启动一个可执行程

    使用实验楼环境,首先移除LinuxKernel下的menu,从老师的github上clone一个新的menu目录,将exec加入到MenuOS中
    指令如下所述:

    rm -rf menu
    git clone https://github.com/mengning/menu.git
    cd menu
    mv test_exec.c test.c
    make rootfs
    


    查看添加的Exec函数:

    使用make rootfs将menuOS在qemu下运行起来,在功能列表下发现增加了exec指令

    重新打开一个shell用qemu -kernel ../linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s指令打开MenuOS进行调试

    下面使用gdb对这个过程进行跟踪调试:

    在sys_execve一处设置断点:


    结束gdb调试,返回shell,在menu文件夹中使用readelf -h hello来查看hello的elf头部文件信息

  • 相关阅读:
    access remote libvirtd
    python中获取当前所有的logger
    python标准库xml.etree.ElementTree的bug
    python Requests库在处理response时的一些陷阱
    Ubuntu12.04下安装Subversion并进行配置
    命令行打包war包
    Ubuntu12.04安装MariaDB并修改字符集为UTF-8
    Windows下Navicat远程连接Linux下MySQL服务器错误1130
    解决ubuntu下eth0不显示
    解决Ubuntu12.04下rpcbind: cannot open '/var/run/rpcbind/rpcbind.xdr' file for reading
  • 原文地址:https://www.cnblogs.com/lmmn/p/14039355.html
Copyright © 2020-2023  润新知