Win32 DLL中的所有导出函数都具有相同的入口点

时间:2018-01-25 12:03:00

标签: c++ visual-c++ visual-studio-2017

我遇到了Windows DLL文件的问题。我正在使用Visual Studio 2017创建一个DLL项目。我只是从dll中导出了3个函数(function1,function2和function3)。当我在依赖walker中查看我的dll时,它显示了dll中的所有三个导出函数,但是所有三个导出函数都具有相同的入口点,即0x00001000。

无论是从我使用上述dll的另一个应用程序调用function1或function2还是function3,它总是调用function1。

请让我知道如何创建使用1:1入口点映射函数的dll。

我的dll项目中只有两个文件(.h和.cpp)。这些函数在头文件中定义,如

this.label1.BackColor = System.Drawing.SystemColors.ActiveCaption;
this.label1.Font = new System.Drawing.Font("Arial", 16F, System.Drawing.FontStyle.Bold);
this.label1.Location = new System.Drawing.Point(124, 187);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(217, 65);
this.label1.TabIndex = 0;
this.label1.Text = "Something Cool";
this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.label1.MouseHover += new System.EventHandler(this.label1_MouseHover);
this.label1.MouseLeave += new System.EventHandler(this.label1_MouseLeave);

在源文件中,我将函数定义为

private void label1_MouseHover(object sender, EventArgs e)
{
    label1.BorderStyle = BorderStyle.FixedSingle;
    label1.Font = new Font("Arial", 18, FontStyle.Bold);
}

private void label1_MouseLeave(object sender, EventArgs e)
{
    // initialize
    label1.BorderStyle = BorderStyle.None;
    label1.Font = new Font("Arial", 16, FontStyle.Bold);
}

从我的另一个应用程序中,我使用LoadLibraryEx()和GetProcAddress()来返回函数地址。 GetProceAddress始终返回相同的函数指针。

这是我的dll的依赖步行者的视图

dependency walker

1 个答案:

答案 0 :(得分:1)

Msvc进行积极的comdat折叠。与地址相同的函数。如果这在标准下是合法的,那就太模糊了,但它确实发生了。

它检查“我可以在机器代码级别使用相同的实现并在抽象机器中获得所需的结果”级别的相同内容。

这也可以通过/OPT:NOICF禁用,但这可能导致巨大的膨胀,尤其是模板功能。

相反,只需使函数具有根本不同的行为和状态。