CMU CSAPP笔记 第七章

本文详细介绍了C语言的编译过程,包括预处理器、编译器、汇编器和链接器的作用。预处理器将源文件转换为.i文件,编译器生成汇编语言文件,汇编器产出可重定位目标文件,链接器负责符号解析和重定位,生成可执行文件。链接器的主要任务是处理符号表和重定位,解决函数和全局变量的引用。此外,文章还讨论了ELF文件格式、全局符号的强弱符号概念以及静态库的使用。动态库和位置无关代码(PIC)的概念也被提及,用于减少内存浪费并提高效率。
摘要由CSDN通过智能技术生成
  • 编译驱动程序包括

    • 预处理器(cpp)
      • 将程序从ASCII源文件翻译成 .i 文件
    • 编译器(ccl)
      • 翻译成 .s ASCII汇编语言文件
    • 汇编器(as)
      • 翻译成 .o 可重定位目标文件
    • 链接器(ld)
      • 翻译成可执行文件
  • 链接器主要任务

    • 符号解析
      • 将函数,全局变量,静态变量(static)的定义和引用(使用)关联起来
    • 重定位
      • 汇编器生成从地址0开始的代码和数据(产生相对地址),链接器将这些定义和内存位置关联起来(产生绝对地址)
        • 这里的绝对地址是对于这个程序内部而言的绝对位置,并不是整个PC内的绝对位置
  • 可重定位目标文件格式(ELF)
    这里写图片描述

  • 局部变量是在运行时保存在栈中,链接器不知道其存在

    • 所以ELF文件的符号表中没有局部变量的条目
      • 而编译器的符号表中是有的
  • 全局符号分为强符号和弱符号

    • 强符号为函数或者已经初始化的全局
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值