• linux内核分析 第七周


    一、课堂相关

    (一)预处理、编译、链接和目标文件的格式

    1.可执行程序是怎么得来的

    C代码——预处理——汇编代码——目标代码——可执行文件
    
    预处理负责把include的文件包含进来及宏替换工作。
    
    hello和hello.o都是ELF格式的文件。
    

    2.目标文件的格式ELF

    种类:
    
    	一个可重定位(relocatable)文件保存着代码和适当的数据,用来和其他的object文件一起来创建一个可执行文件或者是一个共享文件。
    	
    	一个可执行(executable)文件保存着一个用来执行的程序;该文件指出了exec(BA_OS)如何来创建程序进程映象。
    	
    	一个共享object文件保存着代码和合适的数据,用来被下面的两个链接器链接。第一个是连接编辑器[请参看ld(SD_CMD)],可以和其他的可重定位和共享object文件来创建其他的object。第二个是动态链接器,联合一个可执行文件和其他的共享object文件来创建一个进程映象。
    

    3.静态链接的ELF可执行文件和进程的地址空间

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

    (二)可执行程序、共享库和动态加载

    1.装载可执行程序之前的工作
    
    	命令行参数和shell环境,一般我们执行一个程序的Shell环境,我们的实验直接使用execve系统调用。 
    
    	命令行参数和环境串都放在用户态堆栈中
    
    2.装载时动态链接和运行时动态链接应用举例
    
    	动态链接分为可执行程序装载时动态链接和运行时动态链接。
    

    (三)可执行程序的装载

    1.可执行程序的装载相关关键问题分析

    sys_execve内部会解析可执行文件格式	 
    
    对于ELF格式的可执行文件fmt->load_binary(bprm);执行的应该是load_elf_binary其内部是和ELF文件格式解析的部分需要和ELF文件格式标准结合起来阅读。
    

    2.sys_execve的内部处理过程

    装载和启动一个可执行程序依次调用以下函数:
    
    sys_execve() -> do_execve() -> do_execve_common() -> exec_binprm() -> search_binary_handler() -> load_elf_binary() -> start_thread()
    

    5.浅析动态链接的可执行程序的装载

    可以关注ELF格式中的interp和dynamic。
    
    动态链接库的装载过程是一个图的遍历。
    
    装载和连接之后ld将CPU的控制权交给可执行程序。
    

    二、实验截图

    1.下载新的代码文件

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

    2.运行和gdb跟踪断点

    《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

  • 相关阅读:
    混合式应用开发之AngularJS ng-repeat数组有重复值的解决方法
    混合式应用开发之串口通讯(2)
    混合式应用开发之串口通讯(1)
    第一篇博客
    win10出现"本地计算机上的MySQL57服务启动后停止"
    彻底区分html的attribute与dom的property
    Angularv4入门篇1
    node开发后将本地mysql数据导入到服务器mysql
    weex入门
    Color.js 方便修改颜色值
  • 原文地址:https://www.cnblogs.com/whyfarrell/p/5366012.html
Copyright © 2020-2023  润新知