1

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

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

我需要的是一种方法:

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

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

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

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

4

1 回答 1

1

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

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

    NAME "YourExecutableBaseName"
    

    这将是YourExecutableBaseName.exeYourExecutableBaseName.dll。中的 basename.def应该与链接器的输出文件名匹配,否则会出现警告。

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

  3. 将可执行文件与此.exp文件链接。这个导出文件完全定义了所有导出的符号,链接器不会导出任何不存在的符号。

于 2013-09-27T13:12:25.500 回答