链接器工具警告 LNK4092

共享的可写节“section”包含重定位;映像可能不能正确运行

每当有共享节时,链接器都会发出此警告以警示潜在的严重问题。

在多个进程之间共享数据的一种方法是将节标记为“共享”。但是,将节标记为共享可能会导致问题。 例如,你有一个 DLL,它在一个共享数据节中包含这样的声明:

int var = 1;
int *pvar = &var;

链接器无法解析 pvar,因为它的值取决于在内存中加载 DLL 的位置,因此它会在 DLL 中放置重定位记录。 将 DLL 加载到内存中时,可以解析并 pvar 分配 var 的地址。 如果另一个进程加载同一 DLL 但无法在同一地址加载该 DLL,则第二个进程的 var 地址的重定位将更新,第一个进程的地址空间将指向错误的地址。