可执行文件和共享库是否包含具有相同名称的函数?

时间:2016-10-11 20:21:18

标签: c++ c dll shared-libraries exe

如果可执行文件和共享库包含具有相同名称的函数,会发生什么?例如,EXE的定义如下:

extern int fund()
{
   return 0;
}

和共享库具有相同的定义:

extern int fund()
{
   return 1;
}

将从可执行文件和共享库调用哪个函数: 1 - 用于Windows? 2 - 对于unix-base?

PS:当我在我的MFC应用程序中定义AfxWinMain时,在启动时将调用它而不是MFC DLL中的AfxWinMain。我需要一些理论为什么会这样?

1 个答案:

答案 0 :(得分:1)

你已经在标题中回答了这个问题。

非共享库依赖项在链接时解析,而不是在加载时解析。一旦链接器满足了对静态库的外部引用,它将保持这种状态,Windows和Unix加载器都不会再尝试解析它(符号通常不是偶然的"可见"在二进制文件中在链接阶段之后)。

当链接库(无论是静态还是动态)时,链接器一旦找到满足要求的引用就会停止搜索符号以便解析,并且在任何其他(或相同)中不会再查找该符号的库。这就是为什么你可以为中的同一个函数提供多个定义的原因(与目标文件相反,保证可以对这些定义进行详尽的搜索,因此将检查重复的符号)。

只有在加载时需要解析的符号才会被标记为"外部共享"并在运行时由加载程序解析。

我看不到unixoid操作系统和Windows之间在这方面的根本区别。