我使用 Visual Studio 2008,对此警告有疑问。
在我们的一个库中,我们设置了“固定基址”标志 (/FIXED) 并定义了一个固定基址。
我们声明一个带有命令的共享部分
#pragma comment(linker,"/SECTION:FOO,RWS")
#pragma data_seg("FOO")
当我删除/FIXED 标志时,我收到警告
LINK : warning LNK4092: shared writable section 'FOO' contains relocations; image may not run correctly
据我所知,使用此标志,当从可执行文件加载时,DLL 可能会被重新定位。 现在我不明白什么。为什么不重新定位这些共享部分很重要?这些地址对于每个进程来说不是虚拟的吗?
有什么方法可以允许重新定位并拥有共享部分吗?在更改库接口(interface)后,我们遇到了这个问题,如果任何开发人员在不知道这些后果的情况下更改了该库,我希望将来避免这种情况。
我也很好奇这是如何运作的。/SECTION 标志和 4092 警告的 MSDNA 页面在这里没有多大帮助。
最佳答案
我相信KB137235在这里相关。基本上,该错误是告诉您该节包含的数据取决于加载该节的地址,例如指向该节中其他数据的指针。如果该部分是可重定位的,则不同的实例可能不会位于同一虚拟地址,因此指针不能同时对所有实例有效。
从中长期来看,正确的解决方案是不使用共享部分。例如,参见:
关于c - 警告 LNK4092 : shared writable section contains relocations,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13348959/