【发布时间】:2013-09-26 23:38:30
【问题描述】:
我正在将我的可执行文件与一个第三方静态库链接,该库是用传递给 C 编译器的错误定义编译的。同一个库也可以作为 DLL 使用,静态版本的编译使得所有符号都被导出。这对于静态库当然没有意义,因为导出会传播到可执行文件(或 DLL),这样的库将被集成到其中。
当我将可执行文件与此库链接时,库中的符号将从可执行文件中导出。我不关心生成的 .lib 和 .exp 文件。我需要摆脱可执行文件本身中的导出符号。
我需要的是一种方法:
强制清除链接器的导出符号列表,或
编辑从库中提取的目标文件以“取消导出”符号。
我正在使用 Visual Studio 2012 构建项目。该库以 .LIB 文件的形式提供,我可以使用库管理器来提取目标文件并使用 dumpbin 来确认是否存在导出的符号。
目前我不想打扰供应商修复它,或者更确切地说,我不希望他们在我变老之前回复。
【问题讨论】:
-
这是不可避免的,链接器会按照您的要求执行操作,而无法再次撤消它。它只会产生两个您实际上不使用的小垃圾文件。如果您真的非常讨厌它,那么只需在构建后事件中再次删除它们即可。
-
垃圾文件不是问题。问题是 .EXE 文件已导出符号!
-
如果您找到了导入它们的方法,请分享秘密。
-
那里有很多 dll 注入工具。 This one 可能是最小的例子。加载(注入)后,DLL 可以绑定到从可执行文件导出的符号。
-
在链接时尝试使用 .def 文件。我相信此文件中的 EXPORT 语句将覆盖目标文件中的信息。然后您可以使用 NONAME 选项;严格来说,符号仍然会被导出,但只能按序号,而不是按名称。
标签: windows visual-studio linker