我使用Visual Studio 2008并对此警告提出疑问。
在我们的一个图书馆中,我们设置了#34;固定基地址" flag(/ FIXED)并定义了固定的基址。
我们使用命令
声明一个共享部分#pragma comment(linker,"/SECTION:FOO,RWS")
#pragma data_seg("FOO")
当我删除/ FIXED标志时,我收到警告
LINK:警告LNK4092:共享可写部分' FOO'包含重新安置;图像可能无法正常运行
我理解,使用此标志,从可执行文件加载时,可能会重定位dll。 现在我不明白。为什么重要的是,这些共享部分没有重新定位?这些地址对于每个流程都不是虚拟的吗?
有没有办法允许重定位并拥有共享部分?在我们更改了库接口之后我们遇到了这个问题,如果有任何开发人员在不知道这些后果的情况下更改了这个库,我希望以后再避免这种情况。
我也很好奇这是如何运作的。 / SECTION标志的MSDNA页面和4092警告在这里不是很有帮助。
答案 0 :(得分:4)
我相信KB137235与此相关。基本上,错误告诉您该部分包含的数据取决于加载部分的地址,例如指向该部分中其他数据的指针。如果该部分是可重定位的,则不同的实例可能不在同一个虚拟地址,因此指针不能同时对所有实例有效。
从中长期来看,正确的解决方案是不使用共享部分。例如,见: