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

【ARM/RISCV 嵌入式 编译系列 16 -- GCC 进制优化编译的常用方法】

文章目录

      • 方法一:给函数加 __attribute__((used)) 强制保留
      • 方法二:加 __attribute__((section(".text.jump"))) + 链接脚本强制放入
      • 方法三:关闭函数优化和链接时清除未使用代码
    • 如果是纯汇编写的(`.S`)
    • 最强一招:使用 `KEEP()` 保留段内所有代码
    • 验证跳转函数是否真的保留
    • 总结

方法一:给函数加 attribute((used)) 强制保留

如果你是用 C 写的(而不是纯汇编),这样做可以让函数即使没被调用也不被优化掉:

__attribute__((used))
void jump_to_ilm() {asm volatile ("lui t0, 0x60000\n""jr t0\n");
}

方法二:加 attribute((section(“.text.jump”))) + 链接脚本强制放入

__attribute__((used, section(".text.jump")))
void jump_to_ilm() {asm volatile ("lui t0, 0x60000\n""jr t0\n");
}

并在链接脚本中加入:

.text : {KEEP(*(.text.jump))*(.text)
}

方法三:关闭函数优化和链接时清除未使用代码

在编译时使用以下选项:

riscv64-elf-gcc -O0 -Wl,--whole-archive -Wl,--no-gc-sections ...

或者最少加 -Wl,--gc-sections 时配合 KEEP() 保住关键段落。

如果是纯汇编写的(.S

确保该跳转代码出现在 _start 或其他被链接器引用的地方,否则链接器仍可能把你 .text 中的符号扔掉。

例如:

.section .text
.globl _start
_start:lui t0, 0x60000jr t0

_start 是入口符号,必须通过链接脚本 ENTRY(_start) 指定入口,否则编译器也可能不处理。

最强一招:使用 KEEP() 保留段内所有代码

在链接脚本中:

.text : {KEEP(*(.text.boot))KEEP(*(.text.jump))*(.text*)
}

只要你把函数放进 .text.jump,它就不会被优化掉了。

验证跳转函数是否真的保留

你可以用 objdump 检查 ELF 文件:

riscv64-elf-objdump -d bootrom.elf | less

确认是否有类似:

60000000 <_ilm_main>:...

总结

方法适用情况是否推荐
__attribute__((used))写在 C 代码中推荐
KEEP() + section写在链接脚本 + C/汇编都适用强力推荐
直接放在 _start简单项目推荐
关闭优化(-O0, --no-gc-sections调试期可用有副作用,慎用

相关文章:

  • SQL进阶之旅 Day 1:高效表设计与规范
  • leetcode-快慢指针系列
  • FFTW图像处理之频域滤波和频域分析
  • 2025语音语聊系统源码开发深度解析:WebRTC与AI降噪技术如何重塑语音社交体验
  • 苍穹外卖07 缓存菜品缓存套餐 添加购物车
  • 电脑风扇转速不正常的原因
  • Python、PyTorch、TensorFlow和飞桨(PaddlePaddle)的核心介绍及对比
  • EtherNet IP到modbus TCP网关完成AGV系统的安全解决方案及应用
  • Day34 Python打卡训练营
  • 关于千兆网络变压器的详细介绍
  • 03 基于 java udp 做一个dns服务器 和 一个dns代理服务器
  • 【ISP算法精粹】ISP算法管线的预处理算法有哪些?
  • 新能源汽车滑行阻力参数计算全解析:从理论推导到MATLAB工具实现
  • 深度学习中的分布偏移问题及其解决方法
  • LeetCode Hot100(字串)
  • 在 Ubuntu 虚拟机中实现 HTML 表单与 C 语言 HTTP 服务器交互
  • 前后端联调实战指南:Axios拦截器、CORS与JWT身份验证全解析
  • WPF骨架屏控件(Skeleton)
  • 用户获取规模提升45%,NetMarvel助力金融APP精准推广!
  • CAD球体功能梯度材料3D插件
  • 驻马店做网站/怎样注册网站
  • 昆山做网站好的/seo外包 靠谱
  • 做h5商城网站/怎么样在百度上推广自己的产品
  • 潍坊做网站潍坊做网站/百度广告官网
  • 电商免费网站入口/外贸网站推广方法之一
  • 做app和做网站相同和区别/免费推广app平台有哪些