zoukankan      html  css  js  c++  java
  • Linux内核分析07

    可执行程序的装载

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

    可执行程序是怎么来的?

    预处理  把include里的宏定义替换 做字符串处理。

    efl格式? 目标文件格式,Windows中用PE Linux中用efl

    静态链接、动态链接?

    ABI和文件格式的关系? 二进制兼容

    可重定位文件    可执行文件    共享目标文件

    连接器:链接编辑器 ,动态链接器

    **当创建或者增加一个进程映像时,系统在理论上会复制文件的一个段到一个虚拟的内存段去。

    可执行文件加载到内存中 开始执行第一行代码。

    一般情况静态链接会把所有代码放到一个代码段

    二,可执行程序、共享库和动态链接

    研究可执行程序的装载、执行环境等

    先函数调用参数传递,再系统调用参数传递。

    装载和运行时的动态链接举例。

     

    三,可执行程序的装载

     命令行参数和shell环境,一般我们执行一个程序的Shell环境,我们的实验直接使用execve系统调用。

    Shell本身不限制命令行参数的个数, 命令行参数的个数受限于命令自身

    Shell会调用execve将命令行参数和环境参数传递给可执行程序的main函数

    sys_execve内部会解析可执行文件格式

    do_execve -> do_execve_common -> exec_binprm

    search_binary_handler符合寻找文件格式对应的解析模块

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

    execve和fork都是特殊的系统调用

    上周已经学习过fork的调用了 

    通过修改内核堆栈EIP的值来作为新程序执行的起点

    ELF可执行文件会默认映射到0x8048000这个地址

    需要动态链接的可执行文件需要先加载链接器ID,将CPU控制权交给链接ID来加载依赖库完成动态链接。装载之后ID将CPU控制权交给可执行程序。

    而对于静态链接文件来说 efl_entry是新程序执行起点。

    用gdb调试:

    new_ip是返回用户态的第一条指令的地址。

  • 相关阅读:
    Babelfish
    【动态规划】货币面值
    contest 1.18
    contest 1.17
    contest 1.16
    contest 1.15
    contest 1.14
    contest 1.13
    contest 12.31
    [cf]Round #529 (Div. 3)
  • 原文地址:https://www.cnblogs.com/KG35/p/5358278.html
Copyright © 2011-2022 走看看