《Linux内核原理与分析》第八周作业

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

  • 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格式
      • 主体是各种节,还有描述这些节属性的信息(Program header table和Section header table),以及ELF文件的整体描述信息(ELF header)。整体如下图所示:
      • ELF Header
      • Section Header
      • Program Header
    • 对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
  • 链接与库
    • 链接
      • 从过程上讲:符号解析、重定位。
      • 根据链接时机:静态链接、动态链接。
  • 程序装载
    • exec函数:sys_execve()系统调用
    • 调用关系:sys_execve() -> do_execve() -> do_execve_common() -> exec_binprm() -> search_binary_handler() -> load_elf_binary() -> start_thread()
    • fork与execve的区别和联系
      • 都是比较特殊的系统调用
      • fork在陷入内核态后有两次返回,第一次返回到原来父进程的位置继续向下执行,第二次是在子进程返回,这次会返回到ret_from_fork,之后正常返回用户态。
      • execve在执行时陷入内核态,在内核中调用execve加载的可执行文件把当前进程的可执行程序给覆盖了,当其返回时,返回的已经不是原来的那个可执行程序了,而是新的程序,返回的是新的可执行程序执行的起点,即main函数的大致位置(一般地址为0x8048xxx,由编译器设定)
  • 内核支持多格式是在执行execve时,它加载了文件的头部,来判断文件是什么格式,在链表中寻找能够解析这种文件格式的内核模块
  • 两种加载方法
    • 静态库:直接执行可执行程序的入口
    • 动态库:由ld来动态链接这个程序,再把控制权移交给可执行程序的入口

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

      问题与总结

猜你喜欢

转载自www.cnblogs.com/intoxication/p/10051149.html