工具/软件:
您好:
我有(有...) 与 DSPLIB 完美配合的项目(使用 LEA 进行 FFT 计算)。
我决定将 DSPLIB 移动到静态库工程并链接到该工程。
现在、在执行期间、在不同的位置进入现在链接到我的应用程序的 DSPLIB 代码中、会生成存储器违例。
这是对不受执行保护的段的违规。
我始终可以跟踪导致违规的确切行。 它是发生违例的受保护段 (0x10000-0x16000) 之外的对有效地址 (0x39xxx) 的调用。
奇怪的是,违反不是每次在同一个 Calla 触发,但总是在一个 Calla。 始终。
每次、在违规发生之前、反汇编窗口中显示的调用地址都是完全合法且有效的。 它实际上非常接近 PC、因为这是从库中的某个位置调用到库中的其他位置。
在 NMI 中、我有一些代码会检查栈、在发生执行违例时检索被调用地址和预期返回地址。 此代码在一段时间内运行良好、因此我倾向于信任检索到的数据。 被调用地址为 0x10000、这是所违反受保护段的确切起始位置。 所以、这肯定是一个真正的违规行为。 但是、返回地址绝对无效、超出了有效的存储器范围。
搜索二进制文件,我可以找到一整堆 Calla,完全有效,显然产生违规. 但是、0x10000 没有调用。 因此它应该是以 0x10000 结尾的间接调用... 但跟踪代码始终会将有效 CALLA 显示为 NMI 之前执行的最后一条指令。 始终。
这是怎么回事????
它很可能与与一个库的链接有关,但我真的无法解释或修复它。
此致、
Frederic