为什么未导出的函数名称仍列在 MinGW DLL 中?

Why are un-exported functions' names still listed in MinGW DLLs?

我有一个具有这些功能的 DLL:

void __declspec(dllexport) foo1()
{
    printf("1");
}

void foo2()
{
    printf("2");
}

在 Dependency Walker 中打开 DLL 时,只有 foo1() 显示为已导出,这是预期的。但是,当我在十六进制编辑器中打开 DLL 文件时,我注意到字符串 _Z4foo2v,它看起来像一个导出名称。

但是由于 foo2() 没有标记为导出,为什么这个字符串 _Z4foo2v 存在?

您是否构建了带有调试信息的库?因为如果你用调试信息构建它,它就是来自普通符号的符号。尝试剥离共享库并查看是否有这些符号。

实际上,如果您阅读 man nm,您会看到 --dynamic 选项,它可以切换要显示的部分类型(仅动态或全部)