当我使用调试器(例如 OllyDbg)调试任何程序时,在反汇编的汇编代码中,我可以看到函数名称,例如:
push 0
call msvcrt.exit
调试器如何知道函数名?他们来自哪里?在机器代码中,它表示为call address
。那么调试器是怎么知道的呢?
编译器生成“符号”文件,为调试器提供一种显示与特定地址或偏移量相对应的符号名称的方法。这高度依赖于系统:例如,Windows 上的 VS 工具链将这些符号放在单独的 .pdb 文件中,而在某些 UNIX 版本中,这些调试符号嵌入到可执行文件中。编辑:根据评论,OllyDbg 从嵌入在可执行文件中的导入地址表中提取符号。
当符号嵌入到可执行文件中时,编译器供应商提供了一个工具来删除这些符号。例如,GNU 提供了strip
使用其工具链的实用程序。