【问题标题】:How to force IAR linker to keep unused functions?如何强制 IAR 链接器保留未使用的功能?
【发布时间】:2016-03-30 15:16:01
【问题描述】:

我正在测试为瑞萨电子 RL78 微控制器编写的 C 软件。该软件仍在开发中,因此有些功能已实现但尚未调用。因此,链接器会消除此类函数,并在列表中输出以下条目:

CODE
  Segment part 42. NOT NEEDED.
       LOCAL                   ADDRESS         
       =====                   =======         
       function_name

我的目标是在目标系统上对这些函数执行单元测试,因此我需要将代码显示在输出 ELF 文件中。如何告诉链接器保留未使用的功能?我已经尝试将优化级别设置为 None,并将模块类型设置为 ProgramLibrary。我还定义了一个名为CODE 的代码段。所有这些操作对链接器输出都没有预期的效果。

我不能修改源代码(从技术上讲,我可以修改我想要的所有东西,但我不能提交任何东西),所以从main() 调用我需要的所有函数不是一个选项。

【问题讨论】:

  • 你打算如何对从未调用过的函数进行单元测试
  • @M.M 通过创建堆栈帧并将入口点地址放入程序计数器。
  • @M.M 我在我的回答中添加了一个屏幕截图,让您了解这是如何完成的。

标签: c linker iar dead-code


【解决方案1】:

我找到了相关的tech note,它提出了以下建议:

  • IAR XLINK 链接器 -g 选项
  • IAR ILINK 链接器 --keep 选项
  • 在汇编程序中使用 REQUIRE 关键字
  • 使用 __root 扩展关键字

因为我使用xlink,所以我尝试了第一个选项并且它成功了。以下是选项快速参考:

-gsymbol1[,symbol2,symbol3,…] Requires global entries

以下是在 IDE 中设置选项的方式:

由于 M.M 询问我如何对其余代码未调用的函数进行单元测试,这里是我的调试器的屏幕截图。基本上,一旦到达主循环,它就会停止目标,为函数创建一个人工堆栈框架并调用它。

【讨论】:

  • 链接器选项应该有(至少在 ARM 版本上)还有“输入”选项卡,它有“保留符号”文本框。这应该等同于您的第二个选项。
  • @user694733 ARM平台在工具方面有更好的支持。我的 IDE 没有“保留符号”文本框(或“输入”选项卡,就此而言)。无论如何,除非可以选择保留输出中的所有符号,否则如何列出我想要保留的符号没有实际区别。
  • 仅供参考:IAR 技术说明 51348 -“链接器删除函数和变量或未找到外部”
猜你喜欢
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
  • 2016-11-07
  • 2012-12-16
相关资源
最近更新 更多