【问题标题】:Force the Compiler Not to Link to Certain Object Files强制编译器不链接到某些目标文件
【发布时间】:2012-11-07 14:58:08
【问题描述】:

我目前正在研究强制 rvct 编译器不链接特定翻译单元并假装它已链接它的可能性。

我们的产品在空间限制上运行非常紧张,并且在将一些单元测试与其集成时遇到了麻烦,同时又要控制空间。

基本上,我们在运行时可以利用的内存足以存储我们的单元测试,但我们没有足够的 ROM 空间来保存它们。

我们有办法在分散文件中准确控制代码的哪一段内存进入我们的设备,因此我们正在考虑定义单元测试代码将位于哪个区域以及以某种方式强制编译器在编译期间不要链接该特定代码。

类似于以下内容:

Result UnitTestEntryPoint (UnitTest suite) {
   if (hasTestInMemory) {
      switch (suite) {
          case EncrpytionTest:
              return EncrptyUnitTest();
          // more tests.
      }
   }
}

// Actual Tests, can we not link this code, but just pretend we link to them?
Result EncrpyUnitTest (void) {
    // Do stuff...
}

然后在运行时,我们会将单元测试二进制文件上传到我们在分散文件中定义的指定内存区域,并将hasTestInMemory翻转为true

这可能吗?

如果没有,有人可以指出我寻找解决方案的正确方向,该解决方案以某种方式满足我们的空间限制并能够在运行时加载单元测试。

谢谢,

【问题讨论】:

  • 你的平台是否支持像 linux 库这样的库(so)?
  • 不幸的是,动态加载似乎是不可能的,因为我们的产品是一个引导 rom,并且几乎是设备加载的第一件事。
  • 您能否针对仅包含存根实现的备用文件集进行构建?或者#ifdef 删除调用,并使用链接器选项去除未使用的代码?
  • 如果我们 ifdef out 调用者代码,代码大小将会减少,因为我们不再调用单元测试函数。但是,如果没有调用者代码,我们以后如何在运行时调用它们呢?

标签: c embedded arm realview


【解决方案1】:

您应该能够使用分散文件将所有单元测试功能放入单独的加载区域。链接图像时,您将获得一个 AXF,但当您将其转换为二进制文件以加载到内存中时,您应该获得两个文件,每个区域一个。

您还可以在单​​元测试映像中添加一些标记,您的 ROM 映像可以检查这些标记以验证二进制文件是否已加载。此检查将替换代码中的 hadTestInMemory 检查。同样,您应该能够使用分散文件在第二个二进制文件的开头放置一些特定的 RO 数据。

随着您的进步,我可能会帮助您提供更多细节。

【讨论】:

  • 嗨,我不确定我知道这个 AXF 文件是什么...我们一直只生成一个二进制文件。我听从了您的建议,并将单元测试 .o 文件放入分散文件中的不同加载区域。生成的 bin 文件小于约束(与没有单元测试的文件大小大致相同)。但是单元测试代码却无处可寻。
  • 应该已经创建了第二个二进制文件,它将包含单元测试。我刚刚更正了我的回答,说加载区域而不是执行区域,我认为这就是为什么你只有一个文件。
  • AXF文件由armlink生成。它是一个包含加载区域的 ELF 文件。通常,您会使用 fromelf 将其转换为一个或多个二进制文件。
  • 谢谢,我使用 fromelf 并确实获得了两个单独的二进制文件。
猜你喜欢
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多