CSSAPP稀里糊涂的读书笔记(七)链接

本文讲解了链接器在构造可执行文件过程中的作用,包括符号解析和重定位两大任务。介绍了目标文件的三种形式:可重定位、可执行和共享目标文件。详细解释了链接器如何处理全局、外部和局部符号,以及强弱符号的定义和规则。最后,概述了重定位和动态链接的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链接是将各种代码和数据片段收集并组合成为一个单一文件的过程,这个文件可被加载到内存并执行。本章主要讲链接的各个方面,不过本章的总结应该会比较少,毕竟链接有链接器自动执行,所以就看个大概吧。

  1. 为了构造可执行文件,链接器必须完成两个主要任务:符号解析;重定位。
  2. 目标文件有三种形式:
  • 可重定位目标文件。包含二进制代码和数据,其形式可以在编译时与其他可重定位目标文件合并起来,创建一个可执行目标文件。
  • 可执行目标文件。包含二进制代码和数据,其形式可以被直接复制到内存并执行。
  • 共享目标文件。一种特殊类型的可重定位目标文件,可以在加载或者运行时被动态地加载进内存并链接。
  1. 每个可重定位目标模块m都有一个符号表,它包含m定义和引用地符号的信息。在链接器上下文中,有三种不同地符号:
  • 由模块m定义并能被其他模块引用地全局符号。全局链接器符号对应于非静态地C函数和全局变量
  • 由其他模块定义并被模块m引用地全局符号。这些符号称为外部符号,对应于在其他模块中定义地非静态C函数和全局变量。
  • 只被模块m定义和引用地局部符号。它们对应于带static属性地C函数和全局变量。这些符号在模块m中任何位置都可见,但是不能被其他模块引用。
  1. 链接器解析符号引用地方法是将每个引用与它输入地可重定位目标文件的符号表中的一个确定的符号定义关联起来。但是对于全局符号的引用解析就非常棘手。
    如果多个模块定义同名的全局符号,会怎样?
    在编译时,编译器向汇编器输出每个全局符号,或者是强(strong)或者是弱(weak),而汇编器把这个信息隐含地编码在可重定位目标文件的符号表里。函数和已初始化的全局变量是强符号,未初始化的全局变量是弱符号。
    根据强弱符号的定义,Linux链接器使用下面的规则来处理多重定义的符号名:
  • 规则一:不允许由多个同名的强符号。
  • 规则二:如果有一个强符号和多个弱符号同名,那么选择强符号。
  • 规则三:如果有多个弱符号同名,那么从这些弱符号中任意选择一个。
  1. 一旦链接器完成了符号解析这一步,就把代码中的每个符号引用和正好一个符号定义关联起来。现在就可以开始重定位了。重定位由两步组成:
  • 重定位节和符号定义。在这一步中,链接器将所有相同类型的节合并为统一类型的新的聚合节。然后链接器将运行时内存地址赋给新的聚合节,赋给输入模块定义的每个节,以及赋给输入模块定义的每个符号。当这一步完成时,程序中的每条指令和全局变量都有唯一的运行时内存地址了。
  • 重定位节中的符号引用。这一步中,链接器修改代码节和数据节中对每个符号的引用,使得它们指向正确的运行时地址。
  1. 加载器将可执行目标文件中的代码和数据从磁盘复制到内存中,然后通过跳转到程序的第一条指令或者入口点来运行该程序。这个将程序复制到内存并运行的过程叫做加载。

  2. 共享库是一个目标模块,在运行和加载时,可以加载到任意的内存地址,并和一个在内存中的程序链接起来。这个过程称为动态链接,是由一个动态链接器的程序来执行的。目的是为了解决静态库的缺陷——函数代码会复制到每个运行进程的文本段中,造成内存资源的极大浪费。

只是总结了些概念性的东西,还有很多更详细的内容,感觉没有特别的了解必要,建议看书自己判断。

STM32(意法半导体)是一种广泛应用于嵌入式系统的微控制器平台。下载指的是将开发好的程序或固件烧录到STM32芯片内部的过程。 当使用STM32进行下载时,如果没有正确地设置或操作,就会出现稀里糊涂的情况。下载过程通常涉及到软件和硬件两个方面: 软件方面,首先需要选择合适的集成开发环境(IDE),例如Keil、IAR Embedded Workbench等,然后配置好开发环境中的下载工具。如果下载工具与芯片型号和连接方式不匹配,就会遇到下载失败或出现稀里糊涂的问题。 硬件方面,确保正确连接下载工具和目标STM32芯片,通常使用 JTAG 或 SWD 接口进行连接。如果连接错误或接触不良,也会导致下载失败或出现错误。 解决这种稀里糊涂问题的方法通常包括以下几步: 1. 检查软件设置:确认使用的IDE和下载工具版本与STM32芯片兼容;检查下载器和芯片连接设置是否正确。 2. 检查硬件连接:确保下载器正确连接到目标STM32芯片的JTAG或SWD接口上,并保持稳定的连接。 3. 引脚映射:检查芯片上的引脚映射是否正确,确保下载器与芯片之间的引脚对应正确。 4. 重启和复位:尝试对STM32芯片进行复位操作,或重新启动开发环境和下载工具。 如果以上方法都无效,可以尝试换用其他下载工具或IDE进行下载,或者咨询相关技术支持进行帮助。总之,稀里糊涂的STM32下载问题通常是由设置错误、连接问题或软硬件不兼容等原因引起的,通过仔细检查和调试可以解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值