警告LNK4092:共享可写部分包含重定位

我使用Visual Studio 2008,并有关于此警告的问题。

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

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

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

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

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

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

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

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

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

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

  • 附录G:SDL要求:无共享部分
  • 旧的新事物:为什么共享部分是一个安全漏洞
  • KB147136:DLL中的共享数据段的问题