zoukankan      html  css  js  c++  java
  • 《程序员的自我修养-链接、装载和库》

    第一章.温故而知新
    最近电脑出了点故障,到电脑城维修,说是桥芯片坏了,刚好看到本书中关于计算机体系结构介绍北桥芯片是为了协调CPU,内存和高速图形设备之间的访问,速度非常快,而南桥芯片主要负责处理外鼠标,键盘,打印机等低速设备,并汇总到北桥芯片中.
    第二章
    程序从源文件到可执行文件:预处理替换和去除预处理指令如:#define, #if #endif等, 编译进行词法分析语法分析语义分析生成目标文件(linux *.o文件, windows *.obj文件),最后将目标文件链接生成可执行文件.
    windows下的PE文件格式和linux下的ELF文件格式都是在COFF基础上生成的,将文件分为几个段如代码段: .text, 数据段(初始化过): .data, 未初始化数据段: .bss, 只读数据段:  .rodata
    第六章.可执行文件的装载与进程
    (1)检查ELF可执行文件格式的有效性, 比如魔数,程序头表中段的数量.
    (2)寻找动态链接的".interp"段, 设置动态链接器路径.
    (3)根据ELF可执行文件的程序头表的描述, 对ELF文件进行映射,比如代码,数据,只读数据.
    (4)初始化ELF进程环境, 比如进程启动时EDX寄存器的地址应该是DT_FINI的地址.
    (5)将系统调用的返回地址修改成ELF可执行文件的入口点,这个入口点取决于程序的链接方式, 对于静态链接的ELF可执行文件,这个程序入口就是ELF文件的文件头中e_entry所指的地址,对于动态链接的ELF可执行文件,程序入口点是动态连接器
    当load_elf_binary()执行完毕,返回至do_execve()再返回至sys_execve()时,上面5补中已经把系统调用的返回地址改成了被装载的ELF程序的入口地址了,所以当sys_execve()系统调用从内核态返回用户态时, EIP寄存器直接跳转到了ELF程序的入口地址,于是新的程序开始执行, ELF可执行文件装载完成.
    第七章.
    动态库中的全局变量在加载时,在当前进程中会保存一个副本,防止不同进程进行访问时发生冲突.
  • 相关阅读:
    #翻译# 深入JavaScript的Unicode难题(上)
    深入 JavaScript(6)
    Angular service, 服务
    [译] 什么是移动友好的
    [译] 新手和老手都将受益的JavaScript小技巧
    Create XHR
    计算新浪Weibo消息长度
    SpringMVCDemo中,遇到的问题(四) 之分页功能
    为什么要用where 1=1?
    SpringMVCDemo中,遇到的问题(二)之mybatis中的mapper映射
  • 原文地址:https://www.cnblogs.com/ourroad/p/3331745.html
Copyright © 2011-2022 走看看