Wil*_*yot 5 c static-libraries disassembly
我已经用c编写了这个简单的库:
library.h:
int sum(int a, int b);
Run Code Online (Sandbox Code Playgroud)
library.c:
#include "library.h"
int sum(int a, int b) {
return a+b;
}
Run Code Online (Sandbox Code Playgroud)
我使用以下命令使用cl.exe(Visual Studio 2012)对其进行了编译:
cl /c /EHsc library.cpp
lib library.obj
Run Code Online (Sandbox Code Playgroud)
它将其编译为静态链接.lib库文件。现在,我想看看出于学习/学术目的,编译器如何生成汇编代码。请注意,我不想反编译它,我只想阅读生成的程序集。我试图用w32dasm打开.lib,但是出现很多奇怪的符号,看来该工具无法读取该文件。我已经使用了动态链接库(从相同的源生成)完成了类似的任务,并且有效。因为我能够使用w32dasm查看汇编代码。因此,我的问题是:是否可以像使用动态链接库那样查看静态链接库的汇编代码?如果是这样,那将是正确的工具,因为w32dasm似乎不是正确的工具。
如果您确实想反汇编该库而不是查看编译器生成的汇编器,则可以使用以下DUMPBIN工具:
dumpbin /disasm library.lib
Run Code Online (Sandbox Code Playgroud)
IDA还可以处理静态库和目标文件(以及许多其他文件格式)。免责声明:我为Hex-Rays工作。
这在技术上有点不同,因为它不会反汇编文件.lib,但对于大多数目的来说应该足够好:
您可以使用switch,如此/FA处详细描述。更准确地说,您可能想要使用哪个应该为包含程序集和源代码的每个源文件生成文件,这对于参考很有帮助。例如,如果您将其添加到命令中:/FAs.asmcl
cl /c /EHsc /FAs library.cpp
Run Code Online (Sandbox Code Playgroud)
除了其正常功能之外,这还应该创建一个文件library.asm. 该文件可能包含很多内容,因此搜索它是一个好主意。
如果您使用的是 Visual Studio IDE,您还可以设置断点,开始调试,然后右键单击源代码行并选择“转到反汇编”。此选项仅在调试期间显示在上下文菜单中,并且仅在中断期间才处于活动状态,这就是设置断点很有用的原因,但您也可以手动中断。