调试器如何知道函数名称?

Sma*_*vić 5 c assembly winapi ollydbg

当我使用调试器(例如 OllyDbg)调试任何程序时,在反汇编代码中,我可以看到函数名称,例如:

push 0
call msvcrt.exit
Run Code Online (Sandbox Code Playgroud)

调试器如何知道函数名称?他们来自哪里?在机器码中,它表示为call address。那么调试器是如何知道的呢?

das*_*ght 4

编译器生成“符号”文件,为调试器提供一种显示与特定地址或偏移量相对应的符号名称的方法。这高度依赖于系统:例如,Windows 上的 VS 工具链将这些符号放在单独的 .pdb 文件中,而在某些 UNIX 版本上,这些调试符号嵌入到可执行文件中。编辑:根据评论,OllyDbg 从嵌入可执行文件中的导入地址表中提取符号。

当符号嵌入到可执行文件中时,编译器供应商提供了一个工具来删除这些符号。例如,GNU 提供了strip与其工具链一起使用的实用程序。