如果可执行文件和共享库包含具有相同名称的函数,会发生什么?例如,EXE的定义如下:
extern int fund()
{
return 0;
}
和共享库具有相同的定义:
extern int fund()
{
return 1;
}
将从可执行文件和共享库调用哪个函数: 1 - 用于Windows? 2 - 对于unix-base?
PS:当我在我的MFC应用程序中定义AfxWinMain时,在启动时将调用它而不是MFC DLL中的AfxWinMain。我需要一些理论为什么会这样?
答案 0 :(得分:1)
你已经在标题中回答了这个问题。
非共享库依赖项在链接时解析,而不是在加载时解析。一旦链接器满足了对静态库的外部引用,它将保持这种状态,Windows和Unix加载器都不会再尝试解析它(符号通常不是偶然的"可见"在二进制文件中在链接阶段之后)。
当链接库(无论是静态还是动态)时,链接器一旦找到满足要求的引用就会停止搜索符号以便解析,并且在任何其他(或相同)中不会再查找该符号的库。这就是为什么你可以为库中的同一个函数提供多个定义的原因(与目标文件相反,保证可以对这些定义进行详尽的搜索,因此将检查重复的符号)。
只有在加载时需要解析的符号才会被标记为"外部共享"并在运行时由加载程序解析。
我看不到unixoid操作系统和Windows之间在这方面的根本区别。