c - 警告 LNK4092 : shared writable section contains relocations

标签 c windows visual-studio-2008 mfc shared-memory

我使用 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/

相关文章:

CUDA : error C2491: 'log1p' : definition of dllimport function not allowed

c - getaddrinfo 抛出段错误

c++ - Visual Studio : can't add ATL class to ATL project?

c - 如何摆脱字符数组中的垃圾?

c# - .NET (C#) : Getting child windows when you only have a process handle or PID?

python - 如何在python中获取文件关闭事件

java - Eclipse Mars Java - 首选项错误 - 无法接受更改

c# - 生成 MyAssembly.XmlSerializers.dll 的目的是什么?

c - 在c中的数组中查找 'X'数字的部分和

c - 使用线程时 printf 无法正常工作