在系统上运行程序

链接

  • gcc编译链接程序:cpp预处理器预处理源文件,cc1编译器编译.i文件为.S文件,as汇编器将.S文件变为可重定位目标文件.o,最后运行ld链接器,创建一个可执行程序
  • 执行./a.out,shell调用加载器函数,将可执行文件的.text和.data复制到内存并跳转到该程序开头

解析多重定义的全局符号

  • 规则
    1. 不允许多个同名的强符号
    2. 如果有一个强符号和多个弱符号同名,选择弱符号
    3. 如果有多个弱符号同名,选择其中任意一个
  • 链接器不会表示检测到符号的多重定义
  • 未初始化的全局变量交给COMMON段,将可能存在多重定义的变量交给链接器进行裁决
    • 未初始化的静态变量,初始化为0的静态或全局变量在.bss段;全局变量初始化为0是一个强符号

与静态链接库链接

  • 链接器将只复制被程序引用的目标模块

动态链接共享库

  • 链接器复制了.so文件的重定位和符号表信息
  • 在可执行文件加载后,存在.interp节,加载动态链接器(ld-linux.so);动态链接器本身不能依赖任何动态库,所有它是静态链接的