当前位置: 首页 > news >正文

ARM学习(43)armcc HardFault函数链接不到的问题理解

armcc HardFault函数链接不到的问题理解

1、问题背景:

笔者汇编语言编写了一个HardFault异常处理函数,HardFault函数属于芯片架构异常处理函数,没有显著的调用(中断向量表中有该函数地址),且启动函数里面也有一个HardFault函数,为弱函数(weak),这两个函数均参与了编译。目前的现象是armcc链接器链接了 weak函数,而没有链接笔者写的HardFault函数,需要寻找原因。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、解决方案

  • 正常情况下,如果有强符号,首先链接强符号,其次才是弱符号,如果是弱符号,则会按照一定规则去链接,参考笔者这篇文章ARM学习(25)链接装载高阶认识,比如链接时优先链接到的函数,或者变量暂用size大的等等,比较少见。
  • 其次如果是链接顺序问题,优先链接到,那么通过调整链接顺序可以解决,笔者多次修改链接顺序,均未有效果。

后续笔者想到了armcc 链接器的stripped功能,

  • 正常情况按.o文件划分,.o文件只要被调用一个函数,就会全部链接进去,否则全部去掉。

  • 对于C文件,–split_sections,可以将函数都单独放置一个section,链接的时候没用的section会被去掉,假如笔者将某些函数放到一个section,那么只要有函数被用到,就都被链接进去,否则都不被链接进去,这是因为链接器只能按照section去掉,而不能进一步划分。之所以没有被显著放置到section的函数可以根据需要保留和去掉,那是因为链接器把每个函数都单独分成单独section。

  • 对于S文件,暂无发现这种机制,所以则按照.o文件划分

  • feedback功能,需要两次链接,首次链接找到没用到的函数,第二次把没有用到的函数放到一个内置的section,从而连接器可以去掉。

笔者写的汇编函数所在的.o文件,除了HardFault均没有被调用,所以就整体被stripped掉了,而链接的时候恰好有weak函数满足链接,所以就链接了weak函数。

所以解决方案就是:手动调用一个汇编文件.o里面的一个函数,则全部会被链接到,这样就正常了。

此外笔者还尝试了,不仅仅是汇编文件,C文件也类似,C文件手动调用HardFault,其他函数均未被调用,也会被stripped掉。

在这里插入图片描述

相关文章:

  • 3-4 WPS JS宏 工作表的新建、删除与错务内容处理(批量新建工作表)学习笔记
  • VUE2生命周期页面加载顺序
  • How to use VRX on ubuntu20.04 with ROS1 Noetic?[2]
  • Python 函数高级特性:从默认参数到闭包的全面解析
  • 偏移量是什么
  • 图书数据采集:使用Python爬虫获取书籍详细信息
  • vector习题
  • 基于YOLO11深度学习的遥感视角农田检测与分割系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标分割、人工智能
  • 知识图谱-资源网
  • 深度学习简介
  • 编写一个程序,输出1到100的所有质数(Python版)
  • NLP学习记录十一:位置编码
  • 【和鲸社区获奖作品】内容平台数据分析报告
  • Git快速入门
  • MacBook 终端中使用 vim命令
  • 洛谷————P11559 【MX-X7-T0】[LSOT-3] 嗯欧哎
  • STM32G431RBT6——(2)浅析Cortex-M4内核
  • gimp使用教程
  • Ollama download DeepSeek Local Install
  • 网络变压器的主要电性参数与测试方法(2)
  • 青岛网站制作/关键词优化话术
  • 网站制作完成后/百度推广点击软件
  • 织梦做仿站时 为何会发生本地地址跳转网站地址/北京网站seo服务
  • 济南 手机网站制作/保定网站推广公司
  • 做推广那个网站比较靠谱/seo基础入门视频教程
  • 个人专属logo设计/搜狗搜索引擎优化