如何拆卸 .lib 静态库?

6
我可以帮助您翻译以下内容,如下所示:

我用C写了这个简单的库:

library.h:

int sum(int a, int b);

library.c:

#include "library.h"
int sum(int a, int b) {
    return a+b;
}

我使用以下命令,通过 cl.exe (visual studio 2012) 编译:

cl /c /EHsc library.cpp
lib library.obj

现在,我想查看编译器生成的汇编代码,以供学习和研究目的。请注意,我不想反编译它,我只想阅读生成的汇编代码。我尝试用w32dasm打开.lib文件,但是出现了很多奇怪的符号,看起来这个工具无法读取该文件。我已经使用相同源代码生成的动态链接库完成了类似的任务,并成功地查看了汇编代码;在那种情况下,我能够使用w32dasm查看汇编代码。因此,我的问题是:是否可以像动态链接库一样查看静态链接库的汇编代码?如果可以,应该使用什么正确的工具,因为w32dasm似乎不是正确的工具。

可能是使用GCC生成可读汇编?的重复问题。 - Hans Passant
@usmcs 谢谢你帮我解决了我的英文拼写错误。 - WileTheCoyot
@HansPassant objdump在Windows下工作吗? - WileTheCoyot
使用-S选项,这样objdump就完全不必要了。 - Hans Passant
1
@HansPassant 你是指 gcc -S 吗? - WileTheCoyot
2个回答

7

如果您想要分解库而不是查看编译器生成的汇编代码,您可以使用 DUMPBIN 工具

dumpbin /disasm library.lib

IDA也可以处理静态库和目标文件(以及其他几十种文件格式)。免责声明:我为Hex-Rays工作。


1

从技术上讲,这有点不同,因为它不会对 .lib 文件进行反汇编,但对于大多数目的来说应该已经足够了:

您可以使用 /FA 开关,详细说明请参见 此处。更准确地说,您可能想要使用 /FAs,它应该为每个包含汇编和源代码的源文件生成一个 .asm 文件,这对于参考非常有帮助。例如,如果您将此添加到您的 cl 命令中:

cl /c /EHsc /FAs library.cpp

这应该除了正常功能外,还创建一个名为library.asm的文件。此文件可能包含很多内容,因此搜索它是个好主意。
如果您使用Visual Studio IDE,还可以设置断点,开始调试,然后右键单击源代码行并选择转到反汇编。此选项仅在调试期间出现在上下文菜单中,并且仅在断点期间处于活动状态,这就是为什么设置断点很有用的原因,但您也可以手动中断。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接