【问题标题】:How to get rid of exported symbols from a windows static library?如何摆脱 Windows 静态库中的导出符号?
【发布时间】:2013-09-26 23:38:30
【问题描述】:

我正在将我的可执行文件与一个第三方静态库链接,该库是用传递给 C 编译器的错误定义编译的。同一个库也可以作为 DLL 使用,静态版本的编译使得所有符号都被导出。这对于静态库当然没有意义,因为导出会传播到可执行文件(或 DLL),这样的库将被集成到其中。

当我将可执行文件与此库链接时,库中的符号将从可执行文件中导出。我不关心生成的 .lib 和 .exp 文件。我需要摆脱可执行文件本身中的导出符号。

我需要的是一种方法:

  1. 强制清除链接器的导出符号列表,或

  2. 编辑从库中提取的目标文件以“取消导出”符号。

我正在使用 Visual Studio 2012 构建项目。该库以 .LIB 文件的形式提供,我可以使用库管​​理器来提取目标文件并使用 dumpbin 来确认是否存在导出的符号。

目前我不想打扰供应商修复它,或者更确切地说,我不希望他们在我变老之前回复。

【问题讨论】:

  • 这是不可避免的,链接器会按照您的要求执行操作,而无法再次撤消它。它只会产生两个您实际上不使用的小垃圾文件。如果您真的非常讨厌它,那么只需在构建后事件中再次删除它们即可。
  • 垃圾文件不是问题。问题是 .EXE 文件已导出符号!
  • 如果您找到了导入它们的方法,请分享秘密。
  • 那里有很多 dll 注入工具。 This one 可能是最小的例子。加载(注入)后,DLL 可以绑定到从可执行文件导出的符号。
  • 在链接时尝试使用 .def 文件。我相信此文件中的 EXPORT 语句将覆盖目标文件中的信息。然后您可以使用 NONAME 选项;严格来说,符号仍然会被导出,但只能按序号,而不是按名称。

标签: windows visual-studio linker


【解决方案1】:

要完全覆盖从链接期间创建的 PE 映像(.exe 或 .dll)导出的符号,必须与 .exp 文件链接。仅linking with a .def file 只能将符号添加到导出列表中,不能从中删除。

  1. 创建一个.def 文件。如果您不想导出任何内容,它将几乎是空的:

    NAME "YourExecutableBaseName"
    

    这将用于YourExecutableBaseName.exeYourExecutableBaseName.dll.def 中的基本名称应与链接器的输出文件名匹配,否则会出现警告。

  2. 使用LIB.def 文件创建.exp 文件。

  3. Link the executable with this .exp file。这个导出文件完全定义了所有导出的符号,链接器不会导出任何不存在的符号。

【讨论】:

  • 这在 VS 2015 中不起作用。.exp 文件是二进制文件。与文本版本链接给出:test.exp : fatal error LNK1107: invalid or corrupt file: cannot read at 0xF
  • @RustyX .exp 文件是二进制文件,是您应该链接的文件。你不应该链接到.def 文件,即使它是it works when done correctly。我已经说得更清楚了。
  • 我有类似的情况:链接到 DLL 的静态库导致一些静态库的符号被 DLL 导出。这个解决方案在制作 DLL 时也适用吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
相关资源
最近更新 更多