【问题标题】:How to generate a hex without main function using IAR linker - xlink?如何使用 IAR 链接器 - xlink 生成没有主函数的十六进制?
【发布时间】:2016-12-25 01:34:02
【问题描述】:

关键是使用IAR链接器-xlink生成一个没有主函数的十六进制? 此代码应加载到 RL78 MCU 的 RAM 中。

【问题讨论】:

  • 你目前有什么工作?我假设你有一个库项目生成类似library.a?
  • 看起来像个 XY 问题;你到底想达到什么目的?也许是动态加载/链接?完全链接的应用程序必须有一个入口点。 GNU 链接器支持称为“部分链接”的选项,不确定您的选项。

标签: linker embedded workbench iar xlink


【解决方案1】:

在 Google 上快速搜索 iar generate hex from library 将我带到 this document, "Creating an Absolutely Placed Library",这是第一个结果。它包含您需要的所有信息,以及一些关于使用 CRC 进行一致性检查的信息。该文档适用于 IAR EWRX 变体,但概念应该相同。

基本过程是将您的库编译为可执行文件,但其中没有main() 函数。您需要将 General -> Library Options 下的库配置设置为 None。此时您还可以设置文件转换设置。

由于您没有用于程序入口点的main() 函数,因此您需要创建一个入口函数来调用IAR C 运行时初始化函数__iar_data_init2(),然后设置链接器以使用该函数作为入口点(可以在 Linker Options -> Library Options 下找到)。

在构建库时,所有符号都将保留到使用它的应用程序的最后链接步骤,但由于您将其构建为可执行文件,因此您要保留的符号具有 __root 很重要关键字,或者在 Linker -> Extra Options 下,您可以指定 --no-remove 以保留所有符号。

在下一步中,您需要使用isymexport 导出您想要的符号。您将需要一个文件来指导工具导出的内容。在示例中,他们的文件仅包含以下内容:

show lib_*
show __checksum*

这将指导工具导出所有以lib_ 开头的符号和所有以__checksum 开头的符号。他们指出 __iar_data_init2() 不应该被导出,因为这会导致与最终将使用此代码的应用程序发生冲突。您可以像这样调用该工具:

isymexport <path to .out file> <path to output from tool> --edit <path to file created above>

现在您应该有来自isymexport 的输出和您正在寻找的库文件。对于使用此库的应用程序,您需要将 isymexport 的输出添加为 Linker -> Library 下的库,并且在您的应用程序中,您需要在尝试使用之前调用库中的入口函数图书馆的任何符号。

这应该是生成库所需的信息,该库位于 hex 文件中并且可以单独加载,以及如何使用该库。引用的文档有更多的细节,所以如果它可以在那个链接上找到(或者可以通过标题在其他地方找到),它将比我在这里的摘要更好的参考。

【讨论】:

  • 虽然文档链接很有用,但您实际上也应该回答关于 SO 的问题,以便它独立存在(例如,如果链接断开)。在链接周围加上关于您如何找到它的多余评论,以及不相关的建议并不能使它免于成为仅链接的答案。
  • 我将在答案中添加一个摘要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-23
  • 1970-01-01
  • 2022-01-23
  • 2019-03-02
  • 2018-07-09
  • 1970-01-01
相关资源
最近更新 更多