我正在开发一个使用 IAR Embedded Workbench 解决方案编译的应用程序。在这个应用程序中,我嵌入了 expat 库——一个运行良好的小型 XML 解析器——它使用time()
标准函数来生成盐,正如你在这段代码中看到的那样:
static unsigned long
generate_hash_secret_salt(void)
{
unsigned int seed = time(NULL) % UINT_MAX;
srand(seed);
return rand();
}
看来该time()
功能在半主机模式下工作正常(我猜是在使用 Segger 的 J-link JTAG 设备进行调试时),但是当我在没有 j-link 调试器的情况下运行我的应用程序时根本不起作用。
所以我遇到了time()
函数的汇编代码——它实际上似乎是 IAR 的专有实现——并看到了这条指令:
BPKT #0xab
通过网络搜索信息,我想出了以下段落:
如果需要,调试器可以使用它来存储有关断点的附加信息。ARM 不建议将立即值设置为 0xAB 的 BKPT 指令用于半主机以外的任何目的。
是因为这样的问题吗?我必须承认我在 ARM 汇编器方面的知识很差,而且由于我无法在应用程序未处于半托管模式时对其进行调试,所以我很困惑。
供您参考,无论您传递给 的参数是什么time()
,它总是在非半主机模式下冻结。
最后,为了绕过这样的实现,你能建议我做什么?我应该将另一个导入到我的 C 项目中吗?...
谢谢