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