为了混淆目的,我想从 DLL 中隐藏导出的符号。
.def
当使用看起来像这样的模块定义文件()时,这是非常可行的;
EXPORTS
??0Foo@QAE@XZ @1 NONAME
??1Foo@QAE@XZ @2 NONAME
?Bar@Foo@UAEHXZ @3 NONAME
问题是,这种解决方案非常不灵活,需要人工操作。正如您在我的示例中看到的,我正在导出 C++ 符号,因此它们被我的编译器大量修饰。
所以我目前的工作流程是这样的;
我必须首先创建一个我的 DLL 版本,它使用 以标准方式导出所有符号__declspec(dllexport)
,然后我需要使用dumpbin
或类似方法提取所有导出的符号名称。完成后,我需要将符号复制并粘贴到我的模块定义文件中并添加该NONAME
指令。然后我必须确保我的原始来源不再使用它__declspec(dllexport)
。完成所有这些后,我需要在项目设置中激活该 .def 文件,然后我最终可以构建该 DLL 的无导出符号版本。我猜这个相当简单的任务需要做很多工作。
在使用一堆脚本和东西覆盖所有这些之前,我想也许,也许有一个更简单的解决方案?
请注意,我正在使用 VisualStudio (2012),因此pragma hidden
据我所知,漂亮的 GCC 不会这样做。