【发布时间】: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 调用者代码,代码大小将会减少,因为我们不再调用单元测试函数。但是,如果没有调用者代码,我们以后如何在运行时调用它们呢?