1

我正在重新组织我们应用程序中的一些遗留库,这些遗留库将非托管代码调用到托管代码库中。虽然我重新组织了代码,但它会产生以下加载程序错误:

 
...
'app.exe': Loaded 'C:\WINDOWS\system32\CsDisp.dll'
'app.exe': Loaded 'C:\WINDOWS\system32\psapi.dll'
'app.exe': Loaded 'C:\WINDOWS\system32\shell32.dll'
'app.exe': Loaded 'C:\appCode\Debug\daq206_32.dll', Binary was not built with debug information.
'app.exe': Loaded 'C:\appCode\Debug\SiUSBXp.dll', Binary was not built with debug information.
'app.exe': Loaded 'C:\appCode\Debug\AdlinkDAQ.dll', Symbols loaded.
'app.exe': Loaded 'C:\WINDOWS\system32\P9842.dll', Binary was not built with debug information.
LDR: LdrRelocateImageWithBias() failed 0xc0000018
LDR: OldBase     : 10000000
LDR: NewBase     : 00A80000
LDR: Diff        : 0x7c90d6fa0012f6cc
LDR: NextOffset  : 00000000
LDR: *NextOffset : 0x0
LDR: SizeOfBlock : 0xa80000
Debugger:: An unhandled non-continuable exception was thrown during process load
 

我相信 0xc0000018 错误是重叠的地址范围。所以,我有两个问题。首先,哪些链接器选项可能会导致此错误?我目前正在与 /DYNAMICBASE:NO 和 /FIXED:No 链接,因为这是以前的一些库的设置方式。
其次,有没有办法为加载程序打开详细模式,这样我就可以看到它到底想加载什么?P9842 是一个第三方库,所以我想它会在 P9842 之后进入我的一个库并且在那个库上失败了。我可以缩小范围吗?谢谢。

4

1 回答 1

1

不知道第一个问题。对该状态代码的搜索在这篇文章中出现了有趣的注释:“在 XP 之前,Windows 中没有检查具有不同内存类型的页面映射。Windows XP 确实会检查。第二次内存类型映射尝试将失败,并出现 STATUS_CONFLICTING_ADDRESSES (0xc0000018 ) 错误信息。” 如果您使用 MapViewOfFile 可能是相关的...

对于第二个问题,您想查看加载程序快照。请参阅msdn 上的这篇文章。这个命令应该有帮助:“gflags -i yourApp.exe +sls”

于 2010-04-12T15:38:59.783 回答