2

我使用 Visual Studio 2008 并且对此警告有疑问。

在我们的一个库中,我们设置了“固定基址”标志 (/FIXED) 并定义了一个固定基址。

我们用命令声明一个共享部分

#pragma comment(linker,"/SECTION:FOO,RWS") 
#pragma data_seg("FOO")

当我删除 /FIXED 标志时,我收到警告

链接:警告 LNK4092:共享可写部分“FOO”包含重定位;图像可能无法正常运行

我了解,使用此标志,从可执行文件加载时,dll 可能会被重新定位。现在我不明白。为什么不重新定位这些共享部分很重要?这些地址不是每个进程的虚拟地址吗?

有没有办法允许搬迁并有一个共享的部分?我们在更改库接口后遇到了这个问题,如果任何开发人员在不知道这些后果的情况下更改此库,我想在将来避免这种情况。

我也很好奇这是如何工作的。/SECTION 标志的 MSDNA 页面和 4092 警告在这里不是很有帮助。

4

1 回答 1

4

我相信KB137235在这里是相关的。基本上,错误告诉您该部分包含取决于加载该部分的地址的数据,例如指向该部分中其他数据的指针。如果该部分是可重定位的,则不同的实例可能不在同一个虚拟地址上,因此指针不能同时对所有实例都有效。

从中长期来看,正确的解决方案是不使用共享部分。参见,例如:

于 2012-11-12T20:25:18.273 回答