如何反汇编.lib静态库?

时间:2014-03-10 21:31:53

标签: c static-libraries disassembly

我在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

将其编译为静态链接.lib库文件。现在我想看看编译器如何生成汇编代码,用于学习/学术目的。请注意,我不想反编译它,我只想读取生成的程序集。我试图用w32dasm打开.lib,但我得到了很多奇怪的符号,看起来工具无法读取文件。我已经使用动态链接库(从同一个源生成)完成了类似的任务,并且它工作正常;因为我能够使用w32dasm查看汇编代码。所以,我的问题是:可以像动态链接库那样查看静态链接库的汇编代码吗?如果是这样,那么使用什么是正确的工具,因为w32dasm似乎不是正确的工具。

2 个答案:

答案 0 :(得分:5)

如果你想要反汇编库而不是查看编译器生成的汇编程序,可以使用DUMPBIN tool

dumpbin /disasm library.lib

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

答案 1 :(得分:1)

这在技术上有点不同,因为它不会反汇编.lib文件,但对于大多数用途应该足够好了:

您可以使用/FA开关,详细说明here。更确切地说,您可能希望使用/FAs,它应该为包含程序集和源代码的每个源文件生成.asm文件,这有助于参考。例如,如果将其添加到cl命令:

cl /c /EHsc /FAs library.cpp

除了正常功能外,还应创建一个文件library.asm。这个文件可能包含很多东西,所以搜索它是一个好主意。

如果您使用的是Visual Studio IDE,还可以设置断点,开始调试,然后右键单击源代码行并选择转到反汇编。此选项仅在调试期间显示在上下文菜单中,并且仅在中断期间处于活动状态,这就是设置断点很有用的原因,但您也可以手动中断。